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