summaryrefslogtreecommitdiffstats
path: root/testing
diff options
context:
space:
mode:
authorkbr <kbr@chromium.org>2015-11-25 16:49:28 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-26 00:50:26 +0000
commit213b4f29b13df3ae27f0b7eec28229e96f2fee40 (patch)
treee52d84aa4cc24008f10a9d5546286eb5c0e0c892 /testing
parentf3bc1554ea926632d1ec3285decd7505ec957073 (diff)
downloadchromium_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.pyl8
-rwxr-xr-xtesting/buildbot/manage.py1
-rwxr-xr-xtesting/scripts/run_telemetry_benchmark_as_googletest.py99
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())