xref: /aosp_15_r20/external/skia/infra/bots/recipes/compute_buildstats.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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