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