#!/usr/bin/python
#
# 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
logging_CrashSender
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.
"""

import optparse, os, sys, time
import common
from autotest_lib.server.cros import control_file_getter, dynamic_suite

def parse_options():
    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__))),
                      help='Directory under which to search for tests.'\
                           ' (e.g. /usr/local/autotest)')
    parser.add_option('-s', '--stable_only', dest='add_experimental',
                      action='store_false', default=True,
                      help='List only tests that are not labeled experimental.')
    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():
    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 = dynamic_suite.Suite.create_fs_getter(options.autotest_dir)

    if options.listall:
        for suite in dynamic_suite.Suite.list_all_suites('', fs_getter):
            print suite
        return

    suite = dynamic_suite.Suite.create_from_name(args[0], '', fs_getter)
    for test in suite.stable_tests():
        print test.path
    if options.add_experimental:
        for test in suite.unstable_tests():
            print test.path


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