| 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 |
| 11 import collections | 11 import collections |
| 12 import datetime | 12 import datetime |
| 13 import inspect | 13 import inspect |
| 14 import json | 14 import json |
| 15 import logging | 15 import logging |
| 16 import os | 16 import os |
| 17 import re | 17 import re |
| 18 import shlex | 18 import shlex |
| 19 import signal | 19 import signal |
| 20 import subprocess | 20 import subprocess |
| 21 import sys | 21 import sys |
| 22 import tempfile | 22 import tempfile |
| 23 import time | 23 import time |
| 24 | 24 |
| 25 import cmd_helper | 25 import cmd_helper |
| 26 import constants | 26 import constants |
| 27 import screenshot | |
| 28 import system_properties | 27 import system_properties |
| 29 from utils import host_utils | 28 from utils import host_utils |
| 30 from device import device_utils | |
| 31 | 29 |
| 32 try: | 30 try: |
| 33 from pylib import pexpect | 31 from pylib import pexpect |
| 34 except ImportError: | 32 except ImportError: |
| 35 pexpect = None | 33 pexpect = None |
| 36 | 34 |
| 37 sys.path.append(os.path.join( | 35 sys.path.append(os.path.join( |
| 38 constants.DIR_SOURCE_ROOT, 'third_party', 'android_testrunner')) | 36 constants.DIR_SOURCE_ROOT, 'third_party', 'android_testrunner')) |
| 39 import adb_interface | 37 import adb_interface |
| 40 import am_instrument_parser | 38 import am_instrument_parser |
| (...skipping 1664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1705 if 'test: not found' not in status: | 1703 if 'test: not found' not in status: |
| 1706 return int(status) == 0 | 1704 return int(status) == 0 |
| 1707 raise errors.AbortError('"test" binary not found. OS too old.') | 1705 raise errors.AbortError('"test" binary not found. OS too old.') |
| 1708 | 1706 |
| 1709 except ValueError: | 1707 except ValueError: |
| 1710 if IsDeviceAttached(self._device): | 1708 if IsDeviceAttached(self._device): |
| 1711 raise errors.DeviceUnresponsiveError('Device may be offline.') | 1709 raise errors.DeviceUnresponsiveError('Device may be offline.') |
| 1712 | 1710 |
| 1713 return False | 1711 return False |
| 1714 | 1712 |
| 1715 def TakeScreenshot(self, host_file): | 1713 @staticmethod |
| 1714 def GetTimestamp(): |
| 1715 return time.strftime('%Y-%m-%d-%H%M%S', time.localtime()) |
| 1716 |
| 1717 @staticmethod |
| 1718 def EnsureHostDirectory(host_file): |
| 1719 host_dir = os.path.dirname(os.path.abspath(host_file)) |
| 1720 if not os.path.exists(host_dir): |
| 1721 os.makedirs(host_dir) |
| 1722 |
| 1723 def TakeScreenshot(self, host_file=None): |
| 1716 """Saves a screenshot image to |host_file| on the host. | 1724 """Saves a screenshot image to |host_file| on the host. |
| 1717 | 1725 |
| 1718 Args: | 1726 Args: |
| 1719 host_file: Absolute path to the image file to store on the host or None to | 1727 host_file: Absolute path to the image file to store on the host or None to |
| 1720 use an autogenerated file name. | 1728 use an autogenerated file name. |
| 1721 | 1729 |
| 1722 Returns: | 1730 Returns: |
| 1723 Resulting host file name of the screenshot. | 1731 Resulting host file name of the screenshot. |
| 1724 """ | 1732 """ |
| 1725 return screenshot.TakeScreenshot(device_utils.DeviceUtils(self), host_file) | 1733 host_file = os.path.abspath(host_file or |
| 1734 'screenshot-%s.png' % self.GetTimestamp()) |
| 1735 self.EnsureHostDirectory(host_file) |
| 1736 device_file = '%s/screenshot.png' % self.GetExternalStorage() |
| 1737 self.RunShellCommand( |
| 1738 '/system/bin/screencap -p %s' % device_file) |
| 1739 self.PullFileFromDevice(device_file, host_file) |
| 1740 self.RunShellCommand('rm -f "%s"' % device_file) |
| 1741 return host_file |
| 1726 | 1742 |
| 1727 def PullFileFromDevice(self, device_file, host_file): | 1743 def PullFileFromDevice(self, device_file, host_file): |
| 1728 """Download |device_file| on the device from to |host_file| on the host. | 1744 """Download |device_file| on the device from to |host_file| on the host. |
| 1729 | 1745 |
| 1730 Args: | 1746 Args: |
| 1731 device_file: Absolute path to the file to retrieve from the device. | 1747 device_file: Absolute path to the file to retrieve from the device. |
| 1732 host_file: Absolute path to the file to store on the host. | 1748 host_file: Absolute path to the file to store on the host. |
| 1733 """ | 1749 """ |
| 1734 assert self._adb.Pull(device_file, host_file) | 1750 assert self._adb.Pull(device_file, host_file) |
| 1735 assert os.path.exists(host_file) | 1751 assert os.path.exists(host_file) |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1908 """ | 1924 """ |
| 1909 def __init__(self, output): | 1925 def __init__(self, output): |
| 1910 self._output = output | 1926 self._output = output |
| 1911 | 1927 |
| 1912 def write(self, data): | 1928 def write(self, data): |
| 1913 data = data.replace('\r\r\n', '\n') | 1929 data = data.replace('\r\r\n', '\n') |
| 1914 self._output.write(data) | 1930 self._output.write(data) |
| 1915 | 1931 |
| 1916 def flush(self): | 1932 def flush(self): |
| 1917 self._output.flush() | 1933 self._output.flush() |
| OLD | NEW |