Chromium Code Reviews| 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 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 425 # First query the current state and only try to switch if it's different. | 425 # First query the current state and only try to switch if it's different. |
| 426 prev = self.PullContent(path) | 426 prev = self.PullContent(path) |
| 427 if prev: | 427 if prev: |
| 428 prev = prev.strip() | 428 prev = prev.strip() |
| 429 if prev == governor: | 429 if prev == governor: |
| 430 return True | 430 return True |
| 431 if prev not in self.cache.available_governors: | 431 if prev not in self.cache.available_governors: |
| 432 _LOG.warning( | 432 _LOG.warning( |
| 433 '%s.SetCPUScalingGovernor(): Read invalid scaling_governor: %s', | 433 '%s.SetCPUScalingGovernor(): Read invalid scaling_governor: %s', |
| 434 self.port_path, prev) | 434 self.port_path, prev) |
| 435 else: | |
| 436 _LOG.warning( | |
| 437 '%s.SetCPUScalingGovernor(): Failed to read %s', self.port_path, path) | |
| 435 | 438 |
| 436 # This works on Nexus 10 but not on Nexus 5. Need to investigate more. In | 439 # This works on Nexus 10 but not on Nexus 5. Need to investigate more. In |
| 437 # the meantime, simply try one after the other. | 440 # the meantime, simply try one after the other. |
| 438 if not self.PushContent(governor + '\n', path): | 441 if not self.PushContent(governor + '\n', path): |
| 442 _LOG.info( | |
| 443 '%s.SetCPUScalingGovernor(): Failed to push %s in %s', | |
| 444 self.port_path, governor, path) | |
| 439 # Fallback via shell. | 445 # Fallback via shell. |
| 440 _, exit_code = self.Shell('echo "%s" > %s' % (governor, path)) | 446 _, exit_code = self.Shell('echo "%s" > %s' % (governor, path)) |
| 441 if exit_code != 0: | 447 if exit_code != 0: |
| 442 _LOG.warning( | 448 _LOG.warning( |
| 443 '%s.SetCPUScalingGovernor(): Writing %s failed; was %s', | 449 '%s.SetCPUScalingGovernor(): Writing %s failed; was %s', |
| 444 self.port_path, governor, prev) | 450 self.port_path, governor, prev) |
| 445 return False | 451 return False |
| 446 # Get it back to confirm. | 452 # Get it back to confirm. |
| 447 newval = self.PullContent(path) | 453 newval = self.PullContent(path) |
| 448 if not (newval or '').strip() == governor: | 454 if not (newval or '').strip() == governor: |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 601 return None | 607 return None |
| 602 return [l.split(':', 1)[1] for l in out.strip().splitlines()] | 608 return [l.split(':', 1)[1] for l in out.strip().splitlines()] |
| 603 | 609 |
| 604 def InstallAPK(self, destdir, apk): | 610 def InstallAPK(self, destdir, apk): |
| 605 """Installs apk to destdir directory.""" | 611 """Installs apk to destdir directory.""" |
| 606 # TODO(maruel): Test. | 612 # TODO(maruel): Test. |
| 607 # '/data/local/tmp/' | 613 # '/data/local/tmp/' |
| 608 dest = posixpath.join(destdir, os.path.basename(apk)) | 614 dest = posixpath.join(destdir, os.path.basename(apk)) |
| 609 if not self.Push(apk, dest): | 615 if not self.Push(apk, dest): |
| 610 return False | 616 return False |
| 611 return self.Shell('pm install -r %s' % pipes.quote(dest))[1] is 0 | 617 cmd = 'pm install -r %s' % pipes.quote(dest) |
| 618 out, exit_code = self.Shell(cmd) | |
| 619 if not exit_code: | |
| 620 return True | |
| 621 _LOG.info('%s: %s', cmd, out) | |
|
ghost stip (do not use)
2015/11/03 18:50:47
might be cool to abstract this into a helper funct
M-A Ruel
2015/11/04 18:39:10
Yes thinking about that but will leave out for now
| |
| 622 return False | |
| 612 | 623 |
| 613 def UninstallAPK(self, package): | 624 def UninstallAPK(self, package): |
| 614 """Uninstalls the package.""" | 625 """Uninstalls the package.""" |
| 615 return self.Shell('pm uninstall %s' % pipes.quote(package))[1] is 0 | 626 cmd = 'pm uninstall %s' % pipes.quote(package) |
| 627 out, exit_code = self.Shell(cmd) | |
| 628 if not exit_code: | |
| 629 return True | |
| 630 _LOG.info('%s: %s', cmd, out) | |
| 631 return False | |
| 616 | 632 |
| 617 def GetApplicationPath(self, package): | 633 def GetApplicationPath(self, package): |
| 618 # TODO(maruel): Test. | 634 # TODO(maruel): Test. |
| 619 out, _ = self.Shell('pm path %s' % pipes.quote(package)) | 635 out, _ = self.Shell('pm path %s' % pipes.quote(package)) |
| 620 return out.strip().split(':', 1)[1] if out else out | 636 return out.strip().split(':', 1)[1] if out else out |
| 621 | 637 |
| 622 def WaitForDevice(self, timeout=180): | 638 def WaitForDevice(self, timeout=180): |
| 623 """Waits for the device to be responsive. | 639 """Waits for the device to be responsive. |
| 624 | 640 |
| 625 In practice, waits for the device to have its external storage to be | 641 In practice, waits for the device to have its external storage to be |
| 626 mounted. | 642 mounted. |
| 627 | 643 |
| 628 Returns: | 644 Returns: |
| 629 - uptime as float in second or None. | 645 - uptime as float in second or None. |
| 630 """ | 646 """ |
| 631 start = time.time() | 647 start = time.time() |
| 632 while True: | 648 while True: |
| 633 if (time.time() - start) > timeout: | 649 if (time.time() - start) > timeout: |
| 634 return False | 650 break |
| 635 if self.Stat(self.cache.external_storage_path)[0] != None: | 651 if self.Stat(self.cache.external_storage_path)[0] != None: |
| 636 return True | 652 return True |
| 637 time.sleep(0.1) | 653 time.sleep(0.1) |
| 654 _LOG.warning('%s.WaitForDevice() failed', self.port_path) | |
| 638 return False | 655 return False |
| 639 | 656 |
| 640 def WaitUntilFullyBooted(self, timeout=300): | 657 def WaitUntilFullyBooted(self, timeout=300): |
| 641 """Waits for the device to be fully started up with network connectivity. | 658 """Waits for the device to be fully started up with network connectivity. |
| 642 | 659 |
| 643 Arguments: | 660 Arguments: |
| 644 - timeout: minimum amount of time to wait for for the device to come up | 661 - timeout: minimum amount of time to wait for for the device to come up |
| 645 online. It may extend to up to lock_timeout_ms more. | 662 online. It may extend to up to lock_timeout_ms more. |
| 646 """ | 663 """ |
| 647 # Wait for the device to respond at all and optionally have lower uptime. | 664 # Wait for the device to respond at all and optionally have lower uptime. |
| 648 start = time.time() | 665 start = time.time() |
| 649 if not self.WaitForDevice(timeout): | 666 if not self.WaitForDevice(timeout): |
| 650 return False | 667 return False |
| 651 | 668 |
| 652 # Wait for the internal sys.boot_completed bit to be set. This is the place | 669 # Wait for the internal sys.boot_completed bit to be set. This is the place |
| 653 # where most time is spent. | 670 # where most time is spent. |
| 654 while True: | 671 while True: |
| 655 if (time.time() - start) > timeout: | 672 if (time.time() - start) > timeout: |
| 673 _LOG.warning( | |
| 674 '%s.WaitUntilFullyBooted() didn\'t get sys.boot_completed in time', | |
| 675 self.port_path) | |
| 656 return False | 676 return False |
| 657 if self.GetProp('sys.boot_completed') == '1': | 677 if self.GetProp('sys.boot_completed') == '1': |
| 658 break | 678 break |
| 659 time.sleep(0.1) | 679 time.sleep(0.1) |
| 660 | 680 |
| 661 # Wait for one network to be up and running. | 681 # Wait for one network to be up and running. |
| 662 while not self.GetIPs(): | 682 while not self.GetIPs(): |
| 663 if (time.time() - start) > timeout: | 683 if (time.time() - start) > timeout: |
| 684 _LOG.warning( | |
| 685 '%s.WaitUntilFullyBooted() didn\'t get an IP in time', | |
| 686 self.port_path) | |
| 664 return False | 687 return False |
| 665 time.sleep(0.1) | 688 time.sleep(0.1) |
| 666 return True | 689 return True |
| 667 | 690 |
| 668 def PushKeys(self): | 691 def PushKeys(self): |
| 669 """Pushes all the keys on the file system to the device. | 692 """Pushes all the keys on the file system to the device. |
| 670 | 693 |
| 671 This is necessary when the device just got wiped but still has | 694 This is necessary when the device just got wiped but still has |
| 672 authorization, as soon as it reboots it'd lose the authorization. | 695 authorization, as soon as it reboots it'd lose the authorization. |
| 673 | 696 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 758 return out | 781 return out |
| 759 | 782 |
| 760 @classmethod | 783 @classmethod |
| 761 def _Connect(cls, constructor, **kwargs): | 784 def _Connect(cls, constructor, **kwargs): |
| 762 """Called by either ConnectDevice or Connect.""" | 785 """Called by either ConnectDevice or Connect.""" |
| 763 if not kwargs.get('rsa_keys'): | 786 if not kwargs.get('rsa_keys'): |
| 764 with _ADB_KEYS_LOCK: | 787 with _ADB_KEYS_LOCK: |
| 765 kwargs['rsa_keys'] = _ADB_KEYS[:] | 788 kwargs['rsa_keys'] = _ADB_KEYS[:] |
| 766 device = constructor(**kwargs) | 789 device = constructor(**kwargs) |
| 767 return HighDevice(device, _InitCache(device)) | 790 return HighDevice(device, _InitCache(device)) |
| OLD | NEW |