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 perf.
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ciimport calendar
10cb93a386Sopenharmony_ciimport json
11cb93a386Sopenharmony_ciimport os
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ciPYTHON_VERSION_COMPATIBILITY = "PY2+3"
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ciDEPS = [
16cb93a386Sopenharmony_ci  'env',
17cb93a386Sopenharmony_ci  'flavor',
18cb93a386Sopenharmony_ci  'recipe_engine/file',
19cb93a386Sopenharmony_ci  'recipe_engine/json',
20cb93a386Sopenharmony_ci  'recipe_engine/path',
21cb93a386Sopenharmony_ci  'recipe_engine/platform',
22cb93a386Sopenharmony_ci  'recipe_engine/properties',
23cb93a386Sopenharmony_ci  'recipe_engine/raw_io',
24cb93a386Sopenharmony_ci  'recipe_engine/step',
25cb93a386Sopenharmony_ci  'recipe_engine/time',
26cb93a386Sopenharmony_ci  'run',
27cb93a386Sopenharmony_ci  'vars',
28cb93a386Sopenharmony_ci]
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_cidef perf_steps(api):
32cb93a386Sopenharmony_ci  """Run Skia benchmarks."""
33cb93a386Sopenharmony_ci  do_upload = api.properties.get('do_upload') == 'true'
34cb93a386Sopenharmony_ci  images = api.properties.get('images') == 'true'
35cb93a386Sopenharmony_ci  resources = api.properties.get('resources') == 'true'
36cb93a386Sopenharmony_ci  skps = api.properties.get('skps') == 'true'
37cb93a386Sopenharmony_ci  svgs = api.properties.get('svgs') == 'true'
38cb93a386Sopenharmony_ci  texttraces = api.properties.get('texttraces') == 'true'
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ci  api.flavor.install(
41cb93a386Sopenharmony_ci      resources=resources,
42cb93a386Sopenharmony_ci      skps=skps,
43cb93a386Sopenharmony_ci      images=images,
44cb93a386Sopenharmony_ci      svgs=svgs,
45cb93a386Sopenharmony_ci      texttraces=texttraces,
46cb93a386Sopenharmony_ci  )
47cb93a386Sopenharmony_ci
48cb93a386Sopenharmony_ci  if do_upload:
49cb93a386Sopenharmony_ci    api.flavor.create_clean_device_dir(
50cb93a386Sopenharmony_ci        api.flavor.device_dirs.perf_data_dir)
51cb93a386Sopenharmony_ci
52cb93a386Sopenharmony_ci  # Find nanobench flags.
53cb93a386Sopenharmony_ci  args = json.loads(api.properties['nanobench_flags'])
54cb93a386Sopenharmony_ci  props = json.loads(api.properties['nanobench_properties'])
55cb93a386Sopenharmony_ci  swarming_bot_id = api.vars.swarming_bot_id
56cb93a386Sopenharmony_ci  swarming_task_id = api.vars.swarming_task_id
57cb93a386Sopenharmony_ci  if do_upload:
58cb93a386Sopenharmony_ci    args.append('--properties')
59cb93a386Sopenharmony_ci    # Map iteration order is arbitrary; in order to maintain a consistent step
60cb93a386Sopenharmony_ci    # ordering, sort by key.
61cb93a386Sopenharmony_ci    for k in sorted(props.keys()):
62cb93a386Sopenharmony_ci      v = props[k]
63cb93a386Sopenharmony_ci      if v == '${SWARMING_BOT_ID}':
64cb93a386Sopenharmony_ci        v = swarming_bot_id
65cb93a386Sopenharmony_ci      elif v == '${SWARMING_TASK_ID}':
66cb93a386Sopenharmony_ci        v = swarming_task_id
67cb93a386Sopenharmony_ci      if v != '':
68cb93a386Sopenharmony_ci        args.extend([k, v])
69cb93a386Sopenharmony_ci
70cb93a386Sopenharmony_ci  # Paths to required resources.
71cb93a386Sopenharmony_ci  if resources:
72cb93a386Sopenharmony_ci    args.extend(['-i', api.flavor.device_dirs.resource_dir])
73cb93a386Sopenharmony_ci  if skps:
74cb93a386Sopenharmony_ci    args.extend(['--skps', api.flavor.device_dirs.skp_dir]),
75cb93a386Sopenharmony_ci  if images:
76cb93a386Sopenharmony_ci    args.extend(['--images', api.flavor.device_path_join(
77cb93a386Sopenharmony_ci        api.flavor.device_dirs.images_dir, 'nanobench')])
78cb93a386Sopenharmony_ci  if texttraces:
79cb93a386Sopenharmony_ci    assert api.flavor.device_dirs.texttraces_dir
80cb93a386Sopenharmony_ci    args.extend(['--texttraces', api.flavor.device_dirs.texttraces_dir])
81cb93a386Sopenharmony_ci  if svgs:
82cb93a386Sopenharmony_ci    args.extend(['--svgs',  api.flavor.device_dirs.svg_dir])
83cb93a386Sopenharmony_ci  if do_upload:
84cb93a386Sopenharmony_ci    now = api.time.utcnow()
85cb93a386Sopenharmony_ci    ts = int(calendar.timegm(now.utctimetuple()))
86cb93a386Sopenharmony_ci    json_path = api.flavor.device_path_join(
87cb93a386Sopenharmony_ci        api.flavor.device_dirs.perf_data_dir,
88cb93a386Sopenharmony_ci        'nanobench_%s_%d.json' % (api.properties['revision'], ts))
89cb93a386Sopenharmony_ci    args.extend(['--outResultsFile', json_path])
90cb93a386Sopenharmony_ci
91cb93a386Sopenharmony_ci  api.run(api.flavor.step, 'nanobench', cmd=args,
92cb93a386Sopenharmony_ci          abort_on_failure=False)
93cb93a386Sopenharmony_ci
94cb93a386Sopenharmony_ci  # Copy results to swarming out dir.
95cb93a386Sopenharmony_ci  if do_upload:
96cb93a386Sopenharmony_ci    api.file.ensure_directory(
97cb93a386Sopenharmony_ci        'makedirs perf_dir',
98cb93a386Sopenharmony_ci        api.flavor.host_dirs.perf_data_dir)
99cb93a386Sopenharmony_ci    api.flavor.copy_directory_contents_to_host(
100cb93a386Sopenharmony_ci        api.flavor.device_dirs.perf_data_dir,
101cb93a386Sopenharmony_ci        api.flavor.host_dirs.perf_data_dir)
102cb93a386Sopenharmony_ci
103cb93a386Sopenharmony_ci
104cb93a386Sopenharmony_cidef RunSteps(api):
105cb93a386Sopenharmony_ci  api.vars.setup()
106cb93a386Sopenharmony_ci  api.file.ensure_directory('makedirs tmp_dir', api.vars.tmp_dir)
107cb93a386Sopenharmony_ci  api.flavor.setup('nanobench')
108cb93a386Sopenharmony_ci
109cb93a386Sopenharmony_ci  try:
110cb93a386Sopenharmony_ci    perf_steps(api)
111cb93a386Sopenharmony_ci  finally:
112cb93a386Sopenharmony_ci    api.flavor.cleanup_steps()
113cb93a386Sopenharmony_ci  api.run.check_failure()
114cb93a386Sopenharmony_ci
115cb93a386Sopenharmony_ci
116cb93a386Sopenharmony_ciTEST_BUILDERS = [
117cb93a386Sopenharmony_ci  'Perf-Android-Clang-Nexus7-CPU-Tegra3-arm-Debug-All-Android',
118cb93a386Sopenharmony_ci  ('Perf-Ubuntu18-Clang-Golo-GPU-QuadroP400-x86_64-Release-All'
119cb93a386Sopenharmony_ci   '-Valgrind_SK_CPU_LIMIT_SSE41'),
120cb93a386Sopenharmony_ci  'Perf-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-ANGLE',
121cb93a386Sopenharmony_ci]
122cb93a386Sopenharmony_ci
123cb93a386Sopenharmony_ci
124cb93a386Sopenharmony_cidef GenTests(api):
125cb93a386Sopenharmony_ci  for builder in TEST_BUILDERS:
126cb93a386Sopenharmony_ci    props = dict(
127cb93a386Sopenharmony_ci      buildername=builder,
128cb93a386Sopenharmony_ci      nanobench_flags='["nanobench","--example","--flags"]',
129cb93a386Sopenharmony_ci      nanobench_properties=('{"key1":"value1","key2":"",'
130cb93a386Sopenharmony_ci                            '"bot":"${SWARMING_BOT_ID}",'
131cb93a386Sopenharmony_ci                            '"task":"${SWARMING_TASK_ID}"}'),
132cb93a386Sopenharmony_ci      path_config='kitchen',
133cb93a386Sopenharmony_ci      resources='true',
134cb93a386Sopenharmony_ci      revision='abc123',
135cb93a386Sopenharmony_ci      swarm_out_dir='[SWARM_OUT_DIR]'
136cb93a386Sopenharmony_ci    )
137cb93a386Sopenharmony_ci    if 'Valgrind' not in builder and 'Debug' not in builder:
138cb93a386Sopenharmony_ci      props['do_upload'] = 'true'
139cb93a386Sopenharmony_ci    if 'GPU' not in builder:
140cb93a386Sopenharmony_ci      props['images'] = 'true'
141cb93a386Sopenharmony_ci    if 'iOS' not in builder:
142cb93a386Sopenharmony_ci      props['skps'] = 'true'
143cb93a386Sopenharmony_ci    if 'Valgrind' not in builder:
144cb93a386Sopenharmony_ci      props['svgs'] = 'true'
145cb93a386Sopenharmony_ci    if 'Android' in builder and 'CPU' in builder:
146cb93a386Sopenharmony_ci      props['texttraces'] = 'true'
147cb93a386Sopenharmony_ci    test = (
148cb93a386Sopenharmony_ci      api.test(builder) +
149cb93a386Sopenharmony_ci      api.properties(**props) +
150cb93a386Sopenharmony_ci      api.path.exists(
151cb93a386Sopenharmony_ci          api.path['start_dir'].join('skia'),
152cb93a386Sopenharmony_ci          api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
153cb93a386Sopenharmony_ci                                     'skimage', 'VERSION'),
154cb93a386Sopenharmony_ci          api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
155cb93a386Sopenharmony_ci                                     'skp', 'VERSION'),
156cb93a386Sopenharmony_ci          api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
157cb93a386Sopenharmony_ci      ) +
158cb93a386Sopenharmony_ci      api.step_data('get swarming bot id',
159cb93a386Sopenharmony_ci          stdout=api.raw_io.output('skia-bot-123')) +
160cb93a386Sopenharmony_ci      api.step_data('get swarming task id',
161cb93a386Sopenharmony_ci          stdout=api.raw_io.output('123456'))
162cb93a386Sopenharmony_ci    )
163cb93a386Sopenharmony_ci    if 'Win' in builder:
164cb93a386Sopenharmony_ci      test += api.platform('win', 64)
165cb93a386Sopenharmony_ci
166cb93a386Sopenharmony_ci    yield test
167