| Index: build/android/pylib/device/decorators.py
|
| diff --git a/build/android/pylib/device/decorators.py b/build/android/pylib/device/decorators.py
|
| index ca29eb397fcd244ccad3a8aeb87df049def9083b..f8c2fddde4855b16975f5bfc6d8f9f6b3885c002 100644
|
| --- a/build/android/pylib/device/decorators.py
|
| +++ b/build/android/pylib/device/decorators.py
|
| @@ -1,145 +1,8 @@
|
| -# Copyright 2014 The Chromium Authors. All rights reserved.
|
| +# Copyright 2015 The Chromium Authors. All rights reserved.
|
| # Use of this source code is governed by a BSD-style license that can be
|
| # found in the LICENSE file.
|
|
|
| -"""
|
| -Function/method decorators that provide timeout and retry logic.
|
| -"""
|
| -
|
| -import functools
|
| -import os
|
| -import sys
|
| -import threading
|
| -
|
| -from pylib import cmd_helper
|
| -from pylib import constants
|
| -from pylib.device import device_errors
|
| -from pylib.utils import reraiser_thread
|
| -from pylib.utils import timeout_retry
|
| -
|
| -DEFAULT_TIMEOUT_ATTR = '_default_timeout'
|
| -DEFAULT_RETRIES_ATTR = '_default_retries'
|
| -
|
| -
|
| -def _TimeoutRetryWrapper(f, timeout_func, retries_func, pass_values=False):
|
| - """ Wraps a funcion with timeout and retry handling logic.
|
| -
|
| - Args:
|
| - f: The function to wrap.
|
| - timeout_func: A callable that returns the timeout value.
|
| - retries_func: A callable that returns the retries value.
|
| - pass_values: If True, passes the values returned by |timeout_func| and
|
| - |retries_func| to the wrapped function as 'timeout' and
|
| - 'retries' kwargs, respectively.
|
| - Returns:
|
| - The wrapped function.
|
| - """
|
| - @functools.wraps(f)
|
| - def TimeoutRetryWrapper(*args, **kwargs):
|
| - timeout = timeout_func(*args, **kwargs)
|
| - retries = retries_func(*args, **kwargs)
|
| - if pass_values:
|
| - kwargs['timeout'] = timeout
|
| - kwargs['retries'] = retries
|
| - def impl():
|
| - return f(*args, **kwargs)
|
| - try:
|
| - if isinstance(threading.current_thread(),
|
| - timeout_retry.TimeoutRetryThread):
|
| - return impl()
|
| - else:
|
| - return timeout_retry.Run(impl, timeout, retries)
|
| - 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)), None, (
|
| - sys.exc_info()[2])
|
| - return TimeoutRetryWrapper
|
| -
|
| -
|
| -def WithTimeoutAndRetries(f):
|
| - """A decorator that handles timeouts and retries.
|
| -
|
| - 'timeout' and 'retries' kwargs must be passed to the function.
|
| -
|
| - Args:
|
| - f: The function to decorate.
|
| - Returns:
|
| - The decorated function.
|
| - """
|
| - get_timeout = lambda *a, **kw: kw['timeout']
|
| - get_retries = lambda *a, **kw: kw['retries']
|
| - return _TimeoutRetryWrapper(f, get_timeout, get_retries)
|
| -
|
| -
|
| -def WithExplicitTimeoutAndRetries(timeout, retries):
|
| - """Returns a decorator that handles timeouts and retries.
|
| -
|
| - The provided |timeout| and |retries| values are always used.
|
| -
|
| - Args:
|
| - timeout: The number of seconds to wait for the decorated function to
|
| - return. Always used.
|
| - retries: The number of times the decorated function should be retried on
|
| - failure. Always used.
|
| - Returns:
|
| - The actual decorator.
|
| - """
|
| - def decorator(f):
|
| - get_timeout = lambda *a, **kw: timeout
|
| - get_retries = lambda *a, **kw: retries
|
| - return _TimeoutRetryWrapper(f, get_timeout, get_retries)
|
| - return decorator
|
| -
|
| -
|
| -def WithTimeoutAndRetriesDefaults(default_timeout, default_retries):
|
| - """Returns a decorator that handles timeouts and retries.
|
| -
|
| - The provided |default_timeout| and |default_retries| values are used only
|
| - if timeout and retries values are not provided.
|
| -
|
| - Args:
|
| - default_timeout: The number of seconds to wait for the decorated function
|
| - to return. Only used if a 'timeout' kwarg is not passed
|
| - to the decorated function.
|
| - default_retries: The number of times the decorated function should be
|
| - retried on failure. Only used if a 'retries' kwarg is not
|
| - passed to the decorated function.
|
| - Returns:
|
| - The actual decorator.
|
| - """
|
| - def decorator(f):
|
| - get_timeout = lambda *a, **kw: kw.get('timeout', default_timeout)
|
| - get_retries = lambda *a, **kw: kw.get('retries', default_retries)
|
| - return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
|
| - return decorator
|
| -
|
| -
|
| -def WithTimeoutAndRetriesFromInstance(
|
| - default_timeout_name=DEFAULT_TIMEOUT_ATTR,
|
| - default_retries_name=DEFAULT_RETRIES_ATTR):
|
| - """Returns a decorator that handles timeouts and retries.
|
| -
|
| - The provided |default_timeout_name| and |default_retries_name| are used to
|
| - get the default timeout value and the default retries value from the object
|
| - instance if timeout and retries values are not provided.
|
| -
|
| - Note that this should only be used to decorate methods, not functions.
|
| -
|
| - Args:
|
| - default_timeout_name: The name of the default timeout attribute of the
|
| - instance.
|
| - default_retries_name: The name of the default retries attribute of the
|
| - instance.
|
| - Returns:
|
| - The actual decorator.
|
| - """
|
| - def decorator(f):
|
| - def get_timeout(inst, *_args, **kwargs):
|
| - return kwargs.get('timeout', getattr(inst, default_timeout_name))
|
| - def get_retries(inst, *_args, **kwargs):
|
| - return kwargs.get('retries', getattr(inst, default_retries_name))
|
| - return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
|
| - return decorator
|
| +# pylint: disable=unused-wildcard-import
|
| +# pylint: disable=wildcard-import
|
|
|
| +from devil.android.decorators import *
|
|
|