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