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