#!/usr/bin/python2
#
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tool for enumerating the tests in a given suite.

Given an autotest root directory and a suite name (e.g., bvt, regression), this
tool will print out the name of each test in that suite, one per line.

Example:
$ ./site_utils/suite_enumerator.py -a /usr/local/autotest bvt 2>/dev/null
login_LoginSuccess
login_BadAuthentication

This is intended for use only with Chrome OS test suits that leverage the
dynamic suite infrastructure in server/cros/dynamic_suite.py.
"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import logging
import optparse, os, sys

# Silence messages relating to imports of missing, unneeded
# modules.
logging.basicConfig(level=logging.INFO)

import common
import autotest_lib.client.common_lib.cros as cros_lib
import autotest_lib.server.cros.dynamic_suite.suite as suite_lib


def parse_options():
    """Parse command line for arguments including autotest directory, suite
    name, if to list stable tests only, and if to list all available suites.
    """
    usage = "usage: %prog [options] suite_name"
    parser = optparse.OptionParser(usage=usage)
    parser.add_option('-a', '--autotest_dir', dest='autotest_dir',
                      default=os.path.abspath(
                          os.path.join(os.path.dirname(__file__),
                                       os.pardir)),
                      help='Directory under which to search for tests.'\
                           ' (e.g. /usr/local/autotest)')
    parser.add_option('-l', '--listall',
                      action='store_true', default=False,
                      help='Print a listing of all suites. Ignores all args.')
    options, args = parser.parse_args()
    return parser, options, args


def main():
    """Entry point to run the suite enumerator command."""
    parser, options, args = parse_options()
    if options.listall:
        if args:
            print('Cannot use suite_name with --listall')
            parser.print_help()
    elif not args or len(args) != 1:
        parser.print_help()
        return

    fs_getter = suite_lib.create_fs_getter(options.autotest_dir)
    devserver = cros_lib.dev_server.ImageServer('')
    if options.listall:
        for suite in suite_lib.list_all_suites('', devserver, fs_getter):
            print(suite)
        return

    suite = suite_lib.Suite.create_from_name(args[0], {}, '', devserver,
                                             fs_getter)
    # If in test list, print firmware_FAFTSetup before other tests
    # NOTE: the test.name value can be *different* from the directory
    # name that appears in test.path
    PRETEST_LIST = ['firmware_FAFTSetup',]
    for test in [test for test in suite.tests if test.name in
                 PRETEST_LIST]:
        print(test.path)
    for test in [test for test in suite.tests if test.name not in
                 PRETEST_LIST]:
        print(test.path)

    # Check if test_suites/control.suite_name exists.
    control_path = os.path.join(options.autotest_dir, 'test_suites',
                                'control.' + args[0])
    if not os.path.exists(control_path):
        print('Warning! control file is missing: %s' %
              control_path, file=sys.stderr)


if __name__ == "__main__":
    sys.exit(main())
