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