You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2021/11/04 11:19:36 UTC

[libcloud] 03/03: Add test case for additional scenario we were missing.

This is an automated email from the ASF dual-hosted git repository.

tomaz pushed a commit to branch understand-ai-intelligent-retry
in repository https://gitbox.apache.org/repos/asf/libcloud.git

commit 0e729e97d273ded83283ce8ed963074b3f3a340e
Author: Tomaz Muraus <to...@tomaz.me>
AuthorDate: Thu Nov 4 12:16:56 2021 +0100

    Add test case for additional scenario we were missing.
---
 libcloud/test/test_connection.py | 27 +++++++++++++++++++++++++++
 libcloud/utils/retry.py          |  2 +-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/libcloud/test/test_connection.py b/libcloud/test/test_connection.py
index 7a87aed..445cea1 100644
--- a/libcloud/test/test_connection.py
+++ b/libcloud/test/test_connection.py
@@ -35,6 +35,7 @@ from libcloud.http import LibcloudConnection
 from libcloud.http import SignedHTTPSAdapter
 from libcloud.utils.retry import Retry
 from libcloud.utils.retry import RetryForeverOnRateLimitError
+from libcloud.utils.retry import RETRY_EXCEPTIONS
 from libcloud.utils.py3 import assertRaisesRegex
 
 
@@ -559,6 +560,32 @@ class ConnectionClassTestCase(unittest.TestCase):
         self.assertEqual(mock_connect.call_count, 2,
                         'Retry logic failed')
 
+    @patch('libcloud.common.base.Connection.request')
+    def test_retry_on_all_default_retry_exception_classes(self, mock_connect):
+        con = Connection()
+        con.connection = Mock()
+        connect_method = 'libcloud.common.base.Connection.request'
+
+        self.retry_counter = 0
+
+        def mock_connect_side_effect(*args, **kwargs):
+            self.retry_counter += 1
+
+            if self.retry_counter < len(RETRY_EXCEPTIONS):
+                raise RETRY_EXCEPTIONS[self.retry_counter]
+
+            return 'success'
+
+        mock_connect.__name__ = 'mock_connect'
+        mock_connect.side_effect = mock_connect_side_effect
+        retry_request = Retry(timeout=0.6, retry_delay=0.1,
+                                backoff=1)
+        result = retry_request(con.request)(action='/')
+        self.assertEqual(result, "success")
+
+        self.assertEqual(mock_connect.call_count, len(RETRY_EXCEPTIONS),
+                        'Retry logic failed')
+
 
 class CertificateConnectionClassTestCase(unittest.TestCase):
     def setUp(self):
diff --git a/libcloud/utils/retry.py b/libcloud/utils/retry.py
index cb48d74..49418a4 100644
--- a/libcloud/utils/retry.py
+++ b/libcloud/utils/retry.py
@@ -40,7 +40,7 @@ class TransientSSLError(ssl.SSLError):
 
 
 # Constants used by the ``retry`` class
-
+# All the time values (timeout, delay, backoff) are in seconds
 DEFAULT_TIMEOUT = 30  # default retry timeout
 DEFAULT_DELAY = 1  # default sleep delay used in each iterator
 DEFAULT_BACKOFF = 1  # retry backup multiplier