예제 #1
0
    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")
예제 #2
0
    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")
예제 #3
0
    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')
예제 #4
0
    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")
예제 #5
0
    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')
예제 #6
0
    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")
예제 #7
0
    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")
예제 #8
0
    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')