• 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      "/usr/bin/adb.1.0.35",
527      "shell",
528      "rm",
529      "-rf",
530      "/sdcard/revenge_of_the_skiabot/perf"
531    ],
532    "cwd": "[START_DIR]/skia",
533    "env": {
534      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
535      "CHROME_HEADLESS": "1",
536      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
537    },
538    "infra_step": true,
539    "name": "rm /sdcard/revenge_of_the_skiabot/perf"
540  },
541  {
542    "cmd": [
543      "/usr/bin/adb.1.0.35",
544      "shell",
545      "mkdir",
546      "-p",
547      "/sdcard/revenge_of_the_skiabot/perf"
548    ],
549    "cwd": "[START_DIR]/skia",
550    "env": {
551      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
552      "CHROME_HEADLESS": "1",
553      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
554    },
555    "infra_step": true,
556    "name": "mkdir /sdcard/revenge_of_the_skiabot/perf"
557  },
558  {
559    "cmd": [
560      "python",
561      "-u",
562      "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
563    ],
564    "name": "get swarming task id",
565    "~followup_annotations": [
566      "@@@STEP_LOG_LINE@python.inline@import os@@@",
567      "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
568      "@@@STEP_LOG_END@python.inline@@@"
569    ]
570  },
571  {
572    "cmd": [
573      "python",
574      "-u",
575      "\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",
576      "/usr/bin/adb.1.0.35",
577      "4",
578      "userspace"
579    ],
580    "env": {
581      "CHROME_HEADLESS": "1",
582      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
583    },
584    "infra_step": true,
585    "name": "Set CPU 4's governor to userspace",
586    "timeout": 30,
587    "~followup_annotations": [
588      "@@@STEP_LOG_LINE@python.inline@@@@",
589      "@@@STEP_LOG_LINE@python.inline@import os@@@",
590      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
591      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
592      "@@@STEP_LOG_LINE@python.inline@import time@@@",
593      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
594      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
595      "@@@STEP_LOG_LINE@python.inline@gov = sys.argv[3]@@@",
596      "@@@STEP_LOG_LINE@python.inline@@@@",
597      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
598      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
599      "@@@STEP_LOG_LINE@python.inline@print log@@@",
600      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
601      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
602      "@@@STEP_LOG_LINE@python.inline@@@@",
603      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo \"%s\" > '@@@",
604      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % (gov, cpu)])@@@",
605      "@@@STEP_LOG_LINE@python.inline@actual_gov = subprocess.check_output([ADB, 'shell', 'cat '@@@",
606      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % cpu]).strip()@@@",
607      "@@@STEP_LOG_LINE@python.inline@if actual_gov != gov:@@@",
608      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %s)'@@@",
609      "@@@STEP_LOG_LINE@python.inline@                  % (actual_gov, gov))@@@",
610      "@@@STEP_LOG_END@python.inline@@@"
611    ]
612  },
613  {
614    "cmd": [
615      "python",
616      "-u",
617      "\nimport os\nimport subprocess\nimport sys\nimport time\nADB = sys.argv[1]\ntarget_percent = float(sys.argv[2])\ncpu = int(sys.argv[3])\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\nroot = '/sys/devices/system/cpu/cpu%d/cpufreq' %cpu\n\n# All devices we test on give a list of their available frequencies.\navailable_freqs = subprocess.check_output([ADB, 'shell',\n    'cat %s/scaling_available_frequencies' % root])\n\n# Check for message like '/system/bin/sh: file not found'\nif available_freqs and '/system/bin/sh' not in available_freqs:\n  available_freqs = sorted(\n      int(i) for i in available_freqs.strip().split())\nelse:\n  raise Exception('Could not get list of available frequencies: %s' %\n                  available_freqs)\n\nmaxfreq = available_freqs[-1]\ntarget = int(round(maxfreq * target_percent))\nfreq = maxfreq\nfor f in reversed(available_freqs):\n  if f <= target:\n    freq = f\n    break\n\nprint 'Setting frequency to %d' % freq\n\n# If scaling_max_freq is lower than our attempted setting, it won't take.\n# We must set min first, because if we try to set max to be less than min\n# (which sometimes happens after certain devices reboot) it returns a\n# perplexing permissions error.\nsubprocess.check_output([ADB, 'shell', 'echo 0 > '\n    '%s/scaling_min_freq' % root])\nsubprocess.check_output([ADB, 'shell', 'echo %d > '\n    '%s/scaling_max_freq' % (freq, root)])\nsubprocess.check_output([ADB, 'shell', 'echo %d > '\n    '%s/scaling_setspeed' % (freq, root)])\ntime.sleep(5)\nactual_freq = subprocess.check_output([ADB, 'shell', 'cat '\n    '%s/scaling_cur_freq' % root]).strip()\nif actual_freq != str(freq):\n  raise Exception('(actual, expected) (%s, %d)'\n                  % (actual_freq, freq))\n",
618      "/usr/bin/adb.1.0.35",
619      "0.6",
620      "4"
621    ],
622    "env": {
623      "CHROME_HEADLESS": "1",
624      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
625    },
626    "infra_step": true,
627    "name": "Scale CPU 4 to 0.600000",
628    "timeout": 30,
629    "~followup_annotations": [
630      "@@@STEP_LOG_LINE@python.inline@@@@",
631      "@@@STEP_LOG_LINE@python.inline@import os@@@",
632      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
633      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
634      "@@@STEP_LOG_LINE@python.inline@import time@@@",
635      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
636      "@@@STEP_LOG_LINE@python.inline@target_percent = float(sys.argv[2])@@@",
637      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[3])@@@",
638      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
639      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
640      "@@@STEP_LOG_LINE@python.inline@print log@@@",
641      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
642      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
643      "@@@STEP_LOG_LINE@python.inline@@@@",
644      "@@@STEP_LOG_LINE@python.inline@root = '/sys/devices/system/cpu/cpu%d/cpufreq' %cpu@@@",
645      "@@@STEP_LOG_LINE@python.inline@@@@",
646      "@@@STEP_LOG_LINE@python.inline@# All devices we test on give a list of their available frequencies.@@@",
647      "@@@STEP_LOG_LINE@python.inline@available_freqs = subprocess.check_output([ADB, 'shell',@@@",
648      "@@@STEP_LOG_LINE@python.inline@    'cat %s/scaling_available_frequencies' % root])@@@",
649      "@@@STEP_LOG_LINE@python.inline@@@@",
650      "@@@STEP_LOG_LINE@python.inline@# Check for message like '/system/bin/sh: file not found'@@@",
651      "@@@STEP_LOG_LINE@python.inline@if available_freqs and '/system/bin/sh' not in available_freqs:@@@",
652      "@@@STEP_LOG_LINE@python.inline@  available_freqs = sorted(@@@",
653      "@@@STEP_LOG_LINE@python.inline@      int(i) for i in available_freqs.strip().split())@@@",
654      "@@@STEP_LOG_LINE@python.inline@else:@@@",
655      "@@@STEP_LOG_LINE@python.inline@  raise Exception('Could not get list of available frequencies: %s' %@@@",
656      "@@@STEP_LOG_LINE@python.inline@                  available_freqs)@@@",
657      "@@@STEP_LOG_LINE@python.inline@@@@",
658      "@@@STEP_LOG_LINE@python.inline@maxfreq = available_freqs[-1]@@@",
659      "@@@STEP_LOG_LINE@python.inline@target = int(round(maxfreq * target_percent))@@@",
660      "@@@STEP_LOG_LINE@python.inline@freq = maxfreq@@@",
661      "@@@STEP_LOG_LINE@python.inline@for f in reversed(available_freqs):@@@",
662      "@@@STEP_LOG_LINE@python.inline@  if f <= target:@@@",
663      "@@@STEP_LOG_LINE@python.inline@    freq = f@@@",
664      "@@@STEP_LOG_LINE@python.inline@    break@@@",
665      "@@@STEP_LOG_LINE@python.inline@@@@",
666      "@@@STEP_LOG_LINE@python.inline@print 'Setting frequency to %d' % freq@@@",
667      "@@@STEP_LOG_LINE@python.inline@@@@",
668      "@@@STEP_LOG_LINE@python.inline@# If scaling_max_freq is lower than our attempted setting, it won't take.@@@",
669      "@@@STEP_LOG_LINE@python.inline@# We must set min first, because if we try to set max to be less than min@@@",
670      "@@@STEP_LOG_LINE@python.inline@# (which sometimes happens after certain devices reboot) it returns a@@@",
671      "@@@STEP_LOG_LINE@python.inline@# perplexing permissions error.@@@",
672      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo 0 > '@@@",
673      "@@@STEP_LOG_LINE@python.inline@    '%s/scaling_min_freq' % root])@@@",
674      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo %d > '@@@",
675      "@@@STEP_LOG_LINE@python.inline@    '%s/scaling_max_freq' % (freq, root)])@@@",
676      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo %d > '@@@",
677      "@@@STEP_LOG_LINE@python.inline@    '%s/scaling_setspeed' % (freq, root)])@@@",
678      "@@@STEP_LOG_LINE@python.inline@time.sleep(5)@@@",
679      "@@@STEP_LOG_LINE@python.inline@actual_freq = subprocess.check_output([ADB, 'shell', 'cat '@@@",
680      "@@@STEP_LOG_LINE@python.inline@    '%s/scaling_cur_freq' % root]).strip()@@@",
681      "@@@STEP_LOG_LINE@python.inline@if actual_freq != str(freq):@@@",
682      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
683      "@@@STEP_LOG_LINE@python.inline@                  % (actual_freq, freq))@@@",
684      "@@@STEP_LOG_END@python.inline@@@"
685    ]
686  },
687  {
688    "cmd": [
689      "python",
690      "-u",
691      "\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",
692      "/usr/bin/adb.1.0.35",
693      "0",
694      "0"
695    ],
696    "env": {
697      "CHROME_HEADLESS": "1",
698      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
699    },
700    "infra_step": true,
701    "name": "Disabling CPU 0",
702    "timeout": 30,
703    "~followup_annotations": [
704      "@@@STEP_LOG_LINE@python.inline@@@@",
705      "@@@STEP_LOG_LINE@python.inline@import os@@@",
706      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
707      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
708      "@@@STEP_LOG_LINE@python.inline@import time@@@",
709      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
710      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
711      "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
712      "@@@STEP_LOG_LINE@python.inline@@@@",
713      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
714      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
715      "@@@STEP_LOG_LINE@python.inline@print log@@@",
716      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
717      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
718      "@@@STEP_LOG_LINE@python.inline@@@@",
719      "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
720      "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
721      "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
722      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
723      "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
724      "@@@STEP_LOG_LINE@python.inline@  print 'CPU %d online already %d' % (cpu, value)@@@",
725      "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
726      "@@@STEP_LOG_LINE@python.inline@@@@",
727      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo %s > '@@@",
728      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
729      "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
730      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
731      "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
732      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
733      "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
734      "@@@STEP_LOG_END@python.inline@@@"
735    ]
736  },
737  {
738    "cmd": [
739      "python",
740      "-u",
741      "\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",
742      "/usr/bin/adb.1.0.35",
743      "1",
744      "0"
745    ],
746    "env": {
747      "CHROME_HEADLESS": "1",
748      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
749    },
750    "infra_step": true,
751    "name": "Disabling CPU 1",
752    "timeout": 30,
753    "~followup_annotations": [
754      "@@@STEP_LOG_LINE@python.inline@@@@",
755      "@@@STEP_LOG_LINE@python.inline@import os@@@",
756      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
757      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
758      "@@@STEP_LOG_LINE@python.inline@import time@@@",
759      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
760      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
761      "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
762      "@@@STEP_LOG_LINE@python.inline@@@@",
763      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
764      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
765      "@@@STEP_LOG_LINE@python.inline@print log@@@",
766      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
767      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
768      "@@@STEP_LOG_LINE@python.inline@@@@",
769      "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
770      "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
771      "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
772      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
773      "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
774      "@@@STEP_LOG_LINE@python.inline@  print 'CPU %d online already %d' % (cpu, value)@@@",
775      "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
776      "@@@STEP_LOG_LINE@python.inline@@@@",
777      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo %s > '@@@",
778      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
779      "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
780      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
781      "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
782      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
783      "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
784      "@@@STEP_LOG_END@python.inline@@@"
785    ]
786  },
787  {
788    "cmd": [
789      "python",
790      "-u",
791      "\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",
792      "/usr/bin/adb.1.0.35",
793      "2",
794      "0"
795    ],
796    "env": {
797      "CHROME_HEADLESS": "1",
798      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
799    },
800    "infra_step": true,
801    "name": "Disabling CPU 2",
802    "timeout": 30,
803    "~followup_annotations": [
804      "@@@STEP_LOG_LINE@python.inline@@@@",
805      "@@@STEP_LOG_LINE@python.inline@import os@@@",
806      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
807      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
808      "@@@STEP_LOG_LINE@python.inline@import time@@@",
809      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
810      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
811      "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
812      "@@@STEP_LOG_LINE@python.inline@@@@",
813      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
814      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
815      "@@@STEP_LOG_LINE@python.inline@print log@@@",
816      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
817      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
818      "@@@STEP_LOG_LINE@python.inline@@@@",
819      "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
820      "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
821      "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
822      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
823      "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
824      "@@@STEP_LOG_LINE@python.inline@  print 'CPU %d online already %d' % (cpu, value)@@@",
825      "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
826      "@@@STEP_LOG_LINE@python.inline@@@@",
827      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo %s > '@@@",
828      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
829      "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
830      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
831      "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
832      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
833      "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
834      "@@@STEP_LOG_END@python.inline@@@"
835    ]
836  },
837  {
838    "cmd": [
839      "python",
840      "-u",
841      "\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",
842      "/usr/bin/adb.1.0.35",
843      "3",
844      "0"
845    ],
846    "env": {
847      "CHROME_HEADLESS": "1",
848      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
849    },
850    "infra_step": true,
851    "name": "Disabling CPU 3",
852    "timeout": 30,
853    "~followup_annotations": [
854      "@@@STEP_LOG_LINE@python.inline@@@@",
855      "@@@STEP_LOG_LINE@python.inline@import os@@@",
856      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
857      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
858      "@@@STEP_LOG_LINE@python.inline@import time@@@",
859      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
860      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
861      "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
862      "@@@STEP_LOG_LINE@python.inline@@@@",
863      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
864      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
865      "@@@STEP_LOG_LINE@python.inline@print log@@@",
866      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
867      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
868      "@@@STEP_LOG_LINE@python.inline@@@@",
869      "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
870      "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
871      "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
872      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
873      "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
874      "@@@STEP_LOG_LINE@python.inline@  print 'CPU %d online already %d' % (cpu, value)@@@",
875      "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
876      "@@@STEP_LOG_LINE@python.inline@@@@",
877      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo %s > '@@@",
878      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
879      "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
880      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
881      "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
882      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
883      "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
884      "@@@STEP_LOG_END@python.inline@@@"
885    ]
886  },
887  {
888    "cmd": [
889      "python",
890      "-u",
891      "\nimport os\nimport subprocess\nimport sys\nimport time\nADB = sys.argv[1]\nfreq = sys.argv[2]\nidle_timer = \"10000\"\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', 'stop', 'thermald'])\n\nsubprocess.check_output([ADB, 'shell', 'echo \"%s\" > '\n    '/sys/class/kgsl/kgsl-3d0/gpuclk' % freq])\n\nactual_freq = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/class/kgsl/kgsl-3d0/gpuclk']).strip()\nif actual_freq != freq:\n  raise Exception('Frequency (actual, expected) (%s, %s)'\n                  % (actual_freq, freq))\n\nsubprocess.check_output([ADB, 'shell', 'echo \"%s\" > '\n    '/sys/class/kgsl/kgsl-3d0/idle_timer' % idle_timer])\n\nactual_timer = subprocess.check_output([ADB, 'shell', 'cat '\n    '/sys/class/kgsl/kgsl-3d0/idle_timer']).strip()\nif actual_timer != idle_timer:\n  raise Exception('idle_timer (actual, expected) (%s, %s)'\n                  % (actual_timer, idle_timer))\n\nfor s in ['force_bus_on', 'force_rail_on', 'force_clk_on']:\n  subprocess.check_output([ADB, 'shell', 'echo \"1\" > '\n      '/sys/class/kgsl/kgsl-3d0/%s' % s])\n  actual_set = subprocess.check_output([ADB, 'shell', 'cat '\n      '/sys/class/kgsl/kgsl-3d0/%s' % s]).strip()\n  if actual_set != \"1\":\n    raise Exception('%s (actual, expected) (%s, 1)'\n                    % (s, actual_set))\n",
892      "/usr/bin/adb.1.0.35",
893      "600000000"
894    ],
895    "env": {
896      "CHROME_HEADLESS": "1",
897      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
898    },
899    "infra_step": true,
900    "name": "Lock GPU to 600000000 (and other perf tweaks)",
901    "timeout": 30,
902    "~followup_annotations": [
903      "@@@STEP_LOG_LINE@python.inline@@@@",
904      "@@@STEP_LOG_LINE@python.inline@import os@@@",
905      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
906      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
907      "@@@STEP_LOG_LINE@python.inline@import time@@@",
908      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
909      "@@@STEP_LOG_LINE@python.inline@freq = sys.argv[2]@@@",
910      "@@@STEP_LOG_LINE@python.inline@idle_timer = \"10000\"@@@",
911      "@@@STEP_LOG_LINE@python.inline@@@@",
912      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
913      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
914      "@@@STEP_LOG_LINE@python.inline@print log@@@",
915      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
916      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
917      "@@@STEP_LOG_LINE@python.inline@@@@",
918      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'stop', 'thermald'])@@@",
919      "@@@STEP_LOG_LINE@python.inline@@@@",
920      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo \"%s\" > '@@@",
921      "@@@STEP_LOG_LINE@python.inline@    '/sys/class/kgsl/kgsl-3d0/gpuclk' % freq])@@@",
922      "@@@STEP_LOG_LINE@python.inline@@@@",
923      "@@@STEP_LOG_LINE@python.inline@actual_freq = subprocess.check_output([ADB, 'shell', 'cat '@@@",
924      "@@@STEP_LOG_LINE@python.inline@    '/sys/class/kgsl/kgsl-3d0/gpuclk']).strip()@@@",
925      "@@@STEP_LOG_LINE@python.inline@if actual_freq != freq:@@@",
926      "@@@STEP_LOG_LINE@python.inline@  raise Exception('Frequency (actual, expected) (%s, %s)'@@@",
927      "@@@STEP_LOG_LINE@python.inline@                  % (actual_freq, freq))@@@",
928      "@@@STEP_LOG_LINE@python.inline@@@@",
929      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo \"%s\" > '@@@",
930      "@@@STEP_LOG_LINE@python.inline@    '/sys/class/kgsl/kgsl-3d0/idle_timer' % idle_timer])@@@",
931      "@@@STEP_LOG_LINE@python.inline@@@@",
932      "@@@STEP_LOG_LINE@python.inline@actual_timer = subprocess.check_output([ADB, 'shell', 'cat '@@@",
933      "@@@STEP_LOG_LINE@python.inline@    '/sys/class/kgsl/kgsl-3d0/idle_timer']).strip()@@@",
934      "@@@STEP_LOG_LINE@python.inline@if actual_timer != idle_timer:@@@",
935      "@@@STEP_LOG_LINE@python.inline@  raise Exception('idle_timer (actual, expected) (%s, %s)'@@@",
936      "@@@STEP_LOG_LINE@python.inline@                  % (actual_timer, idle_timer))@@@",
937      "@@@STEP_LOG_LINE@python.inline@@@@",
938      "@@@STEP_LOG_LINE@python.inline@for s in ['force_bus_on', 'force_rail_on', 'force_clk_on']:@@@",
939      "@@@STEP_LOG_LINE@python.inline@  subprocess.check_output([ADB, 'shell', 'echo \"1\" > '@@@",
940      "@@@STEP_LOG_LINE@python.inline@      '/sys/class/kgsl/kgsl-3d0/%s' % s])@@@",
941      "@@@STEP_LOG_LINE@python.inline@  actual_set = subprocess.check_output([ADB, 'shell', 'cat '@@@",
942      "@@@STEP_LOG_LINE@python.inline@      '/sys/class/kgsl/kgsl-3d0/%s' % s]).strip()@@@",
943      "@@@STEP_LOG_LINE@python.inline@  if actual_set != \"1\":@@@",
944      "@@@STEP_LOG_LINE@python.inline@    raise Exception('%s (actual, expected) (%s, 1)'@@@",
945      "@@@STEP_LOG_LINE@python.inline@                    % (s, actual_set))@@@",
946      "@@@STEP_LOG_END@python.inline@@@"
947    ]
948  },
949  {
950    "cmd": [
951      "/usr/bin/adb.1.0.35",
952      "push",
953      "[START_DIR]/build/nanobench",
954      "/data/local/tmp/"
955    ],
956    "cwd": "[START_DIR]/skia",
957    "env": {
958      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
959      "CHROME_HEADLESS": "1",
960      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
961    },
962    "infra_step": true,
963    "name": "push nanobench"
964  },
965  {
966    "cmd": [
967      "python",
968      "-u",
969      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
970      "--json-output",
971      "/path/to/tmp/json",
972      "copy",
973      "set -x; /data/local/tmp/nanobench -i /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/nanobench --svgs /sdcard/revenge_of_the_skiabot/svgs --pre_log --images --gpuStatsDump true --scales 1.0 1.1 --nocpu --config gles glessrgb glesmsaa4 --gpuThreads 0 --match ~blurroundrect ~patch_grid ~desk_carsvg ~keymobi_shop_mobileweb_ebay_com.skp ~inc0.gif ~inc1.gif ~incInterlaced.gif ~inc0.jpg ~incGray.jpg ~inc0.wbmp ~inc1.wbmp ~inc0.webp ~inc1.webp ~inc0.ico ~inc1.ico ~inc0.png ~inc1.png ~inc2.png ~inc12.png ~inc13.png ~inc14.png ~inc0.webp ~inc1.webp --outResultsFile /sdcard/revenge_of_the_skiabot/perf/nanobench_abc123_1337000001.json --properties gitHash abc123 swarming_bot_id skia-bot-123 swarming_task_id 123456 --key arch arm64 compiler Clang cpu_or_gpu GPU cpu_or_gpu_value Adreno418 extra_config Android_NoGPUThreads model Nexus5x os Android; echo $? >/data/local/tmp/rc",
974      "[START_DIR]/tmp/nanobench.sh"
975    ],
976    "env": {
977      "CHROME_HEADLESS": "1",
978      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
979    },
980    "infra_step": true,
981    "name": "write nanobench.sh",
982    "~followup_annotations": [
983      "@@@STEP_LOG_LINE@nanobench.sh@set -x; /data/local/tmp/nanobench -i /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/nanobench --svgs /sdcard/revenge_of_the_skiabot/svgs --pre_log --images --gpuStatsDump true --scales 1.0 1.1 --nocpu --config gles glessrgb glesmsaa4 --gpuThreads 0 --match ~blurroundrect ~patch_grid ~desk_carsvg ~keymobi_shop_mobileweb_ebay_com.skp ~inc0.gif ~inc1.gif ~incInterlaced.gif ~inc0.jpg ~incGray.jpg ~inc0.wbmp ~inc1.wbmp ~inc0.webp ~inc1.webp ~inc0.ico ~inc1.ico ~inc0.png ~inc1.png ~inc2.png ~inc12.png ~inc13.png ~inc14.png ~inc0.webp ~inc1.webp --outResultsFile /sdcard/revenge_of_the_skiabot/perf/nanobench_abc123_1337000001.json --properties gitHash abc123 swarming_bot_id skia-bot-123 swarming_task_id 123456 --key arch arm64 compiler Clang cpu_or_gpu GPU cpu_or_gpu_value Adreno418 extra_config Android_NoGPUThreads model Nexus5x os Android; echo $? >/data/local/tmp/rc@@@",
984      "@@@STEP_LOG_END@nanobench.sh@@@"
985    ]
986  },
987  {
988    "cmd": [
989      "/usr/bin/adb.1.0.35",
990      "push",
991      "[START_DIR]/tmp/nanobench.sh",
992      "/data/local/tmp/"
993    ],
994    "cwd": "[START_DIR]/skia",
995    "env": {
996      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
997      "CHROME_HEADLESS": "1",
998      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
999    },
1000    "infra_step": true,
1001    "name": "push nanobench.sh"
1002  },
1003  {
1004    "cmd": [
1005      "/usr/bin/adb.1.0.35",
1006      "logcat",
1007      "-c"
1008    ],
1009    "cwd": "[START_DIR]/skia",
1010    "env": {
1011      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
1012      "CHROME_HEADLESS": "1",
1013      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1014    },
1015    "infra_step": true,
1016    "name": "clear log"
1017  },
1018  {
1019    "cmd": [
1020      "python",
1021      "-u",
1022      "\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",
1023      "/data/local/tmp/",
1024      "nanobench.sh"
1025    ],
1026    "env": {
1027      "CHROME_HEADLESS": "1",
1028      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1029    },
1030    "name": "nanobench",
1031    "~followup_annotations": [
1032      "@@@STEP_LOG_LINE@python.inline@@@@",
1033      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
1034      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
1035      "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
1036      "@@@STEP_LOG_LINE@python.inline@sh      = sys.argv[2]@@@",
1037      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['/usr/bin/adb.1.0.35', 'shell', 'sh', bin_dir + sh])@@@",
1038      "@@@STEP_LOG_LINE@python.inline@try:@@@",
1039      "@@@STEP_LOG_LINE@python.inline@  sys.exit(int(subprocess.check_output(['/usr/bin/adb.1.0.35', 'shell', 'cat',@@@",
1040      "@@@STEP_LOG_LINE@python.inline@                                        bin_dir + 'rc'])))@@@",
1041      "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
1042      "@@@STEP_LOG_LINE@python.inline@  print \"Couldn't read the return code.  Probably killed for OOM.\"@@@",
1043      "@@@STEP_LOG_LINE@python.inline@  sys.exit(1)@@@",
1044      "@@@STEP_LOG_END@python.inline@@@"
1045    ]
1046  },
1047  {
1048    "cmd": [
1049      "python",
1050      "-u",
1051      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1052      "--json-output",
1053      "/path/to/tmp/json",
1054      "ensure-directory",
1055      "--mode",
1056      "0777",
1057      "[START_DIR]/[SWARM_OUT_DIR]"
1058    ],
1059    "infra_step": true,
1060    "name": "makedirs perf_dir"
1061  },
1062  {
1063    "cmd": [],
1064    "name": "adb pull"
1065  },
1066  {
1067    "cmd": [
1068      "/usr/bin/adb.1.0.35",
1069      "pull",
1070      "/sdcard/revenge_of_the_skiabot/perf",
1071      "[CLEANUP]/adb_pull_tmp_1"
1072    ],
1073    "cwd": "[START_DIR]/skia",
1074    "env": {
1075      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
1076      "CHROME_HEADLESS": "1",
1077      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1078    },
1079    "infra_step": true,
1080    "name": "adb pull.pull /sdcard/revenge_of_the_skiabot/perf",
1081    "~followup_annotations": [
1082      "@@@STEP_NEST_LEVEL@1@@@"
1083    ]
1084  },
1085  {
1086    "cmd": [
1087      "python",
1088      "-u",
1089      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1090      "--json-output",
1091      "/path/to/tmp/json",
1092      "glob",
1093      "[CLEANUP]/adb_pull_tmp_1",
1094      "perf/*"
1095    ],
1096    "infra_step": true,
1097    "name": "adb pull.list pulled files",
1098    "~followup_annotations": [
1099      "@@@STEP_NEST_LEVEL@1@@@",
1100      "@@@STEP_LOG_LINE@glob@[CLEANUP]/adb_pull_tmp_1/1.png@@@",
1101      "@@@STEP_LOG_LINE@glob@[CLEANUP]/adb_pull_tmp_1/2.png@@@",
1102      "@@@STEP_LOG_END@glob@@@"
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/1.png",
1114      "[START_DIR]/[SWARM_OUT_DIR]"
1115    ],
1116    "infra_step": true,
1117    "name": "adb pull.copy 1.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      "copy",
1130      "[CLEANUP]/adb_pull_tmp_1/2.png",
1131      "[START_DIR]/[SWARM_OUT_DIR]"
1132    ],
1133    "infra_step": true,
1134    "name": "adb pull.copy 2.png",
1135    "~followup_annotations": [
1136      "@@@STEP_NEST_LEVEL@1@@@"
1137    ]
1138  },
1139  {
1140    "cmd": [
1141      "python",
1142      "-u",
1143      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
1144      "--json-output",
1145      "/path/to/tmp/json",
1146      "rmtree",
1147      "[CLEANUP]/adb_pull_tmp_1"
1148    ],
1149    "infra_step": true,
1150    "name": "adb pull.rmtree [CLEANUP]/adb_pull_tmp_1",
1151    "~followup_annotations": [
1152      "@@@STEP_NEST_LEVEL@1@@@"
1153    ]
1154  },
1155  {
1156    "cmd": [
1157      "python",
1158      "-u",
1159      "\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",
1160      "[START_DIR]/build"
1161    ],
1162    "env": {
1163      "CHROME_HEADLESS": "1",
1164      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1165    },
1166    "infra_step": true,
1167    "name": "dump log",
1168    "timeout": 300,
1169    "~followup_annotations": [
1170      "@@@STEP_LOG_LINE@python.inline@@@@",
1171      "@@@STEP_LOG_LINE@python.inline@import os@@@",
1172      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
1173      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
1174      "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
1175      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['/usr/bin/adb.1.0.35', 'logcat', '-d'])@@@",
1176      "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
1177      "@@@STEP_LOG_LINE@python.inline@  tokens = line.split()@@@",
1178      "@@@STEP_LOG_LINE@python.inline@  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
1179      "@@@STEP_LOG_LINE@python.inline@    addr, path = tokens[-2:]@@@",
1180      "@@@STEP_LOG_LINE@python.inline@    local = os.path.join(out, os.path.basename(path))@@@",
1181      "@@@STEP_LOG_LINE@python.inline@    if os.path.exists(local):@@@",
1182      "@@@STEP_LOG_LINE@python.inline@      sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
1183      "@@@STEP_LOG_LINE@python.inline@      line = line.replace(addr, addr + ' ' + sym.strip())@@@",
1184      "@@@STEP_LOG_LINE@python.inline@  print line@@@",
1185      "@@@STEP_LOG_END@python.inline@@@"
1186    ]
1187  },
1188  {
1189    "cmd": [
1190      "/usr/bin/adb.1.0.35",
1191      "kill-server"
1192    ],
1193    "cwd": "[START_DIR]/skia",
1194    "env": {
1195      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
1196      "CHROME_HEADLESS": "1",
1197      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
1198    },
1199    "infra_step": true,
1200    "name": "kill adb server"
1201  },
1202  {
1203    "name": "$result"
1204  }
1205]