| OLD | NEW |
| (Empty) | |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 from recipe_engine.types import freeze |
| 6 |
| 7 |
| 8 DEPS = [ |
| 9 'build/adb', |
| 10 'build/chromium', |
| 11 'build/chromium_android', |
| 12 'build/chromium_tests', |
| 13 'build/test_utils', |
| 14 'depot_tools/bot_update', |
| 15 'depot_tools/gclient', |
| 16 'recipe_engine/json', |
| 17 'recipe_engine/path', |
| 18 'recipe_engine/properties', |
| 19 'recipe_engine/python', |
| 20 'recipe_engine/step', |
| 21 ] |
| 22 |
| 23 |
| 24 REPO_URL = 'https://chromium.googlesource.com/chromium/src.git' |
| 25 |
| 26 def _CreateTestSpec(name, perf_id, required_apks, num_device_shards=1, |
| 27 num_host_shards=1, target_bits=64, |
| 28 browser_name=None, remove_system_webview=False, |
| 29 enable_platform_mode=False): |
| 30 def _CreateShardTestSpec(name, perf_id, required_apks, num_device_shards, |
| 31 num_host_shards, shard_index, target_bits, |
| 32 browser_name, remove_system_webview, |
| 33 enable_platform_mode): |
| 34 spec = { |
| 35 'perf_id': perf_id, |
| 36 'required_apks': required_apks, |
| 37 'bucket': 'chrome-perf', |
| 38 'num_device_shards': num_device_shards, |
| 39 'num_host_shards': num_host_shards, |
| 40 'shard_index': shard_index, |
| 41 'test_spec_file': 'chromium.perf.json', |
| 42 'max_battery_temp': 350, |
| 43 'known_devices_file': '.known_devices', |
| 44 'browser_name': browser_name, |
| 45 'remove_system_webview': remove_system_webview, |
| 46 'enable_platform_mode': enable_platform_mode, |
| 47 } |
| 48 if target_bits == 32: |
| 49 builder_name = 'Android Builder' |
| 50 elif target_bits == 64: |
| 51 builder_name = 'Android arm64 Builder' |
| 52 spec['recipe_config'] = 'tests_arm64' |
| 53 spec['path'] = lambda api: '%s/full-build-linux_%s.zip' % ( |
| 54 builder_name, api.properties['parent_revision']) |
| 55 return spec |
| 56 |
| 57 tester_spec = {} |
| 58 for shard_index in xrange(num_host_shards): |
| 59 builder_name = '%s (%d)' % (name, shard_index + 1) |
| 60 tester_spec[builder_name] = _CreateShardTestSpec( |
| 61 name, perf_id, required_apks, num_device_shards, num_host_shards, |
| 62 shard_index, target_bits, browser_name, remove_system_webview, |
| 63 enable_platform_mode) |
| 64 return tester_spec |
| 65 |
| 66 def _ChromiumPerfTesters(): |
| 67 testers = [ |
| 68 _CreateTestSpec('Android Galaxy S5 Perf', 'android-galaxy-s5', |
| 69 required_apks=['ChromePublic.apk'], num_device_shards=7, |
| 70 num_host_shards=3, target_bits=32, enable_platform_mode=True), |
| 71 _CreateTestSpec('Android Nexus5 Perf', 'android-nexus5', |
| 72 required_apks=['ChromePublic.apk'], num_device_shards=7, |
| 73 num_host_shards=3, target_bits=32, enable_platform_mode=True), |
| 74 _CreateTestSpec('Android Nexus5X Perf', 'android-nexus5X', |
| 75 required_apks=['ChromePublic.apk'], num_device_shards=7, |
| 76 num_host_shards=3, enable_platform_mode=True), |
| 77 _CreateTestSpec('Android Nexus6 Perf', 'android-nexus6', |
| 78 required_apks=['ChromePublic.apk'], num_device_shards=7, |
| 79 num_host_shards=3, target_bits=32), |
| 80 _CreateTestSpec('Android Nexus7v2 Perf', 'android-nexus7v2', |
| 81 required_apks=['ChromePublic.apk'], num_device_shards=7, |
| 82 num_host_shards=3, target_bits=32, enable_platform_mode=True), |
| 83 _CreateTestSpec('Android Nexus9 Perf', 'android-nexus9', |
| 84 required_apks=['ChromePublic.apk'], num_device_shards=7, |
| 85 num_host_shards=3), |
| 86 _CreateTestSpec('Android One Perf', 'android-one', |
| 87 required_apks=['ChromePublic.apk'], num_device_shards=7, |
| 88 num_host_shards=3, target_bits=32), |
| 89 _CreateTestSpec('Android Nexus5X WebView Perf', 'android-webview-nexus5X', |
| 90 required_apks=['SystemWebView.apk', 'SystemWebViewShell.apk'], |
| 91 num_device_shards=7, num_host_shards=3, target_bits=64, |
| 92 browser_name='android-webview', remove_system_webview=True), |
| 93 _CreateTestSpec('Android Nexus6 WebView Perf', 'android-webview-nexus6', |
| 94 required_apks=['SystemWebView.apk', 'SystemWebViewShell.apk'], |
| 95 num_device_shards=6, num_host_shards=3, target_bits=32, |
| 96 browser_name='android-webview', remove_system_webview=True), |
| 97 ] |
| 98 master_spec = {} |
| 99 for spec in testers: |
| 100 master_spec.update(spec) |
| 101 return master_spec |
| 102 |
| 103 def _ChromiumPerfFyiTesters(): |
| 104 testers = [ |
| 105 _CreateTestSpec('Android Power Nexus 5X Perf', 'android-power-nexus-5x', |
| 106 required_apks=['ChromePublic.apk'], num_device_shards=7, |
| 107 num_host_shards=1), |
| 108 ] |
| 109 |
| 110 master_spec = {} |
| 111 for spec in testers: |
| 112 master_spec.update(spec) |
| 113 return master_spec |
| 114 |
| 115 BUILDERS = freeze({ |
| 116 'chromium.perf': _ChromiumPerfTesters(), |
| 117 'chromium.perf.fyi': _ChromiumPerfFyiTesters(), |
| 118 }) |
| 119 |
| 120 |
| 121 def RunSteps(api): |
| 122 mastername = api.properties['mastername'] |
| 123 buildername = api.properties['buildername'] |
| 124 # TODO(akuegel): Move the configs in builders.py in chromium_tests to this |
| 125 # recipe, and get rid of duplications. |
| 126 builder = dict(BUILDERS[mastername][buildername]) |
| 127 builder_config = builder.get('recipe_config', 'base_config') |
| 128 kwargs = { |
| 129 'REPO_NAME':'src', |
| 130 'REPO_URL':REPO_URL, |
| 131 'INTERNAL':False, |
| 132 'BUILD_CONFIG':'Release', |
| 133 'TARGET_PLATFORM':'android', |
| 134 } |
| 135 |
| 136 api.chromium_android.set_config(builder_config, **kwargs) |
| 137 api.chromium.set_config(builder_config, **kwargs) |
| 138 api.gclient.set_config('perf') |
| 139 api.gclient.apply_config('android') |
| 140 |
| 141 bot_update_step = api.bot_update.ensure_checkout() |
| 142 |
| 143 test_spec_file = builder.get('test_spec_file') |
| 144 test_spec = {} |
| 145 if test_spec_file: |
| 146 test_spec = api.chromium_tests.read_test_spec(api, test_spec_file) |
| 147 |
| 148 scripts_compile_targets = \ |
| 149 api.chromium_tests.get_compile_targets_for_scripts().json.output |
| 150 |
| 151 builder['tests'] = api.chromium_tests.generate_tests_from_test_spec( |
| 152 api, test_spec, builder, buildername, mastername, False, None, |
| 153 scripts_compile_targets, [api.chromium_tests.steps.generate_script], |
| 154 bot_update_step) |
| 155 |
| 156 api.path['checkout'] = api.path['slave_build'].join('src') |
| 157 api.chromium_android.clean_local_files() |
| 158 |
| 159 # TODO(jbudorick): Remove this after resolving |
| 160 # https://github.com/catapult-project/catapult/issues/2901 |
| 161 devil_path = api.path['checkout'].join('third_party', 'catapult', 'devil') |
| 162 api.python.inline( |
| 163 'initialize devil', |
| 164 """ |
| 165 import sys |
| 166 sys.path.append(sys.argv[1]) |
| 167 from devil import devil_env |
| 168 devil_env.config.Initialize() |
| 169 devil_env.config.PrefetchPaths(dependencies=['adb']) |
| 170 """, |
| 171 args=[devil_path]) |
| 172 api.adb.set_adb_path( |
| 173 devil_path.join('bin', 'deps', 'linux2', 'x86_64', 'bin', 'adb')) |
| 174 |
| 175 api.chromium_android.download_build(bucket=builder['bucket'], |
| 176 path=builder['path'](api)) |
| 177 |
| 178 api.chromium_android.common_tests_setup_steps( |
| 179 perf_setup=True, |
| 180 remove_system_webview=builder.get('remove_system_webview', False)) |
| 181 |
| 182 required_apks = builder.get('required_apks', []) |
| 183 for apk in required_apks: |
| 184 api.chromium_android.adb_install_apk(apk) |
| 185 |
| 186 api.chromium_android.host_info( |
| 187 args=api.chromium_tests.get_common_args_for_scripts()) |
| 188 |
| 189 test_runner = api.chromium_tests.create_test_runner( |
| 190 api, builder.get('tests', [])) |
| 191 |
| 192 try: |
| 193 failures = [] |
| 194 if test_runner: |
| 195 try: |
| 196 test_runner() |
| 197 except api.step.StepFailure as f: |
| 198 failures.append(f) |
| 199 |
| 200 dynamic_perf_tests = api.chromium_tests.steps.DynamicPerfTests( |
| 201 builder['perf_id'], 'android', None, |
| 202 max_battery_temp=builder.get('max_battery_temp'), |
| 203 num_device_shards=builder['num_device_shards'], |
| 204 num_host_shards=builder.get('num_host_shards', 1), |
| 205 shard_index=builder.get('shard_index', 0), |
| 206 override_browser_name=builder.get('browser_name'), |
| 207 enable_platform_mode=builder.get('enable_platform_mode')) |
| 208 dynamic_perf_tests.run(api, None) |
| 209 |
| 210 if failures: |
| 211 raise api.step.StepFailure('src-side perf tests failed %s' % failures) |
| 212 finally: |
| 213 api.chromium_android.common_tests_final_steps( |
| 214 logcat_gs_bucket='chromium-android') |
| 215 |
| 216 |
| 217 def _sanitize_nonalpha(text): |
| 218 return ''.join(c if c.isalnum() else '_' for c in text) |
| 219 |
| 220 |
| 221 def GenTests(api): |
| 222 for mastername, builders in BUILDERS.iteritems(): |
| 223 for buildername in builders: |
| 224 yield ( |
| 225 api.test('full_%s_%s' % (_sanitize_nonalpha(mastername), |
| 226 _sanitize_nonalpha(buildername))) + |
| 227 api.properties.generic( |
| 228 path_config='kitchen', |
| 229 repo_name='src', |
| 230 repo_url=REPO_URL, |
| 231 mastername=mastername, |
| 232 buildername=buildername, |
| 233 parent_buildername='parent_buildername', |
| 234 parent_buildnumber='1729', |
| 235 parent_revision='deadbeef', |
| 236 revision='deadbeef', |
| 237 slavename='slavename', |
| 238 target='Release')) |
| 239 yield (api.test('provision_devices') + |
| 240 api.properties.generic( |
| 241 path_config='kitchen', |
| 242 repo_name='src', |
| 243 repo_url=REPO_URL, |
| 244 mastername='chromium.perf', |
| 245 buildername='Android Nexus5 Perf (1)', |
| 246 parent_buildername='parent_buildername', |
| 247 parent_buildnumber='1729', |
| 248 parent_revision='deadbeef', |
| 249 revision='deadbeef', |
| 250 slavename='slavename', |
| 251 target='Release') |
| 252 + api.step_data('provision_devices', retcode=1)) |
| 253 yield (api.test('get_perf_test_list_old_data') + |
| 254 api.properties.generic( |
| 255 path_config='kitchen', |
| 256 repo_name='src', |
| 257 repo_url=REPO_URL, |
| 258 mastername='chromium.perf', |
| 259 buildername='Android Nexus5 Perf (1)', |
| 260 parent_buildername='parent_buildername', |
| 261 parent_buildnumber='1729', |
| 262 parent_revision='deadbeef', |
| 263 revision='deadbeef', |
| 264 slavename='slavename', |
| 265 target='Release') + |
| 266 api.override_step_data( |
| 267 'get perf test list', |
| 268 api.json.output(['perf_test.foo', 'page_cycler.foo']))) |
| 269 yield (api.test('src_side_script_fails') + |
| 270 api.properties.generic( |
| 271 path_config='kitchen', |
| 272 repo_name='src', |
| 273 repo_url=REPO_URL, |
| 274 mastername='chromium.perf', |
| 275 buildername='Android Nexus5 Perf (1)', |
| 276 parent_buildername='parent_buildername', |
| 277 parent_buildnumber='1729', |
| 278 parent_revision='deadbeef', |
| 279 revision='deadbeef', |
| 280 slavename='slavename', |
| 281 target='Release') + |
| 282 api.override_step_data( |
| 283 'read test spec (chromium.perf.json)', |
| 284 api.json.output({ |
| 285 "Android Nexus5 Perf (1)": { |
| 286 "scripts": [ |
| 287 { |
| 288 "name": "host_info", |
| 289 "script": "host_info.py" |
| 290 }]}})) + |
| 291 api.step_data('host_info', retcode=1)) |
| 292 yield (api.test('test_failure') + |
| 293 api.properties.generic( |
| 294 path_config='kitchen', |
| 295 repo_name='src', |
| 296 repo_url=REPO_URL, |
| 297 mastername='chromium.perf', |
| 298 buildername='Android Nexus5 Perf (1)', |
| 299 parent_buildername='parent_buildername', |
| 300 parent_buildnumber='1729', |
| 301 parent_revision='deadbeef', |
| 302 revision='deadbeef', |
| 303 slavename='slavename', |
| 304 target='Release') + |
| 305 api.override_step_data( |
| 306 'perf_test.foo', retcode=1)) |
| 307 yield (api.test('missing_device') + |
| 308 api.properties.generic( |
| 309 path_config='kitchen', |
| 310 repo_name='src', |
| 311 repo_url=REPO_URL, |
| 312 mastername='chromium.perf', |
| 313 buildername='Android Nexus5 Perf (1)', |
| 314 parent_buildername='parent_buildername', |
| 315 parent_buildnumber='1729', |
| 316 parent_revision='deadbeef', |
| 317 revision='deadbeef', |
| 318 slavename='slavename', |
| 319 target='Release') + |
| 320 api.override_step_data( |
| 321 'perf_test.foo', retcode=87)) |
| 322 yield (api.test('host_info_failure') + |
| 323 api.properties.generic( |
| 324 path_config='kitchen', |
| 325 repo_name='src', |
| 326 repo_url=REPO_URL, |
| 327 mastername='chromium.perf', |
| 328 buildername='Android Nexus5 Perf (1)', |
| 329 parent_buildername='parent_buildername', |
| 330 parent_buildnumber='1729', |
| 331 parent_revision='deadbeef', |
| 332 revision='deadbeef', |
| 333 slavename='slavename', |
| 334 target='Release') + |
| 335 api.override_step_data( |
| 336 'Host Info', |
| 337 api.json.output({ |
| 338 'valid': True, |
| 339 'failures': ['Failure A', 'Failure B'], |
| 340 '_host_info': { |
| 341 'os_system': 'os_system', |
| 342 'os_release': 'os_release', |
| 343 'processor': 'processor', |
| 344 'num_cpus': 'num_cpus', |
| 345 'free_disk_space': 'free_disk_space', |
| 346 'python_version': 'python_version', |
| 347 'python_path': 'python_path', |
| 348 'devices': [{ |
| 349 "usb_status": True, |
| 350 "blacklisted": None, |
| 351 "ro.build.fingerprint": "fingerprint", |
| 352 "battery": { |
| 353 "status": "5", |
| 354 "scale": "100", |
| 355 "temperature": "240", |
| 356 "level": "100", |
| 357 "technology": "Li-ion", |
| 358 "AC powered": "false", |
| 359 "health": "2", |
| 360 "voltage": "4302", |
| 361 "Wireless powered": "false", |
| 362 "USB powered": "true", |
| 363 "Max charging current": "500000", |
| 364 "present": "true" |
| 365 }, |
| 366 "adb_status": "device", |
| 367 "imei_slice": "", |
| 368 "ro.build.product": "bullhead", |
| 369 "ro.build.id": "MDB08Q", |
| 370 "serial": "00d0d567893340f4", |
| 371 "wifi_ip": "" |
| 372 }] |
| 373 }}), |
| 374 retcode=87)) |
| 375 |
| OLD | NEW |