Index: build/android/pylib/device/device_utils.py |
diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py |
index 47884725740151fb9b0acd1bf76f61fb6850d9de..33d6351ae464bb86f65f43bb07a3adaed519bee0 100644 |
--- a/build/android/pylib/device/device_utils.py |
+++ b/build/android/pylib/device/device_utils.py |
@@ -81,12 +81,12 @@ class DeviceUtils(object): |
"""Checks whether the device is online. |
Args: |
- timeout: An integer containing the number of seconds to wait for the |
- operation to complete. |
- retries: An integer containing the number of times the operation should |
- be retried if it fails. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Returns: |
True if the device is online, False otherwise. |
+ Raises: |
+ CommandTimeoutError on timeout. |
""" |
return self.old_interface.IsOnline() |
@@ -95,21 +95,26 @@ class DeviceUtils(object): |
"""Checks whether or not adbd has root privileges. |
Args: |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Returns: |
True if adbd has root privileges, False otherwise. |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
return self._HasRootImpl() |
def _HasRootImpl(self): |
- """ Implementation of HasRoot. |
+ """Implementation of HasRoot. |
This is split from HasRoot to allow other DeviceUtils methods to call |
HasRoot without spawning a new timeout thread. |
Returns: |
Same as for |HasRoot|. |
+ Raises: |
+ Same as for |HasRoot|. |
""" |
return self.old_interface.IsRootEnabled() |
@@ -118,10 +123,11 @@ class DeviceUtils(object): |
"""Restarts adbd with root privileges. |
Args: |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Raises: |
CommandFailedError if root could not be enabled. |
+ CommandTimeoutError on timeout. |
""" |
if not self.old_interface.EnableAdbRoot(): |
raise device_errors.CommandFailedError( |
@@ -132,10 +138,14 @@ class DeviceUtils(object): |
"""Get the device's path to its SD card. |
Args: |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Returns: |
The device's path to its SD card. |
+ Raises: |
+ CommandFailedError if the external storage path could not be determined. |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
try: |
return self.old_interface.GetExternalStorage() |
@@ -153,16 +163,17 @@ class DeviceUtils(object): |
Args: |
wifi: A boolean indicating if we should wait for wifi to come up or not. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Raises: |
+ CommandFailedError on failure. |
CommandTimeoutError if one of the component waits times out. |
DeviceUnreachableError if the device becomes unresponsive. |
""" |
self._WaitUntilFullyBootedImpl(wifi=wifi, timeout=timeout) |
def _WaitUntilFullyBootedImpl(self, wifi=False, timeout=None): |
- """ Implementation of WaitUntilFullyBooted. |
+ """Implementation of WaitUntilFullyBooted. |
This is split from WaitUntilFullyBooted to allow other DeviceUtils methods |
to call WaitUntilFullyBooted without spawning a new timeout thread. |
@@ -172,7 +183,7 @@ class DeviceUtils(object): |
Args: |
wifi: Same as for |WaitUntilFullyBooted|. |
- timeout: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
Raises: |
Same as for |WaitUntilFullyBooted|. |
""" |
@@ -197,8 +208,11 @@ class DeviceUtils(object): |
Args: |
block: A boolean indicating if we should wait for the reboot to complete. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
self.old_interface.Reboot() |
if block: |
@@ -218,11 +232,12 @@ class DeviceUtils(object): |
Args: |
apk_path: A string containing the path to the APK to install. |
reinstall: A boolean indicating if we should keep any existing app data. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Raises: |
CommandFailedError if the installation fails. |
CommandTimeoutError if the installation times out. |
+ DeviceUnreachableError on missing device. |
""" |
package_name = apk_helper.GetPackageName(apk_path) |
device_path = self.old_interface.GetApplicationPath(package_name) |
@@ -266,12 +281,14 @@ class DeviceUtils(object): |
be checked. |
as_root: A boolean indicating whether the shell command should be run |
with root privileges. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
- Raises: |
- CommandFailedError if check_return is True and the return code is nozero. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Returns: |
The output of the command. |
+ Raises: |
+ CommandFailedError if check_return is True and the return code is nozero. |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
return self._RunShellCommandImpl(cmd, check_return=check_return, |
as_root=as_root, timeout=timeout) |
@@ -290,7 +307,7 @@ class DeviceUtils(object): |
cmd: Same as for |RunShellCommand|. |
check_return: Same as for |RunShellCommand|. |
as_root: Same as for |RunShellCommand|. |
- timeout: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
Raises: |
Same as for |RunShellCommand|. |
Returns: |
@@ -323,10 +340,12 @@ class DeviceUtils(object): |
root privileges. |
blocking: A boolean indicating whether we should wait until all processes |
with the given |process_name| are dead. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Raises: |
CommandFailedError if no process was killed. |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
pids = self.old_interface.ExtractPid(process_name) |
if len(pids) == 0: |
@@ -357,10 +376,12 @@ class DeviceUtils(object): |
trace should be saved. |
force_stop: A boolean indicating whether we should stop the activity |
before starting it. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Raises: |
CommandFailedError if the activity could not be started. |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
single_category = (intent.category[0] if isinstance(intent.category, list) |
else intent.category) |
@@ -379,8 +400,11 @@ class DeviceUtils(object): |
Args: |
intent: An Intent to broadcast. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
package, old_intent = intent.action.rsplit('.', 1) |
if intent.extras is None: |
@@ -395,8 +419,11 @@ class DeviceUtils(object): |
"""Return to the home screen. |
Args: |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
self.old_interface.GoHome() |
@@ -406,8 +433,11 @@ class DeviceUtils(object): |
Args: |
package: A string containing the name of the package to stop. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
self.old_interface.CloseApplication(package) |
@@ -417,8 +447,11 @@ class DeviceUtils(object): |
Args: |
package: A string containing the name of the package to stop. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
self.old_interface.ClearApplicationState(package) |
@@ -430,8 +463,11 @@ class DeviceUtils(object): |
Args: |
keycode: A integer keycode to send to the device. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
self.old_interface.SendKeyEvent(keycode) |
@@ -450,8 +486,12 @@ class DeviceUtils(object): |
on the host that should be minimally pushed to the device. |
device_path: A string containing the absolute path of the destination on |
the device. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandFailedError on failure. |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
self.old_interface.PushIfNeeded(host_path, device_path) |
@@ -462,10 +502,13 @@ class DeviceUtils(object): |
Args: |
device_path: A string containing the absolute path to the file on the |
device. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Returns: |
True if the file exists on the device, False otherwise. |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
return self._FileExistsImpl(device_path) |
@@ -479,6 +522,8 @@ class DeviceUtils(object): |
device_path: Same as for |FileExists|. |
Returns: |
True if the file exists on the device, False otherwise. |
+ Raises: |
+ Same as for |FileExists|. |
""" |
return self.old_interface.FileExistsOnDevice(device_path) |
@@ -491,10 +536,17 @@ class DeviceUtils(object): |
from the device. |
host_path: A string containing the absolute path of the destination on |
the host. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandFailedError on failure. |
+ CommandTimeoutError on timeout. |
""" |
- self.old_interface.PullFileFromDevice(device_path, host_path) |
+ try: |
+ self.old_interface.PullFileFromDevice(device_path, host_path) |
+ except AssertionError as e: |
+ raise device_errors.CommandFailedError( |
+ str(e), device=str(self)), None, sys.exc_info()[2] |
@decorators.WithTimeoutAndRetriesFromInstance() |
def ReadFile(self, device_path, as_root=False, timeout=None, retries=None): |
@@ -505,12 +557,14 @@ class DeviceUtils(object): |
from the device. |
as_root: A boolean indicating whether the read should be executed with |
root privileges. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Returns: |
The contents of the file at |device_path| as a list of lines. |
Raises: |
CommandFailedError if the file can't be read. |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
# TODO(jbudorick) Evaluate whether we actually want to return a list of |
# lines after the implementation switch. |
@@ -533,10 +587,12 @@ class DeviceUtils(object): |
contents: A string containing the data to write to the device. |
as_root: A boolean indicating whether the write should be executed with |
root privileges. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Raises: |
CommandFailedError if the file could not be written on the device. |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
if as_root: |
if not self.old_interface.CanAccessProtectedFileContents(): |
@@ -553,10 +609,13 @@ class DeviceUtils(object): |
Args: |
device_path: A string containing the path of the directory on the device |
to list. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Returns: |
The contents of the directory specified by |device_path|. |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
""" |
return self.old_interface.ListPathContents(device_path) |
@@ -567,8 +626,10 @@ class DeviceUtils(object): |
Args: |
enabled: A boolean indicating whether Java asserts should be enabled |
or disabled. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandTimeoutError on timeout. |
""" |
self.old_interface.SetJavaAssertsEnabled(enabled) |
@@ -579,10 +640,12 @@ class DeviceUtils(object): |
Args: |
property_name: A string containing the name of the property to get from |
the device. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
Returns: |
The value of the device's |property_name| property. |
+ Raises: |
+ CommandTimeoutError on timeout. |
""" |
return self.old_interface.system_properties[property_name] |
@@ -595,11 +658,73 @@ class DeviceUtils(object): |
the device. |
value: A string containing the value to set to the property on the |
device. |
- timeout: Same as for |IsOnline|. |
- retries: Same as for |IsOnline|. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Raises: |
+ CommandTimeoutError on timeout. |
""" |
self.old_interface.system_properties[property_name] = value |
+ @decorators.WithTimeoutAndRetriesFromInstance() |
+ def GetPids(self, process_name, timeout=None, retries=None): |
+ """Returns the PIDs of processes with the given name. |
+ |
+ Note that the |process_name| is often the package name. |
+ |
+ Args: |
+ process_name: A string containing the process name to get the PIDs for. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Returns: |
+ A dict mapping process name to PID for each process that contained the |
+ provided |process_name|. |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
+ """ |
+ procs_pids = {} |
+ for line in self._RunShellCommandImpl('ps'): |
+ try: |
+ ps_data = line.split() |
+ if process_name in ps_data[-1]: |
+ procs_pids[ps_data[-1]] = ps_data[1] |
+ except IndexError: |
+ pass |
+ return procs_pids |
+ |
+ @decorators.WithTimeoutAndRetriesFromInstance() |
+ def TakeScreenshot(self, host_path=None, timeout=None, retries=None): |
+ """Takes a screenshot of the device. |
+ |
+ Args: |
+ host_path: A string containing the path on the host to save the |
+ screenshot to. If None, a file name will be generated. |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Returns: |
+ The name of the file on the host to which the screenshot was saved. |
+ Raises: |
+ CommandFailedError on failure. |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
+ """ |
+ return self.old_interface.TakeScreenshot(host_path) |
+ |
+ @decorators.WithTimeoutAndRetriesFromInstance() |
+ def GetIOStats(self, timeout=None, retries=None): |
+ """Gets cumulative disk IO stats since boot for all processes. |
+ |
+ Args: |
+ timeout: timeout in seconds |
+ retries: number of retries |
+ Returns: |
+ A dict containing |num_reads|, |num_writes|, |read_ms|, and |write_ms|. |
+ Raises: |
+ CommandTimeoutError on timeout. |
+ DeviceUnreachableError on missing device. |
+ """ |
+ return self.old_interface.GetIoStats() |
+ |
def __str__(self): |
"""Returns the device serial.""" |
return self.old_interface.GetDevice() |