| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Provides an interface to communicate with the device via the adb command. | 5 """Provides an interface to communicate with the device via the adb command. |
| 6 | 6 |
| 7 Assumes adb binary is currently on system path. | 7 Assumes adb binary is currently on system path. |
| 8 """ | 8 """ |
| 9 # pylint: disable-all | 9 # pylint: disable-all |
| 10 | 10 |
| (...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 751 last_line = lines[-1] | 751 last_line = lines[-1] |
| 752 status_pos = last_line.rfind('%') | 752 status_pos = last_line.rfind('%') |
| 753 assert status_pos >= 0 | 753 assert status_pos >= 0 |
| 754 status = int(last_line[status_pos + 1:]) | 754 status = int(last_line[status_pos + 1:]) |
| 755 if status_pos == 0: | 755 if status_pos == 0: |
| 756 lines = lines[:-1] | 756 lines = lines[:-1] |
| 757 else: | 757 else: |
| 758 lines = lines[:-1] + [last_line[:status_pos]] | 758 lines = lines[:-1] + [last_line[:status_pos]] |
| 759 return (status, lines) | 759 return (status, lines) |
| 760 | 760 |
| 761 def KillAll(self, process, signum=9, with_su=False): | 761 def KillAll(self, process, signum=signal.SIGKILL, with_su=False): |
| 762 """Android version of killall, connected via adb. | 762 """Android version of killall, connected via adb. |
| 763 | 763 |
| 764 Args: | 764 Args: |
| 765 process: name of the process to kill off. | 765 process: name of the process to kill off. |
| 766 signum: signal to use, 9 (SIGKILL) by default. | 766 signum: signal to use, 9 (SIGKILL) by default. |
| 767 with_su: wether or not to use su to kill the processes. | 767 with_su: wether or not to use su to kill the processes. |
| 768 | 768 |
| 769 Returns: | 769 Returns: |
| 770 the number of processes killed | 770 the number of processes killed |
| 771 """ | 771 """ |
| 772 pids = self.ExtractPid(process) | 772 pids = self.ExtractPid(process) |
| 773 if pids: | 773 if pids: |
| 774 cmd = 'kill -%d %s' % (signum, ' '.join(pids)) | 774 cmd = 'kill -%d %s' % (signum, ' '.join(pids)) |
| 775 if with_su: | 775 if with_su: |
| 776 self.RunShellCommandWithSU(cmd) | 776 self.RunShellCommandWithSU(cmd) |
| 777 else: | 777 else: |
| 778 self.RunShellCommand(cmd) | 778 self.RunShellCommand(cmd) |
| 779 return len(pids) | 779 return len(pids) |
| 780 | 780 |
| 781 def KillAllBlocking(self, process, timeout_sec): | 781 def KillAllBlocking(self, process, timeout_sec, signum=signal.SIGKILL, |
| 782 with_su=False): |
| 782 """Blocking version of killall, connected via adb. | 783 """Blocking version of killall, connected via adb. |
| 783 | 784 |
| 784 This waits until no process matching the corresponding name appears in ps' | 785 This waits until no process matching the corresponding name appears in ps' |
| 785 output anymore. | 786 output anymore. |
| 786 | 787 |
| 787 Args: | 788 Args: |
| 788 process: name of the process to kill off | 789 process: name of the process to kill off |
| 789 timeout_sec: the timeout in seconds | 790 timeout_sec: the timeout in seconds |
| 790 | 791 signum: same as |KillAll| |
| 792 with_su: same as |KillAll| |
| 791 Returns: | 793 Returns: |
| 792 the number of processes killed | 794 the number of processes killed |
| 793 """ | 795 """ |
| 794 processes_killed = self.KillAll(process) | 796 processes_killed = self.KillAll(process, signum=signum, with_su=with_su) |
| 795 if processes_killed: | 797 if processes_killed: |
| 796 elapsed = 0 | 798 elapsed = 0 |
| 797 wait_period = 0.1 | 799 wait_period = 0.1 |
| 798 # Note that this doesn't take into account the time spent in ExtractPid(). | 800 # Note that this doesn't take into account the time spent in ExtractPid(). |
| 799 while self.ExtractPid(process) and elapsed < timeout_sec: | 801 while self.ExtractPid(process) and elapsed < timeout_sec: |
| 800 time.sleep(wait_period) | 802 time.sleep(wait_period) |
| 801 elapsed += wait_period | 803 elapsed += wait_period |
| 802 if elapsed >= timeout_sec: | 804 if elapsed >= timeout_sec: |
| 803 return 0 | 805 return processes_killed - self.ExtractPid(process) |
| 804 return processes_killed | 806 return processes_killed |
| 805 | 807 |
| 806 @staticmethod | 808 @staticmethod |
| 807 def _GetActivityCommand(package, activity, wait_for_completion, action, | 809 def _GetActivityCommand(package, activity, wait_for_completion, action, |
| 808 category, data, extras, trace_file_name, force_stop, | 810 category, data, extras, trace_file_name, force_stop, |
| 809 flags): | 811 flags): |
| 810 """Creates command to start |package|'s activity on the device. | 812 """Creates command to start |package|'s activity on the device. |
| 811 | 813 |
| 812 Args - as for StartActivity | 814 Args - as for StartActivity |
| 813 | 815 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 activity: Name of activity (e.g. '.Main' or | 858 activity: Name of activity (e.g. '.Main' or |
| 857 'com.google.android.apps.chrome.Main'). | 859 'com.google.android.apps.chrome.Main'). |
| 858 wait_for_completion: wait for the activity to finish launching (-W flag). | 860 wait_for_completion: wait for the activity to finish launching (-W flag). |
| 859 action: string (e.g. "android.intent.action.MAIN"). Default is VIEW. | 861 action: string (e.g. "android.intent.action.MAIN"). Default is VIEW. |
| 860 category: string (e.g. "android.intent.category.HOME") | 862 category: string (e.g. "android.intent.category.HOME") |
| 861 data: Data string to pass to activity (e.g. 'http://www.example.com/'). | 863 data: Data string to pass to activity (e.g. 'http://www.example.com/'). |
| 862 extras: Dict of extras to pass to activity. Values are significant. | 864 extras: Dict of extras to pass to activity. Values are significant. |
| 863 trace_file_name: If used, turns on and saves the trace to this file name. | 865 trace_file_name: If used, turns on and saves the trace to this file name. |
| 864 force_stop: force stop the target app before starting the activity (-S | 866 force_stop: force stop the target app before starting the activity (-S |
| 865 flag). | 867 flag). |
| 868 Returns: |
| 869 The output of the underlying command as a list of lines. |
| 866 """ | 870 """ |
| 867 cmd = self._GetActivityCommand(package, activity, wait_for_completion, | 871 cmd = self._GetActivityCommand(package, activity, wait_for_completion, |
| 868 action, category, data, extras, | 872 action, category, data, extras, |
| 869 trace_file_name, force_stop, flags) | 873 trace_file_name, force_stop, flags) |
| 870 self.RunShellCommand(cmd) | 874 return self.RunShellCommand(cmd) |
| 871 | 875 |
| 872 def StartActivityTimed(self, package, activity, wait_for_completion=False, | 876 def StartActivityTimed(self, package, activity, wait_for_completion=False, |
| 873 action='android.intent.action.VIEW', | 877 action='android.intent.action.VIEW', |
| 874 category=None, data=None, | 878 category=None, data=None, |
| 875 extras=None, trace_file_name=None, | 879 extras=None, trace_file_name=None, |
| 876 force_stop=False, flags=None): | 880 force_stop=False, flags=None): |
| 877 """Starts |package|'s activity on the device, returning the start time | 881 """Starts |package|'s activity on the device, returning the start time |
| 878 | 882 |
| 879 Args - as for StartActivity | 883 Args - as for StartActivity |
| 880 | 884 |
| 881 Returns: | 885 Returns: |
| 882 a timestamp string for the time at which the activity started | 886 A tuple containing: |
| 887 - the output of the underlying command as a list of lines, and |
| 888 - a timestamp string for the time at which the activity started |
| 883 """ | 889 """ |
| 884 cmd = self._GetActivityCommand(package, activity, wait_for_completion, | 890 cmd = self._GetActivityCommand(package, activity, wait_for_completion, |
| 885 action, category, data, extras, | 891 action, category, data, extras, |
| 886 trace_file_name, force_stop, flags) | 892 trace_file_name, force_stop, flags) |
| 887 self.StartMonitoringLogcat() | 893 self.StartMonitoringLogcat() |
| 888 self.RunShellCommand('log starting activity; ' + cmd) | 894 out = self.RunShellCommand('log starting activity; ' + cmd) |
| 889 activity_started_re = re.compile('.*starting activity.*') | 895 activity_started_re = re.compile('.*starting activity.*') |
| 890 m = self.WaitForLogMatch(activity_started_re, None) | 896 m = self.WaitForLogMatch(activity_started_re, None) |
| 891 assert m | 897 assert m |
| 892 start_line = m.group(0) | 898 start_line = m.group(0) |
| 893 return GetLogTimestamp(start_line, self.GetDeviceYear()) | 899 return (out, GetLogTimestamp(start_line, self.GetDeviceYear())) |
| 894 | 900 |
| 895 def StartCrashUploadService(self, package): | 901 def StartCrashUploadService(self, package): |
| 896 # TODO(frankf): We really need a python wrapper around Intent | 902 # TODO(frankf): We really need a python wrapper around Intent |
| 897 # to be shared with StartActivity/BroadcastIntent. | 903 # to be shared with StartActivity/BroadcastIntent. |
| 898 cmd = ( | 904 cmd = ( |
| 899 'am startservice -a %s.crash.ACTION_FIND_ALL -n ' | 905 'am startservice -a %s.crash.ACTION_FIND_ALL -n ' |
| 900 '%s/%s.crash.MinidumpUploadService' % | 906 '%s/%s.crash.MinidumpUploadService' % |
| 901 (constants.PACKAGE_INFO['chrome'].package, | 907 (constants.PACKAGE_INFO['chrome'].package, |
| 902 package, | 908 package, |
| 903 constants.PACKAGE_INFO['chrome'].package)) | 909 constants.PACKAGE_INFO['chrome'].package)) |
| (...skipping 1079 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1983 """ | 1989 """ |
| 1984 def __init__(self, output): | 1990 def __init__(self, output): |
| 1985 self._output = output | 1991 self._output = output |
| 1986 | 1992 |
| 1987 def write(self, data): | 1993 def write(self, data): |
| 1988 data = data.replace('\r\r\n', '\n') | 1994 data = data.replace('\r\r\n', '\n') |
| 1989 self._output.write(data) | 1995 self._output.write(data) |
| 1990 | 1996 |
| 1991 def flush(self): | 1997 def flush(self): |
| 1992 self._output.flush() | 1998 self._output.flush() |
| OLD | NEW |