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:35 UTC

[libcloud] 02/03: Simplify a bunch of tests to reduce two unncessary levels of nesting which made code much harder to read.

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 af7f4c4bbd3f8f89973e9ad286e9b0afdbc35ab0
Author: Tomaz Muraus <to...@tomaz.me>
AuthorDate: Thu Nov 4 12:13:02 2021 +0100

    Simplify a bunch of tests to reduce two unncessary levels of nesting
    which made code much harder to read.
---
 libcloud/test/test_connection.py | 157 ++++++++++++++++++---------------------
 1 file changed, 72 insertions(+), 85 deletions(-)

diff --git a/libcloud/test/test_connection.py b/libcloud/test/test_connection.py
index e098f48..7a87aed 100644
--- a/libcloud/test/test_connection.py
+++ b/libcloud/test/test_connection.py
@@ -428,75 +428,66 @@ class ConnectionClassTestCase(unittest.TestCase):
     def _raise_socket_error(self):
         raise socket.gaierror('')
 
-    def test_retry_with_sleep(self):
+    @patch('libcloud.common.base.Connection.request')
+    def test_retry_with_sleep(self, mock_connect):
         con = Connection()
         con.connection = Mock()
-        connect_method = 'libcloud.common.base.Connection.request'
 
-        with patch(connect_method) as mock_connect:
-            mock_connect.__name__ = 'mock_connect'
-            with self.assertRaises(socket.gaierror):
-                mock_connect.side_effect = socket.gaierror('')
-                retry_request = Retry(timeout=0.2, retry_delay=0.1,
-                                      backoff=1)
-                retry_request(con.request)(action='/')
+        mock_connect.side_effect = socket.gaierror('')
+        retry_request = Retry(timeout=0.2, retry_delay=0.1,
+                                backoff=1)
+        self.assertRaises(socket.gaierror,
+                          retry_request(con.request), action='/')
 
-            self.assertGreater(mock_connect.call_count, 1,
-                               'Retry logic failed')
+        self.assertGreater(mock_connect.call_count, 1,
+                            'Retry logic failed')
 
-    def test_retry_with_timeout(self):
+    @patch('libcloud.common.base.Connection.request')
+    def test_retry_with_timeout(self, mock_connect):
         con = Connection()
         con.connection = Mock()
-        connect_method = 'libcloud.common.base.Connection.request'
 
-        with patch(connect_method) as mock_connect:
-            mock_connect.__name__ = 'mock_connect'
-            with self.assertRaises(socket.gaierror):
-                mock_connect.side_effect = socket.gaierror('')
-                retry_request = Retry(timeout=0.2, retry_delay=0.1,
-                                      backoff=1)
-                retry_request(con.request)(action='/')
+        mock_connect.side_effect = socket.gaierror('')
+        retry_request = Retry(timeout=0.2, retry_delay=0.1,
+                                backoff=1)
+        self.assertRaises(socket.gaierror,
+                          retry_request(con.request), action='/')
 
-            self.assertGreater(mock_connect.call_count, 1,
-                               'Retry logic failed')
+        self.assertGreater(mock_connect.call_count, 1,
+                            'Retry logic failed')
 
-    def test_retry_with_backoff(self):
+    @patch('libcloud.common.base.Connection.request')
+    def test_retry_with_backoff(self, mock_connect):
         con = Connection()
         con.connection = Mock()
-        connect_method = 'libcloud.common.base.Connection.request'
 
-        with patch(connect_method) as mock_connect:
-            mock_connect.__name__ = 'mock_connect'
-            with self.assertRaises(socket.gaierror):
-                mock_connect.side_effect = socket.gaierror('')
-                retry_request = Retry(timeout=0.2, retry_delay=0.1,
-                                      backoff=1)
-                retry_request(con.request)(action='/')
-
-            self.assertGreater(mock_connect.call_count, 1,
-                               'Retry logic failed')
+        mock_connect.side_effect = socket.gaierror('')
+        retry_request = Retry(timeout=0.2, retry_delay=0.1,
+                                backoff=1)
+        self.assertRaises(socket.gaierror,
+                          retry_request(con.request), action='/')
+        self.assertGreater(mock_connect.call_count, 1,
+                            'Retry logic failed')
 
-    def test_retry_rate_limit_error_timeout(self):
+    @patch('libcloud.common.base.Connection.request')
+    def test_retry_rate_limit_error_timeout(self, mock_connect):
         con = Connection()
         con.connection = Mock()
-        connect_method = 'libcloud.common.base.Connection.request'
-
-        with patch(connect_method) as mock_connect:
-            mock_connect.__name__ = 'mock_connect'
-            with self.assertRaises(RateLimitReachedError):
-                headers = {'retry-after': 0.2}
-                mock_connect.side_effect = RateLimitReachedError(headers=headers)
-                retry_request = Retry(timeout=0.4, retry_delay=0.1,
-                                      backoff=1)
-                retry_request(con.request)(action='/')
-
-            self.assertEqual(mock_connect.call_count, 2,
-                            'Retry logic failed')
 
-    def test_retry_rate_limit_error_forever_with_old_retry_class(self):
+        mock_connect.__name__ = 'mock_connect'
+        headers = {'retry-after': 0.2}
+        mock_connect.side_effect = RateLimitReachedError(headers=headers)
+        retry_request = Retry(timeout=0.4, retry_delay=0.1,
+                                backoff=1)
+        self.assertRaises(RateLimitReachedError,
+                          retry_request(con.request), action='/')
+        self.assertEqual(mock_connect.call_count, 2,
+                        'Retry logic failed')
+
+    @patch('libcloud.common.base.Connection.request')
+    def test_retry_rate_limit_error_forever_with_old_retry_class(self, mock_connect):
         con = Connection()
         con.connection = Mock()
-        connect_method = 'libcloud.common.base.Connection.request'
 
         self.retry_counter = 0
 
@@ -509,43 +500,40 @@ class ConnectionClassTestCase(unittest.TestCase):
 
             return 'success'
 
-        with patch(connect_method) as mock_connect:
-            mock_connect.__name__ = 'mock_connect'
-            headers = {'retry-after': 0.2}
-            mock_connect.side_effect = mock_connect_side_effect
-            retry_request = RetryForeverOnRateLimitError(timeout=0.1, retry_delay=0.1,
-                                    backoff=1)
-            retry_request(con.request)(action='/')
+        mock_connect.__name__ = 'mock_connect'
+        headers = {'retry-after': 0.2}
+        mock_connect.side_effect = mock_connect_side_effect
+        retry_request = RetryForeverOnRateLimitError(timeout=0.1, retry_delay=0.1,
+                                backoff=1)
+        retry_request(con.request)(action='/')
 
-            # We have waited longer the timeout but continue to retry
-            result = retry_request(con.request)(action='/')
-            self.assertEqual(result, "success")
+        # We have waited longer the timeout but continue to retry
+        result = retry_request(con.request)(action='/')
+        self.assertEqual(result, "success")
 
-            self.assertEqual(mock_connect.call_count, 5,
-                            'Retry logic failed')
+        self.assertEqual(mock_connect.call_count, 5,
+                        'Retry logic failed')
 
-    def test_retry_should_not_retry_on_non_defined_exception(self):
+    @patch('libcloud.common.base.Connection.request')
+    def test_retry_should_not_retry_on_non_defined_exception(self, mock_connect):
         con = Connection()
         con.connection = Mock()
         connect_method = 'libcloud.common.base.Connection.request'
 
         self.retry_counter = 0
 
-        with patch(connect_method) as mock_connect:
-            mock_connect.__name__ = 'mock_connect'
-            with self.assertRaises(ValueError):
-                headers = {'retry-after': 0.2}
-                mock_connect.side_effect = ValueError('should not retry this '
-                                                    'error')
-                retry_request = Retry(timeout=5, retry_delay=0.1, backoff=1)
-                retry_request(con.request)(action='/')
-
-                retry_request(con.request)(action='/')
+        mock_connect.__name__ = 'mock_connect'
+        headers = {'retry-after': 0.2}
+        mock_connect.side_effect = ValueError('should not retry this '
+                                            'error')
+        retry_request = Retry(timeout=5, retry_delay=0.1, backoff=1)
 
-            self.assertEqual(mock_connect.call_count, 1,
-                            'Retry logic failed')
+        self.assertRaisesRegex(ValueError, 'should not retry this error',
+                               retry_request(con.request), action='/')
+        self.assertEqual(mock_connect.call_count, 1, 'Retry logic failed')
 
-    def test_retry_rate_limit_error_success_on_second_attempt(self):
+    @patch('libcloud.common.base.Connection.request')
+    def test_retry_rate_limit_error_success_on_second_attempt(self, mock_connect):
         con = Connection()
         con.connection = Mock()
         connect_method = 'libcloud.common.base.Connection.request'
@@ -561,16 +549,15 @@ class ConnectionClassTestCase(unittest.TestCase):
 
             return 'success'
 
-        with patch(connect_method) as mock_connect:
-            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")
+        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, 2,
-                            'Retry logic failed')
+        self.assertEqual(mock_connect.call_count, 2,
+                        'Retry logic failed')
 
 
 class CertificateConnectionClassTestCase(unittest.TestCase):