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