| #!/usr/bin/env python |
| # Copyright 2013 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. |
| |
| """Run Manual Test Bisect Tool |
| |
| An example usage: |
| tools/run-bisect-manual-test.py -g 201281 -b 201290 |
| |
| On Linux platform, follow the instructions in this document |
| https://code.google.com/p/chromium/wiki/LinuxSUIDSandboxDevelopment |
| to setup the sandbox manually before running the script. Otherwise the script |
| fails to launch Chrome and exits with an error. |
| |
| """ |
| |
| import os |
| import subprocess |
| import sys |
| |
| CROS_BOARD_ENV = 'BISECT_CROS_BOARD' |
| CROS_IP_ENV = 'BISECT_CROS_IP' |
| _DIR_TOOLS_ROOT = os.path.abspath(os.path.dirname(__file__)) |
| |
| sys.path.append(os.path.join(_DIR_TOOLS_ROOT, 'telemetry')) |
| from telemetry.core import browser_options |
| |
| |
| def _RunBisectionScript(options): |
| """Attempts to execute src/tools/bisect-perf-regression.py with the parameters |
| passed in. |
| |
| Args: |
| options: The configuration options to pass to the bisect script. |
| |
| Returns: |
| 0 on success, otherwise 1. |
| """ |
| test_command = 'python %s --browser=%s --chrome-root=.' %\ |
| (os.path.join(_DIR_TOOLS_ROOT, 'bisect-manual-test.py'), |
| options.browser_type) |
| |
| cmd = ['python', os.path.join(_DIR_TOOLS_ROOT, 'bisect-perf-regression.py'), |
| '-c', test_command, |
| '-g', options.good_revision, |
| '-b', options.bad_revision, |
| '-m', 'manual_test/manual_test', |
| '-r', '1', |
| '--working_directory', options.working_directory, |
| '--build_preference', 'ninja', |
| '--use_goma', |
| '--no_custom_deps'] |
| |
| if 'cros' in options.browser_type: |
| cmd.extend(['--target_platform', 'cros']) |
| |
| if os.environ[CROS_BOARD_ENV] and os.environ[CROS_IP_ENV]: |
| cmd.extend(['--cros_board', os.environ[CROS_BOARD_ENV]]) |
| cmd.extend(['--cros_remote_ip', os.environ[CROS_IP_ENV]]) |
| else: |
| print 'Error: Cros build selected, but BISECT_CROS_IP or'\ |
| 'BISECT_CROS_BOARD undefined.' |
| print |
| return 1 |
| elif 'android' in options.browser_type: |
| cmd.extend(['--target_platform', 'android']) |
| |
| cmd = [str(c) for c in cmd] |
| |
| return_code = subprocess.call(cmd) |
| |
| if return_code: |
| print 'Error: bisect-perf-regression.py returned with error %d' %\ |
| return_code |
| print |
| |
| return return_code |
| |
| |
| def main(): |
| usage = ('%prog [options]\n' |
| 'Used to run the bisection script with a manual test.') |
| |
| options = browser_options.BrowserFinderOptions('release') |
| parser = options.CreateParser(usage) |
| |
| parser.add_option('-b', '--bad_revision', |
| type='str', |
| help='A bad revision to start bisection. ' + |
| 'Must be later than good revision. May be either a git' + |
| ' or svn revision.') |
| parser.add_option('-g', '--good_revision', |
| type='str', |
| help='A revision to start bisection where performance' + |
| ' test is known to pass. Must be earlier than the ' + |
| 'bad revision. May be either a git or svn revision.') |
| parser.add_option('-w', '--working_directory', |
| type='str', |
| default='..', |
| help='A working directory to supply to the bisection ' |
| 'script, which will use it as the location to checkout ' |
| 'a copy of the chromium depot.') |
| |
| options, args = parser.parse_args() |
| error_msg = '' |
| if not options.good_revision: |
| error_msg += 'Error: missing required parameter: --good_revision\n' |
| if not options.bad_revision: |
| error_msg += 'Error: missing required parameter: --bad_revision\n' |
| |
| if error_msg: |
| print error_msg |
| parser.print_help() |
| return 1 |
| |
| if 'android' not in options.browser_type and sys.platform.startswith('linux'): |
| if not os.environ.get('CHROME_DEVEL_SANDBOX'): |
| print 'SUID sandbox has not been setup.'\ |
| ' See https://code.google.com/p/chromium/wiki/'\ |
| 'LinuxSUIDSandboxDevelopment for more information.' |
| return 1 |
| |
| return _RunBisectionScript(options) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |