run_tests.py revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1# Copyright 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. 4 5import logging 6import unittest 7 8from telemetry import decorators 9from telemetry.core import browser_options 10from telemetry.core import discover 11from telemetry.core import util 12from telemetry.unittest import gtest_testrunner 13from telemetry.unittest import options_for_unittests 14 15 16def Discover(start_dir, top_level_dir=None, pattern='test*.py'): 17 loader = unittest.defaultTestLoader 18 loader.suiteClass = gtest_testrunner.GTestTestSuite 19 subsuites = [] 20 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() 25 else: 26 new_suite = loader.loadTestsFromModule(module) 27 if new_suite.countTestCases(): 28 subsuites.append(new_suite) 29 return gtest_testrunner.GTestTestSuite(subsuites) 30 31 32def FilterSuite(suite, predicate): 33 new_suite = suite.__class__() 34 for x in suite: 35 if isinstance(x, unittest.TestSuite): 36 subsuite = FilterSuite(x, predicate) 37 if subsuite.countTestCases() == 0: 38 continue 39 40 new_suite.addTest(subsuite) 41 continue 42 43 assert isinstance(x, unittest.TestCase) 44 if predicate(x): 45 new_suite.addTest(x) 46 47 return new_suite 48 49 50def DiscoverAndRunTests(dir_name, args, top_level_dir, platform, 51 options, default_options, runner): 52 if not runner: 53 runner = gtest_testrunner.GTestTestRunner(inner=True) 54 suite = Discover(dir_name, top_level_dir, '*_unittest.py') 55 def IsTestSelected(test): 56 if len(args) != 0: 57 found = False 58 for name in args: 59 if name in test.id(): 60 found = True 61 if not found: 62 return False 63 if default_options.run_disabled_tests: 64 return True 65 # pylint: disable=W0212 66 if not hasattr(test, '_testMethodName'): 67 return True 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) 72 return test_result 73 74 75def 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 79 # setting. 80 logging_level = logging.getLogger().getEffectiveLevel() 81 try: 82 return func(*args, **kwargs) 83 finally: 84 # Restore logging level, which may be changed in parser.parse_args. 85 logging.getLogger().setLevel(logging_level) 86 87 return _LoggingRestoreWrapper 88 89 90@RestoreLoggingLevel 91def 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()) 95 96 default_options = browser_options.BrowserFinderOptions() 97 default_options.browser_type = 'any' 98 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.') 107 108 _, args = parser.parse_args(args) 109 110 if default_options.verbosity == 0: 111 logging.getLogger().setLevel(logging.WARN) 112 113 from telemetry.core import browser_finder 114 try: 115 browser_to_create = browser_finder.FindBrowser(default_options) 116 except browser_finder.BrowserFinderException, ex: 117 logging.error(str(ex)) 118 return 1 119 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.') 124 return 1 125 126 options_for_unittests.Set(default_options, 127 browser_to_create.browser_type) 128 try: 129 success = True 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) 134 if success: 135 return 0 136 finally: 137 options_for_unittests.Set(None, None) 138 139 return 1 140