• 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\nimport time\nADB = sys.argv[1]\nASAN_SETUP = sys.argv[2]\n\ndef wait_for_device():\n  while True:\n    time.sleep(5)\n    print 'Waiting for device'\n    subprocess.check_output([ADB, 'wait-for-device'])\n    bit1 = subprocess.check_output([ADB, 'shell', 'getprop',\n                                   'dev.bootcomplete'])\n    bit2 = subprocess.check_output([ADB, 'shell', 'getprop',\n                                   'sys.boot_completed'])\n    if '1' in bit1 and '1' in bit2:\n      print 'Device detected'\n      break\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\noutput = subprocess.check_output([ADB, 'disable-verity'])\nprint output\n\nif 'already disabled' not in output:\n  print 'Rebooting device'\n  subprocess.check_output([ADB, 'reboot'])\n  wait_for_device()\n\ndef installASAN(revert=False):\n  # ASAN setup script is idempotent, either it installs it or\n  # says it's installed.  Returns True on success, false otherwise.\n  out = subprocess.check_output([ADB, 'wait-for-device'])\n  print out\n  cmd = [ASAN_SETUP]\n  if revert:\n    cmd = [ASAN_SETUP, '--revert']\n  process = subprocess.Popen(cmd, env={'ADB': ADB},\n                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n\n  # this also blocks until command finishes\n  (stdout, stderr) = process.communicate()\n  print stdout\n  print 'Stderr: %s' % stderr\n  return process.returncode == 0\n\nif not installASAN():\n  print 'Trying to revert the ASAN install and then re-install'\n  # ASAN script sometimes has issues if it was interrupted or partially applied\n  # Try reverting it, then re-enabling it\n  if not installASAN(revert=True):\n    raise Exception('reverting ASAN install failed')\n\n  # Sleep because device does not reboot instantly\n  time.sleep(10)\n\n  if not installASAN():\n    raise Exception('Tried twice to setup ASAN and failed.')\n\n# Sleep because device does not reboot instantly\ntime.sleep(10)\nwait_for_device()\n# Sleep again to hopefully avoid error \"secure_mkdirs failed: No such file or\n# directory\" when pushing resources to the device.\ntime.sleep(60)\n",
52      "/usr/bin/adb.1.0.35",
53      "[START_DIR]/android_ndk_linux/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/8.0.7/bin/asan_device_setup"
54    ],
55    "env": {
56      "CHROME_HEADLESS": "1",
57      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
58    },
59    "infra_step": true,
60    "name": "Setting up device to run ASAN",
61    "timeout": 300,
62    "~followup_annotations": [
63      "@@@STEP_LOG_LINE@python.inline@@@@",
64      "@@@STEP_LOG_LINE@python.inline@import os@@@",
65      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
66      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
67      "@@@STEP_LOG_LINE@python.inline@import time@@@",
68      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
69      "@@@STEP_LOG_LINE@python.inline@ASAN_SETUP = sys.argv[2]@@@",
70      "@@@STEP_LOG_LINE@python.inline@@@@",
71      "@@@STEP_LOG_LINE@python.inline@def wait_for_device():@@@",
72      "@@@STEP_LOG_LINE@python.inline@  while True:@@@",
73      "@@@STEP_LOG_LINE@python.inline@    time.sleep(5)@@@",
74      "@@@STEP_LOG_LINE@python.inline@    print 'Waiting for device'@@@",
75      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_output([ADB, 'wait-for-device'])@@@",
76      "@@@STEP_LOG_LINE@python.inline@    bit1 = subprocess.check_output([ADB, 'shell', 'getprop',@@@",
77      "@@@STEP_LOG_LINE@python.inline@                                   'dev.bootcomplete'])@@@",
78      "@@@STEP_LOG_LINE@python.inline@    bit2 = subprocess.check_output([ADB, 'shell', 'getprop',@@@",
79      "@@@STEP_LOG_LINE@python.inline@                                   'sys.boot_completed'])@@@",
80      "@@@STEP_LOG_LINE@python.inline@    if '1' in bit1 and '1' in bit2:@@@",
81      "@@@STEP_LOG_LINE@python.inline@      print 'Device detected'@@@",
82      "@@@STEP_LOG_LINE@python.inline@      break@@@",
83      "@@@STEP_LOG_LINE@python.inline@@@@",
84      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
85      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
86      "@@@STEP_LOG_LINE@python.inline@print log@@@",
87      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
88      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
89      "@@@STEP_LOG_LINE@python.inline@@@@",
90      "@@@STEP_LOG_LINE@python.inline@output = subprocess.check_output([ADB, 'disable-verity'])@@@",
91      "@@@STEP_LOG_LINE@python.inline@print output@@@",
92      "@@@STEP_LOG_LINE@python.inline@@@@",
93      "@@@STEP_LOG_LINE@python.inline@if 'already disabled' not in output:@@@",
94      "@@@STEP_LOG_LINE@python.inline@  print 'Rebooting device'@@@",
95      "@@@STEP_LOG_LINE@python.inline@  subprocess.check_output([ADB, 'reboot'])@@@",
96      "@@@STEP_LOG_LINE@python.inline@  wait_for_device()@@@",
97      "@@@STEP_LOG_LINE@python.inline@@@@",
98      "@@@STEP_LOG_LINE@python.inline@def installASAN(revert=False):@@@",
99      "@@@STEP_LOG_LINE@python.inline@  # ASAN setup script is idempotent, either it installs it or@@@",
100      "@@@STEP_LOG_LINE@python.inline@  # says it's installed.  Returns True on success, false otherwise.@@@",
101      "@@@STEP_LOG_LINE@python.inline@  out = subprocess.check_output([ADB, 'wait-for-device'])@@@",
102      "@@@STEP_LOG_LINE@python.inline@  print out@@@",
103      "@@@STEP_LOG_LINE@python.inline@  cmd = [ASAN_SETUP]@@@",
104      "@@@STEP_LOG_LINE@python.inline@  if revert:@@@",
105      "@@@STEP_LOG_LINE@python.inline@    cmd = [ASAN_SETUP, '--revert']@@@",
106      "@@@STEP_LOG_LINE@python.inline@  process = subprocess.Popen(cmd, env={'ADB': ADB},@@@",
107      "@@@STEP_LOG_LINE@python.inline@                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)@@@",
108      "@@@STEP_LOG_LINE@python.inline@@@@",
109      "@@@STEP_LOG_LINE@python.inline@  # this also blocks until command finishes@@@",
110      "@@@STEP_LOG_LINE@python.inline@  (stdout, stderr) = process.communicate()@@@",
111      "@@@STEP_LOG_LINE@python.inline@  print stdout@@@",
112      "@@@STEP_LOG_LINE@python.inline@  print 'Stderr: %s' % stderr@@@",
113      "@@@STEP_LOG_LINE@python.inline@  return process.returncode == 0@@@",
114      "@@@STEP_LOG_LINE@python.inline@@@@",
115      "@@@STEP_LOG_LINE@python.inline@if not installASAN():@@@",
116      "@@@STEP_LOG_LINE@python.inline@  print 'Trying to revert the ASAN install and then re-install'@@@",
117      "@@@STEP_LOG_LINE@python.inline@  # ASAN script sometimes has issues if it was interrupted or partially applied@@@",
118      "@@@STEP_LOG_LINE@python.inline@  # Try reverting it, then re-enabling it@@@",
119      "@@@STEP_LOG_LINE@python.inline@  if not installASAN(revert=True):@@@",
120      "@@@STEP_LOG_LINE@python.inline@    raise Exception('reverting ASAN install failed')@@@",
121      "@@@STEP_LOG_LINE@python.inline@@@@",
122      "@@@STEP_LOG_LINE@python.inline@  # Sleep because device does not reboot instantly@@@",
123      "@@@STEP_LOG_LINE@python.inline@  time.sleep(10)@@@",
124      "@@@STEP_LOG_LINE@python.inline@@@@",
125      "@@@STEP_LOG_LINE@python.inline@  if not installASAN():@@@",
126      "@@@STEP_LOG_LINE@python.inline@    raise Exception('Tried twice to setup ASAN and failed.')@@@",
127      "@@@STEP_LOG_LINE@python.inline@@@@",
128      "@@@STEP_LOG_LINE@python.inline@# Sleep because device does not reboot instantly@@@",
129      "@@@STEP_LOG_LINE@python.inline@time.sleep(10)@@@",
130      "@@@STEP_LOG_LINE@python.inline@wait_for_device()@@@",
131      "@@@STEP_LOG_LINE@python.inline@# Sleep again to hopefully avoid error \"secure_mkdirs failed: No such file or@@@",
132      "@@@STEP_LOG_LINE@python.inline@# directory\" when pushing resources to the device.@@@",
133      "@@@STEP_LOG_LINE@python.inline@time.sleep(60)@@@",
134      "@@@STEP_LOG_END@python.inline@@@"
135    ]
136  },
137  {
138    "cmd": [
139      "python",
140      "-u",
141      "\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",
142      "[START_DIR]/skia/resources",
143      "/sdcard/revenge_of_the_skiabot/resources"
144    ],
145    "env": {
146      "CHROME_HEADLESS": "1",
147      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
148    },
149    "infra_step": true,
150    "name": "push [START_DIR]/skia/resources/* /sdcard/revenge_of_the_skiabot/resources",
151    "~followup_annotations": [
152      "@@@STEP_LOG_LINE@python.inline@@@@",
153      "@@@STEP_LOG_LINE@python.inline@import os@@@",
154      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
155      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
156      "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
157      "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
158      "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
159      "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
160      "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
161      "@@@STEP_LOG_LINE@python.inline@    continue@@@",
162      "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
163      "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
164      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['/usr/bin/adb.1.0.35', 'push',@@@",
165      "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
166      "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
167      "@@@STEP_LOG_END@python.inline@@@"
168    ]
169  },
170  {
171    "cmd": [
172      "python",
173      "-u",
174      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
175      "--json-output",
176      "/path/to/tmp/json",
177      "copy",
178      "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
179      "/path/to/tmp/"
180    ],
181    "infra_step": true,
182    "name": "Get skp VERSION"
183  },
184  {
185    "cmd": [
186      "python",
187      "-u",
188      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
189      "--json-output",
190      "/path/to/tmp/json",
191      "copy",
192      "42",
193      "[START_DIR]/tmp/SKP_VERSION"
194    ],
195    "infra_step": true,
196    "name": "write SKP_VERSION",
197    "~followup_annotations": [
198      "@@@STEP_LOG_LINE@SKP_VERSION@42@@@",
199      "@@@STEP_LOG_END@SKP_VERSION@@@"
200    ]
201  },
202  {
203    "cmd": [
204      "/usr/bin/adb.1.0.35",
205      "shell",
206      "cat",
207      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
208    ],
209    "cwd": "[START_DIR]/skia",
210    "env": {
211      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
212      "CHROME_HEADLESS": "1",
213      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
214    },
215    "infra_step": true,
216    "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION"
217  },
218  {
219    "cmd": [
220      "/usr/bin/adb.1.0.35",
221      "shell",
222      "rm",
223      "-f",
224      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
225    ],
226    "cwd": "[START_DIR]/skia",
227    "env": {
228      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
229      "CHROME_HEADLESS": "1",
230      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
231    },
232    "infra_step": true,
233    "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION"
234  },
235  {
236    "cmd": [
237      "/usr/bin/adb.1.0.35",
238      "shell",
239      "rm",
240      "-rf",
241      "/sdcard/revenge_of_the_skiabot/skps"
242    ],
243    "cwd": "[START_DIR]/skia",
244    "env": {
245      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
246      "CHROME_HEADLESS": "1",
247      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
248    },
249    "infra_step": true,
250    "name": "rm /sdcard/revenge_of_the_skiabot/skps"
251  },
252  {
253    "cmd": [
254      "/usr/bin/adb.1.0.35",
255      "shell",
256      "mkdir",
257      "-p",
258      "/sdcard/revenge_of_the_skiabot/skps"
259    ],
260    "cwd": "[START_DIR]/skia",
261    "env": {
262      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
263      "CHROME_HEADLESS": "1",
264      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
265    },
266    "infra_step": true,
267    "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
268  },
269  {
270    "cmd": [
271      "python",
272      "-u",
273      "\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",
274      "[START_DIR]/skp",
275      "/sdcard/revenge_of_the_skiabot/skps"
276    ],
277    "env": {
278      "CHROME_HEADLESS": "1",
279      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
280    },
281    "infra_step": true,
282    "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps",
283    "~followup_annotations": [
284      "@@@STEP_LOG_LINE@python.inline@@@@",
285      "@@@STEP_LOG_LINE@python.inline@import os@@@",
286      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
287      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
288      "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
289      "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
290      "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
291      "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
292      "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
293      "@@@STEP_LOG_LINE@python.inline@    continue@@@",
294      "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
295      "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
296      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['/usr/bin/adb.1.0.35', 'push',@@@",
297      "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
298      "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
299      "@@@STEP_LOG_END@python.inline@@@"
300    ]
301  },
302  {
303    "cmd": [
304      "/usr/bin/adb.1.0.35",
305      "push",
306      "[START_DIR]/tmp/SKP_VERSION",
307      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
308    ],
309    "cwd": "[START_DIR]/skia",
310    "env": {
311      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
312      "CHROME_HEADLESS": "1",
313      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
314    },
315    "infra_step": true,
316    "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
317  },
318  {
319    "cmd": [
320      "python",
321      "-u",
322      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
323      "--json-output",
324      "/path/to/tmp/json",
325      "copy",
326      "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
327      "/path/to/tmp/"
328    ],
329    "infra_step": true,
330    "name": "Get skimage VERSION"
331  },
332  {
333    "cmd": [
334      "python",
335      "-u",
336      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
337      "--json-output",
338      "/path/to/tmp/json",
339      "copy",
340      "42",
341      "[START_DIR]/tmp/SK_IMAGE_VERSION"
342    ],
343    "infra_step": true,
344    "name": "write SK_IMAGE_VERSION",
345    "~followup_annotations": [
346      "@@@STEP_LOG_LINE@SK_IMAGE_VERSION@42@@@",
347      "@@@STEP_LOG_END@SK_IMAGE_VERSION@@@"
348    ]
349  },
350  {
351    "cmd": [
352      "/usr/bin/adb.1.0.35",
353      "shell",
354      "cat",
355      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
356    ],
357    "cwd": "[START_DIR]/skia",
358    "env": {
359      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
360      "CHROME_HEADLESS": "1",
361      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
362    },
363    "infra_step": true,
364    "name": "read /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
365  },
366  {
367    "cmd": [
368      "/usr/bin/adb.1.0.35",
369      "shell",
370      "rm",
371      "-f",
372      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
373    ],
374    "cwd": "[START_DIR]/skia",
375    "env": {
376      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
377      "CHROME_HEADLESS": "1",
378      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
379    },
380    "infra_step": true,
381    "name": "rm /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
382  },
383  {
384    "cmd": [
385      "/usr/bin/adb.1.0.35",
386      "shell",
387      "rm",
388      "-rf",
389      "/sdcard/revenge_of_the_skiabot/images"
390    ],
391    "cwd": "[START_DIR]/skia",
392    "env": {
393      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
394      "CHROME_HEADLESS": "1",
395      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
396    },
397    "infra_step": true,
398    "name": "rm /sdcard/revenge_of_the_skiabot/images"
399  },
400  {
401    "cmd": [
402      "/usr/bin/adb.1.0.35",
403      "shell",
404      "mkdir",
405      "-p",
406      "/sdcard/revenge_of_the_skiabot/images"
407    ],
408    "cwd": "[START_DIR]/skia",
409    "env": {
410      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
411      "CHROME_HEADLESS": "1",
412      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
413    },
414    "infra_step": true,
415    "name": "mkdir /sdcard/revenge_of_the_skiabot/images"
416  },
417  {
418    "cmd": [
419      "python",
420      "-u",
421      "\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",
422      "[START_DIR]/skimage",
423      "/sdcard/revenge_of_the_skiabot/images"
424    ],
425    "env": {
426      "CHROME_HEADLESS": "1",
427      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
428    },
429    "infra_step": true,
430    "name": "push [START_DIR]/skimage/* /sdcard/revenge_of_the_skiabot/images",
431    "~followup_annotations": [
432      "@@@STEP_LOG_LINE@python.inline@@@@",
433      "@@@STEP_LOG_LINE@python.inline@import os@@@",
434      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
435      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
436      "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
437      "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
438      "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
439      "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
440      "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
441      "@@@STEP_LOG_LINE@python.inline@    continue@@@",
442      "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
443      "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
444      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['/usr/bin/adb.1.0.35', 'push',@@@",
445      "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
446      "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
447      "@@@STEP_LOG_END@python.inline@@@"
448    ]
449  },
450  {
451    "cmd": [
452      "/usr/bin/adb.1.0.35",
453      "push",
454      "[START_DIR]/tmp/SK_IMAGE_VERSION",
455      "/sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
456    ],
457    "cwd": "[START_DIR]/skia",
458    "env": {
459      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
460      "CHROME_HEADLESS": "1",
461      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
462    },
463    "infra_step": true,
464    "name": "push [START_DIR]/tmp/SK_IMAGE_VERSION /sdcard/revenge_of_the_skiabot/SK_IMAGE_VERSION"
465  },
466  {
467    "cmd": [
468      "python",
469      "-u",
470      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
471      "--json-output",
472      "/path/to/tmp/json",
473      "copy",
474      "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
475      "/path/to/tmp/"
476    ],
477    "infra_step": true,
478    "name": "Get svg VERSION"
479  },
480  {
481    "cmd": [
482      "python",
483      "-u",
484      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
485      "--json-output",
486      "/path/to/tmp/json",
487      "copy",
488      "42",
489      "[START_DIR]/tmp/SVG_VERSION"
490    ],
491    "infra_step": true,
492    "name": "write SVG_VERSION",
493    "~followup_annotations": [
494      "@@@STEP_LOG_LINE@SVG_VERSION@42@@@",
495      "@@@STEP_LOG_END@SVG_VERSION@@@"
496    ]
497  },
498  {
499    "cmd": [
500      "/usr/bin/adb.1.0.35",
501      "shell",
502      "cat",
503      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
504    ],
505    "cwd": "[START_DIR]/skia",
506    "env": {
507      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
508      "CHROME_HEADLESS": "1",
509      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
510    },
511    "infra_step": true,
512    "name": "read /sdcard/revenge_of_the_skiabot/SVG_VERSION"
513  },
514  {
515    "cmd": [
516      "/usr/bin/adb.1.0.35",
517      "shell",
518      "rm",
519      "-f",
520      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
521    ],
522    "cwd": "[START_DIR]/skia",
523    "env": {
524      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
525      "CHROME_HEADLESS": "1",
526      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
527    },
528    "infra_step": true,
529    "name": "rm /sdcard/revenge_of_the_skiabot/SVG_VERSION"
530  },
531  {
532    "cmd": [
533      "/usr/bin/adb.1.0.35",
534      "shell",
535      "rm",
536      "-rf",
537      "/sdcard/revenge_of_the_skiabot/svgs"
538    ],
539    "cwd": "[START_DIR]/skia",
540    "env": {
541      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
542      "CHROME_HEADLESS": "1",
543      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
544    },
545    "infra_step": true,
546    "name": "rm /sdcard/revenge_of_the_skiabot/svgs"
547  },
548  {
549    "cmd": [
550      "/usr/bin/adb.1.0.35",
551      "shell",
552      "mkdir",
553      "-p",
554      "/sdcard/revenge_of_the_skiabot/svgs"
555    ],
556    "cwd": "[START_DIR]/skia",
557    "env": {
558      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
559      "CHROME_HEADLESS": "1",
560      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
561    },
562    "infra_step": true,
563    "name": "mkdir /sdcard/revenge_of_the_skiabot/svgs"
564  },
565  {
566    "cmd": [
567      "python",
568      "-u",
569      "\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",
570      "[START_DIR]/svg",
571      "/sdcard/revenge_of_the_skiabot/svgs"
572    ],
573    "env": {
574      "CHROME_HEADLESS": "1",
575      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
576    },
577    "infra_step": true,
578    "name": "push [START_DIR]/svg/* /sdcard/revenge_of_the_skiabot/svgs",
579    "~followup_annotations": [
580      "@@@STEP_LOG_LINE@python.inline@@@@",
581      "@@@STEP_LOG_LINE@python.inline@import os@@@",
582      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
583      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
584      "@@@STEP_LOG_LINE@python.inline@host   = sys.argv[1]@@@",
585      "@@@STEP_LOG_LINE@python.inline@device = sys.argv[2]@@@",
586      "@@@STEP_LOG_LINE@python.inline@for d, _, fs in os.walk(host):@@@",
587      "@@@STEP_LOG_LINE@python.inline@  p = os.path.relpath(d, host)@@@",
588      "@@@STEP_LOG_LINE@python.inline@  if p != '.' and p.startswith('.'):@@@",
589      "@@@STEP_LOG_LINE@python.inline@    continue@@@",
590      "@@@STEP_LOG_LINE@python.inline@  for f in fs:@@@",
591      "@@@STEP_LOG_LINE@python.inline@    print os.path.join(p,f)@@@",
592      "@@@STEP_LOG_LINE@python.inline@    subprocess.check_call(['/usr/bin/adb.1.0.35', 'push',@@@",
593      "@@@STEP_LOG_LINE@python.inline@                           os.path.realpath(os.path.join(host, p, f)),@@@",
594      "@@@STEP_LOG_LINE@python.inline@                           os.path.join(device, p, f)])@@@",
595      "@@@STEP_LOG_END@python.inline@@@"
596    ]
597  },
598  {
599    "cmd": [
600      "/usr/bin/adb.1.0.35",
601      "push",
602      "[START_DIR]/tmp/SVG_VERSION",
603      "/sdcard/revenge_of_the_skiabot/SVG_VERSION"
604    ],
605    "cwd": "[START_DIR]/skia",
606    "env": {
607      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
608      "CHROME_HEADLESS": "1",
609      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
610    },
611    "infra_step": true,
612    "name": "push [START_DIR]/tmp/SVG_VERSION /sdcard/revenge_of_the_skiabot/SVG_VERSION"
613  },
614  {
615    "cmd": [
616      "python",
617      "-u",
618      "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
619    ],
620    "name": "get swarming task id",
621    "~followup_annotations": [
622      "@@@STEP_LOG_LINE@python.inline@import os@@@",
623      "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
624      "@@@STEP_LOG_END@python.inline@@@"
625    ]
626  },
627  {
628    "cmd": [
629      "python",
630      "-u",
631      "\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",
632      "/usr/bin/adb.1.0.35",
633      "0",
634      "1"
635    ],
636    "env": {
637      "CHROME_HEADLESS": "1",
638      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
639    },
640    "infra_step": true,
641    "name": "Enabling CPU 0",
642    "timeout": 30,
643    "~followup_annotations": [
644      "@@@STEP_LOG_LINE@python.inline@@@@",
645      "@@@STEP_LOG_LINE@python.inline@import os@@@",
646      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
647      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
648      "@@@STEP_LOG_LINE@python.inline@import time@@@",
649      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
650      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
651      "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
652      "@@@STEP_LOG_LINE@python.inline@@@@",
653      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
654      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
655      "@@@STEP_LOG_LINE@python.inline@print log@@@",
656      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
657      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
658      "@@@STEP_LOG_LINE@python.inline@@@@",
659      "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
660      "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
661      "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
662      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
663      "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
664      "@@@STEP_LOG_LINE@python.inline@  print 'CPU %d online already %d' % (cpu, value)@@@",
665      "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
666      "@@@STEP_LOG_LINE@python.inline@@@@",
667      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo %s > '@@@",
668      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
669      "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
670      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
671      "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
672      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
673      "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
674      "@@@STEP_LOG_END@python.inline@@@"
675    ]
676  },
677  {
678    "cmd": [
679      "python",
680      "-u",
681      "\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",
682      "/usr/bin/adb.1.0.35",
683      "1",
684      "1"
685    ],
686    "env": {
687      "CHROME_HEADLESS": "1",
688      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
689    },
690    "infra_step": true,
691    "name": "Enabling CPU 1",
692    "timeout": 30,
693    "~followup_annotations": [
694      "@@@STEP_LOG_LINE@python.inline@@@@",
695      "@@@STEP_LOG_LINE@python.inline@import os@@@",
696      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
697      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
698      "@@@STEP_LOG_LINE@python.inline@import time@@@",
699      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
700      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
701      "@@@STEP_LOG_LINE@python.inline@value = int(sys.argv[3])@@@",
702      "@@@STEP_LOG_LINE@python.inline@@@@",
703      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
704      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
705      "@@@STEP_LOG_LINE@python.inline@print log@@@",
706      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
707      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
708      "@@@STEP_LOG_LINE@python.inline@@@@",
709      "@@@STEP_LOG_LINE@python.inline@# If we try to echo 1 to an already online cpu, adb returns exit code 1.@@@",
710      "@@@STEP_LOG_LINE@python.inline@# So, check the value before trying to write it.@@@",
711      "@@@STEP_LOG_LINE@python.inline@prior_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
712      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
713      "@@@STEP_LOG_LINE@python.inline@if prior_status == str(value):@@@",
714      "@@@STEP_LOG_LINE@python.inline@  print 'CPU %d online already %d' % (cpu, value)@@@",
715      "@@@STEP_LOG_LINE@python.inline@  sys.exit()@@@",
716      "@@@STEP_LOG_LINE@python.inline@@@@",
717      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo %s > '@@@",
718      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % (value, cpu)])@@@",
719      "@@@STEP_LOG_LINE@python.inline@actual_status = subprocess.check_output([ADB, 'shell', 'cat '@@@",
720      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/online' % cpu]).strip()@@@",
721      "@@@STEP_LOG_LINE@python.inline@if actual_status != str(value):@@@",
722      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %d)'@@@",
723      "@@@STEP_LOG_LINE@python.inline@                  % (actual_status, value))@@@",
724      "@@@STEP_LOG_END@python.inline@@@"
725    ]
726  },
727  {
728    "cmd": [
729      "python",
730      "-u",
731      "\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",
732      "/usr/bin/adb.1.0.35",
733      "2",
734      "ondemand"
735    ],
736    "env": {
737      "CHROME_HEADLESS": "1",
738      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
739    },
740    "infra_step": true,
741    "name": "Set CPU 2's governor to ondemand",
742    "timeout": 30,
743    "~followup_annotations": [
744      "@@@STEP_LOG_LINE@python.inline@@@@",
745      "@@@STEP_LOG_LINE@python.inline@import os@@@",
746      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
747      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
748      "@@@STEP_LOG_LINE@python.inline@import time@@@",
749      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
750      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
751      "@@@STEP_LOG_LINE@python.inline@gov = sys.argv[3]@@@",
752      "@@@STEP_LOG_LINE@python.inline@@@@",
753      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
754      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
755      "@@@STEP_LOG_LINE@python.inline@print log@@@",
756      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
757      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
758      "@@@STEP_LOG_LINE@python.inline@@@@",
759      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo \"%s\" > '@@@",
760      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % (gov, cpu)])@@@",
761      "@@@STEP_LOG_LINE@python.inline@actual_gov = subprocess.check_output([ADB, 'shell', 'cat '@@@",
762      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % cpu]).strip()@@@",
763      "@@@STEP_LOG_LINE@python.inline@if actual_gov != gov:@@@",
764      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %s)'@@@",
765      "@@@STEP_LOG_LINE@python.inline@                  % (actual_gov, gov))@@@",
766      "@@@STEP_LOG_END@python.inline@@@"
767    ]
768  },
769  {
770    "cmd": [
771      "python",
772      "-u",
773      "\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",
774      "/usr/bin/adb.1.0.35",
775      "0",
776      "ondemand"
777    ],
778    "env": {
779      "CHROME_HEADLESS": "1",
780      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
781    },
782    "infra_step": true,
783    "name": "Set CPU 0's governor to ondemand",
784    "timeout": 30,
785    "~followup_annotations": [
786      "@@@STEP_LOG_LINE@python.inline@@@@",
787      "@@@STEP_LOG_LINE@python.inline@import os@@@",
788      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
789      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
790      "@@@STEP_LOG_LINE@python.inline@import time@@@",
791      "@@@STEP_LOG_LINE@python.inline@ADB = sys.argv[1]@@@",
792      "@@@STEP_LOG_LINE@python.inline@cpu = int(sys.argv[2])@@@",
793      "@@@STEP_LOG_LINE@python.inline@gov = sys.argv[3]@@@",
794      "@@@STEP_LOG_LINE@python.inline@@@@",
795      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output([ADB, 'root'])@@@",
796      "@@@STEP_LOG_LINE@python.inline@# check for message like 'adbd cannot run as root in production builds'@@@",
797      "@@@STEP_LOG_LINE@python.inline@print log@@@",
798      "@@@STEP_LOG_LINE@python.inline@if 'cannot' in log:@@@",
799      "@@@STEP_LOG_LINE@python.inline@  raise Exception('adb root failed')@@@",
800      "@@@STEP_LOG_LINE@python.inline@@@@",
801      "@@@STEP_LOG_LINE@python.inline@subprocess.check_output([ADB, 'shell', 'echo \"%s\" > '@@@",
802      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % (gov, cpu)])@@@",
803      "@@@STEP_LOG_LINE@python.inline@actual_gov = subprocess.check_output([ADB, 'shell', 'cat '@@@",
804      "@@@STEP_LOG_LINE@python.inline@    '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor' % cpu]).strip()@@@",
805      "@@@STEP_LOG_LINE@python.inline@if actual_gov != gov:@@@",
806      "@@@STEP_LOG_LINE@python.inline@  raise Exception('(actual, expected) (%s, %s)'@@@",
807      "@@@STEP_LOG_LINE@python.inline@                  % (actual_gov, gov))@@@",
808      "@@@STEP_LOG_END@python.inline@@@"
809    ]
810  },
811  {
812    "cmd": [
813      "/usr/bin/adb.1.0.35",
814      "push",
815      "[START_DIR]/build/dm",
816      "/data/local/tmp/"
817    ],
818    "cwd": "[START_DIR]/skia",
819    "env": {
820      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
821      "CHROME_HEADLESS": "1",
822      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
823    },
824    "infra_step": true,
825    "name": "push dm"
826  },
827  {
828    "cmd": [
829      "python",
830      "-u",
831      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
832      "--json-output",
833      "/path/to/tmp/json",
834      "copy",
835      "set -x; /data/local/tmp/dm --resourcePath /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/dm --colorImages /sdcard/revenge_of_the_skiabot/images/colorspace --nameByHash --properties gitHash abc123 builder Test-Android-Clang-Pixel-GPU-Adreno530-arm-Debug-All-Android_ASAN buildbucket_build_id 123454321 task_id task_12345 swarming_bot_id skia-bot-123 swarming_task_id 123456 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value Adreno530 extra_config Android_ASAN model Pixel os Android style default --dont_write pdf --nocpu --config gles glesdft glessrgb glesmsaa4 --src tests gm image colorImage svg --blacklist _ svg _ svgparse_ glessrgb image _ _ _ image gen_platf error _ test _ GrShape _ image _ interlaced1.png _ image _ interlaced2.png _ image _ interlaced3.png _ image _ .arw _ image _ .cr2 _ image _ .dng _ image _ .nef _ image _ .nrw _ image _ .orf _ image _ .raf _ image _ .rw2 _ image _ .pef _ image _ .srw _ image _ .ARW _ image _ .CR2 _ image _ .DNG _ image _ .NEF _ image _ .NRW _ image _ .ORF _ image _ .RAF _ image _ .RW2 _ image _ .PEF _ image _ .SRW --match ~BadImage --nonativeFonts --verbose; echo $? >/data/local/tmp/rc",
836      "[START_DIR]/tmp/dm.sh"
837    ],
838    "env": {
839      "CHROME_HEADLESS": "1",
840      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
841    },
842    "infra_step": true,
843    "name": "write dm.sh",
844    "~followup_annotations": [
845      "@@@STEP_LOG_LINE@dm.sh@set -x; /data/local/tmp/dm --resourcePath /sdcard/revenge_of_the_skiabot/resources --skps /sdcard/revenge_of_the_skiabot/skps --images /sdcard/revenge_of_the_skiabot/images/dm --colorImages /sdcard/revenge_of_the_skiabot/images/colorspace --nameByHash --properties gitHash abc123 builder Test-Android-Clang-Pixel-GPU-Adreno530-arm-Debug-All-Android_ASAN buildbucket_build_id 123454321 task_id task_12345 swarming_bot_id skia-bot-123 swarming_task_id 123456 --svgs /sdcard/revenge_of_the_skiabot/svgs --key arch arm compiler Clang configuration Debug cpu_or_gpu GPU cpu_or_gpu_value Adreno530 extra_config Android_ASAN model Pixel os Android style default --dont_write pdf --nocpu --config gles glesdft glessrgb glesmsaa4 --src tests gm image colorImage svg --blacklist _ svg _ svgparse_ glessrgb image _ _ _ image gen_platf error _ test _ GrShape _ image _ interlaced1.png _ image _ interlaced2.png _ image _ interlaced3.png _ image _ .arw _ image _ .cr2 _ image _ .dng _ image _ .nef _ image _ .nrw _ image _ .orf _ image _ .raf _ image _ .rw2 _ image _ .pef _ image _ .srw _ image _ .ARW _ image _ .CR2 _ image _ .DNG _ image _ .NEF _ image _ .NRW _ image _ .ORF _ image _ .RAF _ image _ .RW2 _ image _ .PEF _ image _ .SRW --match ~BadImage --nonativeFonts --verbose; echo $? >/data/local/tmp/rc@@@",
846      "@@@STEP_LOG_END@dm.sh@@@"
847    ]
848  },
849  {
850    "cmd": [
851      "/usr/bin/adb.1.0.35",
852      "push",
853      "[START_DIR]/tmp/dm.sh",
854      "/data/local/tmp/"
855    ],
856    "cwd": "[START_DIR]/skia",
857    "env": {
858      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
859      "CHROME_HEADLESS": "1",
860      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
861    },
862    "infra_step": true,
863    "name": "push dm.sh"
864  },
865  {
866    "cmd": [
867      "/usr/bin/adb.1.0.35",
868      "logcat",
869      "-c"
870    ],
871    "cwd": "[START_DIR]/skia",
872    "env": {
873      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
874      "CHROME_HEADLESS": "1",
875      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
876    },
877    "infra_step": true,
878    "name": "clear log"
879  },
880  {
881    "cmd": [
882      "python",
883      "-u",
884      "\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",
885      "/data/local/tmp/",
886      "dm.sh"
887    ],
888    "env": {
889      "CHROME_HEADLESS": "1",
890      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
891    },
892    "name": "dm",
893    "~followup_annotations": [
894      "@@@STEP_LOG_LINE@python.inline@@@@",
895      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
896      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
897      "@@@STEP_LOG_LINE@python.inline@bin_dir = sys.argv[1]@@@",
898      "@@@STEP_LOG_LINE@python.inline@sh      = sys.argv[2]@@@",
899      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(['/usr/bin/adb.1.0.35', 'shell', 'sh', bin_dir + sh])@@@",
900      "@@@STEP_LOG_LINE@python.inline@try:@@@",
901      "@@@STEP_LOG_LINE@python.inline@  sys.exit(int(subprocess.check_output(['/usr/bin/adb.1.0.35', 'shell', 'cat',@@@",
902      "@@@STEP_LOG_LINE@python.inline@                                        bin_dir + 'rc'])))@@@",
903      "@@@STEP_LOG_LINE@python.inline@except ValueError:@@@",
904      "@@@STEP_LOG_LINE@python.inline@  print \"Couldn't read the return code.  Probably killed for OOM.\"@@@",
905      "@@@STEP_LOG_LINE@python.inline@  sys.exit(1)@@@",
906      "@@@STEP_LOG_END@python.inline@@@"
907    ]
908  },
909  {
910    "cmd": [
911      "/usr/bin/adb.1.0.35",
912      "wait-for-device"
913    ],
914    "env": {
915      "CHROME_HEADLESS": "1",
916      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
917    },
918    "infra_step": true,
919    "name": "wait for device before uninstalling ASAN",
920    "timeout": 180
921  },
922  {
923    "cmd": [
924      "[START_DIR]/android_ndk_linux/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/8.0.2/bin/asan_device_setup",
925      "--revert"
926    ],
927    "env": {
928      "CHROME_HEADLESS": "1",
929      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
930    },
931    "infra_step": true,
932    "name": "uninstall ASAN",
933    "timeout": 300
934  },
935  {
936    "cmd": [
937      "python",
938      "-u",
939      "\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",
940      "[START_DIR]/build"
941    ],
942    "env": {
943      "CHROME_HEADLESS": "1",
944      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
945    },
946    "infra_step": true,
947    "name": "dump log",
948    "timeout": 300,
949    "~followup_annotations": [
950      "@@@STEP_LOG_LINE@python.inline@@@@",
951      "@@@STEP_LOG_LINE@python.inline@import os@@@",
952      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
953      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
954      "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
955      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['/usr/bin/adb.1.0.35', 'logcat', '-d'])@@@",
956      "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
957      "@@@STEP_LOG_LINE@python.inline@  tokens = line.split()@@@",
958      "@@@STEP_LOG_LINE@python.inline@  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
959      "@@@STEP_LOG_LINE@python.inline@    addr, path = tokens[-2:]@@@",
960      "@@@STEP_LOG_LINE@python.inline@    local = os.path.join(out, os.path.basename(path))@@@",
961      "@@@STEP_LOG_LINE@python.inline@    if os.path.exists(local):@@@",
962      "@@@STEP_LOG_LINE@python.inline@      sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
963      "@@@STEP_LOG_LINE@python.inline@      line = line.replace(addr, addr + ' ' + sym.strip())@@@",
964      "@@@STEP_LOG_LINE@python.inline@  print line@@@",
965      "@@@STEP_LOG_END@python.inline@@@"
966    ]
967  },
968  {
969    "cmd": [
970      "/usr/bin/adb.1.0.35",
971      "kill-server"
972    ],
973    "cwd": "[START_DIR]/skia",
974    "env": {
975      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
976      "CHROME_HEADLESS": "1",
977      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
978    },
979    "infra_step": true,
980    "name": "kill adb server"
981  },
982  {
983    "name": "$result"
984  }
985]