blob: 8e94ed03f0ab2a6c68caacc43fe987a028b94a36 [file] [log] [blame]
# Copyright (c) 2014 ThE Chromium Authors. All Rights Reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from recipe_engine import recipe_api
class AdbApi(recipe_api.RecipeApi):
def __init__(self, **kwargs):
super(AdbApi, self).__init__(**kwargs)
self._custom_adb_path = None
self._devices = None
def __call__(self, cmd, serial=None, **kwargs): # pragma: nocover
"""Run an ADB command."""
cmd_prefix = [self.adb_path()]
if serial:
cmd_prefix.extend(['-s', serial])
return self.m.step(cmd=cmd_prefix + cmd, **kwargs)
def set_adb_path(self, adb_path):
self._custom_adb_path = adb_path
def adb_path(self):
if self._custom_adb_path:
return self._custom_adb_path
return self.m.path['checkout'].join(
'third_party', 'android_tools', 'sdk', 'platform-tools', 'adb')
def list_devices(self, step_test_data=None, **kwargs):
cmd = [
str(self.adb_path()),
'devices',
]
result = self.m.python(
'List adb devices',
self.resource('list_devices.py'),
args=[ repr(cmd), self.m.json.output() ],
step_test_data=step_test_data or self.test_api.device_list,
**kwargs)
self._devices = result.json.output
@property
def devices(self):
assert self._devices is not None, (
"devices is only available after yielding list_devices()")
return self._devices
def root_devices(self, **kwargs):
self.list_devices(**kwargs)
self.m.python.inline(
'Root devices',
"""
import subprocess
import sys
adb_path = sys.argv[1]
for device in sys.argv[2:]:
print 'Attempting to root device %s ...' % (device)
subprocess.check_call([adb_path, '-s', device, 'root'])
subprocess.check_call([adb_path, '-s', device, 'wait-for-device'])
print 'Finished rooting device %s' % (device)
""",
args=[self.adb_path()] + self.devices,
**kwargs)