blob: 85010839982c017c7caa48bd81ca0a672adcae6b [file] [log] [blame]
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import unittest
from telemetry.core import browser_options
from telemetry.core import discover
from telemetry.core import util
from telemetry.unittest import gtest_testrunner
from telemetry.unittest import options_for_unittests
def Discover(start_dir, top_level_dir=None, pattern='test*.py'):
loader = unittest.defaultTestLoader
loader.suiteClass = gtest_testrunner.GTestTestSuite
subsuites = []
modules = discover.DiscoverModules(start_dir, top_level_dir, pattern)
for module in modules:
if hasattr(module, 'suite'):
new_suite = module.suite()
else:
new_suite = loader.loadTestsFromModule(module)
if new_suite.countTestCases():
subsuites.append(new_suite)
return gtest_testrunner.GTestTestSuite(subsuites)
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)
return new_suite
def DiscoverAndRunTests(
dir_name, args, top_level_dir,
runner=None, run_disabled_tests=False):
if not runner:
runner = gtest_testrunner.GTestTestRunner(inner=True)
suite = Discover(dir_name, top_level_dir, '*_unittest.py')
def IsTestSelected(test):
if len(args) != 0:
found = False
for name in args:
if name in test.id():
found = True
if not found:
return False
if hasattr(test, '_testMethodName'):
method = getattr(test, test._testMethodName) # pylint: disable=W0212
if hasattr(method, '_requires_browser_types'):
types = method._requires_browser_types # pylint: disable=W0212
if options_for_unittests.GetBrowserType() not in types:
logging.debug('Skipping test %s because it requires %s' %
(test.id(), types))
return False
if hasattr(method, '_disabled_test'):
if not run_disabled_tests:
return False
return True
filtered_suite = FilterSuite(suite, IsTestSelected)
test_result = runner.run(filtered_suite)
return test_result
def RestoreLoggingLevel(func):
def _LoggingRestoreWrapper(*args, **kwargs):
# Cache the current logging level, this needs to be done before calling
# parser.parse_args, which changes logging level based on verbosity
# setting.
logging_level = logging.getLogger().getEffectiveLevel()
try:
return func(*args, **kwargs)
finally:
# Restore logging level, which may be changed in parser.parse_args.
logging.getLogger().setLevel(logging_level)
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='Also run tests decorated with @DisabledTest.')
_, 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 range(
default_options.run_test_repeat_count): # pylint: disable=E1101
success = success and DiscoverAndRunTests(
start_dir, args, top_level_dir,
runner, default_options.run_disabled_tests)
if success:
return 0
finally:
options_for_unittests.Set(None, None)
return 1