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