OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 a variety of device interactions based on adb. | 5 """Provides a variety of device interactions based on adb. |
6 | 6 |
7 Eventually, this will be based on adb_wrapper. | 7 Eventually, this will be based on adb_wrapper. |
8 """ | 8 """ |
9 # pylint: disable=W0613 | 9 # pylint: disable=W0613 |
10 | 10 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 _DEFAULT_TIMEOUT, _DEFAULT_RETRIES) | 60 _DEFAULT_TIMEOUT, _DEFAULT_RETRIES) |
61 def RestartServer(): | 61 def RestartServer(): |
62 """Restarts the adb server. | 62 """Restarts the adb server. |
63 | 63 |
64 Raises: | 64 Raises: |
65 CommandFailedError if we fail to kill or restart the server. | 65 CommandFailedError if we fail to kill or restart the server. |
66 """ | 66 """ |
67 pylib.android_commands.AndroidCommands().RestartAdbServer() | 67 pylib.android_commands.AndroidCommands().RestartAdbServer() |
68 | 68 |
69 | 69 |
| 70 def _JoinLines(lines): |
| 71 # makes sure that the last line is also terminated, and is more memory |
| 72 # efficient than first appending an end-line to each line and then joining |
| 73 # all of them together. |
| 74 return ''.join(s for line in lines for s in (line, '\n')) |
| 75 |
| 76 |
70 class DeviceUtils(object): | 77 class DeviceUtils(object): |
71 | 78 |
72 _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$') | 79 _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$') |
73 | 80 |
74 def __init__(self, device, default_timeout=_DEFAULT_TIMEOUT, | 81 def __init__(self, device, default_timeout=_DEFAULT_TIMEOUT, |
75 default_retries=_DEFAULT_RETRIES): | 82 default_retries=_DEFAULT_RETRIES): |
76 """DeviceUtils constructor. | 83 """DeviceUtils constructor. |
77 | 84 |
78 Args: | 85 Args: |
79 device: Either a device serial, an existing AdbWrapper instance, or an | 86 device: Either a device serial, an existing AdbWrapper instance, or an |
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 CommandFailedError on failure. | 858 CommandFailedError on failure. |
852 CommandTimeoutError on timeout. | 859 CommandTimeoutError on timeout. |
853 """ | 860 """ |
854 # Create the base dir if it doesn't exist already | 861 # Create the base dir if it doesn't exist already |
855 dirname = os.path.dirname(host_path) | 862 dirname = os.path.dirname(host_path) |
856 if dirname and not os.path.exists(dirname): | 863 if dirname and not os.path.exists(dirname): |
857 os.makedirs(dirname) | 864 os.makedirs(dirname) |
858 self.adb.Pull(device_path, host_path) | 865 self.adb.Pull(device_path, host_path) |
859 | 866 |
860 @decorators.WithTimeoutAndRetriesFromInstance() | 867 @decorators.WithTimeoutAndRetriesFromInstance() |
861 def ReadFile(self, device_path, as_root=False, timeout=None, retries=None): | 868 def ReadFile(self, device_path, as_root=False, |
| 869 timeout=None, retries=None): |
862 """Reads the contents of a file from the device. | 870 """Reads the contents of a file from the device. |
863 | 871 |
864 Args: | 872 Args: |
865 device_path: A string containing the absolute path of the file to read | 873 device_path: A string containing the absolute path of the file to read |
866 from the device. | 874 from the device. |
867 as_root: A boolean indicating whether the read should be executed with | 875 as_root: A boolean indicating whether the read should be executed with |
868 root privileges. | 876 root privileges. |
869 timeout: timeout in seconds | 877 timeout: timeout in seconds |
870 retries: number of retries | 878 retries: number of retries |
871 | 879 |
872 Returns: | 880 Returns: |
873 The contents of the file at |device_path| as a list of lines. | 881 The contents of |device_path| as a string. Contents are intepreted using |
| 882 universal newlines, so the caller will see them encoded as '\n'. Also, |
| 883 all lines will be terminated. |
874 | 884 |
875 Raises: | 885 Raises: |
876 CommandFailedError if the file can't be read. | 886 AdbCommandFailedError if the file can't be read. |
877 CommandTimeoutError on timeout. | 887 CommandTimeoutError on timeout. |
878 DeviceUnreachableError on missing device. | 888 DeviceUnreachableError on missing device. |
879 """ | 889 """ |
880 # TODO(jbudorick) Evaluate whether we want to return a list of lines after | 890 return _JoinLines(self.RunShellCommand( |
881 # the implementation switch, and if file not found should raise exception. | 891 ['cat', device_path], as_root=as_root, check_return=True)) |
882 if as_root: | |
883 if not self.old_interface.CanAccessProtectedFileContents(): | |
884 raise device_errors.CommandFailedError( | |
885 'Cannot read from %s with root privileges.' % device_path) | |
886 return self.old_interface.GetProtectedFileContents(device_path) | |
887 else: | |
888 return self.old_interface.GetFileContents(device_path) | |
889 | 892 |
890 @decorators.WithTimeoutAndRetriesFromInstance() | 893 @decorators.WithTimeoutAndRetriesFromInstance() |
891 def WriteFile(self, device_path, contents, as_root=False, force_push=False, | 894 def WriteFile(self, device_path, contents, as_root=False, force_push=False, |
892 timeout=None, retries=None): | 895 timeout=None, retries=None): |
893 """Writes |contents| to a file on the device. | 896 """Writes |contents| to a file on the device. |
894 | 897 |
895 Args: | 898 Args: |
896 device_path: A string containing the absolute path to the file to write | 899 device_path: A string containing the absolute path to the file to write |
897 on the device. | 900 on the device. |
898 contents: A string containing the data to write to the device. | 901 contents: A string containing the data to write to the device. |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1190 Returns: | 1193 Returns: |
1191 A Parallelizer operating over |devices|. | 1194 A Parallelizer operating over |devices|. |
1192 """ | 1195 """ |
1193 if not devices: | 1196 if not devices: |
1194 devices = adb_wrapper.AdbWrapper.GetDevices() | 1197 devices = adb_wrapper.AdbWrapper.GetDevices() |
1195 devices = [d if isinstance(d, cls) else cls(d) for d in devices] | 1198 devices = [d if isinstance(d, cls) else cls(d) for d in devices] |
1196 if async: | 1199 if async: |
1197 return parallelizer.Parallelizer(devices) | 1200 return parallelizer.Parallelizer(devices) |
1198 else: | 1201 else: |
1199 return parallelizer.SyncParallelizer(devices) | 1202 return parallelizer.SyncParallelizer(devices) |
OLD | NEW |