OLD | NEW |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 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 """Provides an interface to communicate with the device via the adb command. | 5 """Provides an interface to communicate with the device via the adb command. |
6 | 6 |
7 Assumes adb binary is currently on system path. | 7 Assumes adb binary is currently on system path. |
8 """ | 8 """ |
9 # pylint: disable-all | 9 # pylint: disable-all |
10 | 10 |
(...skipping 21 matching lines...) Expand all Loading... |
32 from pylib import pexpect | 32 from pylib import pexpect |
33 except ImportError: | 33 except ImportError: |
34 pexpect = None | 34 pexpect = None |
35 | 35 |
36 sys.path.append(os.path.join( | 36 sys.path.append(os.path.join( |
37 constants.DIR_SOURCE_ROOT, 'third_party', 'android_testrunner')) | 37 constants.DIR_SOURCE_ROOT, 'third_party', 'android_testrunner')) |
38 import adb_interface | 38 import adb_interface |
39 import am_instrument_parser | 39 import am_instrument_parser |
40 import errors | 40 import errors |
41 | 41 |
| 42 from pylib.device import device_blacklist |
42 | 43 |
43 # Pattern to search for the next whole line of pexpect output and capture it | 44 # Pattern to search for the next whole line of pexpect output and capture it |
44 # into a match group. We can't use ^ and $ for line start end with pexpect, | 45 # into a match group. We can't use ^ and $ for line start end with pexpect, |
45 # see http://www.noah.org/python/pexpect/#doc for explanation why. | 46 # see http://www.noah.org/python/pexpect/#doc for explanation why. |
46 PEXPECT_LINE_RE = re.compile('\n([^\r]*)\r') | 47 PEXPECT_LINE_RE = re.compile('\n([^\r]*)\r') |
47 | 48 |
48 # Set the adb shell prompt to be a unique marker that will [hopefully] not | 49 # Set the adb shell prompt to be a unique marker that will [hopefully] not |
49 # appear at the start of any line of a command's output. | 50 # appear at the start of any line of a command's output. |
50 SHELL_PROMPT = '~+~PQ\x17RS~+~' | 51 SHELL_PROMPT = '~+~PQ\x17RS~+~' |
51 | 52 |
(...skipping 20 matching lines...) Expand all Loading... |
72 MD5SUM_DEVICE_PATH = MD5SUM_DEVICE_FOLDER + 'md5sum_bin' | 73 MD5SUM_DEVICE_PATH = MD5SUM_DEVICE_FOLDER + 'md5sum_bin' |
73 MD5SUM_LD_LIBRARY_PATH = 'LD_LIBRARY_PATH=%s' % MD5SUM_DEVICE_FOLDER | 74 MD5SUM_LD_LIBRARY_PATH = 'LD_LIBRARY_PATH=%s' % MD5SUM_DEVICE_FOLDER |
74 | 75 |
75 | 76 |
76 def GetAVDs(): | 77 def GetAVDs(): |
77 """Returns a list of AVDs.""" | 78 """Returns a list of AVDs.""" |
78 re_avd = re.compile('^[ ]+Name: ([a-zA-Z0-9_:.-]+)', re.MULTILINE) | 79 re_avd = re.compile('^[ ]+Name: ([a-zA-Z0-9_:.-]+)', re.MULTILINE) |
79 avds = re_avd.findall(cmd_helper.GetCmdOutput(['android', 'list', 'avd'])) | 80 avds = re_avd.findall(cmd_helper.GetCmdOutput(['android', 'list', 'avd'])) |
80 return avds | 81 return avds |
81 | 82 |
82 | |
83 def ResetBadDevices(): | 83 def ResetBadDevices(): |
84 """Removes the file that keeps track of bad devices for a current build.""" | 84 """Removes the blacklist that keeps track of bad devices for a current |
85 if os.path.exists(constants.BAD_DEVICES_JSON): | 85 build. |
86 os.remove(constants.BAD_DEVICES_JSON) | 86 """ |
87 | 87 device_blacklist.ResetBlacklist() |
88 | 88 |
89 def ExtendBadDevices(devices): | 89 def ExtendBadDevices(devices): |
90 """Adds devices to BAD_DEVICES_JSON file. | 90 """Adds devices to the blacklist that keeps track of bad devices for a |
| 91 current build. |
91 | 92 |
92 The devices listed in the BAD_DEVICES_JSON file will not be returned by | 93 The devices listed in the bad devices file will not be returned by |
93 GetAttachedDevices. | 94 GetAttachedDevices. |
94 | 95 |
95 Args: | 96 Args: |
96 devices: list of bad devices to be added to the BAD_DEVICES_JSON file. | 97 devices: list of bad devices to be added to the bad devices file. |
97 """ | 98 """ |
98 if os.path.exists(constants.BAD_DEVICES_JSON): | 99 device_blacklist.ExtendBlacklist(devices) |
99 with open(constants.BAD_DEVICES_JSON, 'r') as f: | |
100 bad_devices = json.load(f) | |
101 devices.extend(bad_devices) | |
102 with open(constants.BAD_DEVICES_JSON, 'w') as f: | |
103 json.dump(list(set(devices)), f) | |
104 | 100 |
105 | 101 |
106 def GetAttachedDevices(hardware=True, emulator=True, offline=False): | 102 def GetAttachedDevices(hardware=True, emulator=True, offline=False): |
107 """Returns a list of attached, android devices and emulators. | 103 """Returns a list of attached, android devices and emulators. |
108 | 104 |
109 If a preferred device has been set with ANDROID_SERIAL, it will be first in | 105 If a preferred device has been set with ANDROID_SERIAL, it will be first in |
110 the returned list. The arguments specify what devices to include in the list. | 106 the returned list. The arguments specify what devices to include in the list. |
111 | 107 |
112 Example output: | 108 Example output: |
113 | 109 |
(...skipping 29 matching lines...) Expand all Loading... |
143 elif hardware: | 139 elif hardware: |
144 devices = [device for device in online_devices | 140 devices = [device for device in online_devices |
145 if device not in emulator_devices] | 141 if device not in emulator_devices] |
146 elif emulator: | 142 elif emulator: |
147 devices = emulator_devices | 143 devices = emulator_devices |
148 | 144 |
149 # Now add offline devices if offline is true | 145 # Now add offline devices if offline is true |
150 if offline: | 146 if offline: |
151 devices = devices + offline_devices | 147 devices = devices + offline_devices |
152 | 148 |
153 # Remove bad devices listed in the bad_devices json file. | 149 # Remove any devices in the blacklist. |
154 if os.path.exists(constants.BAD_DEVICES_JSON): | 150 blacklist = device_blacklist.ReadBlacklist() |
155 with open(constants.BAD_DEVICES_JSON, 'r') as f: | 151 if len(blacklist): |
156 bad_devices = json.load(f) | 152 logging.info('Avoiding bad devices %s', ' '.join(blacklist)) |
157 logging.info('Avoiding bad devices %s', ' '.join(bad_devices)) | 153 devices = [device for device in devices if device not in blacklist] |
158 devices = [device for device in devices if device not in bad_devices] | |
159 | 154 |
160 preferred_device = os.environ.get('ANDROID_SERIAL') | 155 preferred_device = os.environ.get('ANDROID_SERIAL') |
161 if preferred_device in devices: | 156 if preferred_device in devices: |
162 devices.remove(preferred_device) | 157 devices.remove(preferred_device) |
163 devices.insert(0, preferred_device) | 158 devices.insert(0, preferred_device) |
164 return devices | 159 return devices |
165 | 160 |
166 | 161 |
167 def IsDeviceAttached(device): | 162 def IsDeviceAttached(device): |
168 """Return true if the device is attached and online.""" | 163 """Return true if the device is attached and online.""" |
(...skipping 1673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 """ | 1837 """ |
1843 def __init__(self, output): | 1838 def __init__(self, output): |
1844 self._output = output | 1839 self._output = output |
1845 | 1840 |
1846 def write(self, data): | 1841 def write(self, data): |
1847 data = data.replace('\r\r\n', '\n') | 1842 data = data.replace('\r\r\n', '\n') |
1848 self._output.write(data) | 1843 self._output.write(data) |
1849 | 1844 |
1850 def flush(self): | 1845 def flush(self): |
1851 self._output.flush() | 1846 self._output.flush() |
OLD | NEW |