|  | #!/usr/bin/env python | 
|  | # Copyright 2015 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. | 
|  |  | 
|  | import argparse | 
|  | import json | 
|  | import os | 
|  | import sys | 
|  |  | 
|  |  | 
|  | import common | 
|  |  | 
|  |  | 
|  | PERF_DASHBOARD_URL = 'https://chromeperf.appspot.com' | 
|  |  | 
|  |  | 
|  | def create_argparser(): | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument('--platform') | 
|  | parser.add_argument('--perf-id') | 
|  | parser.add_argument('--results-url', default=PERF_DASHBOARD_URL) | 
|  | return parser | 
|  |  | 
|  |  | 
|  | def main_run(script_args): | 
|  | parser = create_argparser() | 
|  | parser.add_argument('prefix') | 
|  | args = parser.parse_args(script_args.args) | 
|  |  | 
|  | with common.temporary_file() as tempfile_path: | 
|  | runtest_args = [ | 
|  | '--test-type', 'sizes', | 
|  | '--run-python-script', | 
|  | ] | 
|  | if args.perf_id: | 
|  | runtest_args.extend([ | 
|  | '--perf-id', args.perf_id, | 
|  | '--results-url=%s' % args.results_url, | 
|  | '--perf-dashboard-id=sizes', | 
|  | '--annotate=graphing', | 
|  | ]) | 
|  | sizes_cmd = [ | 
|  | os.path.join( | 
|  | common.SRC_DIR, 'infra', 'scripts', 'legacy', 'scripts', 'slave', | 
|  | 'chromium', 'sizes.py'), | 
|  | '--json', tempfile_path | 
|  | ] | 
|  | if args.platform: | 
|  | sizes_cmd.extend(['--platform', args.platform]) | 
|  | rc = common.run_runtest(script_args, runtest_args + sizes_cmd) | 
|  | with open(tempfile_path) as f: | 
|  | results = json.load(f) | 
|  |  | 
|  | with open(os.path.join(common.SRC_DIR, 'tools', 'perf_expectations', | 
|  | 'perf_expectations.json')) as f: | 
|  | perf_expectations = json.load(f) | 
|  |  | 
|  | valid = (rc == 0) | 
|  | failures = [] | 
|  |  | 
|  | for name, result in results.iteritems(): | 
|  | fqtn = '%s/%s/%s' % (args.prefix, name, result['identifier']) | 
|  | if fqtn not in perf_expectations: | 
|  | continue | 
|  |  | 
|  | if perf_expectations[fqtn]['type'] != 'absolute': | 
|  | print 'ERROR: perf expectation %r is not yet supported' % fqtn | 
|  | valid = False | 
|  | continue | 
|  |  | 
|  | actual = result['value'] | 
|  | expected = perf_expectations[fqtn]['regress'] | 
|  | better = perf_expectations[fqtn]['better'] | 
|  | check_result = ((actual <= expected) if better == 'lower' | 
|  | else (actual >= expected)) | 
|  |  | 
|  | if not check_result: | 
|  | failures.append(fqtn) | 
|  | print 'FAILED %s: actual %s, expected %s, better %s' % ( | 
|  | fqtn, actual, expected, better) | 
|  |  | 
|  | json.dump({ | 
|  | 'valid': valid, | 
|  | 'failures': failures, | 
|  | }, script_args.output) | 
|  |  | 
|  | # sizes.py itself doesn't fail on regressions. | 
|  | if failures and rc == 0: | 
|  | rc = 1 | 
|  |  | 
|  | return rc | 
|  |  | 
|  |  | 
|  | def main_compile_targets(script_args): | 
|  | parser = create_argparser() | 
|  | args = parser.parse_args(script_args.args) | 
|  |  | 
|  | _COMPILE_TARGETS = { | 
|  | 'android-cronet': ['cronet'], | 
|  | 'android-webview': ['libwebviewchromium'], | 
|  | } | 
|  |  | 
|  | json.dump(_COMPILE_TARGETS.get(args.platform, ['chrome']), | 
|  | script_args.output) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | funcs = { | 
|  | 'run': main_run, | 
|  | 'compile_targets': main_compile_targets, | 
|  | } | 
|  | sys.exit(common.run_script(sys.argv[1:], funcs)) |