Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
  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])
Ejemplo n.º 3
0
  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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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]
Ejemplo n.º 6
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