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