summaryrefslogtreecommitdiff
path: root/tests/test_retry.py
diff options
context:
space:
mode:
authornbraun-amazon <85549956+nbraun-amazon@users.noreply.github.com>2021-08-18 12:06:09 +0300
committerGitHub <noreply@github.com>2021-08-18 12:06:09 +0300
commite19a76c58f2a998d86e51c5a2a0f1db37563efce (patch)
tree876614bb653f6df4006ab64cece4078d0355f067 /tests/test_retry.py
parentb96af52e012bc002df97c4a82a5e4ad389cea3f3 (diff)
downloadredis-py-e19a76c58f2a998d86e51c5a2a0f1db37563efce.tar.gz
Add retry mechanism with backoff (#1494)
Diffstat (limited to 'tests/test_retry.py')
-rw-r--r--tests/test_retry.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/test_retry.py b/tests/test_retry.py
new file mode 100644
index 0000000..24d9683
--- /dev/null
+++ b/tests/test_retry.py
@@ -0,0 +1,66 @@
+from redis.backoff import NoBackoff
+import pytest
+
+from redis.exceptions import ConnectionError
+from redis.connection import Connection
+from redis.retry import Retry
+
+
+class BackoffMock:
+ def __init__(self):
+ self.reset_calls = 0
+ self.calls = 0
+
+ def reset(self):
+ self.reset_calls += 1
+
+ def compute(self, failures):
+ self.calls += 1
+ return 0
+
+
+class TestConnectionConstructorWithRetry:
+ "Test that the Connection constructor properly handles Retry objects"
+
+ @pytest.mark.parametrize("retry_on_timeout", [False, True])
+ def test_retry_on_timeout_boolean(self, retry_on_timeout):
+ c = Connection(retry_on_timeout=retry_on_timeout)
+ assert c.retry_on_timeout == retry_on_timeout
+ assert isinstance(c.retry, Retry)
+ assert c.retry._retries == (1 if retry_on_timeout else 0)
+
+ @pytest.mark.parametrize("retries", range(10))
+ def test_retry_on_timeout_retry(self, retries):
+ retry_on_timeout = retries > 0
+ c = Connection(retry_on_timeout=retry_on_timeout,
+ retry=Retry(NoBackoff(), retries))
+ assert c.retry_on_timeout == retry_on_timeout
+ assert isinstance(c.retry, Retry)
+ assert c.retry._retries == retries
+
+
+class TestRetry:
+ "Test that Retry calls backoff and retries the expected number of times"
+
+ def setup_method(self, test_method):
+ self.actual_attempts = 0
+ self.actual_failures = 0
+
+ def _do(self):
+ self.actual_attempts += 1
+ raise ConnectionError()
+
+ def _fail(self, error):
+ self.actual_failures += 1
+
+ @pytest.mark.parametrize("retries", range(10))
+ def test_retry(self, retries):
+ backoff = BackoffMock()
+ retry = Retry(backoff, retries)
+ with pytest.raises(ConnectionError):
+ retry.call_with_retry(self._do, self._fail)
+
+ assert self.actual_attempts == 1 + retries
+ assert self.actual_failures == 1 + retries
+ assert backoff.reset_calls == 1
+ assert backoff.calls == retries