def test_retry_with_backoff(self, mock_connect): con = Connection() con.connection = Mock() mock_connect.side_effect = socket.gaierror("") retry_request = Retry(timeout=1, 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, mock_connect): con = Connection() con.connection = Mock() mock_connect.__name__ = "mock_connect" headers = {"retry-after": 0.2} mock_connect.side_effect = RateLimitReachedError(headers=headers) retry_request = Retry(timeout=1, retry_delay=0.1, backoff=1) self.assertRaises(RateLimitReachedError, retry_request(con.request), action="/") self.assertGreater(mock_connect.call_count, 1, "Retry logic failed")
def test_retry_rate_limit_error_timeout(self, mock_connect): con = Connection() con.connection = Mock() 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')
def test_retry_should_not_retry_on_non_defined_exception(self, mock_connect): con = Connection() con.connection = Mock() self.retry_counter = 0 mock_connect.__name__ = "mock_connect" mock_connect.side_effect = ValueError("should not retry this " "error") retry_request = Retry(timeout=5, retry_delay=0.1, backoff=1) 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_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 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.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_on_all_default_retry_exception_classes(self, mock_connect): con = Connection() con.connection = Mock() 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")
def test_retry_rate_limit_error_success_on_second_attempt(self, mock_connect): con = Connection() con.connection = Mock() self.retry_counter = 0 def mock_connect_side_effect(*args, **kwargs): self.retry_counter += 1 if self.retry_counter < 2: headers = {"retry-after": 0.2} raise RateLimitReachedError(headers=headers) return "success" mock_connect.__name__ = "mock_connect" mock_connect.side_effect = mock_connect_side_effect retry_request = Retry(timeout=1, 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")
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' self.retry_counter = 0 def mock_connect_side_effect(*args, **kwargs): self.retry_counter += 1 if self.retry_counter < 2: headers = {'retry-after': 0.2} raise RateLimitReachedError(headers=headers) 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, 2, 'Retry logic failed')