| Index: infra/scripts/legacy/scripts/slave/runisolatedtest.py
|
| diff --git a/infra/scripts/legacy/scripts/slave/runisolatedtest.py b/infra/scripts/legacy/scripts/slave/runisolatedtest.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..e9b0fb061193476ebc9a858b10e41b60eacc3005
|
| --- /dev/null
|
| +++ b/infra/scripts/legacy/scripts/slave/runisolatedtest.py
|
| @@ -0,0 +1,169 @@
|
| +#!/usr/bin/env python
|
| +# 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.
|
| +
|
| +"""A tool to run a chrome test executable directly, or in isolated mode.
|
| +
|
| +TODO(maruel): This script technically needs to die and be replaced by running
|
| +all the tests always isolated even when not run on Swarming. This will take a
|
| +while.
|
| +"""
|
| +
|
| +import logging
|
| +import optparse
|
| +import os
|
| +import subprocess
|
| +import sys
|
| +
|
| +
|
| +USAGE = ('%s [options] /full/path/to/test.exe -- [original test command]' %
|
| + os.path.basename(sys.argv[0]))
|
| +
|
| +LINUX_ISOLATE_ENABLED_TESTS = set((
|
| + 'base_unittests',
|
| + 'browser_tests',
|
| + 'interactive_ui_tests',
|
| + 'net_unittests',
|
| + 'unit_tests',
|
| +))
|
| +
|
| +# TODO(maruel): Not enabled because of lack of XCode support and missing
|
| +# dependencies for more complex tests.
|
| +MAC_ISOLATE_ENABLED_TESTS = set()
|
| +
|
| +WIN_ISOLATE_ENABLED_TESTS = set((
|
| + 'base_unittests',
|
| + 'browser_tests',
|
| + 'interactive_ui_tests',
|
| + 'net_unittests',
|
| + 'unit_tests',
|
| +))
|
| +
|
| +# http://crbug.com/260311
|
| +# They are missing files for an unknown reason.
|
| +BUG_260311 = set((
|
| + 'browser_tests',
|
| + 'interactive_ui_tests',
|
| +))
|
| +
|
| +ISOLATE_ENABLED_BUILDERS = {
|
| + # CI linux
|
| + 'Linux Tests': LINUX_ISOLATE_ENABLED_TESTS,
|
| + # CI mac
|
| + 'Mac10.6 Tests (1)': MAC_ISOLATE_ENABLED_TESTS,
|
| + 'Mac10.7 Tests (1)': MAC_ISOLATE_ENABLED_TESTS,
|
| + # CI win
|
| + 'Vista Tests (1)': WIN_ISOLATE_ENABLED_TESTS - BUG_260311,
|
| + 'Vista Tests (2)': WIN_ISOLATE_ENABLED_TESTS - BUG_260311,
|
| + 'Vista Tests (3)': WIN_ISOLATE_ENABLED_TESTS - BUG_260311,
|
| + 'Win7 Tests (1)': WIN_ISOLATE_ENABLED_TESTS,
|
| + 'Win7 Tests (2)': WIN_ISOLATE_ENABLED_TESTS,
|
| + 'Win7 Tests (3)': WIN_ISOLATE_ENABLED_TESTS,
|
| + 'XP Tests (1)': WIN_ISOLATE_ENABLED_TESTS - BUG_260311,
|
| + 'XP Tests (2)': WIN_ISOLATE_ENABLED_TESTS - BUG_260311,
|
| + 'XP Tests (3)': WIN_ISOLATE_ENABLED_TESTS - BUG_260311,
|
| +
|
| + # Try Server
|
| + 'linux_rel': LINUX_ISOLATE_ENABLED_TESTS,
|
| + 'mac_rel': MAC_ISOLATE_ENABLED_TESTS,
|
| + 'win_rel': WIN_ISOLATE_ENABLED_TESTS,
|
| +}
|
| +
|
| +
|
| +def should_run_as_isolated(builder_name, test_name):
|
| + logging.info('should_run_as_isolated(%s, %s)' % (builder_name, test_name))
|
| + return test_name in ISOLATE_ENABLED_BUILDERS.get(builder_name, [])
|
| +
|
| +
|
| +def run_command(command):
|
| + """Inspired from chromium_utils.py's RunCommand()."""
|
| + print '\n' + subprocess.list2cmdline(command)
|
| + sys.stdout.flush()
|
| + sys.stderr.flush()
|
| + return subprocess.call(command)
|
| +
|
| +
|
| +def run_test_isolated(isolate_script, test_exe, original_command):
|
| + """Runs the test under isolate.py run.
|
| +
|
| + It compensates for discrepancies between sharding_supervisor.py arguments and
|
| + run_test_cases.py arguments.
|
| +
|
| + The isolated file must be alongside the test executable, with the same
|
| + name and the .isolated extension.
|
| + """
|
| + isolated_file = os.path.splitext(test_exe)[0] + '.isolated'
|
| +
|
| + if not os.path.exists(isolated_file):
|
| + logging.error('No isolate file %s', isolated_file)
|
| + return 1
|
| +
|
| + isolate_command = [sys.executable, isolate_script,
|
| + 'run', '--isolated', isolated_file,
|
| + # Print info log lines, so isolate.py prints the path to
|
| + # the binary it's about to run, http://crbug.com/311625
|
| + '-v']
|
| +
|
| + # Start setting the test specific options.
|
| + isolate_command.append('--')
|
| + isolate_command.append('--no-cr')
|
| + original_command = original_command[:]
|
| + while original_command:
|
| + item = original_command.pop(0)
|
| + if item == '--total-slave':
|
| + isolate_command.extend(['--shards', original_command.pop(0)])
|
| + elif item == '--slave-index':
|
| + isolate_command.extend(['--index', original_command.pop(0)])
|
| + elif item.startswith(('--gtest_filter',
|
| + '--gtest_output',
|
| + '--test-launcher')):
|
| + isolate_command.append(item)
|
| +
|
| + return run_command(isolate_command)
|
| +
|
| +
|
| +def main(argv):
|
| + option_parser = optparse.OptionParser(USAGE)
|
| + option_parser.add_option('--test_name', default='',
|
| + help='The name of the test')
|
| + option_parser.add_option('--builder_name', default='',
|
| + help='The name of the builder that created this'
|
| + 'test')
|
| + option_parser.add_option('--checkout_dir',
|
| + help='Checkout directory, used to locate the '
|
| + 'swarm_client scripts.')
|
| + option_parser.add_option('-f', '--force-isolated', action='store_true',
|
| + help='Force test to run isolated. By default only '
|
| + 'white listed builders and tests are run isolated.')
|
| + option_parser.add_option('-v', '--verbose', action='count', default=0,
|
| + help='Use to increase log verbosity. Can be passed '
|
| + 'in multiple times for more detailed logs.')
|
| +
|
| + options, args = option_parser.parse_args(argv)
|
| +
|
| + test_exe = args[0]
|
| + original_command = args[1:]
|
| +
|
| + # Initialize logging.
|
| + level = [logging.ERROR, logging.INFO, logging.DEBUG][min(2, options.verbose)]
|
| + logging.basicConfig(level=level,
|
| + format='%(asctime)s %(filename)s:%(lineno)-3d'
|
| + ' %(levelname)s %(message)s',
|
| + datefmt='%y%m%d %H:%M:%S')
|
| +
|
| + if (options.force_isolated or
|
| + should_run_as_isolated(options.builder_name, options.test_name)):
|
| + logging.info('Running test in isolate mode')
|
| + # Search first in swarming_client
|
| + isolate_script = os.path.join(options.checkout_dir, 'src', 'tools',
|
| + 'swarming_client', 'isolate.py')
|
| +
|
| + return run_test_isolated(isolate_script, test_exe, original_command)
|
| + else:
|
| + logging.info('Running test normally')
|
| + return run_command(original_command)
|
| +
|
| +
|
| +if '__main__' == __name__:
|
| + sys.exit(main(None))
|
|
|