| #!/usr/bin/python3 |
| # |
| # Copyright 2012 The ChromiumOS Authors |
| # 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 ChromeOS 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.') |
| parser.add_option( |
| '--tsv', |
| action='store_true', |
| default=False, |
| help='Output a TSV file with path test name and TAST expressions.') |
| options, args = parser.parse_args() |
| return parser, options, args |
| |
| |
| def print_test(options, test): |
| """Prints one test to stdout.""" |
| if options.tsv: |
| print(f"{test.path}\t{getattr(test, 'name', '')}\t{getattr(test, 'tast_test_exprs', '')}" |
| ) |
| else: |
| print(test.path) |
| |
| |
| 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 options.tsv: |
| print("Path\tTest Name\tTAST expressions") |
| # 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(options, test) |
| for test in [test for test in suite.tests if test.name not in |
| PRETEST_LIST]: |
| print_test(options, test) |
| |
| # 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()) |