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):