1# Copyright 2016 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5 6# Recipe module for Skia Swarming test. 7 8 9import json 10 11PYTHON_VERSION_COMPATIBILITY = "PY3" 12 13DEPS = [ 14 'env', 15 'flavor', 16 'recipe_engine/context', 17 'recipe_engine/file', 18 'recipe_engine/path', 19 'recipe_engine/platform', 20 'recipe_engine/properties', 21 'recipe_engine/raw_io', 22 'recipe_engine/step', 23 'gold_upload', 24 'run', 25 'vars', 26] 27 28DM_JSON = 'dm.json' 29 30def test_steps(api): 31 """Run the DM test.""" 32 do_upload = api.properties.get('do_upload') == 'true' 33 images = api.properties.get('images') == 'true' 34 lotties = api.properties.get('lotties') == 'true' 35 resources = api.properties.get('resources') == 'true' 36 skps = api.properties.get('skps') == 'true' 37 svgs = api.properties.get('svgs') == 'true' 38 39 api.flavor.install( 40 images=images, 41 lotties=lotties, 42 resources=resources, 43 skps=skps, 44 svgs=svgs, 45 ) 46 47 use_hash_file = False 48 if do_upload: 49 host_dm_dir = str(api.flavor.host_dirs.dm_dir) 50 api.flavor.create_clean_host_dir(api.path.start_dir.joinpath('test')) 51 device_dm_dir = str(api.flavor.device_dirs.dm_dir) 52 if host_dm_dir != device_dm_dir: 53 api.flavor.create_clean_device_dir(device_dm_dir) 54 55 # Obtain the list of already-generated hashes. 56 hash_filename = 'uninteresting_hashes.txt' 57 58 host_hashes_file = api.vars.tmp_dir.joinpath(hash_filename) 59 hashes_file = api.flavor.device_path_join( 60 api.flavor.device_dirs.tmp_dir, hash_filename) 61 script = api.gold_upload.resource('get_uninteresting_hashes.py') 62 api.run( 63 api.step, 64 'get uninteresting hashes', 65 cmd=['python3', script, api.properties['gold_hashes_url'], 66 host_hashes_file], 67 # If this fails, we want to know about it because it means Gold is down 68 # and proceeding onwards would take a very long time, but be hard to notice. 69 abort_on_failure=True, 70 fail_build_on_failure=True, 71 infra_step=True) 72 73 if api.path.exists(host_hashes_file): 74 api.flavor.copy_file_to_device(host_hashes_file, hashes_file) 75 use_hash_file = True 76 77 # Find DM flags. 78 args = json.loads(api.properties['dm_flags']) 79 props = json.loads(api.properties['dm_properties']) 80 args.append('--properties') 81 # Map iteration order is arbitrary; in order to maintain a consistent step 82 # ordering, sort by key. 83 for k in sorted(props.keys()): 84 v = props[k] 85 if v == '${SWARMING_BOT_ID}': 86 v = api.vars.swarming_bot_id 87 elif v == '${SWARMING_TASK_ID}': 88 v = api.vars.swarming_task_id 89 if v != '': 90 args.extend([k, v]) 91 92 # Paths to required resources. 93 if resources: 94 args.extend(['--resourcePath', api.flavor.device_dirs.resource_dir]) 95 if skps: 96 args.extend(['--skps', api.flavor.device_dirs.skp_dir]) 97 if images: 98 args.extend([ 99 '--images', api.flavor.device_path_join( 100 api.flavor.device_dirs.images_dir, 'dm'), 101 '--colorImages', api.flavor.device_path_join( 102 api.flavor.device_dirs.images_dir, 'colorspace'), 103 ]) 104 if svgs: 105 # svg_dir is the root of the SVG corpus. Within that directory, 106 # the *.svg inputs are in the 'svg' subdirectory. See skbug.com/11229 107 args.extend(['--svgs', api.flavor.device_path_join( 108 api.flavor.device_dirs.svg_dir, "svg")]) 109 if lotties: 110 args.extend([ 111 '--lotties', 112 api.flavor.device_path_join( 113 api.flavor.device_dirs.resource_dir, 'skottie'), 114 api.flavor.device_dirs.lotties_dir, 115 ]) 116 if 'Fontations' in api.vars.builder_cfg.get('extra_config', []): 117 args.extend(['--fontTestDataPath', api.flavor.device_dirs.fonts_dir]) 118 119 if use_hash_file: 120 args.extend(['--uninterestingHashesFile', hashes_file]) 121 if do_upload: 122 args.extend(['--writePath', api.flavor.device_dirs.dm_dir]) 123 124 # Run DM. 125 api.run(api.flavor.step, 'dm', cmd=args, abort_on_failure=False) 126 127 if do_upload: 128 # Copy images and JSON to host machine if needed. 129 api.flavor.copy_directory_contents_to_host( 130 api.flavor.device_dirs.dm_dir, api.flavor.host_dirs.dm_dir) 131 # https://bugs.chromium.org/p/chromium/issues/detail?id=1192611 132 if 'Win' not in api.vars.builder_cfg.get('os', ''): 133 api.gold_upload.upload() 134 135 136def RunSteps(api): 137 api.vars.setup() 138 api.file.ensure_directory('makedirs tmp_dir', api.vars.tmp_dir) 139 api.flavor.setup('dm') 140 141 try: 142 test_steps(api) 143 finally: 144 api.flavor.cleanup_steps() 145 api.run.check_failure() 146 147 148TEST_BUILDERS = [ 149 'Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm-Debug-All-Android_ASAN', 150 'Test-Android-Clang-Pixel2XL-GPU-Adreno540-arm64-Debug-All-Android', 151 'Test-Debian10-Clang-GCE-CPU-AVX2-x86_64-Release-All-Lottie', 152 'Test-Win10-Clang-ShuttleC-GPU-GTX960-x86_64-Debug-All-ANGLE', 153 'Test-Debian10-Clang-GCE-CPU-AVX2-x86_64-Debug-All-Fontations', 154] 155 156 157def GenTests(api): 158 for builder in TEST_BUILDERS: 159 props = dict( 160 buildername=builder, 161 buildbucket_build_id='123454321', 162 dm_flags='["dm","--example","--flags"]', 163 dm_properties=('{"key1":"value1","key2":"",' 164 '"bot":"${SWARMING_BOT_ID}",' 165 '"task":"${SWARMING_TASK_ID}"}'), 166 revision='abc123', 167 gs_bucket='skia-infra-gm', 168 patch_ref='89/456789/12', 169 patch_set=7, 170 patch_issue=1234, 171 path_config='kitchen', 172 gold_hashes_url='https://example.com/hashes.txt', 173 swarm_out_dir='[SWARM_OUT_DIR]', 174 task_id='task_12345', 175 resources='true', 176 ) 177 if 'ASAN' not in builder: 178 props['do_upload'] = 'true' 179 if 'Lottie' in builder: 180 props['lotties'] = 'true' 181 else: 182 props['images'] = 'true' 183 props['skps'] = 'true' 184 props['svgs'] = 'true' 185 test = ( 186 api.test(builder) + 187 api.properties(**props) + 188 api.path.exists( 189 api.path.start_dir.joinpath('skia'), 190 api.path.start_dir.joinpath('skia', 'infra', 'bots', 'assets', 191 'skimage', 'VERSION'), 192 api.path.start_dir.joinpath('skia', 'infra', 'bots', 'assets', 193 'skp', 'VERSION'), 194 api.path.start_dir.joinpath('skia', 'infra', 'bots', 'assets', 195 'svg', 'VERSION'), 196 api.path.start_dir.joinpath('tmp', 'uninteresting_hashes.txt') 197 ) + 198 api.step_data('get swarming bot id', 199 stdout=api.raw_io.output('skia-bot-123')) + 200 api.step_data('get swarming task id', 201 stdout=api.raw_io.output('123456')) 202 ) 203 if 'Win' in builder: 204 test += api.platform('win', 64) 205 206 yield test 207