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