aboutsummaryrefslogtreecommitdiff
path: root/third_party/catapult/devil/devil/android/decorators.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/catapult/devil/devil/android/decorators.py')
-rw-r--r--third_party/catapult/devil/devil/android/decorators.py176
1 files changed, 0 insertions, 176 deletions
diff --git a/third_party/catapult/devil/devil/android/decorators.py b/third_party/catapult/devil/devil/android/decorators.py
deleted file mode 100644
index 3844b49..0000000
--- a/third_party/catapult/devil/devil/android/decorators.py
+++ /dev/null
@@ -1,176 +0,0 @@
-# Copyright 2014 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 itertools
-import sys
-
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-DEFAULT_TIMEOUT_ATTR = '_default_timeout'
-DEFAULT_RETRIES_ATTR = '_default_retries'
-
-
-def _TimeoutRetryWrapper(
- f, timeout_func, retries_func, retry_if_func=timeout_retry.AlwaysRetry,
- 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 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)), None, (
- sys.exc_info()[2])
- return timeout_retry_wrapper
-
-
-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 WithTimeoutAndConditionalRetries(retry_if_func):
- """Returns a decorator that handles timeouts and, in some cases, retries.
-
- 'timeout' and 'retries' kwargs must be passed to the function.
-
- Args:
- retry_if_func: A unary callable that takes an exception and returns
- whether failures should be retried.
- Returns:
- The actual decorator.
- """
- def decorator(f):
- get_timeout = lambda *a, **kw: kw['timeout']
- get_retries = lambda *a, **kw: kw['retries']
- return _TimeoutRetryWrapper(
- f, get_timeout, get_retries, retry_if_func=retry_if_func)
- return decorator
-
-
-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,
- min_default_timeout=None):
- """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.
- min_timeout: Miniumum timeout to be used when using instance timeout.
- Returns:
- The actual decorator.
- """
- def decorator(f):
- def get_timeout(inst, *_args, **kwargs):
- ret = getattr(inst, default_timeout_name)
- if min_default_timeout is not None:
- ret = max(min_default_timeout, ret)
- return kwargs.get('timeout', ret)
-
- 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
-