blob: 3713faeddd2c1a00cddc61b2198ab8002d5ac6ef [file] [log] [blame]
#!/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))