xref: /third_party/skia/tools/skpbench/_adb.py (revision cb93a386)
1cb93a386Sopenharmony_ci# Copyright 2016 Google Inc.
2cb93a386Sopenharmony_ci#
3cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
4cb93a386Sopenharmony_ci# found in the LICENSE file.
5cb93a386Sopenharmony_ci
6cb93a386Sopenharmony_cifrom __future__ import print_function
7cb93a386Sopenharmony_ciimport re
8cb93a386Sopenharmony_ciimport time
9cb93a386Sopenharmony_ciimport subprocess
10cb93a386Sopenharmony_ciimport sys
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ciclass Adb:
13cb93a386Sopenharmony_ci  def __init__(self, device_serial=None, adb_binary=None, echo=False):
14cb93a386Sopenharmony_ci    self.__invocation = [adb_binary]
15cb93a386Sopenharmony_ci    if device_serial:
16cb93a386Sopenharmony_ci      self.__invocation.extend(['-s', device_serial])
17cb93a386Sopenharmony_ci    self.__echo = echo
18cb93a386Sopenharmony_ci    self.__is_root = None
19cb93a386Sopenharmony_ci    self.__has_established_connection = False
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_ci  def shell(self, cmd):
22cb93a386Sopenharmony_ci    if self.__echo:
23cb93a386Sopenharmony_ci      self.__echo_shell_cmd(cmd)
24cb93a386Sopenharmony_ci    self.__invoke('shell', cmd)
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_ci  def check(self, cmd):
27cb93a386Sopenharmony_ci    if self.__echo:
28cb93a386Sopenharmony_ci      self.__echo_shell_cmd(cmd)
29cb93a386Sopenharmony_ci    self.__establish_connection()
30cb93a386Sopenharmony_ci    result = subprocess.check_output(self.__invocation + ['shell', cmd])
31cb93a386Sopenharmony_ci    if self.__echo:
32cb93a386Sopenharmony_ci      print(result, file=sys.stderr)
33cb93a386Sopenharmony_ci    return result
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ci  def root(self):
36cb93a386Sopenharmony_ci    if not self.is_root():
37cb93a386Sopenharmony_ci      self.__invoke('root')
38cb93a386Sopenharmony_ci      self.__has_established_connection = False
39cb93a386Sopenharmony_ci      self.__is_root = None
40cb93a386Sopenharmony_ci    return self.is_root()
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ci  def is_root(self):
43cb93a386Sopenharmony_ci    if self.__is_root is None:
44cb93a386Sopenharmony_ci      self.__is_root = ('root' == self.check('whoami').strip())
45cb93a386Sopenharmony_ci    return self.__is_root
46cb93a386Sopenharmony_ci
47cb93a386Sopenharmony_ci  def remount(self):
48cb93a386Sopenharmony_ci    self.__invoke('remount')
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ci  def reboot(self):
51cb93a386Sopenharmony_ci    self.__is_root = None
52cb93a386Sopenharmony_ci    self.shell('reboot')
53cb93a386Sopenharmony_ci    self.__has_established_connection = False
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci  def __echo_shell_cmd(self, cmd):
56cb93a386Sopenharmony_ci    escaped = [re.sub(r'([^a-zA-Z0-9])', r'\\\1', x)
57cb93a386Sopenharmony_ci               for x in cmd.strip().splitlines()]
58cb93a386Sopenharmony_ci    self.__invoke('shell', 'echo', '$(whoami)@$(getprop ro.serialno)$',
59cb93a386Sopenharmony_ci                  " '\n>' ".join(escaped))
60cb93a386Sopenharmony_ci
61cb93a386Sopenharmony_ci  def __invoke(self, *args):
62cb93a386Sopenharmony_ci    self.__establish_connection()
63cb93a386Sopenharmony_ci    subprocess.call(self.__invocation + list(args), stdout=sys.stderr)
64cb93a386Sopenharmony_ci
65cb93a386Sopenharmony_ci  def __establish_connection(self):
66cb93a386Sopenharmony_ci    if self.__has_established_connection:
67cb93a386Sopenharmony_ci      return
68cb93a386Sopenharmony_ci    self.__has_established_connection = True
69cb93a386Sopenharmony_ci    self.__invoke('wait-for-device')
70cb93a386Sopenharmony_ci    while True:
71cb93a386Sopenharmony_ci      time.sleep(1)
72cb93a386Sopenharmony_ci      if '1' == self.check('getprop sys.boot_completed').strip():
73cb93a386Sopenharmony_ci        break
74