1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)"""This module wraps Android's adb tool.
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)This is a thin wrapper around the adb interface. Any additional complexity
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)should be delegated to a higher level (ex. DeviceUtils).
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)"""
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import errno
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import os
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)from pylib import cmd_helper
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)from pylib.device import decorators
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)from pylib.device import device_errors
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)_DEFAULT_TIMEOUT = 30
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)_DEFAULT_RETRIES = 2
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def _VerifyLocalFileExists(path):
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  """Verifies a local file exists.
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Args:
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    path: Path to the local file.
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Raises:
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    IOError: If the file doesn't exist.
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  """
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if not os.path.exists(path):
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path)
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class AdbWrapper(object):
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  """A wrapper around a local Android Debug Bridge executable."""
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def __init__(self, device_serial):
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Initializes the AdbWrapper.
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      device_serial: The device serial number as a string.
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._device_serial = str(device_serial)
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  # pylint: disable=W0613
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  @classmethod
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  @decorators.WithTimeoutAndRetries
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def _RunAdbCmd(cls, arg_list, timeout=None, retries=None, check_error=True):
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cmd = ['adb'] + arg_list
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    exit_code, output = cmd_helper.GetCmdStatusAndOutput(cmd)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if exit_code != 0:
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      raise device_errors.AdbCommandFailedError(
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          cmd, 'returned non-zero exit code %s, output: %s' %
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          (exit_code, output))
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # This catches some errors, including when the device drops offline;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # unfortunately adb is very inconsistent with error reporting so many
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # command failures present differently.
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if check_error and output[:len('error:')] == 'error:':
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      raise device_errors.AdbCommandFailedError(arg_list, output)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return output
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  # pylint: enable=W0613
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def _DeviceAdbCmd(self, arg_list, timeout, retries, check_error=True):
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Runs an adb command on the device associated with this object.
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      arg_list: A list of arguments to adb.
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: Timeout in seconds.
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: Number of retries.
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      check_error: Check that the command doesn't return an error message. This
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        does NOT check the return code of shell commands.
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      The output of the command.
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self._RunAdbCmd(
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ['-s', self._device_serial] + arg_list, timeout=timeout,
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        retries=retries, check_error=check_error)
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def __eq__(self, other):
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Consider instances equal if they refer to the same device.
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      other: The instance to compare equality with.
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      True if the instances are considered equal, false otherwise.
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return self._device_serial == str(other)
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def __str__(self):
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """The string representation of an instance.
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      The device serial number as a string.
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return self._device_serial
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def __repr__(self):
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return '%s(\'%s\')' % (self.__class__.__name__, self)
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  # TODO(craigdh): Determine the filter criteria that should be supported.
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  @classmethod
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def GetDevices(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Get the list of active attached devices.
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Yields:
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      AdbWrapper instances.
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    output = cls._RunAdbCmd(['devices'], timeout=timeout, retries=retries)
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    lines = [line.split() for line in output.split('\n')]
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return [AdbWrapper(line[0]) for line in lines
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            if len(line) == 2 and line[1] == 'device']
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def GetDeviceSerial(self):
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Gets the device serial number associated with this object.
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      Device serial number as a string.
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return self._device_serial
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Push(self, local, remote, timeout=60*5, retries=_DEFAULT_RETRIES):
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Pushes a file from the host to the device.
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      local: Path on the host filesystem.
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      remote: Path on the device filesystem.
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    _VerifyLocalFileExists(local)
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._DeviceAdbCmd(['push', local, remote], timeout, retries)
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Pull(self, remote, local, timeout=60*5, retries=_DEFAULT_RETRIES):
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Pulls a file from the device to the host.
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      remote: Path on the device filesystem.
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      local: Path on the host filesystem.
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._DeviceAdbCmd(['pull', remote, local], timeout, retries)
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    _VerifyLocalFileExists(local)
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Shell(self, command, expect_rc=None, timeout=_DEFAULT_TIMEOUT,
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            retries=_DEFAULT_RETRIES):
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Runs a shell command on the device.
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      command: The shell command to run.
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      expect_rc: (optional) If set checks that the command's return code matches
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        this value.
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      The output of the shell command as a string.
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Raises:
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      device_errors.AdbCommandFailedError: If the return code doesn't match
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        |expect_rc|.
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if expect_rc is None:
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      actual_command = command
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else:
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      actual_command = '%s; echo $?;' % command
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    output = self._DeviceAdbCmd(
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ['shell', actual_command], timeout, retries, check_error=False)
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if expect_rc is not None:
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      output_end = output.rstrip().rfind('\n') + 1
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      rc = output[output_end:].strip()
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      output = output[:output_end]
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if int(rc) != expect_rc:
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        raise device_errors.AdbCommandFailedError(
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            ['shell', command],
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            'shell command exited with code: %s' % rc,
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            self._device_serial)
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return output
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Logcat(self, filter_spec=None, timeout=_DEFAULT_TIMEOUT,
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)             retries=_DEFAULT_RETRIES):
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Get the logcat output.
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      filter_spec: (optional) Spec to filter the logcat.
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      logcat output as a string.
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cmd = ['logcat']
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if filter_spec is not None:
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append(filter_spec)
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return self._DeviceAdbCmd(cmd, timeout, retries, check_error=False)
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Forward(self, local, remote, timeout=_DEFAULT_TIMEOUT,
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              retries=_DEFAULT_RETRIES):
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Forward socket connections from the local socket to the remote socket.
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Sockets are specified by one of:
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      tcp:<port>
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      localabstract:<unix domain socket name>
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      localreserved:<unix domain socket name>
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      localfilesystem:<unix domain socket name>
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      dev:<character device name>
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      jdwp:<process pid> (remote only)
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      local: The host socket.
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      remote: The device socket.
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._DeviceAdbCmd(['forward', str(local), str(remote)], timeout, retries)
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def JDWP(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """List of PIDs of processes hosting a JDWP transport.
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      A list of PIDs as strings.
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return [a.strip() for a in
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            self._DeviceAdbCmd(['jdwp'], timeout, retries).split('\n')]
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Install(self, apk_path, forward_lock=False, reinstall=False,
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              sd_card=False, timeout=60*2, retries=_DEFAULT_RETRIES):
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Install an apk on the device.
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      apk_path: Host path to the APK file.
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      forward_lock: (optional) If set forward-locks the app.
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      reinstall: (optional) If set reinstalls the app, keeping its data.
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      sd_card: (optional) If set installs on the SD card.
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    _VerifyLocalFileExists(apk_path)
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cmd = ['install']
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if forward_lock:
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append('-l')
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if reinstall:
255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append('-r')
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if sd_card:
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append('-s')
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cmd.append(apk_path)
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    output = self._DeviceAdbCmd(cmd, timeout, retries)
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if 'Success' not in output:
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      raise device_errors.AdbCommandFailedError(cmd, output)
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Uninstall(self, package, keep_data=False, timeout=_DEFAULT_TIMEOUT,
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                retries=_DEFAULT_RETRIES):
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Remove the app |package| from the device.
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      package: The package to uninstall.
269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      keep_data: (optional) If set keep the data and cache directories.
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cmd = ['uninstall']
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if keep_data:
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append('-k')
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cmd.append(package)
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    output = self._DeviceAdbCmd(cmd, timeout, retries)
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if 'Failure' in output:
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      raise device_errors.AdbCommandFailedError(cmd, output)
280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Backup(self, path, packages=None, apk=False, shared=False,
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)             nosystem=True, include_all=False, timeout=_DEFAULT_TIMEOUT,
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)             retries=_DEFAULT_RETRIES):
284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Write an archive of the device's data to |path|.
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      path: Local path to store the backup file.
288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      packages: List of to packages to be backed up.
289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      apk: (optional) If set include the .apk files in the archive.
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      shared: (optional) If set buckup the device's SD card.
291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      nosystem: (optional) If set exclude system applications.
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      include_all: (optional) If set back up all installed applications and
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        |packages| is optional.
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cmd = ['backup', path]
298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if apk:
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append('-apk')
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if shared:
301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append('-shared')
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if nosystem:
303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append('-nosystem')
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if include_all:
305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.append('-all')
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if packages:
307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd.extend(packages)
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    assert bool(packages) ^ bool(include_all), (
309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        'Provide \'packages\' or set \'include_all\' but not both.')
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ret = self._DeviceAdbCmd(cmd, timeout, retries)
311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    _VerifyLocalFileExists(path)
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ret
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Restore(self, path, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Restore device contents from the backup archive.
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      path: Host path to the backup archive.
319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    _VerifyLocalFileExists(path)
323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._DeviceAdbCmd(['restore'] + [path], timeout, retries)
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def WaitForDevice(self, timeout=60*5, retries=_DEFAULT_RETRIES):
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Block until the device is online.
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._DeviceAdbCmd(['wait-for-device'], timeout, retries)
333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def GetState(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Get device state.
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      One of 'offline', 'bootloader', or 'device'.
343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return self._DeviceAdbCmd(['get-state'], timeout, retries).strip()
345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def GetDevPath(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Gets the device path.
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Returns:
354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      The device path (e.g. usb:3-4)
355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return self._DeviceAdbCmd(['get-devpath'], timeout, retries)
357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Remount(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Remounts the /system partition on the device read-write."""
360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._DeviceAdbCmd(['remount'], timeout, retries)
361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Reboot(self, to_bootloader=False, timeout=60*5,
363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)             retries=_DEFAULT_RETRIES):
364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Reboots the device.
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      to_bootloader: (optional) If set reboots to the bootloader.
368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if to_bootloader:
372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd = ['reboot-bootloader']
373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else:
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cmd = ['reboot']
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._DeviceAdbCmd(cmd, timeout, retries)
376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def Root(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """Restarts the adbd daemon with root permissions, if possible.
379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Args:
381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      timeout: (optional) Timeout per try in seconds.
382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      retries: (optional) Number of retries to attempt.
383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """
384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    output = self._DeviceAdbCmd(['root'], timeout, retries)
385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if 'cannot' in output:
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      raise device_errors.AdbCommandFailedError(['root'], output)
387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
388