run_tests.py revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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.
4import logging
5import unittest
6
7from telemetry.core import browser_options
8from telemetry.core import discover
9from telemetry.core import util
10from telemetry.unittest import gtest_testrunner
11from telemetry.unittest import options_for_unittests
12
13def Discover(start_dir, top_level_dir=None, pattern='test*.py'):
14  loader = unittest.defaultTestLoader
15  loader.suiteClass = gtest_testrunner.GTestTestSuite
16  subsuites = []
17
18  modules = discover.DiscoverModules(start_dir, top_level_dir, pattern)
19  for module in modules:
20    if hasattr(module, 'suite'):
21      new_suite = module.suite()
22    else:
23      new_suite = loader.loadTestsFromModule(module)
24    if new_suite.countTestCases():
25      subsuites.append(new_suite)
26  return gtest_testrunner.GTestTestSuite(subsuites)
27
28
29def FilterSuite(suite, predicate):
30  new_suite = suite.__class__()
31  for x in suite:
32    if isinstance(x, unittest.TestSuite):
33      subsuite = FilterSuite(x, predicate)
34      if subsuite.countTestCases() == 0:
35        continue
36
37      new_suite.addTest(subsuite)
38      continue
39
40    assert isinstance(x, unittest.TestCase)
41    if predicate(x):
42      new_suite.addTest(x)
43
44  return new_suite
45
46
47def DiscoverAndRunTests(
48    dir_name, args, top_level_dir,
49    runner=None, run_disabled_tests=False):
50  if not runner:
51    runner = gtest_testrunner.GTestTestRunner(inner=True)
52
53  suite = Discover(dir_name, top_level_dir, '*_unittest.py')
54
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
64    if hasattr(test, '_testMethodName'):
65      method = getattr(test, test._testMethodName) # pylint: disable=W0212
66      if hasattr(method, '_requires_browser_types'):
67        types = method._requires_browser_types # pylint: disable=W0212
68        if options_for_unittests.GetBrowserType() not in types:
69          logging.debug('Skipping test %s because it requires %s' %
70                        (test.id(), types))
71          return False
72      if hasattr(method, '_disabled_test'):
73        if not run_disabled_tests:
74          return False
75
76    return True
77
78  filtered_suite = FilterSuite(suite, IsTestSelected)
79  test_result = runner.run(filtered_suite)
80  return test_result
81
82
83def Main(args, start_dir, top_level_dir, runner=None):
84  """Unit test suite that collects all test cases for telemetry."""
85  # Add unittest_data to the path so we can import packages from it.
86  util.AddDirToPythonPath(util.GetUnittestDataDir())
87
88  default_options = browser_options.BrowserFinderOptions()
89  default_options.browser_type = 'any'
90
91  parser = default_options.CreateParser('run_tests [options] [test names]')
92  parser.add_option('--repeat-count', dest='run_test_repeat_count',
93                    type='int', default=1,
94                    help='Repeats each a provided number of times.')
95  parser.add_option('-d', '--also-run-disabled-tests',
96                    dest='run_disabled_tests',
97                    action='store_true', default=False,
98                    help='Also run tests decorated with @DisabledTest.')
99
100  _, args = parser.parse_args(args)
101
102  logging_level = logging.getLogger().getEffectiveLevel()
103  if default_options.verbosity == 0:
104    logging.getLogger().setLevel(logging.WARN)
105
106  from telemetry.core import browser_finder
107  try:
108    browser_to_create = browser_finder.FindBrowser(default_options)
109  except browser_finder.BrowserFinderException, ex:
110    logging.error(str(ex))
111    return 1
112
113  if browser_to_create == None:
114    logging.error('No browser found of type %s. Cannot run tests.',
115                  default_options.browser_type)
116    logging.error('Re-run with --browser=list to see available browser types.')
117    return 1
118
119  options_for_unittests.Set(default_options,
120                            browser_to_create.browser_type)
121  try:
122    success = True
123    for _ in range(
124        default_options.run_test_repeat_count): # pylint: disable=E1101
125      success = success and DiscoverAndRunTests(
126        start_dir, args, top_level_dir,
127        runner, default_options.run_disabled_tests)
128    if success:
129      return 0
130  finally:
131    options_for_unittests.Set(None, None)
132    if default_options.verbosity == 0:
133      # Restore logging level.
134      logging.getLogger().setLevel(logging_level)
135
136  return 1
137