Index: tools/telemetry/telemetry/unittest/run_tests.py |
diff --git a/tools/telemetry/telemetry/unittest/run_tests.py b/tools/telemetry/telemetry/unittest/run_tests.py |
index 2605f342b2b5530cdfa9b90d0fece005cedfcdf2..352134140922d58ae0a25823d8f7227495eb3d00 100644 |
--- a/tools/telemetry/telemetry/unittest/run_tests.py |
+++ b/tools/telemetry/telemetry/unittest/run_tests.py |
@@ -6,70 +6,80 @@ import logging |
import unittest |
from telemetry import decorators |
+from telemetry.core import browser_finder |
from telemetry.core import browser_options |
+from telemetry.core import command_line |
from telemetry.core import discover |
-from telemetry.core import util |
-from telemetry.unittest import gtest_testrunner |
-from telemetry.unittest import options_for_unittests |
+from telemetry.unittest import gtest_unittest_results |
+ |
+ |
+class Environment(object): |
+ def __init__(self, top_level_dir, test_dirs): |
+ self._top_level_dir = top_level_dir |
+ self._test_dirs = tuple(test_dirs) |
+ |
+ @property |
+ def top_level_dir(self): |
+ return self._top_level_dir |
+ |
+ @property |
+ def test_dirs(self): |
+ return self._test_dirs |
def Discover(start_dir, top_level_dir=None, pattern='test*.py'): |
loader = unittest.defaultTestLoader |
- loader.suiteClass = gtest_testrunner.GTestTestSuite |
- subsuites = [] |
+ loader.suiteClass = gtest_unittest_results.GTestTestSuite |
+ test_suites = [] |
modules = discover.DiscoverModules(start_dir, top_level_dir, pattern) |
for module in modules: |
if hasattr(module, 'suite'): |
- new_suite = module.suite() |
+ suite = module.suite() |
else: |
- new_suite = loader.loadTestsFromModule(module) |
- if new_suite.countTestCases(): |
- subsuites.append(new_suite) |
- return gtest_testrunner.GTestTestSuite(subsuites) |
+ suite = loader.loadTestsFromModule(module) |
+ if suite.countTestCases(): |
+ test_suites.append(suite) |
+ return test_suites |
def FilterSuite(suite, predicate): |
new_suite = suite.__class__() |
- for x in suite: |
- if isinstance(x, unittest.TestSuite): |
- subsuite = FilterSuite(x, predicate) |
- if subsuite.countTestCases() == 0: |
- continue |
- |
- new_suite.addTest(subsuite) |
- continue |
- |
- assert isinstance(x, unittest.TestCase) |
- if predicate(x): |
- new_suite.addTest(x) |
+ for test in suite: |
+ if isinstance(test, unittest.TestSuite): |
+ subsuite = FilterSuite(test, predicate) |
+ if subsuite.countTestCases(): |
+ new_suite.addTest(subsuite) |
+ else: |
+ assert isinstance(test, unittest.TestCase) |
+ if predicate(test): |
+ new_suite.addTest(test) |
return new_suite |
-def DiscoverAndRunTests(dir_name, args, top_level_dir, possible_browser, |
- default_options, runner): |
- if not runner: |
- runner = gtest_testrunner.GTestTestRunner(print_result_after_run=True) |
- suite = Discover(dir_name, top_level_dir, '*_unittest.py') |
+def DiscoverTests(search_dirs, top_level_dir, possible_browser, |
+ selected_tests=None, run_disabled_tests=False): |
def IsTestSelected(test): |
- if len(args) != 0: |
+ if selected_tests: |
found = False |
- for name in args: |
+ for name in selected_tests: |
if name in test.id(): |
found = True |
if not found: |
return False |
- if default_options.run_disabled_tests: |
+ if run_disabled_tests: |
return True |
# pylint: disable=W0212 |
if not hasattr(test, '_testMethodName'): |
return True |
method = getattr(test, test._testMethodName) |
return decorators.IsEnabled(method, possible_browser) |
- filtered_suite = FilterSuite(suite, IsTestSelected) |
- test_result = runner.run(filtered_suite) |
- return test_result |
+ |
+ wrapper_suite = gtest_unittest_results.GTestTestSuite() |
+ for search_dir in search_dirs: |
+ wrapper_suite.addTests(Discover(search_dir, top_level_dir, '*_unittest.py')) |
+ return FilterSuite(wrapper_suite, IsTestSelected) |
def RestoreLoggingLevel(func): |
@@ -87,53 +97,51 @@ def RestoreLoggingLevel(func): |
return _LoggingRestoreWrapper |
-@RestoreLoggingLevel |
-def Main(args, start_dir, top_level_dir, runner=None): |
- """Unit test suite that collects all test cases for telemetry.""" |
- # Add unittest_data to the path so we can import packages from it. |
- util.AddDirToPythonPath(util.GetUnittestDataDir()) |
- |
- default_options = browser_options.BrowserFinderOptions() |
- default_options.browser_type = 'any' |
- |
- parser = default_options.CreateParser('run_tests [options] [test names]') |
- parser.add_option('--repeat-count', dest='run_test_repeat_count', |
- type='int', default=1, |
- help='Repeats each a provided number of times.') |
- parser.add_option('-d', '--also-run-disabled-tests', |
- dest='run_disabled_tests', |
- action='store_true', default=False, |
- help='Ignore @Disabled and @Enabled restrictions.') |
- |
- _, args = parser.parse_args(args) |
- |
- if default_options.verbosity == 0: |
- logging.getLogger().setLevel(logging.WARN) |
- |
- from telemetry.core import browser_finder |
- try: |
- browser_to_create = browser_finder.FindBrowser(default_options) |
- except browser_finder.BrowserFinderException, ex: |
- logging.error(str(ex)) |
- return 1 |
- |
- if browser_to_create == None: |
- logging.error('No browser found of type %s. Cannot run tests.', |
- default_options.browser_type) |
- logging.error('Re-run with --browser=list to see available browser types.') |
- return 1 |
- |
- options_for_unittests.Set(default_options, |
- browser_to_create.browser_type) |
- try: |
- success = True |
- for _ in xrange(default_options.run_test_repeat_count): |
- success = success and DiscoverAndRunTests( |
- start_dir, args, top_level_dir, browser_to_create, default_options, |
- runner) |
- if success: |
- return 0 |
- finally: |
- options_for_unittests.Set(None, None) |
- |
- return 1 |
+environment = None |
+ |
+ |
+class RunTestsCommand(command_line.OptparseCommand): |
+ """Run unit tests""" |
+ |
+ usage = '[test_name ...] [<options>]' |
+ |
+ @classmethod |
+ def CreateParser(cls): |
+ options = browser_options.BrowserFinderOptions() |
+ options.browser_type = 'any' |
+ parser = options.CreateParser('%%prog %s' % cls.usage) |
+ return parser |
+ |
+ @classmethod |
+ def AddCommandLineArgs(cls, parser): |
+ parser.add_option('--repeat-count', type='int', default=1, |
+ help='Repeats each a provided number of times.') |
+ parser.add_option('-d', '--also-run-disabled-tests', |
+ dest='run_disabled_tests', |
+ action='store_true', default=False, |
+ help='Ignore @Disabled and @Enabled restrictions.') |
+ |
+ @classmethod |
+ def ProcessCommandLineArgs(cls, parser, args): |
+ if args.verbosity == 0: |
+ logging.getLogger().setLevel(logging.WARN) |
+ |
+ try: |
+ possible_browser = browser_finder.FindBrowser(args) |
+ except browser_finder.BrowserFinderException, ex: |
+ parser.error(ex) |
+ |
+ if not possible_browser: |
+ parser.error('No browser found of type %s. Cannot run tests.\n' |
+ 'Re-run with --browser=list to see ' |
+ 'available browser types.' % args.browser_type) |
+ |
+ @RestoreLoggingLevel |
+ def Run(self, args): |
+ possible_browser = browser_finder.FindBrowser(args) |
+ test_suite = DiscoverTests( |
+ environment.test_dirs, environment.top_level_dir, possible_browser, |
+ args.positional_args, args.run_disabled_tests) |
+ runner = gtest_unittest_results.GTestTestRunner() |
+ result = runner.run(test_suite, args.repeat_count, args) |
+ return len(result.failures_and_errors) |