This patch splits GCMDriver into an abstract interface and an
[chromium-blink-merge.git] / tools / run-bisect-manual-test.py
blob6a2e4ffc3c19e360e6213c2e90200e01612451d0
1 #!/usr/bin/env python
2 # Copyright 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
6 """Run Manual Test Bisect Tool
8 An example usage:
9 tools/run-bisect-manual-test.py -g 201281 -b 201290
11 On Linux platform, follow the instructions in this document
12 https://code.google.com/p/chromium/wiki/LinuxSUIDSandboxDevelopment
13 to setup the sandbox manually before running the script. Otherwise the script
14 fails to launch Chrome and exits with an error.
16 """
18 import os
19 import subprocess
20 import sys
22 CROS_BOARD_ENV = 'BISECT_CROS_BOARD'
23 CROS_IP_ENV = 'BISECT_CROS_IP'
24 _DIR_TOOLS_ROOT = os.path.abspath(os.path.dirname(__file__))
26 sys.path.append(os.path.join(_DIR_TOOLS_ROOT, 'telemetry'))
27 from telemetry.core import browser_options
30 def _RunBisectionScript(options):
31 """Attempts to execute src/tools/bisect-perf-regression.py with the parameters
32 passed in.
34 Args:
35 options: The configuration options to pass to the bisect script.
37 Returns:
38 0 on success, otherwise 1.
39 """
40 test_command = 'python %s --browser=%s --chrome-root=.' %\
41 (os.path.join(_DIR_TOOLS_ROOT, 'bisect-manual-test.py'),
42 options.browser_type)
44 cmd = ['python', os.path.join(_DIR_TOOLS_ROOT, 'bisect-perf-regression.py'),
45 '-c', test_command,
46 '-g', options.good_revision,
47 '-b', options.bad_revision,
48 '-m', 'manual_test/manual_test',
49 '-r', '1',
50 '--working_directory', options.working_directory,
51 '--target_build_type', options.browser_type.title(),
52 '--build_preference', 'ninja',
53 '--use_goma',
54 '--no_custom_deps']
56 if 'cros' in options.browser_type:
57 cmd.extend(['--target_platform', 'cros'])
59 if os.environ[CROS_BOARD_ENV] and os.environ[CROS_IP_ENV]:
60 cmd.extend(['--cros_board', os.environ[CROS_BOARD_ENV]])
61 cmd.extend(['--cros_remote_ip', os.environ[CROS_IP_ENV]])
62 else:
63 print 'Error: Cros build selected, but BISECT_CROS_IP or'\
64 'BISECT_CROS_BOARD undefined.'
65 print
66 return 1
67 elif 'android' in options.browser_type:
68 cmd.extend(['--target_platform', 'android'])
70 cmd = [str(c) for c in cmd]
72 return_code = subprocess.call(cmd)
74 if return_code:
75 print 'Error: bisect-perf-regression.py returned with error %d' %\
76 return_code
77 print
79 return return_code
82 def main():
83 usage = ('%prog [options]\n'
84 'Used to run the bisection script with a manual test.')
86 options = browser_options.BrowserFinderOptions('release')
87 parser = options.CreateParser(usage)
89 parser.add_option('-b', '--bad_revision',
90 type='str',
91 help='A bad revision to start bisection. ' +
92 'Must be later than good revision. May be either a git' +
93 ' or svn revision.')
94 parser.add_option('-g', '--good_revision',
95 type='str',
96 help='A revision to start bisection where performance' +
97 ' test is known to pass. Must be earlier than the ' +
98 'bad revision. May be either a git or svn revision.')
99 parser.add_option('-w', '--working_directory',
100 type='str',
101 default='..',
102 help='A working directory to supply to the bisection '
103 'script, which will use it as the location to checkout '
104 'a copy of the chromium depot.')
106 options, args = parser.parse_args()
107 error_msg = ''
108 if not options.good_revision:
109 error_msg += 'Error: missing required parameter: --good_revision\n'
110 if not options.bad_revision:
111 error_msg += 'Error: missing required parameter: --bad_revision\n'
113 if error_msg:
114 print error_msg
115 parser.print_help()
116 return 1
118 if 'android' not in options.browser_type and sys.platform.startswith('linux'):
119 if not os.environ.get('CHROME_DEVEL_SANDBOX'):
120 print 'SUID sandbox has not been setup.'\
121 ' See https://code.google.com/p/chromium/wiki/'\
122 'LinuxSUIDSandboxDevelopment for more information.'
123 return 1
125 return _RunBisectionScript(options)
128 if __name__ == '__main__':
129 sys.exit(main())