Index: build/android/pylib/remote/device/remote_device_environment.py |
diff --git a/build/android/pylib/remote/device/remote_device_environment.py b/build/android/pylib/remote/device/remote_device_environment.py |
index cc39112e4ff49b3b8d202c9d6ddb7b591a30ec9f..256118098f409c1f622a76300e51be53817f4095 100644 |
--- a/build/android/pylib/remote/device/remote_device_environment.py |
+++ b/build/android/pylib/remote/device/remote_device_environment.py |
@@ -15,12 +15,15 @@ from pylib import constants |
from pylib.base import environment |
from pylib.remote.device import appurify_sanitized |
from pylib.remote.device import remote_device_helper |
+from pylib.utils import timeout_retry |
+from pylib.utils import reraiser_thread |
class RemoteDeviceEnvironment(environment.Environment): |
"""An environment for running on remote devices.""" |
_ENV_KEY = 'env' |
_DEVICE_KEY = 'device' |
+ _DEFAULT_RETRIES = 0 |
def __init__(self, args, error_func): |
"""Constructor. |
@@ -74,6 +77,7 @@ class RemoteDeviceEnvironment(environment.Environment): |
self._remote_device_minimum_os = device_json.get( |
'remote_device_minimum_os', None) |
self._remote_device_os = device_json.get('remote_device_os', None) |
+ self._remote_device_timeout = device_json.get('remote_device_timeout', None) |
self._results_path = device_json.get('results_path', None) |
self._runner_package = device_json.get('runner_package', None) |
self._runner_type = device_json.get('runner_type', None) |
@@ -110,6 +114,9 @@ class RemoteDeviceEnvironment(environment.Environment): |
'remote_device_minimum_os') |
self._remote_device_os = command_line_override( |
self._remote_device_os, args.remote_device_os, 'remote_device_os') |
+ self._remote_device_timeout = command_line_override( |
+ self._remote_device_timeout, args.remote_device_timeout, |
+ 'remote_device_timeout') |
self._results_path = command_line_override( |
self._results_path, args.results_path, 'results_path') |
self._runner_package = command_line_override( |
@@ -158,6 +165,7 @@ class RemoteDeviceEnvironment(environment.Environment): |
logging.info('Remote device OS: %s', self._remote_device_os) |
logging.info('Remote device OEM: %s', self._device_oem) |
logging.info('Remote device type: %s', self._device_type) |
+ logging.info('Remote device timout: %s', self._remote_device_timeout) |
logging.info('Results Path: %s', self._results_path) |
logging.info('Runner package: %s', self._runner_package) |
logging.info('Runner type: %s', self._runner_type) |
@@ -177,7 +185,7 @@ class RemoteDeviceEnvironment(environment.Environment): |
os.environ['APPURIFY_API_PORT'] = self._api_port |
self._GetAccessToken() |
if self._trigger: |
- self._device = self._SelectDevice() |
+ self._SelectDevice() |
def TearDown(self): |
"""Teardown the test environment.""" |
@@ -228,14 +236,20 @@ class RemoteDeviceEnvironment(environment.Environment): |
'Unable to revoke access token.') |
def _SelectDevice(self): |
- """Select which device to use.""" |
+ if self._remote_device_timeout: |
+ try: |
+ timeout_retry.Run(self._FindDeviceWithTimeout, |
+ self._remote_device_timeout, self._DEFAULT_RETRIES) |
+ except reraiser_thread.TimeoutError: |
+ self._NoDeviceFound() |
+ else: |
+ if not self._FindDevice(): |
+ self._NoDeviceFound() |
+ |
+ def _FindDevice(self): |
+ """Find which device to use.""" |
logging.info('Finding device to run tests on.') |
- with appurify_sanitized.SanitizeLogging(self._verbose_count, |
- logging.WARNING): |
- dev_list_res = appurify_sanitized.api.devices_list(self._access_token) |
- remote_device_helper.TestHttpResponse(dev_list_res, |
- 'Unable to generate access token.') |
- device_list = dev_list_res.json()['response'] |
+ device_list = self._GetDeviceList() |
random.shuffle(device_list) |
for device in device_list: |
if device['os_name'] != self._device_type: |
@@ -251,12 +265,16 @@ class RemoteDeviceEnvironment(environment.Environment): |
and distutils.version.LooseVersion(device['os_version']) |
< distutils.version.LooseVersion(self._remote_device_minimum_os)): |
continue |
- if ((self._remote_device and self._remote_device_os) |
- or device['available_devices_count']): |
+ if device['has_available_device']: |
logging.info('Found device: %s %s', |
device['name'], device['os_version']) |
- return device |
- self._NoDeviceFound(device_list) |
+ self._device = device |
+ return True |
+ return False |
+ |
+ def _FindDeviceWithTimeout(self): |
+ """Find which device to use with timeout.""" |
+ timeout_retry.WaitFor(self._FindDevice, wait_period=1) |
def _PrintAvailableDevices(self, device_list): |
def compare_devices(a,b): |
@@ -267,12 +285,23 @@ class RemoteDeviceEnvironment(environment.Environment): |
return 0 |
logging.critical('Available %s Devices:', self._device_type) |
+ logging.critical(' %s %s %s', 'OS'.ljust(7), |
+ 'Device Name'.ljust(20), '# Available') |
devices = (d for d in device_list if d['os_name'] == self._device_type) |
for d in sorted(devices, compare_devices): |
- logging.critical(' %s %s', d['os_version'].ljust(7), d['name']) |
+ logging.critical(' %s %s %s', d['os_version'].ljust(7), |
+ d['name'].ljust(20), d['available_devices_count']) |
+ |
+ def _GetDeviceList(self): |
+ with appurify_sanitized.SanitizeLogging(self._verbose_count, |
+ logging.WARNING): |
+ dev_list_res = appurify_sanitized.api.devices_list(self._access_token) |
+ remote_device_helper.TestHttpResponse(dev_list_res, |
+ 'Unable to generate access token.') |
+ return dev_list_res.json()['response'] |
- def _NoDeviceFound(self, device_list): |
- self._PrintAvailableDevices(device_list) |
+ def _NoDeviceFound(self): |
+ self._PrintAvailableDevices(self._GetDeviceList()) |
raise remote_device_helper.RemoteDeviceError('No device found.') |
@property |