| Index: tools/telemetry/telemetry/testing/run_tests.py
|
| diff --git a/tools/telemetry/telemetry/testing/run_tests.py b/tools/telemetry/telemetry/testing/run_tests.py
|
| deleted file mode 100644
|
| index 9a9165e2a4ef1c3cfb8c6b873156d84ccc184b1a..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/testing/run_tests.py
|
| +++ /dev/null
|
| @@ -1,245 +0,0 @@
|
| -# Copyright 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 sys
|
| -
|
| -from telemetry.core import util
|
| -from telemetry.core import platform as platform_module
|
| -from telemetry import decorators
|
| -from telemetry.internal.browser import browser_finder
|
| -from telemetry.internal.browser import browser_finder_exceptions
|
| -from telemetry.internal.browser import browser_options
|
| -from telemetry.internal.platform import device_finder
|
| -from telemetry.internal.util import binary_manager
|
| -from telemetry.internal.util import command_line
|
| -from telemetry.internal.util import ps_util
|
| -from telemetry.testing import browser_test_case
|
| -from telemetry.testing import options_for_unittests
|
| -
|
| -import typ
|
| -
|
| -
|
| -class RunTestsCommand(command_line.OptparseCommand):
|
| - """Run unit tests"""
|
| -
|
| - usage = '[test_name ...] [<options>]'
|
| -
|
| - def __init__(self):
|
| - super(RunTestsCommand, self).__init__()
|
| - self.stream = sys.stdout
|
| -
|
| - @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('--no-browser', action='store_true', default=False,
|
| - help='Don\'t require an actual browser to run the tests.')
|
| - parser.add_option('-d', '--also-run-disabled-tests',
|
| - dest='run_disabled_tests',
|
| - action='store_true', default=False,
|
| - help='Ignore @Disabled and @Enabled restrictions.')
|
| - parser.add_option('--exact-test-filter', action='store_true', default=False,
|
| - help='Treat test filter as exact matches (default is '
|
| - 'substring matches).')
|
| - parser.add_option('--client-config', dest='client_config', default=None)
|
| - parser.add_option('--disable-logging-config', action='store_true',
|
| - default=False, help='Configure logging (default on)')
|
| -
|
| - typ.ArgumentParser.add_option_group(parser,
|
| - "Options for running the tests",
|
| - running=True,
|
| - skip=['-d', '-v', '--verbose'])
|
| - typ.ArgumentParser.add_option_group(parser,
|
| - "Options for reporting the results",
|
| - reporting=True)
|
| -
|
| - @classmethod
|
| - def ProcessCommandLineArgs(cls, parser, args, _):
|
| - # We retry failures by default unless we're running a list of tests
|
| - # explicitly.
|
| - if not args.retry_limit and not args.positional_args:
|
| - args.retry_limit = 3
|
| -
|
| - if args.no_browser:
|
| - return
|
| -
|
| - try:
|
| - possible_browser = browser_finder.FindBrowser(args)
|
| - except browser_finder_exceptions.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)
|
| -
|
| - @classmethod
|
| - def main(cls, args=None, stream=None): # pylint: disable=arguments-differ
|
| - # We override the superclass so that we can hook in the 'stream' arg.
|
| - parser = cls.CreateParser()
|
| - cls.AddCommandLineArgs(parser, None)
|
| - options, positional_args = parser.parse_args(args)
|
| - options.positional_args = positional_args
|
| -
|
| - # Must initialize the DependencyManager before calling
|
| - # browser_finder.FindBrowser(args)
|
| - binary_manager.InitDependencyManager(options.client_config)
|
| - cls.ProcessCommandLineArgs(parser, options, None)
|
| -
|
| - obj = cls()
|
| - if stream is not None:
|
| - obj.stream = stream
|
| - return obj.Run(options)
|
| -
|
| - def Run(self, args):
|
| - runner = typ.Runner()
|
| - if self.stream:
|
| - runner.host.stdout = self.stream
|
| -
|
| - if args.no_browser:
|
| - possible_browser = None
|
| - platform = platform_module.GetHostPlatform()
|
| - else:
|
| - possible_browser = browser_finder.FindBrowser(args)
|
| - platform = possible_browser.platform
|
| -
|
| - # Telemetry seems to overload the system if we run one test per core,
|
| - # so we scale things back a fair amount. Many of the telemetry tests
|
| - # are long-running, so there's a limit to how much parallelism we
|
| - # can effectively use for now anyway.
|
| - #
|
| - # It should be possible to handle multiple devices if we adjust the
|
| - # browser_finder code properly, but for now we only handle one on ChromeOS.
|
| - if platform.GetOSName() == 'chromeos':
|
| - runner.args.jobs = 1
|
| - elif platform.GetOSName() == 'android':
|
| - runner.args.jobs = len(device_finder.GetDevicesMatchingOptions(args))
|
| - print 'Running tests with %d Android device(s).' % runner.args.jobs
|
| - elif platform.GetOSVersionName() == 'xp':
|
| - # For an undiagnosed reason, XP falls over with more parallelism.
|
| - # See crbug.com/388256
|
| - runner.args.jobs = max(int(args.jobs) // 4, 1)
|
| - else:
|
| - runner.args.jobs = max(int(args.jobs) // 2, 1)
|
| -
|
| - runner.args.metadata = args.metadata
|
| - runner.args.passthrough = args.passthrough
|
| - runner.args.path = args.path
|
| - runner.args.retry_limit = args.retry_limit
|
| - runner.args.test_results_server = args.test_results_server
|
| - runner.args.test_type = args.test_type
|
| - runner.args.top_level_dir = args.top_level_dir
|
| - runner.args.write_full_results_to = args.write_full_results_to
|
| - runner.args.write_trace_to = args.write_trace_to
|
| - runner.args.list_only = args.list_only
|
| -
|
| - runner.args.path.append(util.GetUnittestDataDir())
|
| -
|
| - # Always print out these info for the ease of debugging.
|
| - runner.args.timing = True
|
| - runner.args.verbose = 3
|
| -
|
| - runner.classifier = GetClassifier(args, possible_browser)
|
| - runner.context = args
|
| - runner.setup_fn = _SetUpProcess
|
| - runner.teardown_fn = _TearDownProcess
|
| - runner.win_multiprocessing = typ.WinMultiprocessing.importable
|
| - try:
|
| - ret, _, _ = runner.run()
|
| - except KeyboardInterrupt:
|
| - print >> sys.stderr, "interrupted, exiting"
|
| - ret = 130
|
| - return ret
|
| -
|
| -
|
| -def GetClassifier(args, possible_browser):
|
| -
|
| - def ClassifyTestWithoutBrowser(test_set, test):
|
| - name = test.id()
|
| - if (not args.positional_args
|
| - or _MatchesSelectedTest(name, args.positional_args,
|
| - args.exact_test_filter)):
|
| - # TODO(telemetry-team): Make sure that all telemetry unittest that invokes
|
| - # actual browser are subclasses of browser_test_case.BrowserTestCase
|
| - # (crbug.com/537428)
|
| - if issubclass(test.__class__, browser_test_case.BrowserTestCase):
|
| - test_set.tests_to_skip.append(typ.TestInput(
|
| - name, msg='Skip the test because it requires a browser.'))
|
| - else:
|
| - test_set.parallel_tests.append(typ.TestInput(name))
|
| -
|
| - def ClassifyTestWithBrowser(test_set, test):
|
| - name = test.id()
|
| - if (not args.positional_args
|
| - or _MatchesSelectedTest(name, args.positional_args,
|
| - args.exact_test_filter)):
|
| - assert hasattr(test, '_testMethodName')
|
| - method = getattr(
|
| - test, test._testMethodName) # pylint: disable=protected-access
|
| - should_skip, reason = decorators.ShouldSkip(method, possible_browser)
|
| - if should_skip and not args.run_disabled_tests:
|
| - test_set.tests_to_skip.append(typ.TestInput(name, msg=reason))
|
| - elif decorators.ShouldBeIsolated(method, possible_browser):
|
| - test_set.isolated_tests.append(typ.TestInput(name))
|
| - else:
|
| - test_set.parallel_tests.append(typ.TestInput(name))
|
| -
|
| - if possible_browser:
|
| - return ClassifyTestWithBrowser
|
| - else:
|
| - return ClassifyTestWithoutBrowser
|
| -
|
| -
|
| -def _MatchesSelectedTest(name, selected_tests, selected_tests_are_exact):
|
| - if not selected_tests:
|
| - return False
|
| - if selected_tests_are_exact:
|
| - return any(name in selected_tests)
|
| - else:
|
| - return any(test in name for test in selected_tests)
|
| -
|
| -
|
| -def _SetUpProcess(child, context): # pylint: disable=unused-argument
|
| - ps_util.EnableListingStrayProcessesUponExitHook()
|
| - if binary_manager.NeedsInit():
|
| - # Typ doesn't keep the DependencyManager initialization in the child
|
| - # processes.
|
| - binary_manager.InitDependencyManager(context.client_config)
|
| - # We need to reset the handlers in case some other parts of telemetry already
|
| - # set it to make this work.
|
| - logging.getLogger().handlers = []
|
| - logging.basicConfig(
|
| - level=logging.INFO,
|
| - format='(%(levelname)s) %(asctime)s %(module)s.%(funcName)s:%(lineno)d '
|
| - '%(message)s')
|
| - args = context
|
| - if not args.disable_logging_config:
|
| - logging.getLogger().handlers = []
|
| - logging.basicConfig(
|
| - level=logging.INFO,
|
| - format='(%(levelname)s) %(asctime)s %(module)s.%(funcName)s:%(lineno)d'
|
| - ' %(message)s')
|
| - if args.device and args.device == 'android':
|
| - android_devices = device_finder.GetDevicesMatchingOptions(args)
|
| - args.device = android_devices[child.worker_num-1].guid
|
| - options_for_unittests.Push(args)
|
| -
|
| -
|
| -def _TearDownProcess(child, context): # pylint: disable=unused-argument
|
| - # It's safe to call teardown_browser even if we did not start any browser
|
| - # in any of the tests.
|
| - browser_test_case.teardown_browser()
|
| - options_for_unittests.Pop()
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - ret_code = RunTestsCommand.main()
|
| - sys.exit(ret_code)
|
|
|