OLD | NEW |
---|---|
1 # Copyright 2015 Google Inc. All rights reserved. | 1 # Copyright 2015 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Licensed under the Apache License, Version 2.0 (the "License"); | 3 # Licensed under the Apache License, Version 2.0 (the "License"); |
4 # you may not use this file except in compliance with the License. | 4 # you may not use this file except in compliance with the License. |
5 # You may obtain a copy of the License at | 5 # You may obtain a copy of the License at |
6 # | 6 # |
7 # http://www.apache.org/licenses/LICENSE-2.0 | 7 # http://www.apache.org/licenses/LICENSE-2.0 |
8 # | 8 # |
9 # Unless required by applicable law or agreed to in writing, software | 9 # Unless required by applicable law or agreed to in writing, software |
10 # distributed under the License is distributed on an "AS IS" BASIS, | 10 # distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
338 | 338 |
339 i = 0 | 339 i = 0 |
340 for i in self._Loop(): | 340 for i in self._Loop(): |
341 if not self._Reconnect(True): | 341 if not self._Reconnect(True): |
342 continue | 342 continue |
343 uptime = self.GetUptime() | 343 uptime = self.GetUptime() |
344 if uptime and uptime < previous_uptime: | 344 if uptime and uptime < previous_uptime: |
345 return True | 345 return True |
346 time.sleep(0.1) | 346 time.sleep(0.1) |
347 _LOG.error( | 347 _LOG.error( |
348 '%s.Reboot(): Failed to id after %d tries', self.port_path, i+1) | 348 '%s.Reboot(): Failed to reboot after %d tries', self.port_path, i+1) |
349 return False | 349 return False |
350 | 350 |
351 def Remount(self): | 351 def Remount(self): |
352 """Remount / as read-write.""" | 352 """Remount / as read-write.""" |
353 if self._adb_cmd: | 353 if self._adb_cmd: |
354 for _ in self._Loop(): | 354 for _ in self._Loop(): |
355 try: | 355 try: |
356 out = self._adb_cmd.Remount() | 356 out = self._adb_cmd.Remount() |
357 # TODO(maruel): Wait for the remount operation to be completed. | 357 # TODO(maruel): Wait for the remount operation to be completed. |
358 _LOG.info('%s.Remount(): %s', self.port_path, out) | 358 _LOG.info('%s.Remount(): %s', self.port_path, out) |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
486 if exit_code != 0 or not out: | 486 if exit_code != 0 or not out: |
487 return None | 487 return None |
488 return out.startswith('uid=0(root)') | 488 return out.startswith('uid=0(root)') |
489 | 489 |
490 # Protected methods. | 490 # Protected methods. |
491 | 491 |
492 def _Reboot(self): | 492 def _Reboot(self): |
493 """Reboots the phone.""" | 493 """Reboots the phone.""" |
494 i = 0 | 494 i = 0 |
495 for i in self._Loop(): | 495 for i in self._Loop(): |
496 # TODO(maruel): It looks like it's possible that the device restart so | |
497 # fast that it throws an exception at the USB level. In that case there's | |
498 # no way to know if the command worked too fast or something went wrong | |
499 # and the command didn't go through. | |
496 try: | 500 try: |
497 out = self._adb_cmd.Reboot() | 501 out = self._adb_cmd.Reboot() |
498 except self._ERRORS as e: | 502 except self._ERRORS as e: |
499 if not self._Reset('(): %s', e, use_serial=True): | 503 if not self._Reset('(): %s', e, use_serial=True): |
500 break | 504 break |
501 continue | 505 continue |
502 | 506 |
503 _LOG.info('%s._Reboot(): %r', self.port_path, out) | 507 _LOG.info('%s._Reboot(): %r', self.port_path, out) |
504 if out == '': | 508 if out == '': |
505 # reboot doesn't reply anything. | 509 # reboot doesn't reply anything. |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
577 self._port_path = self._handle.port_path_str | 581 self._port_path = self._handle.port_path_str |
578 else: | 582 else: |
579 self._handle = common.UsbHandle.Find( | 583 self._handle = common.UsbHandle.Find( |
580 adb_commands.DeviceIsAvailable, port_path=self.port_path, | 584 adb_commands.DeviceIsAvailable, port_path=self.port_path, |
581 timeout_ms=self._default_timeout_ms) | 585 timeout_ms=self._default_timeout_ms) |
582 _LOG.info( | 586 _LOG.info( |
583 '%s._Find(%s) %s = %s', | 587 '%s._Find(%s) %s = %s', |
584 previous_port_path, use_serial, self._serial, | 588 previous_port_path, use_serial, self._serial, |
585 self.port_path if self._handle else 'None') | 589 self.port_path if self._handle else 'None') |
586 except (common.usb1.USBError, usb_exceptions.DeviceNotFoundError) as e: | 590 except (common.usb1.USBError, usb_exceptions.DeviceNotFoundError) as e: |
587 _LOG.info( | 591 _LOG.debug( |
588 '%s._Find(%s) %s : %s', self.port_path, use_serial, self._serial, e) | 592 '%s._Find(%s) %s : %s', self.port_path, use_serial, self._serial, e) |
593 return bool(self._handle) | |
589 | 594 |
590 def _WaitUntilFound(self, use_serial): | 595 def _WaitUntilFound(self, use_serial): |
591 """Loops until the device is found on the USB bus. | 596 """Loops until the device is found on the USB bus. |
592 | 597 |
593 The handle is left unopened. | 598 The handle is left unopened. |
594 | 599 |
595 This function should normally be called when either adbd or the phone is | 600 This function should normally be called when either adbd or the phone is |
596 rebooting. | 601 rebooting. |
597 """ | 602 """ |
598 assert not self._handle | 603 assert not self._handle |
599 _LOG.debug('%s._WaitUntilFound(%s)', self.port_path, use_serial) | 604 _LOG.debug('%s._WaitUntilFound(%s)', self.port_path, use_serial) |
600 i = 0 | 605 i = 0 |
601 for i in self._Loop(): | 606 for i in self._Loop(): |
602 try: | 607 if self._Find(use_serial=use_serial): |
603 self._Find(use_serial=use_serial) | |
604 return | 608 return |
605 except usb_exceptions.DeviceNotFoundError as e: | |
606 _LOG.info( | |
607 '%s._WaitUntilFound(): Retrying _Find() due to %s', | |
608 self.port_path, e) | |
609 _LOG.warning( | 609 _LOG.warning( |
610 '%s._WaitUntilFound() gave up after %d tries', self.port_path, i+1) | 610 '%s._WaitUntilFound() gave up after %d tries', self.port_path, i+1) |
611 | 611 |
612 def _OpenHandle(self): | 612 def _OpenHandle(self): |
613 """Opens the unopened self._handle.""" | 613 """Opens the unopened self._handle.""" |
614 #_LOG.debug('%s._OpenHandle()', self.port_path) | 614 #_LOG.debug('%s._OpenHandle()', self.port_path) |
615 if self._handle: | 615 if self._handle: |
616 assert not self._handle.is_open | 616 assert not self._handle.is_open |
617 i = 0 | 617 i = 0 |
618 for i in self._Loop(): | 618 for i in self._Loop(): |
619 try: | 619 try: |
620 # If this succeeds, this initializes self._handle._handle, which is a | 620 # If this succeeds, this initializes self._handle._handle, which is a |
621 # usb1.USBDeviceHandle. | 621 # usb1.USBDeviceHandle. |
622 self._handle.Open() | 622 self._handle.Open() |
623 break | 623 break |
624 except common.usb1.USBErrorNoDevice as e: | 624 except common.usb1.USBErrorNoDevice as e: |
625 _LOG.warning( | 625 _LOG.warning( |
626 '%s._OpenHandle(): USBErrorNoDevice: %s', self.port_path, e) | 626 '%s._OpenHandle(): USBErrorNoDevice: %s', self.port_path, e) |
627 # Do not kill adb, it just means the USB host is likely resetting and | 627 # Do not kill adb, it just means the USB host is likely resetting and |
628 # the device is temporarily unavailable. We can't use | 628 # the device is temporarily unavailable. We can't use |
629 # handle.serial_number since this communicates with the device. | 629 # handle.serial_number since this communicates with the device. |
630 except common.usb1.USBErrorBusy as e: | 630 except common.usb1.USBErrorBusy as e: |
631 _LOG.warning('%s._OpenHandle(): USBErrorBusy: %s', self.port_path, e) | 631 _LOG.warning('%s._OpenHandle(): USBErrorBusy: %s', self.port_path, e) |
632 KillADB() | 632 KillADB() |
633 except common.usb1.USBErrorAccess as e: | 633 except common.usb1.USBErrorAccess as e: |
634 # Do not try to use serial_number, since we can't even access the | 634 # Do not try to use serial_number, since we can't even access the |
635 # port. | 635 # port. |
636 _LOG.warning( | 636 _LOG.warning( |
637 '%s._OpenHandle(): Try rebooting the host: %s', self.port_path, e) | 637 '%s._OpenHandle(): Try rebooting the host: %s', self.port_path, e) |
638 self.Close() | |
ghost stip (do not use)
2015/11/03 18:50:46
*sigh* context manager, man
M-A Ruel
2015/11/04 18:39:10
It's in a loop, I changed the break at line 623 to
| |
638 break | 639 break |
639 else: | 640 else: |
640 _LOG.error( | 641 _LOG.error( |
641 '%s._OpenHandle(): Failed after %d tries', self.port_path, i+1) | 642 '%s._OpenHandle(): Failed after %d tries', self.port_path, i+1) |
642 self.Close() | 643 self.Close() |
643 return bool(self._handle) | 644 return bool(self._handle) |
644 | 645 |
645 def _Connect(self, use_serial): | 646 def _Connect(self, use_serial): |
646 """Initializes self._adb_cmd from the opened self._handle. | 647 """Initializes self._adb_cmd from the opened self._handle. |
647 | 648 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
735 """ | 736 """ |
736 self.Close() | 737 self.Close() |
737 self._WaitUntilFound(use_serial=use_serial) | 738 self._WaitUntilFound(use_serial=use_serial) |
738 if not self._OpenHandle(): | 739 if not self._OpenHandle(): |
739 return False | 740 return False |
740 return self._Connect(use_serial=use_serial) | 741 return self._Connect(use_serial=use_serial) |
741 | 742 |
742 def __repr__(self): | 743 def __repr__(self): |
743 return '<Device %s %s>' % ( | 744 return '<Device %s %s>' % ( |
744 self.port_path, self.serial if self.is_valid else '(broken)') | 745 self.port_path, self.serial if self.is_valid else '(broken)') |
OLD | NEW |