Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """A tool to run a chrome test executable directly, or in isolated mode.""" | 6 """A tool to run a chrome test executable directly, or in isolated mode. |
| 7 | |
| 8 TODO(maruel): This script technically needs to die and be replaced by running | |
| 9 all the tests always isolated even when not run on Swarming. This will take a | |
| 10 while. | |
| 11 """ | |
| 7 | 12 |
| 8 import json | 13 import json |
| 9 import logging | 14 import logging |
| 10 import optparse | 15 import optparse |
| 11 import os | 16 import os |
| 12 import re | 17 import re |
| 13 import subprocess | 18 import subprocess |
| 14 import sys | 19 import sys |
| 15 | 20 |
| 16 from slave import build_directory | 21 from slave import build_directory |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 90 | 95 |
| 91 | 96 |
| 92 def sanitize_isolated_file(isolated_file, build_dir_basename): | 97 def sanitize_isolated_file(isolated_file, build_dir_basename): |
| 93 """Crack open .isolated file and fix embedded paths, if necessary. | 98 """Crack open .isolated file and fix embedded paths, if necessary. |
| 94 | 99 |
| 95 isolates assume that they can embed the build directory at build time and | 100 isolates assume that they can embed the build directory at build time and |
| 96 still used that directory at test time. With a builder/tester setup, this | 101 still used that directory at test time. With a builder/tester setup, this |
| 97 isn't generally true, so rewrite the paths in the isolated file. See | 102 isn't generally true, so rewrite the paths in the isolated file. See |
| 98 http://crbug.com/311622 for details. This can go away once all bots using | 103 http://crbug.com/311622 for details. This can go away once all bots using |
| 99 isolates are using ninja. | 104 isolates are using ninja. |
| 105 | |
| 106 TODO(maruel): Do not forget to delete this code once the Windows incremental | |
| 107 builder is switched to ninja. | |
| 100 """ | 108 """ |
| 101 # See the isolates file format description at: | 109 # See the isolates file format description at: |
| 102 # https://code.google.com/p/swarming/wiki/IsolatedDesign#.isolated_file_format | 110 # https://code.google.com/p/swarming/wiki/IsolatedDesign#.isolated_file_format |
| 103 with open(isolated_file) as f: | 111 with open(isolated_file) as f: |
| 104 isolated_data = json.load(f) | 112 isolated_data = json.load(f) |
| 105 | 113 |
| 106 # 1. check version | 114 # 1. check version |
| 107 if isolated_data['version'].split('.', 1)[0] != '1': | 115 if isolated_data['version'].split('.', 1)[0] != '1': |
|
Nico
2013/12/13 20:00:06
Should this be a whitelist of versions then after
M-A Ruel
2013/12/13 20:02:25
.isolated files *are* backward compatibles. It's b
| |
| 108 logging.error('Unexpected isolate version %s', isolated_data['version']) | 116 logging.error('Unexpected isolate version %s', isolated_data['version']) |
| 109 return 1 | 117 return 1 |
| 110 | 118 |
| 111 # 2. fix command, print it | 119 # 2. fix command, print it |
| 112 for i in range(len(isolated_data['command'])): | 120 for i in range(len(isolated_data['command'])): |
| 113 arg = isolated_data['command'][i] | 121 arg = isolated_data['command'][i] |
| 114 isolated_data['command'][i] = sanitize_build_dir(arg, build_dir_basename) | 122 isolated_data['command'][i] = sanitize_build_dir(arg, build_dir_basename) |
| 115 | 123 |
| 116 # 3. fix files | 124 # 3. fix files |
| 117 sanitized_files = {} | 125 sanitized_files = {} |
| 118 for key, value in isolated_data['files'].iteritems(): | 126 for key, value in isolated_data['files'].iteritems(): |
| 119 # a) fix key | 127 # a) fix key |
| 120 key = sanitize_build_dir(key, build_dir_basename) | 128 key = sanitize_build_dir(key, build_dir_basename) |
| 121 sanitized_files[key] = value | 129 sanitized_files[key] = value |
| 122 # b) fix 'l' entry | 130 # b) fix 'l' entry |
| 123 if 'l' in value: | 131 if 'l' in value: |
| 124 value['l'] = sanitize_build_dir(value['l'], build_dir_basename) | 132 value['l'] = sanitize_build_dir(value['l'], build_dir_basename) |
| 125 isolated_data['files'] = sanitized_files | 133 isolated_data['files'] = sanitized_files |
| 126 | 134 |
| 127 # 4. Fix variables->PRODUCT_DIR if necessary (only present in the .state file) | 135 # 4. Fix variables->PRODUCT_DIR if necessary (only present in the .state file) |
| 128 variables = isolated_data.get('variables', {}) | 136 for name in ('path_variables', 'variables'): |
| 129 if 'PRODUCT_DIR' in variables: | 137 variables = isolated_data.get(name, {}) |
| 130 variables['PRODUCT_DIR'] = sanitize_build_dir(variables['PRODUCT_DIR'], | 138 if 'PRODUCT_DIR' in variables: |
| 131 build_dir_basename) | 139 variables['PRODUCT_DIR'] = sanitize_build_dir(variables['PRODUCT_DIR'], |
| 140 build_dir_basename) | |
| 132 | 141 |
| 133 # TODO(thakis): fix 'includes' if necessary. | 142 # TODO(thakis): fix 'includes' if necessary. |
| 134 | 143 |
| 135 with open(isolated_file, 'w') as f: | 144 with open(isolated_file, 'w') as f: |
| 136 json.dump(isolated_data, f) | 145 json.dump(isolated_data, f) |
| 137 | 146 |
| 138 | 147 |
| 139 def run_test_isolated(isolate_script, test_exe, original_command): | 148 def run_test_isolated(isolate_script, test_exe, original_command): |
| 140 """Runs the test under isolate.py run. | 149 """Runs the test under isolate.py run. |
| 141 | 150 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 224 isolate_script = os.path.join(options.checkout_dir, 'src', 'tools', | 233 isolate_script = os.path.join(options.checkout_dir, 'src', 'tools', |
| 225 'swarm_client', 'isolate.py') | 234 'swarm_client', 'isolate.py') |
| 226 return run_test_isolated(isolate_script, test_exe, original_command) | 235 return run_test_isolated(isolate_script, test_exe, original_command) |
| 227 else: | 236 else: |
| 228 logging.info('Running test normally') | 237 logging.info('Running test normally') |
| 229 return run_command(original_command) | 238 return run_command(original_command) |
| 230 | 239 |
| 231 | 240 |
| 232 if '__main__' == __name__: | 241 if '__main__' == __name__: |
| 233 sys.exit(main(None)) | 242 sys.exit(main(None)) |
| OLD | NEW |