Chromium Code Reviews| Index: build/find_isolated_tests.py |
| diff --git a/build/find_isolated_tests.py b/build/find_isolated_tests.py |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..e19142ebd431bcfa8cfdfdd70299599e8be3bace |
| --- /dev/null |
| +++ b/build/find_isolated_tests.py |
| @@ -0,0 +1,79 @@ |
| +#!/usr/bin/env python |
| +# Copyright 2014 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. |
| + |
| +"""Scans build output directory for .isolated files, calculates their SHA1 |
| +hashes, stores final list in JSON document and then removes *.isolated files |
| +found (to ensure no stale *.isolated stay around on the next build). |
| + |
| +Used to figure out what tests were build in isolated mode to trigger these |
| +tests to run on swarming. |
| + |
| +For more info see: |
| +https://sites.google.com/a/chromium.org/dev/developers/testing/isolated-testing |
| +""" |
| + |
| +import glob |
| +import hashlib |
| +import json |
| +import optparse |
| +import os |
| +import re |
| +import sys |
| + |
| + |
| +def hash_file(filepath): |
| + """Calculates the hash of a file without reading it all in memory at once.""" |
| + digest = hashlib.sha1() |
| + with open(filepath, 'rb') as f: |
| + while True: |
| + chunk = f.read(1024*1024) |
| + if not chunk: |
| + break |
| + digest.update(chunk) |
| + return digest.hexdigest() |
| + |
| + |
| +def main(): |
| + parser = optparse.OptionParser( |
| + usage='%prog --build-dir <path> --output-json <path>', |
| + description=sys.modules[__name__].__doc__) |
| + parser.add_option( |
| + '--build-dir', |
| + help='Path to a directory to search for *.isolated files.') |
| + parser.add_option( |
| + '--output-json', |
| + help='File to dump JSON results into.') |
| + |
| + options, _ = parser.parse_args() |
| + build_dir = options.build_dir |
|
M-A Ruel
2014/02/28 19:25:02
why, you want so save space on line 60? I'd person
Vadim Sh.
2014/02/28 19:30:04
Okay.. 'for' line didn't fit into 80 chars (and I
|
| + if not build_dir: |
| + parser.error('--build-dir option is required') |
| + output_json = options.output_json |
| + if not output_json: |
| + parser.error('--output-json option is required') |
| + |
| + result = {} |
| + |
| + # Get the file hash values and output the pair. |
| + for filepath in sorted(glob.glob(os.path.join(build_dir, '*.isolated'))): |
| + test_name = os.path.splitext(os.path.basename(filepath))[0] |
| + if re.match(r'^.+?\.\d$', test_name): |
| + # It's a split .isolated file, e.g. foo.0.isolated. Ignore these. |
| + continue |
| + |
| + # TODO(csharp): Remove deletion once the isolate tracked dependencies are |
| + # inputs for the isolated files. |
| + sha1_hash = hash_file(filepath) |
| + os.remove(filepath) |
| + result[test_name] = sha1_hash |
| + |
| + with open(output_json, 'wb') as f: |
| + json.dump(result, f) |
| + |
| + return 0 |
| + |
| + |
| +if __name__ == '__main__': |
| + sys.exit(main()) |