Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import logging | 5 import logging |
| 6 import os | 6 import os |
| 7 import posixpath | 7 import posixpath |
| 8 import re | 8 import re |
| 9 import time | 9 import time |
| 10 | 10 |
| 11 from devil.android import device_errors | 11 from devil.android import device_errors |
| 12 from devil.android import flag_changer | 12 from devil.android import flag_changer |
| 13 from devil.android.sdk import shared_prefs | 13 from devil.android.sdk import shared_prefs |
| 14 from devil.utils import reraiser_thread | 14 from devil.utils import reraiser_thread |
| 15 from pylib import valgrind_tools | 15 from pylib import valgrind_tools |
| 16 from pylib.android import logdog_logcat_monitor | 16 from pylib.android import logdog_logcat_monitor |
| 17 from pylib.base import base_test_result | 17 from pylib.base import base_test_result |
| 18 from pylib.instrumentation import instrumentation_test_instance | 18 from pylib.instrumentation import instrumentation_test_instance |
| 19 from pylib.local.device import local_device_environment | 19 from pylib.local.device import local_device_environment |
| 20 from pylib.local.device import local_device_test_run | 20 from pylib.local.device import local_device_test_run |
| 21 from pylib.utils import logdog_helper | 21 from pylib.utils import logdog_helper |
| 22 from py_trace_event import trace_event | 22 from py_trace_event import trace_event |
| 23 from py_utils import contextlib_ext | 23 from py_utils import contextlib_ext |
| 24 import tombstones | 24 import tombstones |
| 25 | 25 |
| 26 from multiprocessing.pool import ThreadPool | |
| 27 | |
| 26 _TAG = 'test_runner_py' | 28 _TAG = 'test_runner_py' |
| 27 | 29 |
| 28 TIMEOUT_ANNOTATIONS = [ | 30 TIMEOUT_ANNOTATIONS = [ |
| 29 ('Manual', 10 * 60 * 60), | 31 ('Manual', 10 * 60 * 60), |
| 30 ('IntegrationTest', 30 * 60), | 32 ('IntegrationTest', 30 * 60), |
| 31 ('External', 10 * 60), | 33 ('External', 10 * 60), |
| 32 ('EnormousTest', 10 * 60), | 34 ('EnormousTest', 10 * 60), |
| 33 ('LargeTest', 5 * 60), | 35 ('LargeTest', 5 * 60), |
| 34 ('MediumTest', 3 * 60), | 36 ('MediumTest', 3 * 60), |
| 35 ('SmallTest', 1 * 60), | 37 ('SmallTest', 1 * 60), |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 68 #override | 70 #override |
| 69 def TestPackage(self): | 71 def TestPackage(self): |
| 70 return self._test_instance.suite | 72 return self._test_instance.suite |
| 71 | 73 |
| 72 #override | 74 #override |
| 73 def SetUp(self): | 75 def SetUp(self): |
| 74 @local_device_environment.handle_shard_failures_with( | 76 @local_device_environment.handle_shard_failures_with( |
| 75 self._env.BlacklistDevice) | 77 self._env.BlacklistDevice) |
| 76 @trace_event.traced | 78 @trace_event.traced |
| 77 def individual_device_set_up(dev, host_device_tuples): | 79 def individual_device_set_up(dev, host_device_tuples): |
| 80 def single_apk_install(apk_permission_pair): | |
| 81 apk = apk_permission_pair[0] | |
| 82 permissions = apk_permission_pair[1] | |
| 83 dev.Install(apk, permissions=permissions) | |
| 84 | |
| 85 def single_incremental_apk_install(dev_apk_script_array): | |
| 86 dev = dev_apk_script_array[0] | |
| 87 apk = dev_apk_script_array[1] | |
| 88 incremental_install_script = dev_apk_script_array[2] | |
| 89 local_device_test_run.IncrementalInstall( | |
| 90 dev, apk, incremental_install_script) | |
| 91 | |
| 92 def single_apk_install_helper(array): | |
| 93 if len(array) == 2: | |
| 94 single_apk_install(array) | |
| 95 elif len(array) == 3: | |
| 96 single_incremental_apk_install(array) | |
| 97 else: | |
| 98 raise Exception('incorrect input array') | |
| 99 | |
| 100 @trace_event.traced | |
| 78 def install_apk(): | 101 def install_apk(): |
| 102 apk_resource_array = [] | |
| 79 if self._test_instance.apk_under_test: | 103 if self._test_instance.apk_under_test: |
| 80 if self._test_instance.apk_under_test_incremental_install_script: | 104 if self._test_instance.apk_under_test_incremental_install_script: |
| 81 local_device_test_run.IncrementalInstall( | 105 apk_resource_array.append([ |
| 82 dev, | 106 dev, |
| 83 self._test_instance.apk_under_test, | 107 self._test_instance.apk_under_test, |
| 84 self._test_instance.apk_under_test_incremental_install_script) | 108 self._test_instance.apk_under_test_incremental_install_script]) |
| 85 else: | 109 else: |
| 86 permissions = self._test_instance.apk_under_test.GetPermissions() | 110 permissions = self._test_instance.apk_under_test.GetPermissions() |
| 87 dev.Install(self._test_instance.apk_under_test, | 111 apk_resource_array.append( |
| 88 permissions=permissions) | 112 [self._test_instance.apk_under_test, permissions]) |
| 89 | 113 |
| 90 if self._test_instance.test_apk_incremental_install_script: | 114 if self._test_instance.test_apk_incremental_install_script: |
| 91 local_device_test_run.IncrementalInstall( | 115 apk_resource_array.append([ |
| 92 dev, | 116 dev, |
| 93 self._test_instance.test_apk, | 117 self._test_instance.test_apk, |
| 94 self._test_instance.test_apk_incremental_install_script) | 118 self._test_instance.test_apk_incremental_install_script]) |
| 95 else: | 119 else: |
| 96 permissions = self._test_instance.test_apk.GetPermissions() | 120 permissions = self._test_instance.test_apk.GetPermissions() |
| 97 dev.Install(self._test_instance.test_apk, permissions=permissions) | 121 apk_resource_array.append( |
| 122 [self._test_instance.test_apk, permissions]) | |
| 98 | 123 |
| 99 for apk in self._test_instance.additional_apks: | 124 for apk in self._test_instance.additional_apks: |
| 100 dev.Install(apk) | 125 apk_resource_array.append([apk, None]) |
| 126 | |
| 127 if self._env.concurrent_adb: | |
| 128 pool = ThreadPool(processes=len(apk_resource_array)) | |
|
jbudorick
2017/04/01 00:58:19
Instead of using a ThreadPool, split apk installat
| |
| 129 pool.map(single_apk_install_helper, apk_resource_array) | |
| 130 else: | |
| 131 for apk_resource in apk_resource_array: | |
| 132 single_apk_install_helper(apk_resource) | |
| 101 | 133 |
| 102 # Set debug app in order to enable reading command line flags on user | 134 # Set debug app in order to enable reading command line flags on user |
| 103 # builds | 135 # builds |
| 104 if self._test_instance.flags: | 136 if self._test_instance.flags: |
| 105 if not self._test_instance.package_info: | 137 if not self._test_instance.package_info: |
| 106 logging.error("Couldn't set debug app: no package info") | 138 logging.error("Couldn't set debug app: no package info") |
| 107 elif not self._test_instance.package_info.package: | 139 elif not self._test_instance.package_info.package: |
| 108 logging.error("Couldn't set debug app: no package defined") | 140 logging.error("Couldn't set debug app: no package defined") |
| 109 else: | 141 else: |
| 110 dev.RunShellCommand(['am', 'set-debug-app', '--persistent', | 142 dev.RunShellCommand(['am', 'set-debug-app', '--persistent', |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 158 logging.error("Couldn't set flags: no cmdline_file") | 190 logging.error("Couldn't set flags: no cmdline_file") |
| 159 else: | 191 else: |
| 160 self._CreateFlagChangerIfNeeded(dev) | 192 self._CreateFlagChangerIfNeeded(dev) |
| 161 logging.debug('Attempting to set flags: %r', | 193 logging.debug('Attempting to set flags: %r', |
| 162 self._test_instance.flags) | 194 self._test_instance.flags) |
| 163 self._flag_changers[str(dev)].AddFlags(self._test_instance.flags) | 195 self._flag_changers[str(dev)].AddFlags(self._test_instance.flags) |
| 164 | 196 |
| 165 valgrind_tools.SetChromeTimeoutScale( | 197 valgrind_tools.SetChromeTimeoutScale( |
| 166 dev, self._test_instance.timeout_scale) | 198 dev, self._test_instance.timeout_scale) |
| 167 | 199 |
| 168 steps = (install_apk, edit_shared_prefs, push_test_data, | 200 steps = (install_apk, edit_shared_prefs, push_test_data, |
|
jbudorick
2017/04/01 00:58:19
... and then add the steps here.
| |
| 169 create_flag_changer) | 201 create_flag_changer) |
| 170 if self._env.concurrent_adb: | 202 if self._env.concurrent_adb: |
| 171 reraiser_thread.RunAsync(steps) | 203 reraiser_thread.RunAsync(steps) |
| 172 else: | 204 else: |
| 173 for step in steps: | 205 for step in steps: |
| 174 step() | 206 step() |
| 175 if self._test_instance.store_tombstones: | 207 if self._test_instance.store_tombstones: |
| 176 tombstones.ClearAllTombstones(dev) | 208 tombstones.ClearAllTombstones(dev) |
| 177 | 209 |
| 178 self._env.parallel_devices.pMap( | 210 self._env.parallel_devices.pMap( |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 if k in annotations: | 463 if k in annotations: |
| 432 timeout = v | 464 timeout = v |
| 433 break | 465 break |
| 434 else: | 466 else: |
| 435 logging.warning('Using default 1 minute timeout for %s', test_name) | 467 logging.warning('Using default 1 minute timeout for %s', test_name) |
| 436 timeout = 60 | 468 timeout = 60 |
| 437 | 469 |
| 438 timeout *= cls._GetTimeoutScaleFromAnnotations(annotations) | 470 timeout *= cls._GetTimeoutScaleFromAnnotations(annotations) |
| 439 | 471 |
| 440 return timeout | 472 return timeout |
| OLD | NEW |