OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright 2013 The Chromium Authors. All rights reserved. | 3 # Copyright 2013 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """A class to keep track of devices across builds and report state.""" | 7 """A class to keep track of devices across builds and report state.""" |
8 import logging | 8 import logging |
9 import optparse | 9 import optparse |
10 import os | 10 import os |
(...skipping 12 matching lines...) Expand all Loading... |
23 sys.path.append(os.path.join(os.path.dirname(__file__), | 23 sys.path.append(os.path.join(os.path.dirname(__file__), |
24 os.pardir, os.pardir, 'util', 'lib', | 24 os.pardir, os.pardir, 'util', 'lib', |
25 'common')) | 25 'common')) |
26 import perf_tests_results_helper # pylint: disable=F0401 | 26 import perf_tests_results_helper # pylint: disable=F0401 |
27 | 27 |
28 sys.path.append(os.path.join(os.path.dirname(__file__), '..')) | 28 sys.path.append(os.path.join(os.path.dirname(__file__), '..')) |
29 from pylib import android_commands | 29 from pylib import android_commands |
30 from pylib import constants | 30 from pylib import constants |
31 from pylib.cmd_helper import GetCmdOutput | 31 from pylib.cmd_helper import GetCmdOutput |
32 from pylib.device import device_blacklist | 32 from pylib.device import device_blacklist |
| 33 from pylib.device import device_utils |
33 | 34 |
34 def DeviceInfo(serial, options): | 35 def DeviceInfo(serial, options): |
35 """Gathers info on a device via various adb calls. | 36 """Gathers info on a device via various adb calls. |
36 | 37 |
37 Args: | 38 Args: |
38 serial: The serial of the attached device to construct info about. | 39 serial: The serial of the attached device to construct info about. |
39 | 40 |
40 Returns: | 41 Returns: |
41 Tuple of device type, build id, report as a string, error messages, and | 42 Tuple of device type, build id, report as a string, error messages, and |
42 boolean indicating whether or not device can be used for testing. | 43 boolean indicating whether or not device can be used for testing. |
43 """ | 44 """ |
44 | 45 |
45 device_adb = android_commands.AndroidCommands(serial) | 46 device_adb = device_utils.DeviceUtils(serial) |
46 | 47 device_type = device_adb.old_interface.GetBuildProduct() |
47 # TODO(navabi): Replace AdbShellCmd with device_adb. | 48 device_build = device_adb.old_interface.GetBuildId() |
48 device_type = device_adb.GetBuildProduct() | 49 device_build_type = device_adb.old_interface.GetBuildType() |
49 device_build = device_adb.GetBuildId() | 50 device_product_name = device_adb.old_interface.GetProductName() |
50 device_build_type = device_adb.GetBuildType() | |
51 device_product_name = device_adb.GetProductName() | |
52 | 51 |
53 try: | 52 try: |
54 battery = device_adb.GetBatteryInfo() | 53 battery = device_adb.old_interface.GetBatteryInfo() |
55 except Exception as e: | 54 except Exception as e: |
56 battery = None | 55 battery = None |
57 logging.error('Unable to obtain battery info for %s, %s', serial, e) | 56 logging.error('Unable to obtain battery info for %s, %s', serial, e) |
58 | 57 |
59 def _GetData(re_expression, line, lambda_function=lambda x:x): | 58 def _GetData(re_expression, line, lambda_function=lambda x:x): |
60 if not line: | 59 if not line: |
61 return 'Unknown' | 60 return 'Unknown' |
62 found = re.findall(re_expression, line) | 61 found = re.findall(re_expression, line) |
63 if found and len(found): | 62 if found and len(found): |
64 return lambda_function(found[0]) | 63 return lambda_function(found[0]) |
65 return 'Unknown' | 64 return 'Unknown' |
66 | 65 |
67 ac_power = _GetData('AC powered: (\w+)', battery) | 66 ac_power = _GetData('AC powered: (\w+)', battery) |
68 battery_level = _GetData('level: (\d+)', battery) | 67 battery_level = _GetData('level: (\d+)', battery) |
69 battery_temp = _GetData('temperature: (\d+)', battery, | 68 battery_temp = _GetData('temperature: (\d+)', battery, |
70 lambda x: float(x) / 10.0) | 69 lambda x: float(x) / 10.0) |
71 imei_slice = _GetData('Device ID = (\d+)', | 70 imei_slice = _GetData('Device ID = (\d+)', |
72 device_adb.GetSubscriberInfo(), | 71 device_adb.old_interface.GetSubscriberInfo(), |
73 lambda x: x[-6:]) | 72 lambda x: x[-6:]) |
74 report = ['Device %s (%s)' % (serial, device_type), | 73 report = ['Device %s (%s)' % (serial, device_type), |
75 ' Build: %s (%s)' % | 74 ' Build: %s (%s)' % |
76 (device_build, device_adb.GetBuildFingerprint()), | 75 (device_build, device_adb.old_interface.GetBuildFingerprint()), |
77 ' Battery: %s%%' % battery_level, | 76 ' Battery: %s%%' % battery_level, |
78 ' Battery temp: %s' % battery_temp, | 77 ' Battery temp: %s' % battery_temp, |
79 ' IMEI slice: %s' % imei_slice, | 78 ' IMEI slice: %s' % imei_slice, |
80 ' Wifi IP: %s' % device_adb.GetWifiIP(), | 79 ' Wifi IP: %s' % device_adb.old_interface.GetWifiIP(), |
81 ''] | 80 ''] |
82 | 81 |
83 errors = [] | 82 errors = [] |
84 if battery_level < 15: | 83 if battery_level < 15: |
85 errors += ['Device critically low in battery. Turning off device.'] | 84 errors += ['Device critically low in battery. Turning off device.'] |
86 if not options.no_provisioning_check: | 85 if not options.no_provisioning_check: |
87 setup_wizard_disabled = device_adb.GetSetupWizardStatus() == 'DISABLED' | 86 setup_wizard_disabled = ( |
| 87 device_adb.old_interface.GetSetupWizardStatus() == 'DISABLED') |
88 if not setup_wizard_disabled and device_build_type != 'user': | 88 if not setup_wizard_disabled and device_build_type != 'user': |
89 errors += ['Setup wizard not disabled. Was it provisioned correctly?'] | 89 errors += ['Setup wizard not disabled. Was it provisioned correctly?'] |
90 if device_product_name == 'mantaray' and ac_power != 'true': | 90 if device_product_name == 'mantaray' and ac_power != 'true': |
91 errors += ['Mantaray device not connected to AC power.'] | 91 errors += ['Mantaray device not connected to AC power.'] |
92 | 92 |
93 # Turn off devices with low battery. | 93 # Turn off devices with low battery. |
94 if battery_level < 15: | 94 if battery_level < 15: |
95 device_adb.EnableAdbRoot() | 95 device_adb.old_interface.EnableAdbRoot() |
96 device_adb.Shutdown() | 96 device_adb.old_interface.Shutdown() |
97 full_report = '\n'.join(report) | 97 full_report = '\n'.join(report) |
98 return device_type, device_build, battery_level, full_report, errors, True | 98 return device_type, device_build, battery_level, full_report, errors, True |
99 | 99 |
100 | 100 |
101 def GetLastDevices(out_dir): | 101 def GetLastDevices(out_dir): |
102 """Returns a list of devices that have been seen on the bot. | 102 """Returns a list of devices that have been seen on the bot. |
103 | 103 |
104 Args: | 104 Args: |
105 options: out_dir parameter of options argument is used as the base | 105 options: out_dir parameter of options argument is used as the base |
106 directory to load and update the cache file. | 106 directory to load and update the cache file. |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 (os.environ.get('BUILDBOT_BUILDERNAME'), | 169 (os.environ.get('BUILDBOT_BUILDERNAME'), |
170 os.environ.get('BUILDBOT_SLAVENAME'), | 170 os.environ.get('BUILDBOT_SLAVENAME'), |
171 os.environ.get('BUILDBOT_BUILDNUMBER'))))) | 171 os.environ.get('BUILDBOT_BUILDNUMBER'))))) |
172 return ['Current online devices: %s' % adb_online_devs, | 172 return ['Current online devices: %s' % adb_online_devs, |
173 '%s are no longer visible. Were they removed?\n' % missing_devs, | 173 '%s are no longer visible. Were they removed?\n' % missing_devs, |
174 'SHERIFF:\n', | 174 'SHERIFF:\n', |
175 '@@@STEP_LINK@Click here to file a bug@%s@@@\n' % crbug_link, | 175 '@@@STEP_LINK@Click here to file a bug@%s@@@\n' % crbug_link, |
176 'Cache file: %s\n\n' % last_devices_path, | 176 'Cache file: %s\n\n' % last_devices_path, |
177 'adb devices: %s' % GetCmdOutput(['adb', 'devices']), | 177 'adb devices: %s' % GetCmdOutput(['adb', 'devices']), |
178 'adb devices(GetAttachedDevices): %s' % | 178 'adb devices(GetAttachedDevices): %s' % |
179 android_commands.GetAttachedDevices()] | 179 android_commands.GetAttachedDevices()] |
180 else: | 180 else: |
181 new_devs = set(adb_online_devs) - set(last_devices) | 181 new_devs = set(adb_online_devs) - set(last_devices) |
182 if new_devs and os.path.exists(last_devices_path): | 182 if new_devs and os.path.exists(last_devices_path): |
183 bb_annotations.PrintWarning() | 183 bb_annotations.PrintWarning() |
184 bb_annotations.PrintSummaryText( | 184 bb_annotations.PrintSummaryText( |
185 '%d new devices detected' % len(new_devs)) | 185 '%d new devices detected' % len(new_devs)) |
186 print ('New devices detected %s. And now back to your ' | 186 print ('New devices detected %s. And now back to your ' |
187 'regularly scheduled program.' % list(new_devs)) | 187 'regularly scheduled program.' % list(new_devs)) |
188 | 188 |
189 | 189 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 # All devices are online, keep going. | 297 # All devices are online, keep going. |
298 break | 298 break |
299 if not usb_restarted and devices: | 299 if not usb_restarted and devices: |
300 # The USB wasn't restarted, but there's at least one device online. | 300 # The USB wasn't restarted, but there's at least one device online. |
301 # No point in trying to wait for all devices. | 301 # No point in trying to wait for all devices. |
302 break | 302 break |
303 retries -= 1 | 303 retries -= 1 |
304 | 304 |
305 devices = android_commands.GetAttachedDevices() | 305 devices = android_commands.GetAttachedDevices() |
306 # TODO(navabi): Test to make sure this fails and then fix call | 306 # TODO(navabi): Test to make sure this fails and then fix call |
307 offline_devices = android_commands.GetAttachedDevices(hardware=False, | 307 offline_devices = android_commands.GetAttachedDevices( |
308 emulator=False, | 308 hardware=False, emulator=False, offline=True) |
309 offline=True) | |
310 | 309 |
311 types, builds, batteries, reports, errors = [], [], [], [], [] | 310 types, builds, batteries, reports, errors = [], [], [], [], [] |
312 fail_step_lst = [] | 311 fail_step_lst = [] |
313 if devices: | 312 if devices: |
314 types, builds, batteries, reports, errors, fail_step_lst = ( | 313 types, builds, batteries, reports, errors, fail_step_lst = ( |
315 zip(*[DeviceInfo(dev, options) for dev in devices])) | 314 zip(*[DeviceInfo(dev, options) for dev in devices])) |
316 | 315 |
317 err_msg = CheckForMissingDevices(options, devices) or [] | 316 err_msg = CheckForMissingDevices(options, devices) or [] |
318 | 317 |
319 unique_types = list(set(types)) | 318 unique_types = list(set(types)) |
(...skipping 30 matching lines...) Expand all Loading... |
350 # devices with critically low battery. Remove those devices from testing, | 349 # devices with critically low battery. Remove those devices from testing, |
351 # allowing build to continue with good devices. | 350 # allowing build to continue with good devices. |
352 return 1 | 351 return 1 |
353 | 352 |
354 if not devices: | 353 if not devices: |
355 return 1 | 354 return 1 |
356 | 355 |
357 | 356 |
358 if __name__ == '__main__': | 357 if __name__ == '__main__': |
359 sys.exit(main()) | 358 sys.exit(main()) |
OLD | NEW |