Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(556)

Side by Side Diff: build/android/pylib/device/adb_wrapper.py

Issue 1101603002: [Android] Rework device filtering and add DeviceUtils.HealthyDevices. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: perezju comments Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « build/android/provision_devices.py ('k') | build/android/pylib/device/device_filter.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 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 """This module wraps Android's adb tool. 5 """This module wraps Android's adb tool.
6 6
7 This is a thin wrapper around the adb interface. Any additional complexity 7 This is a thin wrapper around the adb interface. Any additional complexity
8 should be delegated to a higher level (ex. DeviceUtils). 8 should be delegated to a higher level (ex. DeviceUtils).
9 """ 9 """
10 10
11 import collections 11 import collections
12 import errno 12 import errno
13 import logging 13 import logging
14 import os 14 import os
15 import re
15 16
16 from pylib import cmd_helper 17 from pylib import cmd_helper
17 from pylib import constants 18 from pylib import constants
18 from pylib.device import decorators 19 from pylib.device import decorators
19 from pylib.device import device_errors 20 from pylib.device import device_errors
20 from pylib.device import device_filter
21 from pylib.utils import timeout_retry 21 from pylib.utils import timeout_retry
22 22
23 23
24 _DEFAULT_TIMEOUT = 30 24 _DEFAULT_TIMEOUT = 30
25 _DEFAULT_RETRIES = 2 25 _DEFAULT_RETRIES = 2
26 26
27 _EMULATOR_RE = re.compile(r'^emulator-[0-9]+$')
28
29 _READY_STATE = 'device'
30
27 31
28 def _VerifyLocalFileExists(path): 32 def _VerifyLocalFileExists(path):
29 """Verifies a local file exists. 33 """Verifies a local file exists.
30 34
31 Args: 35 Args:
32 path: Path to the local file. 36 path: Path to the local file.
33 37
34 Raises: 38 Raises:
35 IOError: If the file doesn't exist. 39 IOError: If the file doesn't exist.
36 """ 40 """
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 def KillServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 157 def KillServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
154 cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries) 158 cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries)
155 159
156 @classmethod 160 @classmethod
157 def StartServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 161 def StartServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
158 # CPU affinity is used to reduce adb instability http://crbug.com/268450 162 # CPU affinity is used to reduce adb instability http://crbug.com/268450
159 cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries, 163 cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries,
160 cpu_affinity=0) 164 cpu_affinity=0)
161 165
162 @classmethod 166 @classmethod
163 def GetDevices(cls, filters=None, timeout=_DEFAULT_TIMEOUT, 167 def GetDevices(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
164 retries=_DEFAULT_RETRIES):
165 """DEPRECATED. Refer to Devices(...) below.""" 168 """DEPRECATED. Refer to Devices(...) below."""
166 # TODO(jbudorick): Remove this function once no more clients are using it. 169 # TODO(jbudorick): Remove this function once no more clients are using it.
167 return cls.Devices(filters=filters, timeout=timeout, retries=retries) 170 return cls.Devices(timeout=timeout, retries=retries)
168 171
169 @classmethod 172 @classmethod
170 def Devices(cls, filters=None, timeout=_DEFAULT_TIMEOUT, 173 def Devices(cls, is_ready=True, timeout=_DEFAULT_TIMEOUT,
171 retries=_DEFAULT_RETRIES): 174 retries=_DEFAULT_RETRIES):
172 """Get the list of active attached devices. 175 """Get the list of active attached devices.
173 176
174 Args: 177 Args:
175 filters: (optional) A list of binary functions that take an AdbWrapper
176 instance and a string description. Any device for which all provided
177 filter functions do not return True will not be included in the
178 returned list.
179 timeout: (optional) Timeout per try in seconds. 178 timeout: (optional) Timeout per try in seconds.
180 retries: (optional) Number of retries to attempt. 179 retries: (optional) Number of retries to attempt.
181 180
182 Yields: 181 Yields:
183 AdbWrapper instances. 182 AdbWrapper instances.
184 """ 183 """
185 output = cls._RunAdbCmd(['devices'], timeout=timeout, retries=retries) 184 output = cls._RunAdbCmd(['devices'], timeout=timeout, retries=retries)
186 lines = (line.split() for line in output.splitlines()) 185 lines = (line.split() for line in output.splitlines())
187 devices = (AdbWrapper(line[0]) for line in lines if len(line) == 2) 186 return [AdbWrapper(line[0]) for line in lines
188 187 if len(line) == 2 and (not is_ready or line[1] == _READY_STATE)]
189 def matches_all_filters(device):
190 for f in filters or ():
191 if not f(device):
192 logging.info('Device %s failed filter %s', device.GetDeviceSerial(),
193 f.__name__)
194 return False
195 return True
196
197 return [d for d in devices if matches_all_filters(d)]
198 188
199 def GetDeviceSerial(self): 189 def GetDeviceSerial(self):
200 """Gets the device serial number associated with this object. 190 """Gets the device serial number associated with this object.
201 191
202 Returns: 192 Returns:
203 Device serial number as a string. 193 Device serial number as a string.
204 """ 194 """
205 return self._device_serial 195 return self._device_serial
206 196
207 def Push(self, local, remote, timeout=60*5, retries=_DEFAULT_RETRIES): 197 def Push(self, local, remote, timeout=60*5, retries=_DEFAULT_RETRIES):
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 """Restarts the adbd daemon with root permissions, if possible. 534 """Restarts the adbd daemon with root permissions, if possible.
545 535
546 Args: 536 Args:
547 timeout: (optional) Timeout per try in seconds. 537 timeout: (optional) Timeout per try in seconds.
548 retries: (optional) Number of retries to attempt. 538 retries: (optional) Number of retries to attempt.
549 """ 539 """
550 output = self._RunDeviceAdbCmd(['root'], timeout, retries) 540 output = self._RunDeviceAdbCmd(['root'], timeout, retries)
551 if 'cannot' in output: 541 if 'cannot' in output:
552 raise device_errors.AdbCommandFailedError( 542 raise device_errors.AdbCommandFailedError(
553 ['root'], output, device_serial=self._device_serial) 543 ['root'], output, device_serial=self._device_serial)
544
545 @property
546 def is_emulator(self):
547 return _EMULATOR_RE.match(self._device_serial)
548
549 @property
550 def is_ready(self):
551 try:
552 return self.GetState() == _READY_STATE
553 except device_errors.CommandFailedError:
554 return False
555
OLDNEW
« no previous file with comments | « build/android/provision_devices.py ('k') | build/android/pylib/device/device_filter.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698