OLD | NEW |
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.utils import timeout_retry | 21 from pylib.utils import timeout_retry |
21 | 22 |
22 | 23 |
23 _DEFAULT_TIMEOUT = 30 | 24 _DEFAULT_TIMEOUT = 30 |
24 _DEFAULT_RETRIES = 2 | 25 _DEFAULT_RETRIES = 2 |
25 | 26 |
| 27 _EMULATOR_RE = re.compile(r'^emulator-[0-9]+$') |
| 28 |
| 29 _READY_STATE = 'device' |
| 30 |
26 | 31 |
27 def _VerifyLocalFileExists(path): | 32 def _VerifyLocalFileExists(path): |
28 """Verifies a local file exists. | 33 """Verifies a local file exists. |
29 | 34 |
30 Args: | 35 Args: |
31 path: Path to the local file. | 36 path: Path to the local file. |
32 | 37 |
33 Raises: | 38 Raises: |
34 IOError: If the file doesn't exist. | 39 IOError: If the file doesn't exist. |
35 """ | 40 """ |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 @classmethod | 156 @classmethod |
152 def KillServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): | 157 def KillServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): |
153 cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries) | 158 cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries) |
154 | 159 |
155 @classmethod | 160 @classmethod |
156 def StartServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): | 161 def StartServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): |
157 # 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 |
158 cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries, | 163 cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries, |
159 cpu_affinity=0) | 164 cpu_affinity=0) |
160 | 165 |
161 # TODO(craigdh): Determine the filter criteria that should be supported. | |
162 @classmethod | 166 @classmethod |
163 def GetDevices(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): | 167 def GetDevices(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): |
| 168 """DEPRECATED. Refer to Devices(...) below.""" |
| 169 # TODO(jbudorick): Remove this function once no more clients are using it. |
| 170 return cls.Devices(timeout=timeout, retries=retries) |
| 171 |
| 172 @classmethod |
| 173 def Devices(cls, is_ready=True, timeout=_DEFAULT_TIMEOUT, |
| 174 retries=_DEFAULT_RETRIES): |
164 """Get the list of active attached devices. | 175 """Get the list of active attached devices. |
165 | 176 |
166 Args: | 177 Args: |
167 timeout: (optional) Timeout per try in seconds. | 178 timeout: (optional) Timeout per try in seconds. |
168 retries: (optional) Number of retries to attempt. | 179 retries: (optional) Number of retries to attempt. |
169 | 180 |
170 Yields: | 181 Yields: |
171 AdbWrapper instances. | 182 AdbWrapper instances. |
172 """ | 183 """ |
173 output = cls._RunAdbCmd(['devices'], timeout=timeout, retries=retries) | 184 output = cls._RunAdbCmd(['devices'], timeout=timeout, retries=retries) |
174 lines = [line.split() for line in output.splitlines()] | 185 lines = (line.split() for line in output.splitlines()) |
175 return [AdbWrapper(line[0]) for line in lines | 186 return [AdbWrapper(line[0]) for line in lines |
176 if len(line) == 2 and line[1] == 'device'] | 187 if len(line) == 2 and (not is_ready or line[1] == _READY_STATE)] |
177 | 188 |
178 def GetDeviceSerial(self): | 189 def GetDeviceSerial(self): |
179 """Gets the device serial number associated with this object. | 190 """Gets the device serial number associated with this object. |
180 | 191 |
181 Returns: | 192 Returns: |
182 Device serial number as a string. | 193 Device serial number as a string. |
183 """ | 194 """ |
184 return self._device_serial | 195 return self._device_serial |
185 | 196 |
186 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 Loading... |
523 """Restarts the adbd daemon with root permissions, if possible. | 534 """Restarts the adbd daemon with root permissions, if possible. |
524 | 535 |
525 Args: | 536 Args: |
526 timeout: (optional) Timeout per try in seconds. | 537 timeout: (optional) Timeout per try in seconds. |
527 retries: (optional) Number of retries to attempt. | 538 retries: (optional) Number of retries to attempt. |
528 """ | 539 """ |
529 output = self._RunDeviceAdbCmd(['root'], timeout, retries) | 540 output = self._RunDeviceAdbCmd(['root'], timeout, retries) |
530 if 'cannot' in output: | 541 if 'cannot' in output: |
531 raise device_errors.AdbCommandFailedError( | 542 raise device_errors.AdbCommandFailedError( |
532 ['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 |
OLD | NEW |