Chromium Code Reviews| Index: content/test/gpu/generate_buildbot_json.py |
| diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..1194b450644b7eed686867665e1ffbb6238c4ec8 |
| --- /dev/null |
| +++ b/content/test/gpu/generate_buildbot_json.py |
| @@ -0,0 +1,408 @@ |
| +#!/usr/bin/env python |
| +# Copyright 2016 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. |
| + |
| +"""Script to generate chromium.gpu.json and chromium.gpu.fyi.json in |
| +the src/testing/buildbot directory. Maintaining these files by hand is |
| +too unwieldy. |
| +""" |
| + |
| +import copy |
| +import json |
| +import string |
| +import sys |
| + |
| +BUILDERS = [ |
| + 'GPU NextGen Linux Builder', |
| + 'GPU NextGen Linux Builder (dbg)', |
| + 'GPU NextGen Mac Builder', |
| + 'GPU NextGen Mac Builder (dbg)', |
| + 'GPU NextGen Win Builder', |
| + 'GPU NextGen Win Builder (dbg)', |
| +] |
| + |
| +TESTERS = { |
| + 'Linux NextGen Debug (NVIDIA)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '10de:104a', |
| + 'os': 'Linux' |
| + }, |
| + 'build_config': 'Debug', |
| + 'swarming': True, |
| + 'os_type': 'linux', |
| + }, |
| + 'Linux NextGen Release (NVIDIA)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '10de:104a', |
| + 'os': 'Linux' |
| + }, |
| + 'build_config': 'Release', |
| + 'swarming': True, |
| + 'os_type': 'linux', |
| + }, |
| + 'Mac 10.10 Debug (ATI)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '1002:679e', |
| + 'os': 'Mac-10.10' |
| + }, |
| + 'build_config': 'Debug', |
| + 'swarming': False, |
| + 'os_type': 'mac', |
| + }, |
| + 'Mac 10.10 Release (ATI)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '1002:679e', |
| + 'os': 'Mac-10.10' |
| + }, |
| + 'build_config': 'Release', |
| + 'swarming': False, |
| + 'os_type': 'mac', |
| + }, |
| + 'Mac NextGen 10.10 Retina Debug (AMD)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '1002:6821', |
| + 'hidpi': '1', |
| + 'os': 'Mac-10.10' |
| + }, |
| + 'build_config': 'Debug', |
| + 'swarming': True, |
| + 'os_type': 'mac', |
| + }, |
| + 'Mac NextGen 10.10 Retina Release (AMD)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '1002:6821', |
| + 'hidpi': '1', |
| + 'os': 'Mac-10.10' |
| + }, |
| + 'build_config': 'Release', |
| + 'swarming': True, |
| + 'os_type': 'mac', |
| + }, |
| + 'Win7 NextGen Debug (NVIDIA)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '10de:104a', |
| + 'os': 'Windows-2008ServerR2-SP1' |
| + }, |
| + 'build_config': 'Debug', |
| + 'swarming': True, |
| + 'os_type': 'win', |
| + }, |
| + 'Win7 NextGen Release (AMD)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '1002:6779', |
| + 'os': 'Windows-2008ServerR2-SP1' |
| + }, |
| + 'build_config': 'Release', |
| + 'swarming': True, |
| + 'os_type': 'win', |
| + }, |
| + 'Win7 NextGen Release (Intel)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '8086:041a', |
| + 'os': 'Windows-2008ServerR2-SP1' |
| + }, |
| + 'build_config': 'Release', |
| + 'swarming': False, |
| + 'os_type': 'win', |
| + }, |
| + 'Win7 NextGen Release (NVIDIA)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '10de:104a', |
| + 'os': 'Windows-2008ServerR2-SP1' |
| + }, |
| + 'build_config': 'Release', |
| + 'swarming': True, |
| + 'os_type': 'win', |
| + }, |
| + 'Win7 NextGen dEQP (NVIDIA)': { |
| + 'deqp': True, |
| + 'swarming_dimensions': { |
| + 'gpu': '10de:104a', |
| + 'os': 'Windows-2008ServerR2-SP1' |
| + }, |
| + 'build_config': 'Release', |
| + 'swarming': True, |
| + 'os_type': 'win', |
| + }, |
| + 'Win8 NextGen Debug (NVIDIA)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '10de:104a', |
| + 'os': 'Windows-2012ServerR2-SP0' |
| + }, |
| + 'build_config': 'Debug', |
| + 'swarming': True, |
| + 'os_type': 'win', |
| + }, |
| + 'Win8 NextGen Release (NVIDIA)': { |
| + 'swarming_dimensions': { |
| + 'gpu': '10de:104a', |
| + 'os': 'Windows-2012ServerR2-SP0' |
| + }, |
| + 'build_config': 'Release', |
| + 'swarming': True, |
| + 'os_type': 'win', |
| + }, |
| +} |
| + |
| +COMMON_GTESTS = { |
| + 'angle_end2end_tests': {'args': ['--use-gpu-in-tests']}, |
| + 'angle_unittests': {'args': ['--use-gpu-in-tests']}, |
| + 'content_gl_tests': {'args': ['--use-gpu-in-tests']}, |
| + 'gl_tests': {'args': ['--use-gpu-in-tests']}, |
| + 'gl_unittests': {'args': ['--use-gpu-in-tests']}, |
| +} |
| + |
| +RELEASE_ONLY_GTESTS = { |
| + 'tab_capture_end2end_tests': { |
| + 'override_compile_targets': [ |
| + 'tab_capture_end2end_tests_run', |
| + ], |
| + }, |
| +} |
| + |
| +# This requires a hack because the isolate's name is different than |
| +# the executable's name. On the few non-swarmed testers, this causes |
| +# the executable to not be found. It would be better if the Chromium |
| +# recipe supported running isolates locally. crbug.com/581953 |
| + |
| +NON_SWARMED_GTESTS = { |
| + 'tab_capture_end2end_tests': { |
| + 'test': 'browser_tests', |
| + 'args': [ |
| + '--enable-gpu', |
| + '--test-launcher-jobs=1', |
| + '--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:' + \ |
| + 'TabCaptureApiPixelTest.EndToEnd*' |
| + ] |
| + } |
| +} |
| + |
| +# Until the media-only tests are extracted from content_unittests and |
| +# these both can be run on the commit queue with |
| +# --require-audio-hardware-for-testing, run them only on the FYI |
| +# waterfall. |
| +# |
| +# Note that the transition to the Chromium recipe has forced the |
| +# removal of the --require-audio-hardware-for-testing flag for the |
| +# time being. See crbug.com/574942. |
| +FYI_ONLY_GTESTS = { |
| + 'audio_unittests': {'args': ['--use-gpu-in-tests']}, |
| + 'content_unittests': {}, |
| + # The gles2_conform_tests are closed-source and deliberately only run |
| + # on the FYI waterfall. |
| + 'gles2_conform_test': {'args': ['--use-gpu-in-tests']}, |
| + 'gles2_conform_d3d9_test': { |
| + 'win_only': True, |
| + 'args': [ |
| + '--use-gpu-in-tests', |
| + '--use-angle=d3d9', |
| + ], |
| + 'test': 'gles2_conform_test', |
| + }, |
| + 'gles2_conform_gl_test': { |
| + 'win_only': True, |
| + 'args': [ |
| + '--use-gpu-in-tests', |
| + '--use-angle=gl', |
| + '--disable-gpu-sandbox', |
| + ], |
| + 'test': 'gles2_conform_test', |
| + } |
| +} |
| + |
| +DEQP_GTESTS = { |
| + 'angle_deqp_gles2_tests': {'swarming_shards': 4}, |
| + 'angle_deqp_gles3_tests': {'swarming_shards': 12}, |
| +} |
| + |
| +TELEMETRY_TESTS = { |
| + 'context_lost': {}, |
| + 'gpu_process_launch_tests': {'target_name': 'gpu_process'}, |
| + 'gpu_rasterization': {}, |
| + 'hardware_accelerated_feature': {}, |
| + 'maps_pixel_test': {'target_name': 'maps'}, |
| + 'memory_test': {}, |
| + 'pixel_test': { |
| + 'target_name': 'pixel', |
| + 'args': [ |
| + '--refimg-cloud-storage-bucket', |
| + 'chromium-gpu-archive/reference-images', |
| + '--os-type', |
| + '${os_type}', |
| + '--build-revision', |
| + '${got_revision}', |
| + '--test-machine-name', |
| + '${buildername}', |
| + ], |
| + 'non_precommit_args': [ |
| + '--upload-refimg-to-cloud-storage', |
| + ], |
| + 'precommit_args': [ |
| + '--download-refimg-from-cloud-storage', |
| + ] |
| + }, |
| + 'screenshot_sync': {}, |
| + 'trace_test': {}, |
| + 'webgl_conformance': {}, |
| + 'webgl_conformance_d3d9_tests': { |
| + 'win_only': True, |
| + 'target_name': 'webgl_conformance', |
| + 'extra_browser_args': [ |
| + '--use-angle=d3d9', |
| + ], |
| + }, |
| + 'webgl_conformance_gl_tests': { |
| + 'win_only': True, |
| + 'target_name': 'webgl_conformance', |
| + 'extra_browser_args': [ |
| + '--use-angle=gl', |
| + ], |
| + }, |
| + 'webgl2_conformance_tests': { |
| + 'target_name': 'webgl_conformance', |
| + 'args': [ |
| + '--webgl-conformance-version=2.0.0', |
| + '--webgl2-only=true', |
| + ], |
| + }, |
| +} |
| + |
| +def substitute_args(tester_config, args): |
| + """Substitutes the ${os_type} variable in |args| from the |
| + tester_config's "os_type" property. |
| + """ |
| + substitutions = { |
| + 'os_type': tester_config['os_type'] |
| + } |
| + return [string.Template(arg).safe_substitute(substitutions) for arg in args] |
| + |
| +def generate_gtest(tester_config, test, test_config): |
| + result = copy.deepcopy(test_config) |
| + if result.get('win_only'): |
| + if tester_config['os_type'] != 'win': |
| + return None |
| + # Don't print this in the JSON. |
| + result.pop('win_only') |
| + if 'test' in result: |
| + result['name'] = test |
| + else: |
| + result['test'] = test |
| + if (not tester_config['swarming']) and test in NON_SWARMED_GTESTS: |
| + # Need to override this result. |
| + result = copy.deepcopy(NON_SWARMED_GTESTS[test]) |
| + result['name'] = test |
| + else: |
| + # Put the swarming dimensions in anyway. If the tester is later |
| + # swarmed, they will come in handy. |
| + result['swarming'] = { |
| + 'can_use_on_swarming_builders': True, |
| + 'dimension_sets': [ |
| + tester_config['swarming_dimensions'] |
| + ], |
| + } |
| + if result.get('swarming_shards'): |
| + result['swarming']['shards'] = result['swarming_shards'] |
| + result.pop('swarming_shards') |
| + # print "generating " + test |
| + return result |
| + |
| +def generate_telemetry_test(tester_config, test, test_config): |
| + if test_config.get('win_only'): |
| + if tester_config['os_type'] != 'win': |
| + return None |
| + test_args = ['-v'] |
| + # --expose-gc allows the WebGL conformance tests to more reliably |
| + # reproduce GC-related bugs in the V8 bindings. |
| + extra_browser_args_string = ( |
| + '--enable-logging=stderr --js-flags=--expose-gc') |
| + if 'extra_browser_args' in test_config: |
| + extra_browser_args_string += ' ' + ' '.join( |
| + test_config['extra_browser_args']) |
| + test_args.append('--extra-browser-args=\"' + extra_browser_args_string + |
| + '\"') |
| + if 'args' in test_config: |
| + test_args.extend(substitute_args(tester_config, test_config['args'])) |
| + # The step name must end in 'test' or 'tests' in order for the |
| + # results to automatically show up on the flakiness dashboard. |
| + # (At least, this was true some time ago.) Continue to use this |
| + # naming convention for the time being to minimize changes. |
| + step_name = test |
| + if not (step_name.endswith('test') or step_name.endswith('tests')): |
| + step_name = '%s_tests' % step_name |
| + # Prepend Telemetry GPU-specific flags. |
| + benchmark_name = test_config.get('target_name') or test |
| + prefix_args = [ |
| + benchmark_name, |
| + '--show-stdout', |
| + '--browser=%s' % tester_config['build_config'].lower() |
| + ] |
| + result = { |
| + 'args': prefix_args + test_args, |
| + 'isolate_name': 'telemetry_gpu_test', |
| + 'name': step_name, |
| + 'override_compile_targets': [ |
| + 'telemetry_gpu_test_run' |
| + ], |
| + 'swarming': { |
| + # Always say this is true regardless of whether the tester |
| + # supports swarming. It doesn't hurt. |
| + 'can_use_on_swarming_builders': True, |
| + 'dimension_sets': [ |
| + tester_config['swarming_dimensions'] |
| + ] |
| + } |
| + } |
| + if 'non_precommit_args' in test_config: |
| + result['non_precommit_args'] = test_config['non_precommit_args'] |
| + if 'precommit_args' in test_config: |
| + result['precommit_args'] = test_config['precommit_args'] |
| + return result |
| + |
| +def generate_gtests(tester_config, test_dictionary): |
| + # The relative ordering of some of the tests is important to |
| + # minimize differences compared to the handwritten JSON files, since |
| + # Python's sorts are stable and there are some tests with the same |
| + # key (see gles2_conform_d3d9_test and similar variants). Avoid |
| + # losing the order by avoiding coalescing the dictionaries into one. |
| + gtests = [] |
| + for test_name, test_config in sorted(test_dictionary.iteritems()): |
| + test = generate_gtest(tester_config, test_name, test_config) |
| + if test: |
| + # generate_gtest may veto the test generation on this platform. |
| + gtests.append(test) |
| + return gtests |
| + |
| +def generate_all_tests(): |
| + tests = {} |
| + for builder in BUILDERS: |
| + tests[builder] = {} |
| + for name, config in TESTERS.iteritems(): |
| + gtests = [] |
| + if config.get('deqp'): |
| + gtests.extend(generate_gtests(config, DEQP_GTESTS)) |
| + else: |
| + gtests.extend(generate_gtests(config, COMMON_GTESTS)) |
| + if config['build_config'] == 'Release': |
| + gtests.extend(generate_gtests(config, RELEASE_ONLY_GTESTS)) |
| + # For the moment we're only generating the FYI waterfall's tests. |
| + gtests.extend(generate_gtests(config, FYI_ONLY_GTESTS)) |
| + isolated_scripts = [] |
| + if not config.get('deqp'): |
| + for test_name, test_config in sorted(TELEMETRY_TESTS.iteritems()): |
| + test = generate_telemetry_test(config, test_name, test_config) |
| + if test: |
| + isolated_scripts.append(test) |
| + cur_tests = {} |
| + if gtests: |
| + cur_tests['gtest_tests'] = sorted(gtests, key=lambda x: x['test']) |
| + if isolated_scripts: |
| + cur_tests['isolated_scripts'] = sorted( |
| + isolated_scripts, key=lambda x: x['name']) |
| + tests[name] = cur_tests |
| + tests['AAAAA1 AUTOGENERATED FILE DO NOT EDIT'] = {} |
| + tests['AAAAA2 See generate_buildbot_json.py to make changes'] = {} |
|
Dirk Pranke
2016/01/28 23:53:24
these two lines are part of the reason I wish we h
|
| + print json.dumps(tests, indent=2, separators=(',', ': '), sort_keys=True) |
| + |
| +if __name__ == "__main__": |
| + sys.exit(generate_all_tests()) |