diff options
author | kbr <kbr@chromium.org> | 2015-11-25 16:49:28 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-26 00:50:26 +0000 |
commit | 213b4f29b13df3ae27f0b7eec28229e96f2fee40 (patch) | |
tree | e52d84aa4cc24008f10a9d5546286eb5c0e0c892 /testing | |
parent | f3bc1554ea926632d1ec3285decd7505ec957073 (diff) | |
download | chromium_src-213b4f29b13df3ae27f0b7eec28229e96f2fee40.zip chromium_src-213b4f29b13df3ae27f0b7eec28229e96f2fee40.tar.gz chromium_src-213b4f29b13df3ae27f0b7eec28229e96f2fee40.tar.bz2 |
New isolate and wrapper script for Telemetry based GPU tests.
This follows the "isolated script test" contract in recipes'
chromium_tests/steps.py. Once the recipes are switched over to run
this new isolate, a lot of GPU-specific code can be deleted from the
tools/build workspace. After the cutover, this new name will be
removed. This is the first step in deleting the GPU recipe entirely.
Tested locally on Linux with GN build, including multiple kinds of
failure injection to ensure that the output JSON is produced as
desired.
BUG=560598
NOTRY=true
Review URL: https://codereview.chromium.org/1472263003
Cr-Commit-Position: refs/heads/master@{#361771}
Diffstat (limited to 'testing')
-rw-r--r-- | testing/buildbot/gn_isolate_map.pyl | 8 | ||||
-rwxr-xr-x | testing/buildbot/manage.py | 1 | ||||
-rwxr-xr-x | testing/scripts/run_telemetry_benchmark_as_googletest.py | 99 |
3 files changed, 108 insertions, 0 deletions
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 101404a..135a2f3 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl @@ -387,6 +387,14 @@ "type": "gpu_browser_test", "gtest_filter": "CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*", }, + "telemetry_gpu_new_test": { + "label": "//chrome/test:telemetry_gpu_new_test", + "type": "script", + "script": "//testing/scripts/run_telemetry_benchmark_as_googletest.py", + "args": [ + "../../content/test/gpu/run_gpu_test.py", + ], + }, "telemetry_gpu_test": { "label": "//chrome/test:telemetry_gpu_test", "type": "script", diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py index 3c51341..7794122 100755 --- a/testing/buildbot/manage.py +++ b/testing/buildbot/manage.py @@ -73,6 +73,7 @@ SKIP_GN_ISOLATE_MAP_TARGETS = { 'gl_unittests', 'gles2_conform_test', 'tab_capture_end2end_tests', + 'telemetry_gpu_new_test', 'telemetry_gpu_test', 'telemetry_gpu_unittests', 'telemetry_perf_unittests', diff --git a/testing/scripts/run_telemetry_benchmark_as_googletest.py b/testing/scripts/run_telemetry_benchmark_as_googletest.py new file mode 100755 index 0000000..c232bef --- /dev/null +++ b/testing/scripts/run_telemetry_benchmark_as_googletest.py @@ -0,0 +1,99 @@ +#!/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. + +"""Runs an isolate bundled Telemetry benchmark. + +This script attempts to emulate the contract of gtest-style tests +invoked via recipes. The main contract is that the caller passes the +argument: + + --isolated-script-test-output=[FILENAME] + +json is written to that file in the format produced by +common.parse_common_test_results. + +This script is intended to be the base command invoked by the isolate, +followed by a subsequent Python script. It could be generalized to +invoke an arbitrary executable. +""" + +import argparse +import json +import os +import shutil +import sys +import tempfile +import traceback + +import common + +# Add src/testing/ into sys.path for importing xvfb. +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +import xvfb + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + '--isolated-script-test-output', type=argparse.FileType('w'), + required=True) + parser.add_argument('--xvfb', help='Start xvfb.', action='store_true') + args, rest_args = parser.parse_known_args() + xvfb_proc = None + openbox_proc = None + env = os.environ.copy() + if args.xvfb and xvfb.should_start_xvfb(env): + xvfb_proc, openbox_proc = xvfb.start_xvfb(env=env, build_dir='.') + assert xvfb_proc and openbox_proc, 'Failed to start xvfb' + try: + tempfile_dir = tempfile.mkdtemp('telemetry') + valid = True + failures = [] + try: + rc = common.run_command([sys.executable] + rest_args + [ + '--output-dir', tempfile_dir, + '--output-format=json' + ], env=env) + tempfile_name = os.path.join(tempfile_dir, 'results.json') + with open(tempfile_name) as f: + results = json.load(f) + for value in results['per_page_values']: + if value['type'] == 'failure': + failures.append(results['pages'][str(value['page_id'])]['name']) + valid = bool(rc == 0 or failures) + except Exception: + traceback.print_exc() + valid = False + finally: + shutil.rmtree(tempfile_dir) + + if not valid and not failures: + failures = ['(entire test suite)'] + json.dump({ + 'valid': valid, + 'failures': failures, + }, args.isolated_script_test_output) + return rc + + finally: + xvfb.kill(xvfb_proc) + xvfb.kill(openbox_proc) + + +# This is not really a "script test" so does not need to manually add +# any additional compile targets. +def main_compile_targets(args): + json.dump([], args.output) + + +if __name__ == '__main__': + # Conform minimally to the protocol defined by ScriptTest. + if 'compile_targets' in sys.argv: + funcs = { + 'run': None, + 'compile_targets': main_compile_targets, + } + sys.exit(common.run_script(sys.argv[1:], funcs)) + sys.exit(main()) |