Update rive-cpp to 2.0 version
[platform/core/uifw/rive-tizen.git] / submodule / skia / infra / bots / recipe_modules / flavor / examples / full.expected / Perf-Android-Clang-Pixel6-GPU-Adreno620-arm64-Release-All-Android.json
1 [
2   {
3     "cmd": [
4       "python",
5       "-u",
6       "import os\nprint(os.environ.get('SWARMING_BOT_ID', ''))\n"
7     ],
8     "name": "get swarming bot id",
9     "~followup_annotations": [
10       "@@@STEP_LOG_LINE@python.inline@import os@@@",
11       "@@@STEP_LOG_LINE@python.inline@print(os.environ.get('SWARMING_BOT_ID', ''))@@@",
12       "@@@STEP_LOG_END@python.inline@@@"
13     ]
14   },
15   {
16     "cmd": [
17       "/opt/infra-android/tools/adb",
18       "push",
19       "file.txt",
20       "file.txt"
21     ],
22     "cwd": "[START_DIR]/skia",
23     "env": {
24       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
25       "CHROME_HEADLESS": "1",
26       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
27     },
28     "infra_step": true,
29     "name": "push file.txt file.txt"
30   },
31   {
32     "cmd": [
33       "/opt/infra-android/tools/adb",
34       "shell",
35       "cat",
36       "file.txt"
37     ],
38     "cwd": "[START_DIR]/skia",
39     "env": {
40       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
41       "CHROME_HEADLESS": "1",
42       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
43     },
44     "infra_step": true,
45     "name": "read file.txt"
46   },
47   {
48     "cmd": [
49       "python",
50       "-u",
51       "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(\n      cmd, stderr=subprocess.STDOUT).decode('utf-8')\nexcept subprocess.CalledProcessError as e:\n  output = e.output.decode('utf-8')\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
52       "/opt/infra-android/tools/adb",
53       "file.txt"
54     ],
55     "env": {
56       "CHROME_HEADLESS": "1",
57       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
58     },
59     "infra_step": true,
60     "name": "rm file.txt",
61     "~followup_annotations": [
62       "@@@STEP_LOG_LINE@python.inline@@@@",
63       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
64       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
65       "@@@STEP_LOG_LINE@python.inline@@@@",
66       "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
67       "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
68       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
69       "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
70       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
71       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
72       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
73       "@@@STEP_LOG_LINE@python.inline@@@@",
74       "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
75       "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
76       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
77       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
78       "@@@STEP_LOG_LINE@python.inline@try:@@@",
79       "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(@@@",
80       "@@@STEP_LOG_LINE@python.inline@      cmd, stderr=subprocess.STDOUT).decode('utf-8')@@@",
81       "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
82       "@@@STEP_LOG_LINE@python.inline@  output = e.output.decode('utf-8')@@@",
83       "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
84       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
85       "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
86       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
87       "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
88       "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
89       "@@@STEP_LOG_END@python.inline@@@"
90     ]
91   },
92   {
93     "cmd": [
94       "vpython",
95       "-u",
96       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
97       "--json-output",
98       "/path/to/tmp/json",
99       "rmtree",
100       "results_dir"
101     ],
102     "infra_step": true,
103     "name": "rmtree results_dir"
104   },
105   {
106     "cmd": [
107       "vpython",
108       "-u",
109       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
110       "--json-output",
111       "/path/to/tmp/json",
112       "ensure-directory",
113       "--mode",
114       "0777",
115       "results_dir"
116     ],
117     "infra_step": true,
118     "name": "makedirs results_dir"
119   },
120   {
121     "cmd": [
122       "python",
123       "-u",
124       "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(\n      cmd, stderr=subprocess.STDOUT).decode('utf-8')\nexcept subprocess.CalledProcessError as e:\n  output = e.output.decode('utf-8')\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
125       "/opt/infra-android/tools/adb",
126       "device_results_dir"
127     ],
128     "env": {
129       "CHROME_HEADLESS": "1",
130       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
131     },
132     "infra_step": true,
133     "name": "rm device_results_dir",
134     "~followup_annotations": [
135       "@@@STEP_LOG_LINE@python.inline@@@@",
136       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
137       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
138       "@@@STEP_LOG_LINE@python.inline@@@@",
139       "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
140       "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
141       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
142       "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
143       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
144       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
145       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
146       "@@@STEP_LOG_LINE@python.inline@@@@",
147       "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
148       "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
149       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
150       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
151       "@@@STEP_LOG_LINE@python.inline@try:@@@",
152       "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(@@@",
153       "@@@STEP_LOG_LINE@python.inline@      cmd, stderr=subprocess.STDOUT).decode('utf-8')@@@",
154       "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
155       "@@@STEP_LOG_LINE@python.inline@  output = e.output.decode('utf-8')@@@",
156       "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
157       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
158       "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
159       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
160       "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
161       "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
162       "@@@STEP_LOG_END@python.inline@@@"
163     ]
164   },
165   {
166     "cmd": [
167       "/opt/infra-android/tools/adb",
168       "shell",
169       "mkdir",
170       "-p",
171       "device_results_dir"
172     ],
173     "cwd": "[START_DIR]/skia",
174     "env": {
175       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
176       "CHROME_HEADLESS": "1",
177       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
178     },
179     "infra_step": true,
180     "name": "mkdir device_results_dir"
181   },
182   {
183     "cmd": [
184       "/opt/infra-android/tools/adb",
185       "shell",
186       "mkdir",
187       "-p",
188       "/sdcard/revenge_of_the_skiabot/resources"
189     ],
190     "cwd": "[START_DIR]/skia",
191     "env": {
192       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
193       "CHROME_HEADLESS": "1",
194       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
195     },
196     "infra_step": true,
197     "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
198   },
199   {
200     "cmd": [
201       "python",
202       "-u",
203       "\nimport os\nimport subprocess\nimport sys\nimport time\nADB = sys.argv[1]\ncpu = int(sys.argv[2])\ngov = sys.argv[3]\n\nlog = subprocess.check_output([ADB, 'root']).decode('utf-8')\n# check for message like 'adbd cannot run as root in production builds'\nprint(log)\nif 'cannot' in log:\n  raise Exception('adb root failed')\n\nsubprocess.check_output([\n    ADB, 'shell',\n    'echo \"%s\" > /sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % (\n        gov, cpu)]).decode('utf-8')\nactual_gov = subprocess.check_output([\n    ADB, 'shell', 'cat /sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' %\n        cpu]).decode('utf-8').strip()\nif actual_gov != gov:\n  raise Exception('(actual, expected) (%s, %s)'\n                  % (actual_gov, gov))\n",
204       "/opt/infra-android/tools/adb",
205       "0",
206       "powersave"
207     ],
208     "env": {
209       "CHROME_HEADLESS": "1",
210       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
211     },
212     "infra_step": true,
213     "name": "Set CPU 0's governor to powersave",
214     "timeout": 30,
215     "~followup_annotations": [
216       "@@@STEP_LOG_LINE@python.inline@@@@",
217       "@@@STEP_LOG_LINE@python.inline@import os@@@",
218       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
219       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
220       "@@@STEP_LOG_LINE@python.inline@import time@@@",
221       "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
222       "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
223       "@@@STEP_LOG_LINE@python.inline@gov = sys.argv[3]@@@",
224       "@@@STEP_LOG_LINE@python.inline@@@@",
225       "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root']).decode('utf-8')@@@",
226       "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
227       "@@@STEP_LOG_LINE@python.inline@print(log)@@@",
228       "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
229       "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
230       "@@@STEP_LOG_LINE@python.inline@@@@",
231       "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([@@@",
232       "@@@STEP_LOG_LINE@python.inline@    ADB, 'shell',@@@",
233       "@@@STEP_LOG_LINE@python.inline@    'echo \"%s\" > /sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % (@@@",
234       "@@@STEP_LOG_LINE@python.inline@        gov, cpu)]).decode('utf-8')@@@",
235       "@@@STEP_LOG_LINE@python.inline@actual_gov = subprocess.check_output([@@@",
236       "@@@STEP_LOG_LINE@python.inline@    ADB, 'shell', 'cat /sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' %@@@",
237       "@@@STEP_LOG_LINE@python.inline@        cpu]).decode('utf-8').strip()@@@",
238       "@@@STEP_LOG_LINE@python.inline@if actual_gov != gov:@@@",
239       "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %s)'@@@",
240       "@@@STEP_LOG_LINE@python.inline@                  % (actual_gov, gov))@@@",
241       "@@@STEP_LOG_END@python.inline@@@"
242     ]
243   },
244   {
245     "cmd": [
246       "python",
247       "-u",
248       "\nimport os\nimport subprocess\nimport sys\nimport time\nADB = sys.argv[1]\ncpu = int(sys.argv[2])\nvalue = int(sys.argv[3])\n\nlog = subprocess.check_output([ADB, 'root']).decode('utf-8')\n# check for message like 'adbd cannot run as root in production builds'\nprint(log)\nif 'cannot' in log:\n  raise Exception('adb root failed')\n\n# If we try to echo 1 to an already online cpu, adb returns exit code 1.\n# So, check the value before trying to write it.\nprior_status = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()\nif prior_status == str(value):\n  print('CPU %d online already %d' % (cpu, value))\n  sys.exit()\n\nsubprocess.check_call([ADB, 'shell', 'echo %s > '\n    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])\nactual_status = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()\nif actual_status != str(value):\n  raise Exception('(actual, expected) (%s, %d)'\n                  % (actual_status, value))\n",
249       "/opt/infra-android/tools/adb",
250       "4",
251       "0"
252     ],
253     "env": {
254       "CHROME_HEADLESS": "1",
255       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
256     },
257     "infra_step": true,
258     "name": "Disabling CPU 4",
259     "timeout": 30,
260     "~followup_annotations": [
261       "@@@STEP_LOG_LINE@python.inline@@@@",
262       "@@@STEP_LOG_LINE@python.inline@import os@@@",
263       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
264       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
265       "@@@STEP_LOG_LINE@python.inline@import time@@@",
266       "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
267       "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
268       "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
269       "@@@STEP_LOG_LINE@python.inline@@@@",
270       "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root']).decode('utf-8')@@@",
271       "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
272       "@@@STEP_LOG_LINE@python.inline@print(log)@@@",
273       "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
274       "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
275       "@@@STEP_LOG_LINE@python.inline@@@@",
276       "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
277       "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
278       "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
279       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()@@@",
280       "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
281       "@@@STEP_LOG_LINE@python.inline@  print('CPU %d online already %d' % (cpu, value))@@@",
282       "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
283       "@@@STEP_LOG_LINE@python.inline@@@@",
284       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call([ADB, 'shell', 'echo %s > '@@@",
285       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
286       "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
287       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()@@@",
288       "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
289       "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
290       "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
291       "@@@STEP_LOG_END@python.inline@@@"
292     ]
293   },
294   {
295     "cmd": [
296       "python",
297       "-u",
298       "\nimport os\nimport subprocess\nimport sys\nimport time\nADB = sys.argv[1]\ncpu = int(sys.argv[2])\nvalue = int(sys.argv[3])\n\nlog = subprocess.check_output([ADB, 'root']).decode('utf-8')\n# check for message like 'adbd cannot run as root in production builds'\nprint(log)\nif 'cannot' in log:\n  raise Exception('adb root failed')\n\n# If we try to echo 1 to an already online cpu, adb returns exit code 1.\n# So, check the value before trying to write it.\nprior_status = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()\nif prior_status == str(value):\n  print('CPU %d online already %d' % (cpu, value))\n  sys.exit()\n\nsubprocess.check_call([ADB, 'shell', 'echo %s > '\n    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])\nactual_status = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()\nif actual_status != str(value):\n  raise Exception('(actual, expected) (%s, %d)'\n                  % (actual_status, value))\n",
299       "/opt/infra-android/tools/adb",
300       "5",
301       "0"
302     ],
303     "env": {
304       "CHROME_HEADLESS": "1",
305       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
306     },
307     "infra_step": true,
308     "name": "Disabling CPU 5",
309     "timeout": 30,
310     "~followup_annotations": [
311       "@@@STEP_LOG_LINE@python.inline@@@@",
312       "@@@STEP_LOG_LINE@python.inline@import os@@@",
313       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
314       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
315       "@@@STEP_LOG_LINE@python.inline@import time@@@",
316       "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
317       "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
318       "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
319       "@@@STEP_LOG_LINE@python.inline@@@@",
320       "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root']).decode('utf-8')@@@",
321       "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
322       "@@@STEP_LOG_LINE@python.inline@print(log)@@@",
323       "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
324       "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
325       "@@@STEP_LOG_LINE@python.inline@@@@",
326       "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
327       "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
328       "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
329       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()@@@",
330       "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
331       "@@@STEP_LOG_LINE@python.inline@  print('CPU %d online already %d' % (cpu, value))@@@",
332       "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
333       "@@@STEP_LOG_LINE@python.inline@@@@",
334       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call([ADB, 'shell', 'echo %s > '@@@",
335       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
336       "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
337       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()@@@",
338       "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
339       "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
340       "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
341       "@@@STEP_LOG_END@python.inline@@@"
342     ]
343   },
344   {
345     "cmd": [
346       "python",
347       "-u",
348       "\nimport os\nimport subprocess\nimport sys\nimport time\nADB = sys.argv[1]\ncpu = int(sys.argv[2])\nvalue = int(sys.argv[3])\n\nlog = subprocess.check_output([ADB, 'root']).decode('utf-8')\n# check for message like 'adbd cannot run as root in production builds'\nprint(log)\nif 'cannot' in log:\n  raise Exception('adb root failed')\n\n# If we try to echo 1 to an already online cpu, adb returns exit code 1.\n# So, check the value before trying to write it.\nprior_status = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()\nif prior_status == str(value):\n  print('CPU %d online already %d' % (cpu, value))\n  sys.exit()\n\nsubprocess.check_call([ADB, 'shell', 'echo %s > '\n    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])\nactual_status = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()\nif actual_status != str(value):\n  raise Exception('(actual, expected) (%s, %d)'\n                  % (actual_status, value))\n",
349       "/opt/infra-android/tools/adb",
350       "6",
351       "0"
352     ],
353     "env": {
354       "CHROME_HEADLESS": "1",
355       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
356     },
357     "infra_step": true,
358     "name": "Disabling CPU 6",
359     "timeout": 30,
360     "~followup_annotations": [
361       "@@@STEP_LOG_LINE@python.inline@@@@",
362       "@@@STEP_LOG_LINE@python.inline@import os@@@",
363       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
364       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
365       "@@@STEP_LOG_LINE@python.inline@import time@@@",
366       "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
367       "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
368       "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
369       "@@@STEP_LOG_LINE@python.inline@@@@",
370       "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root']).decode('utf-8')@@@",
371       "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
372       "@@@STEP_LOG_LINE@python.inline@print(log)@@@",
373       "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
374       "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
375       "@@@STEP_LOG_LINE@python.inline@@@@",
376       "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
377       "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
378       "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
379       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()@@@",
380       "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
381       "@@@STEP_LOG_LINE@python.inline@  print('CPU %d online already %d' % (cpu, value))@@@",
382       "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
383       "@@@STEP_LOG_LINE@python.inline@@@@",
384       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call([ADB, 'shell', 'echo %s > '@@@",
385       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
386       "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
387       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()@@@",
388       "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
389       "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
390       "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
391       "@@@STEP_LOG_END@python.inline@@@"
392     ]
393   },
394   {
395     "cmd": [
396       "python",
397       "-u",
398       "\nimport os\nimport subprocess\nimport sys\nimport time\nADB = sys.argv[1]\ncpu = int(sys.argv[2])\nvalue = int(sys.argv[3])\n\nlog = subprocess.check_output([ADB, 'root']).decode('utf-8')\n# check for message like 'adbd cannot run as root in production builds'\nprint(log)\nif 'cannot' in log:\n  raise Exception('adb root failed')\n\n# If we try to echo 1 to an already online cpu, adb returns exit code 1.\n# So, check the value before trying to write it.\nprior_status = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()\nif prior_status == str(value):\n  print('CPU %d online already %d' % (cpu, value))\n  sys.exit()\n\nsubprocess.check_call([ADB, 'shell', 'echo %s > '\n    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])\nactual_status = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()\nif actual_status != str(value):\n  raise Exception('(actual, expected) (%s, %d)'\n                  % (actual_status, value))\n",
399       "/opt/infra-android/tools/adb",
400       "7",
401       "0"
402     ],
403     "env": {
404       "CHROME_HEADLESS": "1",
405       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
406     },
407     "infra_step": true,
408     "name": "Disabling CPU 7",
409     "timeout": 30,
410     "~followup_annotations": [
411       "@@@STEP_LOG_LINE@python.inline@@@@",
412       "@@@STEP_LOG_LINE@python.inline@import os@@@",
413       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
414       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
415       "@@@STEP_LOG_LINE@python.inline@import time@@@",
416       "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
417       "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
418       "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
419       "@@@STEP_LOG_LINE@python.inline@@@@",
420       "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root']).decode('utf-8')@@@",
421       "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
422       "@@@STEP_LOG_LINE@python.inline@print(log)@@@",
423       "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
424       "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
425       "@@@STEP_LOG_LINE@python.inline@@@@",
426       "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
427       "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
428       "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
429       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()@@@",
430       "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
431       "@@@STEP_LOG_LINE@python.inline@  print('CPU %d online already %d' % (cpu, value))@@@",
432       "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
433       "@@@STEP_LOG_LINE@python.inline@@@@",
434       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call([ADB, 'shell', 'echo %s > '@@@",
435       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
436       "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
437       "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).decode('utf-8').strip()@@@",
438       "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
439       "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
440       "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
441       "@@@STEP_LOG_END@python.inline@@@"
442     ]
443   },
444   {
445     "cmd": [
446       "/opt/infra-android/tools/adb",
447       "push",
448       "[START_DIR]/build/nanobench",
449       "/data/local/tmp/"
450     ],
451     "cwd": "[START_DIR]/skia",
452     "env": {
453       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
454       "CHROME_HEADLESS": "1",
455       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
456     },
457     "infra_step": true,
458     "name": "push nanobench"
459   },
460   {
461     "cmd": [
462       "vpython",
463       "-u",
464       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
465       "--json-output",
466       "/path/to/tmp/json",
467       "glob",
468       "[START_DIR]/skia/resources",
469       "*"
470     ],
471     "infra_step": true,
472     "name": "ls [START_DIR]/skia/resources/*",
473     "~followup_annotations": [
474       "@@@STEP_LOG_LINE@glob@[START_DIR]/skia/resources/bar.jpg@@@",
475       "@@@STEP_LOG_LINE@glob@[START_DIR]/skia/resources/foo.png@@@",
476       "@@@STEP_LOG_END@glob@@@"
477     ]
478   },
479   {
480     "cmd": [
481       "/opt/infra-android/tools/adb",
482       "push",
483       "[START_DIR]/skia/resources/bar.jpg",
484       "[START_DIR]/skia/resources/foo.png",
485       "/sdcard/revenge_of_the_skiabot/resources"
486     ],
487     "cwd": "[START_DIR]/skia",
488     "env": {
489       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
490       "CHROME_HEADLESS": "1",
491       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
492     },
493     "infra_step": true,
494     "name": "push --sync [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources"
495   },
496   {
497     "cmd": [
498       "vpython",
499       "-u",
500       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
501       "--json-output",
502       "/path/to/tmp/json",
503       "copy",
504       "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
505       "/path/to/tmp/"
506     ],
507     "infra_step": true,
508     "name": "Get skp VERSION",
509     "~followup_annotations": [
510       "@@@STEP_LOG_LINE@VERSION@42@@@",
511       "@@@STEP_LOG_END@VERSION@@@"
512     ]
513   },
514   {
515     "cmd": [
516       "vpython",
517       "-u",
518       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
519       "--json-output",
520       "/path/to/tmp/json",
521       "copy",
522       "42",
523       "[START_DIR]/tmp/SKP_VERSION"
524     ],
525     "infra_step": true,
526     "name": "write SKP_VERSION",
527     "~followup_annotations": [
528       "@@@STEP_LOG_LINE@SKP_VERSION@42@@@",
529       "@@@STEP_LOG_END@SKP_VERSION@@@"
530     ]
531   },
532   {
533     "cmd": [
534       "/opt/infra-android/tools/adb",
535       "shell",
536       "cat",
537       "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
538     ],
539     "cwd": "[START_DIR]/skia",
540     "env": {
541       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
542       "CHROME_HEADLESS": "1",
543       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
544     },
545     "infra_step": true,
546     "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION"
547   },
548   {
549     "cmd": [
550       "python",
551       "-u",
552       "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(\n      cmd, stderr=subprocess.STDOUT).decode('utf-8')\nexcept subprocess.CalledProcessError as e:\n  output = e.output.decode('utf-8')\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
553       "/opt/infra-android/tools/adb",
554       "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
555     ],
556     "env": {
557       "CHROME_HEADLESS": "1",
558       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
559     },
560     "infra_step": true,
561     "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION",
562     "~followup_annotations": [
563       "@@@STEP_LOG_LINE@python.inline@@@@",
564       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
565       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
566       "@@@STEP_LOG_LINE@python.inline@@@@",
567       "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
568       "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
569       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
570       "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
571       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
572       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
573       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
574       "@@@STEP_LOG_LINE@python.inline@@@@",
575       "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
576       "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
577       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
578       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
579       "@@@STEP_LOG_LINE@python.inline@try:@@@",
580       "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(@@@",
581       "@@@STEP_LOG_LINE@python.inline@      cmd, stderr=subprocess.STDOUT).decode('utf-8')@@@",
582       "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
583       "@@@STEP_LOG_LINE@python.inline@  output = e.output.decode('utf-8')@@@",
584       "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
585       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
586       "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
587       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
588       "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
589       "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
590       "@@@STEP_LOG_END@python.inline@@@"
591     ]
592   },
593   {
594     "cmd": [
595       "python",
596       "-u",
597       "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(\n      cmd, stderr=subprocess.STDOUT).decode('utf-8')\nexcept subprocess.CalledProcessError as e:\n  output = e.output.decode('utf-8')\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
598       "/opt/infra-android/tools/adb",
599       "/sdcard/revenge_of_the_skiabot/skps"
600     ],
601     "env": {
602       "CHROME_HEADLESS": "1",
603       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
604     },
605     "infra_step": true,
606     "name": "rm /sdcard/revenge_of_the_skiabot/skps",
607     "~followup_annotations": [
608       "@@@STEP_LOG_LINE@python.inline@@@@",
609       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
610       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
611       "@@@STEP_LOG_LINE@python.inline@@@@",
612       "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
613       "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
614       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
615       "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
616       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
617       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
618       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
619       "@@@STEP_LOG_LINE@python.inline@@@@",
620       "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
621       "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
622       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
623       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
624       "@@@STEP_LOG_LINE@python.inline@try:@@@",
625       "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(@@@",
626       "@@@STEP_LOG_LINE@python.inline@      cmd, stderr=subprocess.STDOUT).decode('utf-8')@@@",
627       "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
628       "@@@STEP_LOG_LINE@python.inline@  output = e.output.decode('utf-8')@@@",
629       "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
630       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
631       "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
632       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
633       "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
634       "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
635       "@@@STEP_LOG_END@python.inline@@@"
636     ]
637   },
638   {
639     "cmd": [
640       "/opt/infra-android/tools/adb",
641       "shell",
642       "mkdir",
643       "-p",
644       "/sdcard/revenge_of_the_skiabot/skps"
645     ],
646     "cwd": "[START_DIR]/skia",
647     "env": {
648       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
649       "CHROME_HEADLESS": "1",
650       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
651     },
652     "infra_step": true,
653     "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
654   },
655   {
656     "cmd": [
657       "vpython",
658       "-u",
659       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
660       "--json-output",
661       "/path/to/tmp/json",
662       "glob",
663       "[START_DIR]/skp",
664       "*"
665     ],
666     "infra_step": true,
667     "name": "ls [START_DIR]/skp/*",
668     "~followup_annotations": [
669       "@@@STEP_LOG_LINE@glob@[START_DIR]/skp/bar.jpg@@@",
670       "@@@STEP_LOG_LINE@glob@[START_DIR]/skp/foo.png@@@",
671       "@@@STEP_LOG_END@glob@@@"
672     ]
673   },
674   {
675     "cmd": [
676       "/opt/infra-android/tools/adb",
677       "push",
678       "[START_DIR]/skp/bar.jpg",
679       "[START_DIR]/skp/foo.png",
680       "/sdcard/revenge_of_the_skiabot/skps"
681     ],
682     "cwd": "[START_DIR]/skia",
683     "env": {
684       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
685       "CHROME_HEADLESS": "1",
686       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
687     },
688     "infra_step": true,
689     "name": "push --sync [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps"
690   },
691   {
692     "cmd": [
693       "/opt/infra-android/tools/adb",
694       "push",
695       "[START_DIR]/tmp/SKP_VERSION",
696       "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
697     ],
698     "cwd": "[START_DIR]/skia",
699     "env": {
700       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
701       "CHROME_HEADLESS": "1",
702       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
703     },
704     "infra_step": true,
705     "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
706   },
707   {
708     "cmd": [
709       "vpython",
710       "-u",
711       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
712       "--json-output",
713       "/path/to/tmp/json",
714       "copy",
715       "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
716       "/path/to/tmp/"
717     ],
718     "infra_step": true,
719     "name": "Get skimage VERSION",
720     "~followup_annotations": [
721       "@@@STEP_LOG_LINE@VERSION@42@@@",
722       "@@@STEP_LOG_END@VERSION@@@"
723     ]
724   },
725   {
726     "cmd": [
727       "vpython",
728       "-u",
729       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
730       "--json-output",
731       "/path/to/tmp/json",
732       "copy",
733       "42",
734       "[START_DIR]/tmp/SK_IMAGE_VERSION"
735     ],
736     "infra_step": true,
737     "name": "write SK_IMAGE_VERSION",
738     "~followup_annotations": [
739       "@@@STEP_LOG_LINE@SK_IMAGE_VERSION@42@@@",
740       "@@@STEP_LOG_END@SK_IMAGE_VERSION@@@"
741     ]
742   },
743   {
744     "cmd": [
745       "/opt/infra-android/tools/adb",
746       "shell",
747       "cat",
748       "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
749     ],
750     "cwd": "[START_DIR]/skia",
751     "env": {
752       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
753       "CHROME_HEADLESS": "1",
754       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
755     },
756     "infra_step": true,
757     "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
758   },
759   {
760     "cmd": [
761       "python",
762       "-u",
763       "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(\n      cmd, stderr=subprocess.STDOUT).decode('utf-8')\nexcept subprocess.CalledProcessError as e:\n  output = e.output.decode('utf-8')\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
764       "/opt/infra-android/tools/adb",
765       "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
766     ],
767     "env": {
768       "CHROME_HEADLESS": "1",
769       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
770     },
771     "infra_step": true,
772     "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION",
773     "~followup_annotations": [
774       "@@@STEP_LOG_LINE@python.inline@@@@",
775       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
776       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
777       "@@@STEP_LOG_LINE@python.inline@@@@",
778       "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
779       "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
780       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
781       "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
782       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
783       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
784       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
785       "@@@STEP_LOG_LINE@python.inline@@@@",
786       "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
787       "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
788       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
789       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
790       "@@@STEP_LOG_LINE@python.inline@try:@@@",
791       "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(@@@",
792       "@@@STEP_LOG_LINE@python.inline@      cmd, stderr=subprocess.STDOUT).decode('utf-8')@@@",
793       "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
794       "@@@STEP_LOG_LINE@python.inline@  output = e.output.decode('utf-8')@@@",
795       "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
796       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
797       "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
798       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
799       "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
800       "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
801       "@@@STEP_LOG_END@python.inline@@@"
802     ]
803   },
804   {
805     "cmd": [
806       "python",
807       "-u",
808       "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(\n      cmd, stderr=subprocess.STDOUT).decode('utf-8')\nexcept subprocess.CalledProcessError as e:\n  output = e.output.decode('utf-8')\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
809       "/opt/infra-android/tools/adb",
810       "/sdcard/revenge_of_the_skiabot/images"
811     ],
812     "env": {
813       "CHROME_HEADLESS": "1",
814       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
815     },
816     "infra_step": true,
817     "name": "rm /sdcard/revenge_of_the_skiabot/images",
818     "~followup_annotations": [
819       "@@@STEP_LOG_LINE@python.inline@@@@",
820       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
821       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
822       "@@@STEP_LOG_LINE@python.inline@@@@",
823       "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
824       "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
825       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
826       "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
827       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
828       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
829       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
830       "@@@STEP_LOG_LINE@python.inline@@@@",
831       "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
832       "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
833       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
834       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
835       "@@@STEP_LOG_LINE@python.inline@try:@@@",
836       "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(@@@",
837       "@@@STEP_LOG_LINE@python.inline@      cmd, stderr=subprocess.STDOUT).decode('utf-8')@@@",
838       "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
839       "@@@STEP_LOG_LINE@python.inline@  output = e.output.decode('utf-8')@@@",
840       "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
841       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
842       "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
843       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
844       "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
845       "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
846       "@@@STEP_LOG_END@python.inline@@@"
847     ]
848   },
849   {
850     "cmd": [
851       "/opt/infra-android/tools/adb",
852       "shell",
853       "mkdir",
854       "-p",
855       "/sdcard/revenge_of_the_skiabot/images"
856     ],
857     "cwd": "[START_DIR]/skia",
858     "env": {
859       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
860       "CHROME_HEADLESS": "1",
861       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
862     },
863     "infra_step": true,
864     "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
865   },
866   {
867     "cmd": [
868       "vpython",
869       "-u",
870       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
871       "--json-output",
872       "/path/to/tmp/json",
873       "glob",
874       "[START_DIR]/skimage",
875       "*"
876     ],
877     "infra_step": true,
878     "name": "ls [START_DIR]/skimage/*",
879     "~followup_annotations": [
880       "@@@STEP_LOG_LINE@glob@[START_DIR]/skimage/bar.jpg@@@",
881       "@@@STEP_LOG_LINE@glob@[START_DIR]/skimage/foo.png@@@",
882       "@@@STEP_LOG_END@glob@@@"
883     ]
884   },
885   {
886     "cmd": [
887       "/opt/infra-android/tools/adb",
888       "push",
889       "[START_DIR]/skimage/bar.jpg",
890       "[START_DIR]/skimage/foo.png",
891       "/sdcard/revenge_of_the_skiabot/images"
892     ],
893     "cwd": "[START_DIR]/skia",
894     "env": {
895       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
896       "CHROME_HEADLESS": "1",
897       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
898     },
899     "infra_step": true,
900     "name": "push --sync [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images"
901   },
902   {
903     "cmd": [
904       "/opt/infra-android/tools/adb",
905       "push",
906       "[START_DIR]/tmp/SK_IMAGE_VERSION",
907       "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
908     ],
909     "cwd": "[START_DIR]/skia",
910     "env": {
911       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
912       "CHROME_HEADLESS": "1",
913       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
914     },
915     "infra_step": true,
916     "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
917   },
918   {
919     "cmd": [
920       "vpython",
921       "-u",
922       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
923       "--json-output",
924       "/path/to/tmp/json",
925       "copy",
926       "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
927       "/path/to/tmp/"
928     ],
929     "infra_step": true,
930     "name": "Get svg VERSION",
931     "~followup_annotations": [
932       "@@@STEP_LOG_LINE@VERSION@42@@@",
933       "@@@STEP_LOG_END@VERSION@@@"
934     ]
935   },
936   {
937     "cmd": [
938       "vpython",
939       "-u",
940       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
941       "--json-output",
942       "/path/to/tmp/json",
943       "copy",
944       "42",
945       "[START_DIR]/tmp/SVG_VERSION"
946     ],
947     "infra_step": true,
948     "name": "write SVG_VERSION",
949     "~followup_annotations": [
950       "@@@STEP_LOG_LINE@SVG_VERSION@42@@@",
951       "@@@STEP_LOG_END@SVG_VERSION@@@"
952     ]
953   },
954   {
955     "cmd": [
956       "/opt/infra-android/tools/adb",
957       "shell",
958       "cat",
959       "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
960     ],
961     "cwd": "[START_DIR]/skia",
962     "env": {
963       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
964       "CHROME_HEADLESS": "1",
965       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
966     },
967     "infra_step": true,
968     "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION"
969   },
970   {
971     "cmd": [
972       "python",
973       "-u",
974       "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(\n      cmd, stderr=subprocess.STDOUT).decode('utf-8')\nexcept subprocess.CalledProcessError as e:\n  output = e.output.decode('utf-8')\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
975       "/opt/infra-android/tools/adb",
976       "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
977     ],
978     "env": {
979       "CHROME_HEADLESS": "1",
980       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
981     },
982     "infra_step": true,
983     "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION",
984     "~followup_annotations": [
985       "@@@STEP_LOG_LINE@python.inline@@@@",
986       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
987       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
988       "@@@STEP_LOG_LINE@python.inline@@@@",
989       "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
990       "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
991       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
992       "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
993       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
994       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
995       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
996       "@@@STEP_LOG_LINE@python.inline@@@@",
997       "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
998       "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
999       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
1000       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
1001       "@@@STEP_LOG_LINE@python.inline@try:@@@",
1002       "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(@@@",
1003       "@@@STEP_LOG_LINE@python.inline@      cmd, stderr=subprocess.STDOUT).decode('utf-8')@@@",
1004       "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
1005       "@@@STEP_LOG_LINE@python.inline@  output = e.output.decode('utf-8')@@@",
1006       "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
1007       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
1008       "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
1009       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
1010       "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
1011       "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
1012       "@@@STEP_LOG_END@python.inline@@@"
1013     ]
1014   },
1015   {
1016     "cmd": [
1017       "python",
1018       "-u",
1019       "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(\n      cmd, stderr=subprocess.STDOUT).decode('utf-8')\nexcept subprocess.CalledProcessError as e:\n  output = e.output.decode('utf-8')\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
1020       "/opt/infra-android/tools/adb",
1021       "/sdcard/revenge_of_the_skiabot/svgs"
1022     ],
1023     "env": {
1024       "CHROME_HEADLESS": "1",
1025       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1026     },
1027     "infra_step": true,
1028     "name": "rm /sdcard/revenge_of_the_skiabot/svgs",
1029     "~followup_annotations": [
1030       "@@@STEP_LOG_LINE@python.inline@@@@",
1031       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
1032       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
1033       "@@@STEP_LOG_LINE@python.inline@@@@",
1034       "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
1035       "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
1036       "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
1037       "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
1038       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
1039       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
1040       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
1041       "@@@STEP_LOG_LINE@python.inline@@@@",
1042       "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
1043       "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
1044       "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
1045       "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
1046       "@@@STEP_LOG_LINE@python.inline@try:@@@",
1047       "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(@@@",
1048       "@@@STEP_LOG_LINE@python.inline@      cmd, stderr=subprocess.STDOUT).decode('utf-8')@@@",
1049       "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
1050       "@@@STEP_LOG_LINE@python.inline@  output = e.output.decode('utf-8')@@@",
1051       "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
1052       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
1053       "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
1054       "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
1055       "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
1056       "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
1057       "@@@STEP_LOG_END@python.inline@@@"
1058     ]
1059   },
1060   {
1061     "cmd": [
1062       "/opt/infra-android/tools/adb",
1063       "shell",
1064       "mkdir",
1065       "-p",
1066       "/sdcard/revenge_of_the_skiabot/svgs"
1067     ],
1068     "cwd": "[START_DIR]/skia",
1069     "env": {
1070       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1071       "CHROME_HEADLESS": "1",
1072       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1073     },
1074     "infra_step": true,
1075     "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
1076   },
1077   {
1078     "cmd": [
1079       "vpython",
1080       "-u",
1081       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1082       "--json-output",
1083       "/path/to/tmp/json",
1084       "glob",
1085       "[START_DIR]/svg",
1086       "*"
1087     ],
1088     "infra_step": true,
1089     "name": "ls [START_DIR]/svg/*",
1090     "~followup_annotations": [
1091       "@@@STEP_LOG_LINE@glob@[START_DIR]/svg/bar.jpg@@@",
1092       "@@@STEP_LOG_LINE@glob@[START_DIR]/svg/foo.png@@@",
1093       "@@@STEP_LOG_END@glob@@@"
1094     ]
1095   },
1096   {
1097     "cmd": [
1098       "/opt/infra-android/tools/adb",
1099       "push",
1100       "[START_DIR]/svg/bar.jpg",
1101       "[START_DIR]/svg/foo.png",
1102       "/sdcard/revenge_of_the_skiabot/svgs"
1103     ],
1104     "cwd": "[START_DIR]/skia",
1105     "env": {
1106       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1107       "CHROME_HEADLESS": "1",
1108       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1109     },
1110     "infra_step": true,
1111     "name": "push --sync [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs"
1112   },
1113   {
1114     "cmd": [
1115       "/opt/infra-android/tools/adb",
1116       "push",
1117       "[START_DIR]/tmp/SVG_VERSION",
1118       "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
1119     ],
1120     "cwd": "[START_DIR]/skia",
1121     "env": {
1122       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1123       "CHROME_HEADLESS": "1",
1124       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1125     },
1126     "infra_step": true,
1127     "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
1128   },
1129   {
1130     "cmd": [
1131       "vpython",
1132       "-u",
1133       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1134       "--json-output",
1135       "/path/to/tmp/json",
1136       "copy",
1137       "set -x; LD_LIBRARY_PATH=/data/local/tmp/ /data/local/tmp/nanobench --some-flag; echo $? >/data/local/tmp/rc",
1138       "[START_DIR]/tmp/nanobench.sh"
1139     ],
1140     "infra_step": true,
1141     "name": "write nanobench.sh",
1142     "~followup_annotations": [
1143       "@@@STEP_LOG_LINE@nanobench.sh@set -x; LD_LIBRARY_PATH=/data/local/tmp/ /data/local/tmp/nanobench --some-flag; echo $? >/data/local/tmp/rc@@@",
1144       "@@@STEP_LOG_END@nanobench.sh@@@"
1145     ]
1146   },
1147   {
1148     "cmd": [
1149       "/opt/infra-android/tools/adb",
1150       "push",
1151       "[START_DIR]/tmp/nanobench.sh",
1152       "/data/local/tmp/"
1153     ],
1154     "cwd": "[START_DIR]/skia",
1155     "env": {
1156       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1157       "CHROME_HEADLESS": "1",
1158       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1159     },
1160     "infra_step": true,
1161     "name": "push nanobench.sh"
1162   },
1163   {
1164     "cmd": [
1165       "/opt/infra-android/tools/adb",
1166       "logcat",
1167       "-c"
1168     ],
1169     "cwd": "[START_DIR]/skia",
1170     "env": {
1171       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1172       "CHROME_HEADLESS": "1",
1173       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1174     },
1175     "infra_step": true,
1176     "name": "clear log"
1177   },
1178   {
1179     "cmd": [
1180       "python",
1181       "-u",
1182       "\nimport subprocess\nimport sys\nbin_dir = sys.argv[1]\nsh      = sys.argv[2]\nsubprocess.check_call(['/opt/infra-android/tools/adb', 'shell', 'sh', bin_dir + sh])\ntry:\n  sys.exit(int(subprocess.check_output([\n      '/opt/infra-android/tools/adb', 'shell', 'cat', bin_dir + 'rc']).decode('utf-8')))\nexcept ValueError:\n  print(\"Couldn't read the return code.  Probably killed for OOM.\")\n  sys.exit(1)\n",
1183       "/data/local/tmp/",
1184       "nanobench.sh"
1185     ],
1186     "name": "nanobench",
1187     "~followup_annotations": [
1188       "@@@STEP_LOG_LINE@python.inline@@@@",
1189       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
1190       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
1191       "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
1192       "@@@STEP_LOG_LINE@python.inline@sh      = sys.argv[2]@@@",
1193       "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['/opt/infra-android/tools/adb', 'shell', 'sh', bin_dir + sh])@@@",
1194       "@@@STEP_LOG_LINE@python.inline@try:@@@",
1195       "@@@STEP_LOG_LINE@python.inline@  sys.exit(int(subprocess.check_output([@@@",
1196       "@@@STEP_LOG_LINE@python.inline@      '/opt/infra-android/tools/adb', 'shell', 'cat', bin_dir + 'rc']).decode('utf-8')))@@@",
1197       "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
1198       "@@@STEP_LOG_LINE@python.inline@  print(\"Couldn't read the return code.  Probably killed for OOM.\")@@@",
1199       "@@@STEP_LOG_LINE@python.inline@  sys.exit(1)@@@",
1200       "@@@STEP_LOG_END@python.inline@@@"
1201     ]
1202   },
1203   {
1204     "cmd": [],
1205     "name": "adb pull"
1206   },
1207   {
1208     "cmd": [
1209       "/opt/infra-android/tools/adb",
1210       "pull",
1211       "/sdcard/revenge_of_the_skiabot/perf",
1212       "[CLEANUP]/adb_pull_tmp_1"
1213     ],
1214     "cwd": "[START_DIR]/skia",
1215     "env": {
1216       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1217       "CHROME_HEADLESS": "1",
1218       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1219     },
1220     "infra_step": true,
1221     "name": "adb pull.pull /sdcard/revenge_of_the_skiabot/perf",
1222     "~followup_annotations": [
1223       "@@@STEP_NEST_LEVEL@1@@@"
1224     ]
1225   },
1226   {
1227     "cmd": [
1228       "vpython",
1229       "-u",
1230       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1231       "--json-output",
1232       "/path/to/tmp/json",
1233       "glob",
1234       "[CLEANUP]/adb_pull_tmp_1",
1235       "perf/*"
1236     ],
1237     "infra_step": true,
1238     "name": "adb pull.list pulled files",
1239     "~followup_annotations": [
1240       "@@@STEP_NEST_LEVEL@1@@@",
1241       "@@@STEP_LOG_LINE@glob@[CLEANUP]/adb_pull_tmp_1/1.png@@@",
1242       "@@@STEP_LOG_LINE@glob@[CLEANUP]/adb_pull_tmp_1/2.png@@@",
1243       "@@@STEP_LOG_END@glob@@@"
1244     ]
1245   },
1246   {
1247     "cmd": [
1248       "vpython",
1249       "-u",
1250       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1251       "--json-output",
1252       "/path/to/tmp/json",
1253       "copy",
1254       "[CLEANUP]/adb_pull_tmp_1/1.png",
1255       "[START_DIR]/[SWARM_OUT_DIR]"
1256     ],
1257     "infra_step": true,
1258     "name": "adb pull.copy 1.png",
1259     "~followup_annotations": [
1260       "@@@STEP_NEST_LEVEL@1@@@"
1261     ]
1262   },
1263   {
1264     "cmd": [
1265       "vpython",
1266       "-u",
1267       "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1268       "--json-output",
1269       "/path/to/tmp/json",
1270       "copy",
1271       "[CLEANUP]/adb_pull_tmp_1/2.png",
1272       "[START_DIR]/[SWARM_OUT_DIR]"
1273     ],
1274     "infra_step": true,
1275     "name": "adb pull.copy 2.png",
1276     "~followup_annotations": [
1277       "@@@STEP_NEST_LEVEL@1@@@"
1278     ]
1279   },
1280   {
1281     "cmd": [
1282       "python",
1283       "-u",
1284       "\nimport os\nimport subprocess\nimport sys\nout = sys.argv[1]\nlog = subprocess.check_output([\n    '/opt/infra-android/tools/adb', 'logcat', '-d']).decode('utf-8', errors='ignore')\nfor line in log.split('\\n'):\n  tokens = line.split()\n  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':\n    addr, path = tokens[-2:]\n    local = os.path.join(out, os.path.basename(path))\n    if os.path.exists(local):\n      try:\n        sym = subprocess.check_output([\n            'addr2line', '-Cfpe', local, addr]).decode('utf-8')\n        line = line.replace(addr, addr + ' ' + sym.strip())\n      except subprocess.CalledProcessError:\n        pass\n  print(line)\n",
1285       "[START_DIR]/build"
1286     ],
1287     "env": {
1288       "CHROME_HEADLESS": "1",
1289       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1290     },
1291     "infra_step": true,
1292     "name": "dump log",
1293     "timeout": 300,
1294     "~followup_annotations": [
1295       "@@@STEP_LOG_LINE@python.inline@@@@",
1296       "@@@STEP_LOG_LINE@python.inline@import os@@@",
1297       "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
1298       "@@@STEP_LOG_LINE@python.inline@import sys@@@",
1299       "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
1300       "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([@@@",
1301       "@@@STEP_LOG_LINE@python.inline@    '/opt/infra-android/tools/adb', 'logcat', '-d']).decode('utf-8', errors='ignore')@@@",
1302       "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
1303       "@@@STEP_LOG_LINE@python.inline@  tokens = line.split()@@@",
1304       "@@@STEP_LOG_LINE@python.inline@  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
1305       "@@@STEP_LOG_LINE@python.inline@    addr, path = tokens[-2:]@@@",
1306       "@@@STEP_LOG_LINE@python.inline@    local = os.path.join(out, os.path.basename(path))@@@",
1307       "@@@STEP_LOG_LINE@python.inline@    if os.path.exists(local):@@@",
1308       "@@@STEP_LOG_LINE@python.inline@      try:@@@",
1309       "@@@STEP_LOG_LINE@python.inline@        sym = subprocess.check_output([@@@",
1310       "@@@STEP_LOG_LINE@python.inline@            'addr2line', '-Cfpe', local, addr]).decode('utf-8')@@@",
1311       "@@@STEP_LOG_LINE@python.inline@        line = line.replace(addr, addr + ' ' + sym.strip())@@@",
1312       "@@@STEP_LOG_LINE@python.inline@      except subprocess.CalledProcessError:@@@",
1313       "@@@STEP_LOG_LINE@python.inline@        pass@@@",
1314       "@@@STEP_LOG_LINE@python.inline@  print(line)@@@",
1315       "@@@STEP_LOG_END@python.inline@@@"
1316     ]
1317   },
1318   {
1319     "cmd": [
1320       "/opt/infra-android/tools/adb",
1321       "kill-server"
1322     ],
1323     "cwd": "[START_DIR]/skia",
1324     "env": {
1325       "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/chrome_infrastructure_adbkey",
1326       "CHROME_HEADLESS": "1",
1327       "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1328     },
1329     "infra_step": true,
1330     "name": "kill adb server"
1331   },
1332   {
1333     "name": "$result"
1334   }
1335 ]