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