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