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)"""A module to hold adb specific action implementations.""" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import re 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import cr 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class Adb(object): 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Exposes the functionality of the adb tool to the rest of cr. 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) This is intended as the only class in the cr that needs to understand the 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) adb command line, and expose it in neutral form to the rest of the code. 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) # Tracks the set of killed target names, so we don't keep issuing kill 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) # commands that are not going to have any effect. 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) _kills = {} 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def GetPids(cls, target): 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Gets the set of running PIDs that match the specified target.""" 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pids = [] 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch with target: 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch output = cr.Host.Capture('{CR_ADB}', 'shell', 'ps') 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pattern = re.compile(r'\S+\s+(\d+)\s+.*{CR_PROCESS}') 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for line in output.split('\n'): 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) match = re.match(pattern, line) 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if match: 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pids.append(match.group(1)) 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return pids 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Run(cls, target, arguments): 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Invoke a target binary on the device.""" 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch with target: 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cr.Host.Execute( 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_ADB}', 'shell', 'am', 'start', 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '-a', '{CR_ACTION}', 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '-n', '{CR_INTENT}', 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_RUN_ARGUMENTS}', 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *arguments 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ) 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Kill(cls, target, _): 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Kill all running processes for a target.""" 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) target_name = target.build_target 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if target_name in cls._kills: 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) # already killed this target, do nothing 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pids = cls.GetPids(target) 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if pids: 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch with target: 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cr.Host.Execute('{CR_ADB}', 'shell', 'kill', *pids) 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) elif target.verbose: 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print target.Substitute('{CR_TARGET_NAME} not running') 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cls._kills[target_name] = True 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Uninstall(cls, target, arguments): 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch with target: 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cr.Host.Execute( 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_ADB}', 'uninstall', 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_PACKAGE}', 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *arguments 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ) 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Install(cls, target, arguments): 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch with target: 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cr.Host.Execute( 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_ADB}', 'install', 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_BINARY}', 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *arguments 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ) 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Reinstall(cls, target, arguments): 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch with target: 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cr.Host.Execute( 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_ADB}', 'install', 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '-r', 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_BINARY}', 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *arguments 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ) 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def AttachGdb(cls, target, arguments): 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch with target: 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cr.Host.Execute( 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '{CR_ADB_GDB}', 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '--adb={CR_ADB}', 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '--symbol-dir=${CR_BUILD_DIR}/lib', 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '--program-name={CR_TARGET_NAME}', 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch '--package-name={CR_PACKAGE}', 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *arguments 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ) 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class AdbRunner(cr.Runner): 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """An implementation of cr.Runner for the android platform.""" 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @property 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def enabled(self): 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return cr.AndroidPlatform.GetInstance().is_active 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch def Kill(self, targets, arguments): 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for target in targets: 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Adb.Kill(target, arguments) 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch def Run(self, target, arguments): 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Adb.Run(target, arguments) 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch def Test(self, target, arguments): 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch with target: 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cr.Host.Execute( 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) '{CR_TEST_RUNNER}', '{CR_TEST_TYPE}', 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) '-s', '{CR_TARGET_NAME}', 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) '--{CR_TEST_MODE}', 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *arguments 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ) 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class AdbInstaller(cr.Installer): 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """An implementation of cr.Installer for the android platform.""" 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @property 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def enabled(self): 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return cr.AndroidPlatform.GetInstance().is_active 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch def Uninstall(self, targets, arguments): 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for target in targets: 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Adb.Uninstall(target, arguments) 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch def Install(self, targets, arguments): 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for target in targets: 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Adb.Install(target, arguments) 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch def Reinstall(self, targets, arguments): 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for target in targets: 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Adb.Reinstall(target, arguments) 146