def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None, check_error=True, cpu_affinity=None): # pylint: disable=no-member try: status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout( cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity), timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime()) except OSError as e: if e.errno in (errno.ENOENT, errno.ENOEXEC): raise device_errors.NoAdbError(msg=str(e)) else: raise if status != 0: raise device_errors.AdbCommandFailedError(args, output, status, device_serial) # This catches some errors, including when the device drops offline; # unfortunately adb is very inconsistent with error reporting so many # command failures present differently. if check_error and output.startswith('error:'): raise device_errors.AdbCommandFailedError(args, output) return output
def timeout_retry_wrapper(*args, **kwargs): timeout = timeout_func(*args, **kwargs) retries = retries_func(*args, **kwargs) if pass_values: kwargs['timeout'] = timeout kwargs['retries'] = retries @functools.wraps(f) def impl(): return f(*args, **kwargs) try: if timeout_retry.CurrentTimeoutThreadGroup(): # Don't wrap if there's already an outer timeout thread. return impl() else: desc = '%s(%s)' % (f.__name__, ', '.join( itertools.chain( (str(a) for a in args), ('%s=%s' % (k, str(v)) for k, v in kwargs.iteritems())))) return timeout_retry.Run( impl, timeout, retries, desc=desc, retry_if_func=retry_if_func) except reraiser_thread.TimeoutError as e: raise device_errors.CommandTimeoutError(str(e)), None, (sys.exc_info()[2]) except cmd_helper.TimeoutError as e: raise device_errors.CommandTimeoutError( str(e), output=e.output), None, (sys.exc_info()[2])
def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None, check_error=True, cpu_affinity=None, ensure_logs_on_timeout=True): timeout = timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime() if ensure_logs_on_timeout and timeout: timeout = 0.95 * timeout try: status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout( cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity), timeout, env=cls._ADB_ENV) except OSError as e: if e.errno in (errno.ENOENT, errno.ENOEXEC): raise device_errors.NoAdbError(msg=str(e)) else: raise # Best effort to catch errors from adb; unfortunately adb is very # inconsistent with error reporting so many command failures present # differently. if status != 0 or (check_error and output.startswith('error:')): not_found_m = _DEVICE_NOT_FOUND_RE.match(output) device_waiting_m = _WAITING_FOR_DEVICE_RE.match(output) if (device_waiting_m is not None or (not_found_m is not None and not_found_m.group('serial') == device_serial)): raise device_errors.DeviceUnreachableError(device_serial) else: raise device_errors.AdbCommandFailedError( args, output, status, device_serial) return output
def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None, check_error=True, cpu_affinity=None): # pylint: disable=no-member try: status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout( cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity), timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime()) except OSError as e: if e.errno in (errno.ENOENT, errno.ENOEXEC): raise device_errors.NoAdbError(msg=str(e)) else: raise # Best effort to catch errors from adb; unfortunately adb is very # inconsistent with error reporting so many command failures present # differently. if status != 0 or (check_error and output.startswith('error:')): m = _DEVICE_NOT_FOUND_RE.match(output) if m is not None and m.group('serial') == device_serial: raise device_errors.DeviceUnreachableError(device_serial) else: raise device_errors.AdbCommandFailedError( args, output, status, device_serial) return output
def InnerFunc(): current_thread_group = timeout_retry.CurrentTimeoutThreadGroup() self.assertIsNotNone(current_thread_group) def InnerInnerFunc(): self.assertEqual(current_thread_group, timeout_retry.CurrentTimeoutThreadGroup()) return True return reraiser_thread.RunAsync((InnerInnerFunc,))[0]
def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None, check_error=True, cpu_affinity=None, additional_env=None): if timeout: remaining = timeout_retry.CurrentTimeoutThreadGroup( ).GetRemainingTime() if remaining: # Use a slightly smaller timeout than remaining time to ensure that we # have time to collect output from the command. timeout = 0.95 * remaining else: timeout = None env = cls._ADB_ENV.copy() if additional_env: env.update(additional_env) try: adb_cmd = cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity) status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout( adb_cmd, timeout, env=env) except OSError as e: if e.errno in (errno.ENOENT, errno.ENOEXEC): raise device_errors.NoAdbError(msg=str(e)) else: raise except cmd_helper.TimeoutError: logger.error('Timeout on adb command: %r', adb_cmd) raise # Best effort to catch errors from adb; unfortunately adb is very # inconsistent with error reporting so many command failures present # differently. if status != 0 or (check_error and output.startswith('error:')): not_found_m = _DEVICE_NOT_FOUND_RE.search(output) device_waiting_m = _WAITING_FOR_DEVICE_RE.match(output) if (device_waiting_m is not None or (not_found_m is not None and not_found_m.group('serial') == device_serial)): raise device_errors.DeviceUnreachableError(device_serial) else: raise device_errors.AdbCommandFailedError( args, output, status, device_serial) return output
def InnerInnerFunc(): self.assertEqual(current_thread_group, timeout_retry.CurrentTimeoutThreadGroup()) return True