aboutsummaryrefslogtreecommitdiff
path: root/catapult/devil/devil/android/sdk/adb_wrapper.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/devil/devil/android/sdk/adb_wrapper.py')
-rw-r--r--catapult/devil/devil/android/sdk/adb_wrapper.py28
1 files changed, 27 insertions, 1 deletions
diff --git a/catapult/devil/devil/android/sdk/adb_wrapper.py b/catapult/devil/devil/android/sdk/adb_wrapper.py
index 71928d58..d8992242 100644
--- a/catapult/devil/devil/android/sdk/adb_wrapper.py
+++ b/catapult/devil/devil/android/sdk/adb_wrapper.py
@@ -18,6 +18,8 @@ import posixpath
import re
import subprocess
+import six
+
from devil import base_error
from devil import devil_env
from devil.android import decorators
@@ -127,6 +129,30 @@ def _IsExtraneousLine(line, send_cmd):
return send_cmd.rstrip() in line
+@decorators.WithExplicitTimeoutAndRetries(timeout=60, retries=3)
+def RestartServer():
+ """Restarts the adb server.
+
+ Raises:
+ CommandFailedError if we fail to kill or restart the server.
+ """
+
+ def adb_killed():
+ return not AdbWrapper.IsServerOnline()
+
+ def adb_started():
+ return AdbWrapper.IsServerOnline()
+
+ AdbWrapper.KillServer()
+ if not timeout_retry.WaitFor(adb_killed, wait_period=1, max_tries=5):
+ # TODO(crbug.com/442319): Switch this to raise an exception if we
+ # figure out why sometimes not all adb servers on bots get killed.
+ logger.warning('Failed to kill adb server')
+ AdbWrapper.StartServer()
+ if not timeout_retry.WaitFor(adb_started, wait_period=1, max_tries=5):
+ raise device_errors.CommandFailedError('Failed to start adb server')
+
+
class AdbWrapper(object):
"""A wrapper around a local Android Debug Bridge executable."""
@@ -1105,7 +1131,7 @@ class AdbWrapper(object):
Returns:
The output of the emulator console command.
"""
- if isinstance(cmd, basestring):
+ if isinstance(cmd, six.string_types):
cmd = [cmd]
return self._RunDeviceAdbCmd(['emu'] + cmd, timeout, retries)