1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
8 from telemetry import decorators
9 from telemetry.core import browser_options
10 from telemetry.core import discover
11 from telemetry.core import util
12 from telemetry.unittest import gtest_testrunner
13 from telemetry.unittest import options_for_unittests
16 def Discover(start_dir, top_level_dir=None, pattern='test*.py'):
17 loader = unittest.defaultTestLoader
18 loader.suiteClass = gtest_testrunner.GTestTestSuite
21 modules = discover.DiscoverModules(start_dir, top_level_dir, pattern)
22 for module in modules:
23 if hasattr(module, 'suite'):
24 new_suite = module.suite()
26 new_suite = loader.loadTestsFromModule(module)
27 if new_suite.countTestCases():
28 subsuites.append(new_suite)
29 return gtest_testrunner.GTestTestSuite(subsuites)
32 def FilterSuite(suite, predicate):
33 new_suite = suite.__class__()
35 if isinstance(x, unittest.TestSuite):
36 subsuite = FilterSuite(x, predicate)
37 if subsuite.countTestCases() == 0:
40 new_suite.addTest(subsuite)
43 assert isinstance(x, unittest.TestCase)
50 def DiscoverAndRunTests(dir_name, args, top_level_dir, platform,
51 options, default_options, runner):
53 runner = gtest_testrunner.GTestTestRunner(inner=True)
54 suite = Discover(dir_name, top_level_dir, '*_unittest.py')
55 def IsTestSelected(test):
63 if default_options.run_disabled_tests:
65 # pylint: disable=W0212
66 if not hasattr(test, '_testMethodName'):
68 method = getattr(test, test._testMethodName)
69 return decorators.IsEnabled(method, options.GetBrowserType(), platform)
70 filtered_suite = FilterSuite(suite, IsTestSelected)
71 test_result = runner.run(filtered_suite)
75 def RestoreLoggingLevel(func):
76 def _LoggingRestoreWrapper(*args, **kwargs):
77 # Cache the current logging level, this needs to be done before calling
78 # parser.parse_args, which changes logging level based on verbosity
80 logging_level = logging.getLogger().getEffectiveLevel()
82 return func(*args, **kwargs)
84 # Restore logging level, which may be changed in parser.parse_args.
85 logging.getLogger().setLevel(logging_level)
87 return _LoggingRestoreWrapper
91 def Main(args, start_dir, top_level_dir, runner=None):
92 """Unit test suite that collects all test cases for telemetry."""
93 # Add unittest_data to the path so we can import packages from it.
94 util.AddDirToPythonPath(util.GetUnittestDataDir())
96 default_options = browser_options.BrowserFinderOptions()
97 default_options.browser_type = 'any'
99 parser = default_options.CreateParser('run_tests [options] [test names]')
100 parser.add_option('--repeat-count', dest='run_test_repeat_count',
101 type='int', default=1,
102 help='Repeats each a provided number of times.')
103 parser.add_option('-d', '--also-run-disabled-tests',
104 dest='run_disabled_tests',
105 action='store_true', default=False,
106 help='Ignore @Disabled and @Enabled restrictions.')
108 _, args = parser.parse_args(args)
110 if default_options.verbosity == 0:
111 logging.getLogger().setLevel(logging.WARN)
113 from telemetry.core import browser_finder
115 browser_to_create = browser_finder.FindBrowser(default_options)
116 except browser_finder.BrowserFinderException, ex:
117 logging.error(str(ex))
120 if browser_to_create == None:
121 logging.error('No browser found of type %s. Cannot run tests.',
122 default_options.browser_type)
123 logging.error('Re-run with --browser=list to see available browser types.')
126 options_for_unittests.Set(default_options,
127 browser_to_create.browser_type)
130 for _ in xrange(default_options.run_test_repeat_count):
131 success = success and DiscoverAndRunTests(
132 start_dir, args, top_level_dir, browser_to_create.platform,
133 options_for_unittests, default_options, runner)
137 options_for_unittests.Set(None, None)