1*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2018 The Chromium Authors. All rights reserved. 2*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 4*c8dee2aaSAndroid Build Coastguard Worker 5*c8dee2aaSAndroid Build Coastguard Worker# Recipe which analyzes a compiled binary for information (e.g. file size) 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Workerimport ast 8*c8dee2aaSAndroid Build Coastguard Workerimport json 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard WorkerPYTHON_VERSION_COMPATIBILITY = "PY3" 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard WorkerDEPS = [ 13*c8dee2aaSAndroid Build Coastguard Worker 'checkout', 14*c8dee2aaSAndroid Build Coastguard Worker 'env', 15*c8dee2aaSAndroid Build Coastguard Worker 'recipe_engine/context', 16*c8dee2aaSAndroid Build Coastguard Worker 'recipe_engine/file', 17*c8dee2aaSAndroid Build Coastguard Worker 'recipe_engine/path', 18*c8dee2aaSAndroid Build Coastguard Worker 'recipe_engine/properties', 19*c8dee2aaSAndroid Build Coastguard Worker 'recipe_engine/raw_io', 20*c8dee2aaSAndroid Build Coastguard Worker 'recipe_engine/step', 21*c8dee2aaSAndroid Build Coastguard Worker 'run', 22*c8dee2aaSAndroid Build Coastguard Worker 'vars', 23*c8dee2aaSAndroid Build Coastguard Worker] 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard WorkerMAGIC_SEPERATOR = '#$%^&*' 27*c8dee2aaSAndroid Build Coastguard WorkerTOTAL_SIZE_BYTES_KEY = "total_size_bytes" 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Workerdef add_binary_size_output_property(result, source, binary_size): 31*c8dee2aaSAndroid Build Coastguard Worker result.presentation.properties['binary_size_%s' % source] = binary_size 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Workerdef RunSteps(api): 35*c8dee2aaSAndroid Build Coastguard Worker api.vars.setup() 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker checkout_root = api.checkout.default_checkout_root 38*c8dee2aaSAndroid Build Coastguard Worker api.checkout.bot_update(checkout_root=checkout_root) 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker out_dir = api.vars.swarming_out_dir 41*c8dee2aaSAndroid Build Coastguard Worker # Any binaries to scan should be here. 42*c8dee2aaSAndroid Build Coastguard Worker bin_dir = api.vars.build_dir 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker api.file.ensure_directory('mkdirs out_dir', out_dir, mode=0o777) 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker analyzed = 0 47*c8dee2aaSAndroid Build Coastguard Worker with api.context(cwd=bin_dir): 48*c8dee2aaSAndroid Build Coastguard Worker files = api.file.glob_paths( 49*c8dee2aaSAndroid Build Coastguard Worker 'find WASM binaries', 50*c8dee2aaSAndroid Build Coastguard Worker bin_dir, 51*c8dee2aaSAndroid Build Coastguard Worker '*.wasm', 52*c8dee2aaSAndroid Build Coastguard Worker test_data=['pathkit.wasm']) 53*c8dee2aaSAndroid Build Coastguard Worker analyzed += len(files) 54*c8dee2aaSAndroid Build Coastguard Worker if files: 55*c8dee2aaSAndroid Build Coastguard Worker analyze_wasm_file(api, checkout_root, out_dir, files) 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker files = api.file.glob_paths( 58*c8dee2aaSAndroid Build Coastguard Worker 'find JS files', 59*c8dee2aaSAndroid Build Coastguard Worker bin_dir, 60*c8dee2aaSAndroid Build Coastguard Worker '*.js', 61*c8dee2aaSAndroid Build Coastguard Worker test_data=['pathkit.js']) 62*c8dee2aaSAndroid Build Coastguard Worker analyzed += len(files) 63*c8dee2aaSAndroid Build Coastguard Worker if files: 64*c8dee2aaSAndroid Build Coastguard Worker analyze_web_file(api, checkout_root, out_dir, files) 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker files = api.file.glob_paths( 67*c8dee2aaSAndroid Build Coastguard Worker 'find JS mem files', 68*c8dee2aaSAndroid Build Coastguard Worker bin_dir, 69*c8dee2aaSAndroid Build Coastguard Worker '*.js.mem', 70*c8dee2aaSAndroid Build Coastguard Worker test_data=['pathkit.js.mem']) 71*c8dee2aaSAndroid Build Coastguard Worker analyzed += len(files) 72*c8dee2aaSAndroid Build Coastguard Worker if files: 73*c8dee2aaSAndroid Build Coastguard Worker analyze_web_file(api, checkout_root, out_dir, files) 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker files = api.file.glob_paths( 76*c8dee2aaSAndroid Build Coastguard Worker 'find flutter library', 77*c8dee2aaSAndroid Build Coastguard Worker bin_dir, 78*c8dee2aaSAndroid Build Coastguard Worker 'libflutter.so', 79*c8dee2aaSAndroid Build Coastguard Worker test_data=['libflutter.so']) 80*c8dee2aaSAndroid Build Coastguard Worker analyzed += len(files) 81*c8dee2aaSAndroid Build Coastguard Worker if files: 82*c8dee2aaSAndroid Build Coastguard Worker analyze_flutter_lib(api, checkout_root, out_dir, files) 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker files = api.file.glob_paths( 85*c8dee2aaSAndroid Build Coastguard Worker 'find skia library', 86*c8dee2aaSAndroid Build Coastguard Worker bin_dir, 87*c8dee2aaSAndroid Build Coastguard Worker 'libskia.so', 88*c8dee2aaSAndroid Build Coastguard Worker test_data=['libskia.so']) 89*c8dee2aaSAndroid Build Coastguard Worker analyzed += len(files) 90*c8dee2aaSAndroid Build Coastguard Worker if files: 91*c8dee2aaSAndroid Build Coastguard Worker analyze_cpp_lib(api, checkout_root, out_dir, files) 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker files = api.file.glob_paths( 94*c8dee2aaSAndroid Build Coastguard Worker 'find skottie_tool', 95*c8dee2aaSAndroid Build Coastguard Worker bin_dir, 96*c8dee2aaSAndroid Build Coastguard Worker 'skottie_tool', 97*c8dee2aaSAndroid Build Coastguard Worker test_data=['skottie_tool']) 98*c8dee2aaSAndroid Build Coastguard Worker analyzed += len(files) 99*c8dee2aaSAndroid Build Coastguard Worker if files: 100*c8dee2aaSAndroid Build Coastguard Worker make_treemap(api, checkout_root, out_dir, files) 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker files = api.file.glob_paths( 103*c8dee2aaSAndroid Build Coastguard Worker 'find dm', 104*c8dee2aaSAndroid Build Coastguard Worker bin_dir, 105*c8dee2aaSAndroid Build Coastguard Worker 'dm', 106*c8dee2aaSAndroid Build Coastguard Worker test_data=['dm']) 107*c8dee2aaSAndroid Build Coastguard Worker analyzed += len(files) 108*c8dee2aaSAndroid Build Coastguard Worker if files: 109*c8dee2aaSAndroid Build Coastguard Worker make_treemap(api, checkout_root, out_dir, files) 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker if not analyzed: # pragma: nocover 112*c8dee2aaSAndroid Build Coastguard Worker raise Exception('No files were analyzed!') 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Workerdef keys_and_props(api): 116*c8dee2aaSAndroid Build Coastguard Worker keys = [] 117*c8dee2aaSAndroid Build Coastguard Worker for k in sorted(api.vars.builder_cfg.keys()): 118*c8dee2aaSAndroid Build Coastguard Worker if not k in ['role']: 119*c8dee2aaSAndroid Build Coastguard Worker keys.extend([k, api.vars.builder_cfg[k]]) 120*c8dee2aaSAndroid Build Coastguard Worker keystr = ' '.join(keys) 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker props = [ 123*c8dee2aaSAndroid Build Coastguard Worker 'gitHash', api.properties['revision'], 124*c8dee2aaSAndroid Build Coastguard Worker 'swarming_bot_id', api.vars.swarming_bot_id, 125*c8dee2aaSAndroid Build Coastguard Worker 'swarming_task_id', api.vars.swarming_task_id, 126*c8dee2aaSAndroid Build Coastguard Worker ] 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker if api.vars.is_trybot: 129*c8dee2aaSAndroid Build Coastguard Worker props.extend([ 130*c8dee2aaSAndroid Build Coastguard Worker 'issue', api.vars.issue, 131*c8dee2aaSAndroid Build Coastguard Worker 'patchset', api.vars.patchset, 132*c8dee2aaSAndroid Build Coastguard Worker 'patch_storage', api.vars.patch_storage, 133*c8dee2aaSAndroid Build Coastguard Worker ]) 134*c8dee2aaSAndroid Build Coastguard Worker propstr = ' '.join(str(prop) for prop in props) 135*c8dee2aaSAndroid Build Coastguard Worker return (keystr, propstr) 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker 138*c8dee2aaSAndroid Build Coastguard Worker# Get the raw and gzipped size of the given file 139*c8dee2aaSAndroid Build Coastguard Workerdef analyze_web_file(api, checkout_root, out_dir, files): 140*c8dee2aaSAndroid Build Coastguard Worker (keystr, propstr) = keys_and_props(api) 141*c8dee2aaSAndroid Build Coastguard Worker 142*c8dee2aaSAndroid Build Coastguard Worker for f in files: 143*c8dee2aaSAndroid Build Coastguard Worker skia_dir = checkout_root.joinpath('skia') 144*c8dee2aaSAndroid Build Coastguard Worker with api.context(cwd=skia_dir): 145*c8dee2aaSAndroid Build Coastguard Worker script = skia_dir.joinpath('infra', 'bots', 'buildstats', 146*c8dee2aaSAndroid Build Coastguard Worker 'buildstats_web.py') 147*c8dee2aaSAndroid Build Coastguard Worker step_data = api.run(api.step, 'Analyze %s' % f, 148*c8dee2aaSAndroid Build Coastguard Worker cmd=['python3', script, f, out_dir, keystr, propstr, 149*c8dee2aaSAndroid Build Coastguard Worker TOTAL_SIZE_BYTES_KEY, MAGIC_SEPERATOR], 150*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output()) 151*c8dee2aaSAndroid Build Coastguard Worker if step_data and step_data.stdout: 152*c8dee2aaSAndroid Build Coastguard Worker sections = step_data.stdout.decode('utf-8').split(MAGIC_SEPERATOR) 153*c8dee2aaSAndroid Build Coastguard Worker result = api.step.active_result 154*c8dee2aaSAndroid Build Coastguard Worker logs = result.presentation.logs 155*c8dee2aaSAndroid Build Coastguard Worker logs['perf_json'] = sections[1].split('\n') 156*c8dee2aaSAndroid Build Coastguard Worker 157*c8dee2aaSAndroid Build Coastguard Worker add_binary_size_output_property(result, api.path.basename(f), ( 158*c8dee2aaSAndroid Build Coastguard Worker ast.literal_eval(sections[1]) 159*c8dee2aaSAndroid Build Coastguard Worker .get('results', {}) 160*c8dee2aaSAndroid Build Coastguard Worker .get(api.path.basename(f), {}) 161*c8dee2aaSAndroid Build Coastguard Worker .get('default', {}) 162*c8dee2aaSAndroid Build Coastguard Worker .get(TOTAL_SIZE_BYTES_KEY, {}))) 163*c8dee2aaSAndroid Build Coastguard Worker 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker# Get the raw size and a few metrics from bloaty 166*c8dee2aaSAndroid Build Coastguard Workerdef analyze_cpp_lib(api, checkout_root, out_dir, files): 167*c8dee2aaSAndroid Build Coastguard Worker (keystr, propstr) = keys_and_props(api) 168*c8dee2aaSAndroid Build Coastguard Worker bloaty_exe = api.path.start_dir.joinpath('bloaty', 'bloaty') 169*c8dee2aaSAndroid Build Coastguard Worker 170*c8dee2aaSAndroid Build Coastguard Worker for f in files: 171*c8dee2aaSAndroid Build Coastguard Worker skia_dir = checkout_root.joinpath('skia') 172*c8dee2aaSAndroid Build Coastguard Worker with api.context(cwd=skia_dir): 173*c8dee2aaSAndroid Build Coastguard Worker script = skia_dir.joinpath('infra', 'bots', 'buildstats', 174*c8dee2aaSAndroid Build Coastguard Worker 'buildstats_cpp.py') 175*c8dee2aaSAndroid Build Coastguard Worker step_data = api.run(api.step, 'Analyze %s' % f, 176*c8dee2aaSAndroid Build Coastguard Worker cmd=['python3', script, f, out_dir, keystr, propstr, bloaty_exe, 177*c8dee2aaSAndroid Build Coastguard Worker TOTAL_SIZE_BYTES_KEY, MAGIC_SEPERATOR], 178*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output()) 179*c8dee2aaSAndroid Build Coastguard Worker if step_data and step_data.stdout: 180*c8dee2aaSAndroid Build Coastguard Worker sections = step_data.stdout.decode('utf-8').split(MAGIC_SEPERATOR) 181*c8dee2aaSAndroid Build Coastguard Worker result = api.step.active_result 182*c8dee2aaSAndroid Build Coastguard Worker logs = result.presentation.logs 183*c8dee2aaSAndroid Build Coastguard Worker logs['perf_json'] = sections[2].split('\n') 184*c8dee2aaSAndroid Build Coastguard Worker 185*c8dee2aaSAndroid Build Coastguard Worker add_binary_size_output_property(result, api.path.basename(f), ( 186*c8dee2aaSAndroid Build Coastguard Worker ast.literal_eval(sections[2]) 187*c8dee2aaSAndroid Build Coastguard Worker .get('results', {}) 188*c8dee2aaSAndroid Build Coastguard Worker .get(api.path.basename(f), {}) 189*c8dee2aaSAndroid Build Coastguard Worker .get('default', {}) 190*c8dee2aaSAndroid Build Coastguard Worker .get(TOTAL_SIZE_BYTES_KEY, {}))) 191*c8dee2aaSAndroid Build Coastguard Worker 192*c8dee2aaSAndroid Build Coastguard Worker 193*c8dee2aaSAndroid Build Coastguard Worker# Get the size of skia in flutter and a few metrics from bloaty 194*c8dee2aaSAndroid Build Coastguard Workerdef analyze_flutter_lib(api, checkout_root, out_dir, files): 195*c8dee2aaSAndroid Build Coastguard Worker (keystr, propstr) = keys_and_props(api) 196*c8dee2aaSAndroid Build Coastguard Worker bloaty_exe = api.path.start_dir.joinpath('bloaty', 'bloaty') 197*c8dee2aaSAndroid Build Coastguard Worker 198*c8dee2aaSAndroid Build Coastguard Worker for f in files: 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker skia_dir = checkout_root.joinpath('skia') 201*c8dee2aaSAndroid Build Coastguard Worker with api.context(cwd=skia_dir): 202*c8dee2aaSAndroid Build Coastguard Worker stripped = api.vars.build_dir.joinpath('libflutter_stripped.so') 203*c8dee2aaSAndroid Build Coastguard Worker script = skia_dir.joinpath('infra', 'bots', 'buildstats', 204*c8dee2aaSAndroid Build Coastguard Worker 'buildstats_flutter.py') 205*c8dee2aaSAndroid Build Coastguard Worker config = "skia_in_flutter" 206*c8dee2aaSAndroid Build Coastguard Worker lib_name = "libflutter.so" 207*c8dee2aaSAndroid Build Coastguard Worker step_data = api.run(api.step, 'Analyze flutter', 208*c8dee2aaSAndroid Build Coastguard Worker cmd=['python3', script, stripped, out_dir, keystr, propstr, 209*c8dee2aaSAndroid Build Coastguard Worker bloaty_exe, f, config, TOTAL_SIZE_BYTES_KEY, lib_name, 210*c8dee2aaSAndroid Build Coastguard Worker MAGIC_SEPERATOR], 211*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output()) 212*c8dee2aaSAndroid Build Coastguard Worker if step_data and step_data.stdout: 213*c8dee2aaSAndroid Build Coastguard Worker sections = step_data.stdout.decode('utf-8').split(MAGIC_SEPERATOR) 214*c8dee2aaSAndroid Build Coastguard Worker result = api.step.active_result 215*c8dee2aaSAndroid Build Coastguard Worker logs = result.presentation.logs 216*c8dee2aaSAndroid Build Coastguard Worker # Skip section 0 because it's everything before first print, 217*c8dee2aaSAndroid Build Coastguard Worker # which is probably the empty string. 218*c8dee2aaSAndroid Build Coastguard Worker logs['bloaty_file_symbol_short'] = sections[1].split('\n') 219*c8dee2aaSAndroid Build Coastguard Worker logs['bloaty_file_symbol_full'] = sections[2].split('\n') 220*c8dee2aaSAndroid Build Coastguard Worker logs['bloaty_symbol_file_short'] = sections[3].split('\n') 221*c8dee2aaSAndroid Build Coastguard Worker logs['bloaty_symbol_file_full'] = sections[4].split('\n') 222*c8dee2aaSAndroid Build Coastguard Worker logs['perf_json'] = sections[5].split('\n') 223*c8dee2aaSAndroid Build Coastguard Worker 224*c8dee2aaSAndroid Build Coastguard Worker add_binary_size_output_property(result, lib_name, ( 225*c8dee2aaSAndroid Build Coastguard Worker ast.literal_eval(sections[5]) 226*c8dee2aaSAndroid Build Coastguard Worker .get('results', {}) 227*c8dee2aaSAndroid Build Coastguard Worker .get(lib_name, {}) 228*c8dee2aaSAndroid Build Coastguard Worker .get(config, {}) 229*c8dee2aaSAndroid Build Coastguard Worker .get(TOTAL_SIZE_BYTES_KEY, {}))) 230*c8dee2aaSAndroid Build Coastguard Worker 231*c8dee2aaSAndroid Build Coastguard Worker 232*c8dee2aaSAndroid Build Coastguard Worker# Get the size of skia in flutter and a few metrics from bloaty 233*c8dee2aaSAndroid Build Coastguard Workerdef analyze_wasm_file(api, checkout_root, out_dir, files): 234*c8dee2aaSAndroid Build Coastguard Worker (keystr, propstr) = keys_and_props(api) 235*c8dee2aaSAndroid Build Coastguard Worker bloaty_exe = api.path.start_dir.joinpath('bloaty', 'bloaty') 236*c8dee2aaSAndroid Build Coastguard Worker 237*c8dee2aaSAndroid Build Coastguard Worker for f in files: 238*c8dee2aaSAndroid Build Coastguard Worker 239*c8dee2aaSAndroid Build Coastguard Worker skia_dir = checkout_root.joinpath('skia') 240*c8dee2aaSAndroid Build Coastguard Worker with api.context(cwd=skia_dir): 241*c8dee2aaSAndroid Build Coastguard Worker script = skia_dir.joinpath('infra', 'bots', 'buildstats', 242*c8dee2aaSAndroid Build Coastguard Worker 'buildstats_wasm.py') 243*c8dee2aaSAndroid Build Coastguard Worker step_data = api.run(api.step, 'Analyze wasm', 244*c8dee2aaSAndroid Build Coastguard Worker cmd=['python3', script, f, out_dir, keystr, propstr, bloaty_exe, 245*c8dee2aaSAndroid Build Coastguard Worker TOTAL_SIZE_BYTES_KEY, MAGIC_SEPERATOR], 246*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output()) 247*c8dee2aaSAndroid Build Coastguard Worker if step_data and step_data.stdout: 248*c8dee2aaSAndroid Build Coastguard Worker sections = step_data.stdout.decode('utf-8').split(MAGIC_SEPERATOR) 249*c8dee2aaSAndroid Build Coastguard Worker result = api.step.active_result 250*c8dee2aaSAndroid Build Coastguard Worker logs = result.presentation.logs 251*c8dee2aaSAndroid Build Coastguard Worker # Skip section 0 because it's everything before first print, 252*c8dee2aaSAndroid Build Coastguard Worker # which is probably the empty string. 253*c8dee2aaSAndroid Build Coastguard Worker logs['bloaty_symbol_short'] = sections[1].split('\n') 254*c8dee2aaSAndroid Build Coastguard Worker logs['bloaty_symbol_full'] = sections[2].split('\n') 255*c8dee2aaSAndroid Build Coastguard Worker logs['perf_json'] = sections[3].split('\n') 256*c8dee2aaSAndroid Build Coastguard Worker add_binary_size_output_property(result, api.path.basename(f), ( 257*c8dee2aaSAndroid Build Coastguard Worker ast.literal_eval(str(sections[3])) 258*c8dee2aaSAndroid Build Coastguard Worker .get('results', {}) 259*c8dee2aaSAndroid Build Coastguard Worker .get(api.path.basename(f), {}) 260*c8dee2aaSAndroid Build Coastguard Worker .get('default', {}) 261*c8dee2aaSAndroid Build Coastguard Worker .get(TOTAL_SIZE_BYTES_KEY, {}))) 262*c8dee2aaSAndroid Build Coastguard Worker 263*c8dee2aaSAndroid Build Coastguard Worker 264*c8dee2aaSAndroid Build Coastguard Worker# make a zip file containing an HTML treemap of the files 265*c8dee2aaSAndroid Build Coastguard Workerdef make_treemap(api, checkout_root, out_dir, files): 266*c8dee2aaSAndroid Build Coastguard Worker for f in files: 267*c8dee2aaSAndroid Build Coastguard Worker env = {'DOCKER_CONFIG': '/home/chrome-bot/.docker'} 268*c8dee2aaSAndroid Build Coastguard Worker with api.env(env): 269*c8dee2aaSAndroid Build Coastguard Worker skia_dir = checkout_root.joinpath('skia') 270*c8dee2aaSAndroid Build Coastguard Worker with api.context(cwd=skia_dir): 271*c8dee2aaSAndroid Build Coastguard Worker script = skia_dir.joinpath('infra', 'bots', 'buildstats', 272*c8dee2aaSAndroid Build Coastguard Worker 'make_treemap.py') 273*c8dee2aaSAndroid Build Coastguard Worker api.run(api.step, 'Make code size treemap %s' % f, 274*c8dee2aaSAndroid Build Coastguard Worker cmd=['python3', script, f, out_dir], 275*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output()) 276*c8dee2aaSAndroid Build Coastguard Worker 277*c8dee2aaSAndroid Build Coastguard Worker 278*c8dee2aaSAndroid Build Coastguard Workerdef GenTests(api): 279*c8dee2aaSAndroid Build Coastguard Worker builder = 'BuildStats-Debian10-EMCC-wasm-Release-PathKit' 280*c8dee2aaSAndroid Build Coastguard Worker yield ( 281*c8dee2aaSAndroid Build Coastguard Worker api.test('normal_bot') + 282*c8dee2aaSAndroid Build Coastguard Worker api.properties(buildername=builder, 283*c8dee2aaSAndroid Build Coastguard Worker repository='https://skia.googlesource.com/skia.git', 284*c8dee2aaSAndroid Build Coastguard Worker revision='abc123', 285*c8dee2aaSAndroid Build Coastguard Worker swarm_out_dir='[SWARM_OUT_DIR]', 286*c8dee2aaSAndroid Build Coastguard Worker path_config='kitchen') + 287*c8dee2aaSAndroid Build Coastguard Worker api.step_data('get swarming bot id', 288*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output('skia-bot-123')) + 289*c8dee2aaSAndroid Build Coastguard Worker api.step_data('get swarming task id', 290*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output('123456abc')) + 291*c8dee2aaSAndroid Build Coastguard Worker api.step_data('Analyze [START_DIR]/build/pathkit.js.mem', 292*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output(sample_web)) + 293*c8dee2aaSAndroid Build Coastguard Worker api.step_data('Analyze [START_DIR]/build/libskia.so', 294*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output(sample_cpp)) + 295*c8dee2aaSAndroid Build Coastguard Worker api.step_data('Analyze wasm', 296*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output(sample_wasm)) + 297*c8dee2aaSAndroid Build Coastguard Worker api.step_data('Analyze flutter', 298*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output(sample_flutter)) 299*c8dee2aaSAndroid Build Coastguard Worker ) 300*c8dee2aaSAndroid Build Coastguard Worker 301*c8dee2aaSAndroid Build Coastguard Worker yield ( 302*c8dee2aaSAndroid Build Coastguard Worker api.test('trybot') + 303*c8dee2aaSAndroid Build Coastguard Worker api.properties(buildername=builder, 304*c8dee2aaSAndroid Build Coastguard Worker repository='https://skia.googlesource.com/skia.git', 305*c8dee2aaSAndroid Build Coastguard Worker revision='abc123', 306*c8dee2aaSAndroid Build Coastguard Worker swarm_out_dir='[SWARM_OUT_DIR]', 307*c8dee2aaSAndroid Build Coastguard Worker patch_repo='https://skia.googlesource.com/skia.git', 308*c8dee2aaSAndroid Build Coastguard Worker path_config='kitchen') + 309*c8dee2aaSAndroid Build Coastguard Worker api.step_data('get swarming bot id', 310*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output('skia-bot-123')) + 311*c8dee2aaSAndroid Build Coastguard Worker api.step_data('get swarming task id', 312*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output('123456abc')) + 313*c8dee2aaSAndroid Build Coastguard Worker api.properties(patch_storage='gerrit') + 314*c8dee2aaSAndroid Build Coastguard Worker api.properties.tryserver( 315*c8dee2aaSAndroid Build Coastguard Worker buildername=builder, 316*c8dee2aaSAndroid Build Coastguard Worker gerrit_project='skia', 317*c8dee2aaSAndroid Build Coastguard Worker gerrit_url='https://skia-review.googlesource.com/', 318*c8dee2aaSAndroid Build Coastguard Worker ) + 319*c8dee2aaSAndroid Build Coastguard Worker api.step_data('Analyze [START_DIR]/build/pathkit.js.mem', 320*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output(sample_web)) + 321*c8dee2aaSAndroid Build Coastguard Worker api.step_data('Analyze [START_DIR]/build/libskia.so', 322*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output(sample_cpp)) + 323*c8dee2aaSAndroid Build Coastguard Worker api.step_data('Analyze wasm', 324*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output(sample_wasm)) + 325*c8dee2aaSAndroid Build Coastguard Worker api.step_data('Analyze flutter', 326*c8dee2aaSAndroid Build Coastguard Worker stdout=api.raw_io.output(sample_flutter)) 327*c8dee2aaSAndroid Build Coastguard Worker ) 328*c8dee2aaSAndroid Build Coastguard Worker 329*c8dee2aaSAndroid Build Coastguard Workersample_web = """ 330*c8dee2aaSAndroid Build Coastguard WorkerReport A 331*c8dee2aaSAndroid Build Coastguard Worker Total size: 50 bytes 332*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 333*c8dee2aaSAndroid Build Coastguard Worker{ 334*c8dee2aaSAndroid Build Coastguard Worker "some": "json", 335*c8dee2aaSAndroid Build Coastguard Worker "results": { 336*c8dee2aaSAndroid Build Coastguard Worker "pathkit.js.mem": { 337*c8dee2aaSAndroid Build Coastguard Worker "default": { 338*c8dee2aaSAndroid Build Coastguard Worker "total_size_bytes": 7391117, 339*c8dee2aaSAndroid Build Coastguard Worker "gzip_size_bytes": 2884841 340*c8dee2aaSAndroid Build Coastguard Worker } 341*c8dee2aaSAndroid Build Coastguard Worker } 342*c8dee2aaSAndroid Build Coastguard Worker } 343*c8dee2aaSAndroid Build Coastguard Worker} 344*c8dee2aaSAndroid Build Coastguard Worker""" 345*c8dee2aaSAndroid Build Coastguard Worker 346*c8dee2aaSAndroid Build Coastguard Workersample_cpp = """ 347*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 348*c8dee2aaSAndroid Build Coastguard WorkerReport A 349*c8dee2aaSAndroid Build Coastguard Worker Total size: 50 bytes 350*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 351*c8dee2aaSAndroid Build Coastguard Worker{ 352*c8dee2aaSAndroid Build Coastguard Worker "some": "json", 353*c8dee2aaSAndroid Build Coastguard Worker "results": { 354*c8dee2aaSAndroid Build Coastguard Worker "libskia.so": { 355*c8dee2aaSAndroid Build Coastguard Worker "default": { 356*c8dee2aaSAndroid Build Coastguard Worker "total_size_bytes": 7391117, 357*c8dee2aaSAndroid Build Coastguard Worker "gzip_size_bytes": 2884841 358*c8dee2aaSAndroid Build Coastguard Worker } 359*c8dee2aaSAndroid Build Coastguard Worker } 360*c8dee2aaSAndroid Build Coastguard Worker } 361*c8dee2aaSAndroid Build Coastguard Worker} 362*c8dee2aaSAndroid Build Coastguard Worker""" 363*c8dee2aaSAndroid Build Coastguard Worker 364*c8dee2aaSAndroid Build Coastguard Workersample_wasm = """ 365*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 366*c8dee2aaSAndroid Build Coastguard WorkerReport A 367*c8dee2aaSAndroid Build Coastguard Worker Total size: 50 bytes 368*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 369*c8dee2aaSAndroid Build Coastguard WorkerReport B 370*c8dee2aaSAndroid Build Coastguard Worker Total size: 60 bytes 371*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 372*c8dee2aaSAndroid Build Coastguard Worker{ 373*c8dee2aaSAndroid Build Coastguard Worker "some": "json", 374*c8dee2aaSAndroid Build Coastguard Worker "results": { 375*c8dee2aaSAndroid Build Coastguard Worker "pathkit.wasm": { 376*c8dee2aaSAndroid Build Coastguard Worker "default": { 377*c8dee2aaSAndroid Build Coastguard Worker "total_size_bytes": 7391117, 378*c8dee2aaSAndroid Build Coastguard Worker "gzip_size_bytes": 2884841 379*c8dee2aaSAndroid Build Coastguard Worker } 380*c8dee2aaSAndroid Build Coastguard Worker } 381*c8dee2aaSAndroid Build Coastguard Worker } 382*c8dee2aaSAndroid Build Coastguard Worker} 383*c8dee2aaSAndroid Build Coastguard Worker""" 384*c8dee2aaSAndroid Build Coastguard Worker 385*c8dee2aaSAndroid Build Coastguard Workersample_flutter = """ 386*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 387*c8dee2aaSAndroid Build Coastguard WorkerReport A 388*c8dee2aaSAndroid Build Coastguard Worker Total size: 50 bytes 389*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 390*c8dee2aaSAndroid Build Coastguard WorkerReport B 391*c8dee2aaSAndroid Build Coastguard Worker Total size: 60 bytes 392*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 393*c8dee2aaSAndroid Build Coastguard WorkerReport C 394*c8dee2aaSAndroid Build Coastguard Worker Total size: 70 bytes 395*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 396*c8dee2aaSAndroid Build Coastguard WorkerReport D 397*c8dee2aaSAndroid Build Coastguard Worker Total size: 80 bytes 398*c8dee2aaSAndroid Build Coastguard Worker#$%^&* 399*c8dee2aaSAndroid Build Coastguard Worker{ 400*c8dee2aaSAndroid Build Coastguard Worker "some": "json", 401*c8dee2aaSAndroid Build Coastguard Worker "results": { 402*c8dee2aaSAndroid Build Coastguard Worker "libflutter.so": { 403*c8dee2aaSAndroid Build Coastguard Worker "skia_in_flutter": { 404*c8dee2aaSAndroid Build Coastguard Worker "total_size_bytes": 1256676 405*c8dee2aaSAndroid Build Coastguard Worker } 406*c8dee2aaSAndroid Build Coastguard Worker } 407*c8dee2aaSAndroid Build Coastguard Worker } 408*c8dee2aaSAndroid Build Coastguard Worker} 409*c8dee2aaSAndroid Build Coastguard Worker""" 410