Exemplo n.º 1
0
    def test_backoff(self) -> None:
        """Backoff is computed correctly"""
        max_backoff = Retry.DEFAULT_BACKOFF_MAX

        retry = Retry(total=100, backoff_factor=0.2)
        assert retry.get_backoff_time() == 0  # First request

        retry = retry.increment(method="GET")
        assert retry.get_backoff_time() == 0  # First retry

        retry = retry.increment(method="GET")
        assert retry.backoff_factor == 0.2
        assert retry.total == 98
        assert retry.get_backoff_time() == 0.4  # Start backoff

        retry = retry.increment(method="GET")
        assert retry.get_backoff_time() == 0.8

        retry = retry.increment(method="GET")
        assert retry.get_backoff_time() == 1.6

        for _ in range(10):
            retry = retry.increment(method="GET")

        assert retry.get_backoff_time() == max_backoff
Exemplo n.º 2
0
    def test_history(self):
        retry = Retry(total=10, method_whitelist=frozenset(["GET", "POST"]))
        assert retry.history == tuple()
        connection_error = ConnectTimeoutError("conntimeout")
        retry = retry.increment("GET", "/test1", None, connection_error)
        history = (RequestHistory("GET", "/test1", connection_error, None,
                                  None), )
        assert retry.history == history

        read_error = ReadTimeoutError(None, "/test2", "read timed out")
        retry = retry.increment("POST", "/test2", None, read_error)
        history = (
            RequestHistory("GET", "/test1", connection_error, None, None),
            RequestHistory("POST", "/test2", read_error, None, None),
        )
        assert retry.history == history

        response = HTTPResponse(status=500)
        retry = retry.increment("GET", "/test3", response, None)
        history = (
            RequestHistory("GET", "/test1", connection_error, None, None),
            RequestHistory("POST", "/test2", read_error, None, None),
            RequestHistory("GET", "/test3", None, 500, None),
        )
        assert retry.history == history
Exemplo n.º 3
0
    def test_backoff(self):
        """ Backoff is computed correctly """
        max_backoff = Retry.BACKOFF_MAX

        retry = Retry(total=100, backoff_factor=0.2)
        self.assertEqual(retry.get_backoff_time(), 0)  # First request

        retry = retry.increment(method='GET')
        self.assertEqual(retry.get_backoff_time(), 0)  # First retry

        retry = retry.increment(method='GET')
        self.assertEqual(retry.backoff_factor, 0.2)
        self.assertEqual(retry.total, 98)
        self.assertEqual(retry.get_backoff_time(), 0.4)  # Start backoff

        retry = retry.increment(method='GET')
        self.assertEqual(retry.get_backoff_time(), 0.8)

        retry = retry.increment(method='GET')
        self.assertEqual(retry.get_backoff_time(), 1.6)

        for i in xrange(10):
            retry = retry.increment(method='GET')

        self.assertEqual(retry.get_backoff_time(), max_backoff)
Exemplo n.º 4
0
    def test_backoff(self):
        """ Backoff is computed correctly """
        max_backoff = Retry.BACKOFF_MAX

        retry = Retry(total=100, backoff_factor=0.2)
        self.assertEqual(retry.get_backoff_time(), 0) # First request

        retry = retry.increment()
        self.assertEqual(retry.get_backoff_time(), 0) # First retry

        retry = retry.increment()
        self.assertEqual(retry.backoff_factor, 0.2)
        self.assertEqual(retry.total, 98)
        self.assertEqual(retry.get_backoff_time(), 0.4) # Start backoff

        retry = retry.increment()
        self.assertEqual(retry.get_backoff_time(), 0.8)

        retry = retry.increment()
        self.assertEqual(retry.get_backoff_time(), 1.6)

        for i in xrange(10):
            retry = retry.increment()

        self.assertEqual(retry.get_backoff_time(), max_backoff)
Exemplo n.º 5
0
    def test_backoff(self):
        """ Backoff is computed correctly """
        max_backoff = Retry.BACKOFF_MAX

        retry = Retry(total=100, backoff_factor=0.2)
        assert retry.get_backoff_time() == 0  # First request

        retry = retry.increment(method='GET')
        assert retry.get_backoff_time() == 0  # First retry

        retry = retry.increment(method='GET')
        assert retry.backoff_factor == 0.2
        assert retry.total == 98
        assert retry.get_backoff_time() == 0.4  # Start backoff

        retry = retry.increment(method='GET')
        assert retry.get_backoff_time() == 0.8

        retry = retry.increment(method='GET')
        assert retry.get_backoff_time() == 1.6

        for _ in xrange(10):
            retry = retry.increment(method='GET')

        assert retry.get_backoff_time() == max_backoff
Exemplo n.º 6
0
 def test_retry_read_zero(self):
     """ No second chances on read timeouts, by default """
     error = ReadTimeoutError(None, "/", "read timed out")
     retry = Retry(read=0)
     with pytest.raises(MaxRetryError) as e:
         retry.increment(method='GET', error=error)
     assert e.value.reason == error
Exemplo n.º 7
0
    def test_error_message(self):
        retry = Retry(total=0)
        with pytest.raises(MaxRetryError) as e:
            retry = retry.increment(method="GET",
                                    error=ReadTimeoutError(
                                        None, "/", "read timed out"))
        assert "Caused by redirect" not in str(e.value)
        assert str(e.value.reason) == "None: read timed out"

        retry = Retry(total=1)
        with pytest.raises(MaxRetryError) as e:
            retry = retry.increment("POST", "/")
            retry = retry.increment("POST", "/")
        assert "Caused by redirect" not in str(e.value)
        assert isinstance(e.value.reason, ResponseError)
        assert str(e.value.reason) == ResponseError.GENERIC_ERROR

        retry = Retry(total=1)
        response = HTTPResponse(status=500)
        with pytest.raises(MaxRetryError) as e:
            retry = retry.increment("POST", "/", response=response)
            retry = retry.increment("POST", "/", response=response)
        assert "Caused by redirect" not in str(e.value)
        msg = ResponseError.SPECIFIC_ERROR.format(status_code=500)
        assert str(e.value.reason) == msg

        retry = Retry(connect=1)
        with pytest.raises(MaxRetryError) as e:
            retry = retry.increment(error=ConnectTimeoutError("conntimeout"))
            retry = retry.increment(error=ConnectTimeoutError("conntimeout"))
        assert "Caused by redirect" not in str(e.value)
        assert str(e.value.reason) == "conntimeout"
Exemplo n.º 8
0
 def test_retry_read_zero(self) -> None:
     """No second chances on read timeouts, by default"""
     error = ReadTimeoutError(DUMMY_POOL, "/", "read timed out")
     retry = Retry(read=0)
     with pytest.raises(MaxRetryError) as e:
         retry.increment(method="GET", error=error)
     assert e.value.reason == error
Exemplo n.º 9
0
    def test_history(self) -> None:
        retry = Retry(total=10, allowed_methods=frozenset(["GET", "POST"]))
        assert retry.history == tuple()
        connection_error = ConnectTimeoutError("conntimeout")
        retry = retry.increment("GET", "/test1", None, connection_error)
        test_history1 = (RequestHistory("GET", "/test1", connection_error,
                                        None, None), )
        assert retry.history == test_history1

        read_error = ReadTimeoutError(DUMMY_POOL, "/test2", "read timed out")
        retry = retry.increment("POST", "/test2", None, read_error)
        test_history2 = (
            RequestHistory("GET", "/test1", connection_error, None, None),
            RequestHistory("POST", "/test2", read_error, None, None),
        )
        assert retry.history == test_history2

        response = HTTPResponse(status=500)
        retry = retry.increment("GET", "/test3", response, None)
        test_history3 = (
            RequestHistory("GET", "/test1", connection_error, None, None),
            RequestHistory("POST", "/test2", read_error, None, None),
            RequestHistory("GET", "/test3", None, 500, None),
        )
        assert retry.history == test_history3
Exemplo n.º 10
0
    def test_error_message(self):
        retry = Retry(total=0)
        with pytest.raises(MaxRetryError) as e:
            retry = retry.increment(method='GET',
                                    error=ReadTimeoutError(None, "/", "read timed out"))
        assert 'Caused by redirect' not in str(e.value)
        assert str(e.value.reason) == 'None: read timed out'

        retry = Retry(total=1)
        with pytest.raises(MaxRetryError) as e:
            retry = retry.increment('POST', '/')
            retry = retry.increment('POST', '/')
        assert 'Caused by redirect' not in str(e.value)
        assert isinstance(e.value.reason, ResponseError)
        assert str(e.value.reason) == ResponseError.GENERIC_ERROR

        retry = Retry(total=1)
        response = HTTPResponse(status=500)
        with pytest.raises(MaxRetryError) as e:
            retry = retry.increment('POST', '/', response=response)
            retry = retry.increment('POST', '/', response=response)
        assert 'Caused by redirect' not in str(e.value)
        msg = ResponseError.SPECIFIC_ERROR.format(status_code=500)
        assert str(e.value.reason) == msg

        retry = Retry(connect=1)
        with pytest.raises(MaxRetryError) as e:
            retry = retry.increment(error=ConnectTimeoutError('conntimeout'))
            retry = retry.increment(error=ConnectTimeoutError('conntimeout'))
        assert 'Caused by redirect' not in str(e.value)
        assert str(e.value.reason) == 'conntimeout'
Exemplo n.º 11
0
 def test_retry_higher_total_loses(self) -> None:
     """A lower connect timeout than the total is honored"""
     error = ConnectTimeoutError()
     retry = Retry(connect=2, total=3)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     with pytest.raises(MaxRetryError):
         retry.increment(error=error)
Exemplo n.º 12
0
 def test_retry_higher_total_loses_vs_read(self) -> None:
     """A lower read timeout than the total is honored"""
     error = ReadTimeoutError(DUMMY_POOL, "/", "read timed out")
     retry = Retry(read=2, total=3)
     retry = retry.increment(method="GET", error=error)
     retry = retry.increment(method="GET", error=error)
     with pytest.raises(MaxRetryError):
         retry.increment(method="GET", error=error)
Exemplo n.º 13
0
 def test_status_counter(self):
     resp = HTTPResponse(status=400)
     retry = Retry(status=2)
     retry = retry.increment(response=resp)
     retry = retry.increment(response=resp)
     with pytest.raises(MaxRetryError) as e:
         retry.increment(response=resp)
     assert str(e.value.reason) == ResponseError.SPECIFIC_ERROR.format(status_code=400)
Exemplo n.º 14
0
 def test_status_counter(self):
     resp = HTTPResponse(status=400)
     retry = Retry(status=2)
     retry = retry.increment(response=resp)
     retry = retry.increment(response=resp)
     with pytest.raises(MaxRetryError) as e:
         retry.increment(response=resp)
     assert str(e.value.reason) == ResponseError.SPECIFIC_ERROR.format(status_code=400)
Exemplo n.º 15
0
 def test_retry_higher_total_loses_vs_read(self):
     """ A lower read timeout than the total is honored """
     error = ReadTimeoutError(None, "/", "read timed out")
     retry = Retry(read=2, total=3)
     retry = retry.increment(method='GET', error=error)
     retry = retry.increment(method='GET', error=error)
     with pytest.raises(MaxRetryError):
         retry.increment(method='GET', error=error)
Exemplo n.º 16
0
 def test_retry_higher_total_loses(self):
     """ A lower connect timeout than the total is honored """
     error = ConnectTimeoutError()
     retry = Retry(connect=2, total=3)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     with pytest.raises(MaxRetryError):
         retry.increment(error=error)
Exemplo n.º 17
0
 def test_status_counter(self) -> None:
     resp = HTTPResponse(status=400)
     retry = Retry(status=2)
     retry = retry.increment(response=resp)
     retry = retry.increment(response=resp)
     msg = ResponseError.SPECIFIC_ERROR.format(status_code=400)
     with pytest.raises(MaxRetryError, match=msg):
         retry.increment(response=resp)
Exemplo n.º 18
0
 def test_retry_read_zero(self):
     """ No second chances on read timeouts, by default """
     error = ReadTimeoutError(None, "/", "read timed out")
     retry = Retry(read=0)
     try:
         retry.increment(error=error)
         self.fail("Failed to raise error.")
     except MaxRetryError as e:
         self.assertEqual(e.reason, error)
Exemplo n.º 19
0
 def test_retry_both_specified(self) -> None:
     """Total can win if it's lower than the connect value"""
     error = ConnectTimeoutError()
     retry = Retry(connect=3, total=2)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     with pytest.raises(MaxRetryError) as e:
         retry.increment(error=error)
     assert e.value.reason == error
Exemplo n.º 20
0
 def test_retry_read_zero(self):
     """ No second chances on read timeouts, by default """
     error = ReadTimeoutError(None, "/", "read timed out")
     retry = Retry(read=0)
     try:
         retry.increment(method='GET', error=error)
         self.fail("Failed to raise error.")
     except MaxRetryError as e:
         self.assertEqual(e.reason, error)
Exemplo n.º 21
0
 def test_retry_both_specified(self):
     """Total can win if it's lower than the connect value"""
     error = ConnectTimeoutError()
     retry = Retry(connect=3, total=2)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     with pytest.raises(MaxRetryError) as e:
         retry.increment(error=error)
     assert e.value.reason == error
Exemplo n.º 22
0
 def test_backoff_reset_after_redirect(self):
     retry = Retry(total=100, redirect=5, backoff_factor=0.2)
     retry = retry.increment(method='GET')
     retry = retry.increment(method='GET')
     assert retry.get_backoff_time() == 0.4
     redirect_response = HTTPResponse(status=302, headers={'location': 'test'})
     retry = retry.increment(method='GET', response=redirect_response)
     assert retry.get_backoff_time() == 0
     retry = retry.increment(method='GET')
     retry = retry.increment(method='GET')
     assert retry.get_backoff_time() == 0.4
Exemplo n.º 23
0
 def test_backoff_reset_after_redirect(self):
     retry = Retry(total=100, redirect=5, backoff_factor=0.2)
     retry = retry.increment()
     retry = retry.increment()
     self.assertEqual(retry.get_backoff_time(), 0.4)
     redirect_response = HTTPResponse(status=302, headers={'location': 'test'})
     retry = retry.increment(response=redirect_response)
     self.assertEqual(retry.get_backoff_time(), 0)
     retry = retry.increment()
     retry = retry.increment()
     self.assertEqual(retry.get_backoff_time(), 0.4)
Exemplo n.º 24
0
 def test_backoff_reset_after_redirect(self) -> None:
     retry = Retry(total=100, redirect=5, backoff_factor=0.2)
     retry = retry.increment(method="GET")
     retry = retry.increment(method="GET")
     assert retry.get_backoff_time() == 0.4
     redirect_response = HTTPResponse(status=302, headers={"location": "test"})
     retry = retry.increment(method="GET", response=redirect_response)
     assert retry.get_backoff_time() == 0
     retry = retry.increment(method="GET")
     retry = retry.increment(method="GET")
     assert retry.get_backoff_time() == 0.4
Exemplo n.º 25
0
 def test_retry_both_specified(self):
     """Total can win if it's lower than the connect value"""
     error = ConnectTimeoutError()
     retry = Retry(connect=3, total=2)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     try:
         retry.increment(error=error)
         self.fail("Failed to raise error.")
     except MaxRetryError as e:
         self.assertEqual(e.reason, error)
Exemplo n.º 26
0
 def test_backoff_reset_after_redirect(self):
     retry = Retry(total=100, redirect=5, backoff_factor=0.2)
     retry = retry.increment(method='GET')
     retry = retry.increment(method='GET')
     assert retry.get_backoff_time() == 0.4
     redirect_response = HTTPResponse(status=302, headers={'location': 'test'})
     retry = retry.increment(method='GET', response=redirect_response)
     assert retry.get_backoff_time() == 0
     retry = retry.increment(method='GET')
     retry = retry.increment(method='GET')
     assert retry.get_backoff_time() == 0.4
Exemplo n.º 27
0
 def test_backoff_reset_after_redirect(self):
     retry = Retry(total=100, redirect=5, backoff_factor=0.2)
     retry = retry.increment()
     retry = retry.increment()
     self.assertEqual(retry.get_backoff_time(), 0.4)
     redirect_response = HTTPResponse(status=302, headers={'location': 'test'})
     retry = retry.increment(response=redirect_response)
     self.assertEqual(retry.get_backoff_time(), 0)
     retry = retry.increment()
     retry = retry.increment()
     self.assertEqual(retry.get_backoff_time(), 0.4)
Exemplo n.º 28
0
 def test_retry_both_specified(self):
     """Total can win if it's lower than the connect value"""
     error = ConnectTimeoutError()
     retry = Retry(connect=3, total=2)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     try:
         retry.increment(error=error)
         self.fail("Failed to raise error.")
     except MaxRetryError as e:
         self.assertEqual(e.reason, error)
Exemplo n.º 29
0
 def test_status_counter(self):
     resp = HTTPResponse(status=400)
     retry = Retry(status=2)
     retry = retry.increment(response=resp)
     retry = retry.increment(response=resp)
     try:
         retry.increment(response=resp)
         self.fail("Failed to raise error.")
     except MaxRetryError as e:
         self.assertEqual(
             str(e.reason),
             ResponseError.SPECIFIC_ERROR.format(status_code=400))
Exemplo n.º 30
0
    def test_retry_other(self) -> None:
        """If an unexpected error is raised, should retry other times"""
        other_error = SSLError()
        retry = Retry(connect=1)
        retry = retry.increment(error=other_error)
        retry = retry.increment(error=other_error)
        assert not retry.is_exhausted()

        retry = Retry(other=1)
        retry = retry.increment(error=other_error)
        with pytest.raises(MaxRetryError) as e:
            retry.increment(error=other_error)
        assert e.value.reason == other_error
Exemplo n.º 31
0
 def test_history(self):
     retry = Retry(total=10)
     self.assertEqual(retry.history, tuple())
     connection_error = ConnectTimeoutError('conntimeout')
     retry = retry.increment('GET', '/test1', None, connection_error)
     self.assertEqual(retry.history, (RequestHistory('GET', '/test1', connection_error, None, None),))
     read_error = ReadTimeoutError(None, "/test2", "read timed out")
     retry = retry.increment('POST', '/test2', None, read_error)
     self.assertEqual(retry.history, (RequestHistory('GET', '/test1', connection_error, None, None),
                                      RequestHistory('POST', '/test2', read_error, None, None)))
     response = HTTPResponse(status=500)
     retry = retry.increment('GET', '/test3', response, None)
     self.assertEqual(retry.history, (RequestHistory('GET', '/test1', connection_error, None, None),
                                      RequestHistory('POST', '/test2', read_error, None, None),
                                      RequestHistory('GET', '/test3', None, 500, None)))
Exemplo n.º 32
0
 def test_history(self):
     retry = Retry(total=10)
     self.assertEqual(retry.history, tuple())
     connection_error = ConnectTimeoutError('conntimeout')
     retry = retry.increment('GET', '/test1', None, connection_error)
     self.assertEqual(retry.history, (RequestHistory('GET', '/test1', connection_error, None, None),))
     read_error = ReadTimeoutError(None, "/test2", "read timed out")
     retry = retry.increment('POST', '/test2', None, read_error)
     self.assertEqual(retry.history, (RequestHistory('GET', '/test1', connection_error, None, None),
                                      RequestHistory('POST', '/test2', read_error, None, None)))
     response = HTTPResponse(status=500)
     retry = retry.increment('GET', '/test3', response, None)
     self.assertEqual(retry.history, (RequestHistory('GET', '/test1', connection_error, None, None),
                                      RequestHistory('POST', '/test2', read_error, None, None),
                                      RequestHistory('GET', '/test3', None, 500, None)))
Exemplo n.º 33
0
 def test_string(self):
     """ Retry string representation looks the way we expect """
     retry = Retry()
     self.assertEqual(str(retry), 'Retry(total=10, connect=None, read=None, redirect=None)')
     for _ in range(3):
         retry = retry.increment()
     self.assertEqual(str(retry), 'Retry(total=7, connect=None, read=None, redirect=None)')
Exemplo n.º 34
0
 def test_string(self):
     """ Retry string representation looks the way we expect """
     retry = Retry()
     self.assertEqual(str(retry), 'Retry(total=10, connect=None, read=None, redirect=None)')
     for _ in range(3):
         retry = retry.increment()
     self.assertEqual(str(retry), 'Retry(total=7, connect=None, read=None, redirect=None)')
Exemplo n.º 35
0
 def test_string(self):
     """ Retry string representation looks the way we expect """
     retry = Retry()
     assert str(retry) == 'Retry(total=10, connect=None, read=None, redirect=None, status=None)'
     for _ in range(3):
         retry = retry.increment(method='GET')
     assert str(retry) == 'Retry(total=7, connect=None, read=None, redirect=None, status=None)'
Exemplo n.º 36
0
 def test_retry_higher_total_loses_vs_read(self):
     """ A lower read timeout than the total is honored """
     error = ReadTimeoutError(None, "/", "read timed out")
     retry = Retry(read=2, total=3)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     self.assertRaises(MaxRetryError, retry.increment, error=error)
Exemplo n.º 37
0
 def test_string(self):
     """ Retry string representation looks the way we expect """
     retry = Retry()
     assert str(retry) == 'Retry(total=10, connect=None, read=None, redirect=None, status=None)'
     for _ in range(3):
         retry = retry.increment(method='GET')
     assert str(retry) == 'Retry(total=7, connect=None, read=None, redirect=None, status=None)'
Exemplo n.º 38
0
    def test_retry_total_none(self):
        """ if Total is none, connect error should take precedence """
        error = ConnectTimeoutError()
        retry = Retry(connect=2, total=None)
        retry = retry.increment(error=error)
        retry = retry.increment(error=error)
        with pytest.raises(MaxRetryError) as e:
            retry.increment(error=error)
        assert e.value.reason == error

        error = ReadTimeoutError(None, "/", "read timed out")
        retry = Retry(connect=2, total=None)
        retry = retry.increment(method='GET', error=error)
        retry = retry.increment(method='GET', error=error)
        retry = retry.increment(method='GET', error=error)
        assert not retry.is_exhausted()
Exemplo n.º 39
0
 def test_retry_higher_total_loses_vs_read(self):
     """ A lower read timeout than the total is honored """
     error = ReadTimeoutError(None, "/", "read timed out")
     retry = Retry(read=2, total=3)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     self.assertRaises(MaxRetryError, retry.increment, error=error)
Exemplo n.º 40
0
    def test_retry_total_none(self) -> None:
        """if Total is none, connect error should take precedence"""
        error = ConnectTimeoutError()
        retry = Retry(connect=2, total=None)
        retry = retry.increment(error=error)
        retry = retry.increment(error=error)
        with pytest.raises(MaxRetryError) as e:
            retry.increment(error=error)
        assert e.value.reason == error

        timeout_error = ReadTimeoutError(DUMMY_POOL, "/", "read timed out")
        retry = Retry(connect=2, total=None)
        retry = retry.increment(method="GET", error=timeout_error)
        retry = retry.increment(method="GET", error=timeout_error)
        retry = retry.increment(method="GET", error=timeout_error)
        assert not retry.is_exhausted()
Exemplo n.º 41
0
 def test_retry_higher_total_loses(self):
     """ A lower connect timeout than the total is honored """
     error = ConnectTimeoutError()
     retry = Retry(connect=2, total=3)
     retry = retry.increment(error=error)
     retry = retry.increment(error=error)
     self.assertRaises(MaxRetryError, retry.increment, error=error)
Exemplo n.º 42
0
    def test_retry_total_none(self):
        """ if Total is none, connect error should take precedence """
        error = ConnectTimeoutError()
        retry = Retry(connect=2, total=None)
        retry = retry.increment(error=error)
        retry = retry.increment(error=error)
        try:
            retry.increment(error=error)
            self.fail("Failed to raise error.")
        except MaxRetryError as e:
            self.assertEqual(e.reason, error)

        error = ReadTimeoutError(None, "/", "read timed out")
        retry = Retry(connect=2, total=None)
        retry = retry.increment(error=error)
        retry = retry.increment(error=error)
        retry = retry.increment(error=error)
        self.assertFalse(retry.is_exhausted())
Exemplo n.º 43
0
    def test_retry_total_none(self):
        """ if Total is none, connect error should take precedence """
        error = ConnectTimeoutError()
        retry = Retry(connect=2, total=None)
        retry = retry.increment(error=error)
        retry = retry.increment(error=error)
        try:
            retry.increment(error=error)
            self.fail("Failed to raise error.")
        except MaxRetryError as e:
            self.assertEqual(e.reason, error)

        error = ReadTimeoutError(None, "/", "read timed out")
        retry = Retry(connect=2, total=None)
        retry = retry.increment(method='GET', error=error)
        retry = retry.increment(method='GET', error=error)
        retry = retry.increment(method='GET', error=error)
        self.assertFalse(retry.is_exhausted())
Exemplo n.º 44
0
    def test_retry_default(self):
        """ If no value is specified, should retry connects 3 times """
        retry = Retry()
        self.assertEqual(retry.total, 10)
        self.assertEqual(retry.connect, None)
        self.assertEqual(retry.read, None)
        self.assertEqual(retry.redirect, None)

        error = ConnectTimeoutError()
        retry = Retry(connect=1)
        retry = retry.increment(error=error)
        self.assertRaises(MaxRetryError, retry.increment, error=error)

        retry = Retry(connect=1)
        retry = retry.increment(error=error)
        self.assertFalse(retry.is_exhausted())

        self.assertTrue(Retry(0).raise_on_redirect)
        self.assertFalse(Retry(False).raise_on_redirect)
Exemplo n.º 45
0
    def test_retry_default(self):
        """ If no value is specified, should retry connects 3 times """
        retry = Retry()
        self.assertEqual(retry.total, 10)
        self.assertEqual(retry.connect, None)
        self.assertEqual(retry.read, None)
        self.assertEqual(retry.redirect, None)

        error = ConnectTimeoutError()
        retry = Retry(connect=1)
        retry = retry.increment(error=error)
        self.assertRaises(MaxRetryError, retry.increment, error=error)

        retry = Retry(connect=1)
        retry = retry.increment(error=error)
        self.assertFalse(retry.is_exhausted())

        self.assertTrue(Retry(0).raise_on_redirect)
        self.assertFalse(Retry(False).raise_on_redirect)
Exemplo n.º 46
0
    def test_retry_default(self):
        """ If no value is specified, should retry connects 3 times """
        retry = Retry()
        assert retry.total == 10
        assert retry.connect is None
        assert retry.read is None
        assert retry.redirect is None

        error = ConnectTimeoutError()
        retry = Retry(connect=1)
        retry = retry.increment(error=error)
        with pytest.raises(MaxRetryError):
            retry.increment(error=error)

        retry = Retry(connect=1)
        retry = retry.increment(error=error)
        assert not retry.is_exhausted()

        assert Retry(0).raise_on_redirect
        assert not Retry(False).raise_on_redirect
Exemplo n.º 47
0
    def test_history(self):
        retry = Retry(total=10, method_whitelist=frozenset(['GET', 'POST']))
        assert retry.history == tuple()
        connection_error = ConnectTimeoutError('conntimeout')
        retry = retry.increment('GET', '/test1', None, connection_error)
        history = (RequestHistory('GET', '/test1', connection_error, None, None),)
        assert retry.history == history

        read_error = ReadTimeoutError(None, "/test2", "read timed out")
        retry = retry.increment('POST', '/test2', None, read_error)
        history = (RequestHistory('GET', '/test1', connection_error, None, None),
                   RequestHistory('POST', '/test2', read_error, None, None))
        assert retry.history == history

        response = HTTPResponse(status=500)
        retry = retry.increment('GET', '/test3', response, None)
        history = (RequestHistory('GET', '/test1', connection_error, None, None),
                   RequestHistory('POST', '/test2', read_error, None, None),
                   RequestHistory('GET', '/test3', None, 500, None))
        assert retry.history == history
Exemplo n.º 48
0
    def test_retry_default(self):
        """ If no value is specified, should retry connects 3 times """
        retry = Retry()
        assert retry.total == 10
        assert retry.connect is None
        assert retry.read is None
        assert retry.redirect is None

        error = ConnectTimeoutError()
        retry = Retry(connect=1)
        retry = retry.increment(error=error)
        with pytest.raises(MaxRetryError):
            retry.increment(error=error)

        retry = Retry(connect=1)
        retry = retry.increment(error=error)
        assert not retry.is_exhausted()

        assert Retry(0).raise_on_redirect
        assert not Retry(False).raise_on_redirect
Exemplo n.º 49
0
    def test_error_message(self):
        retry = Retry(total=0)
        try:
            retry = retry.increment(method='GET',
                                    error=ReadTimeoutError(
                                        None, "/", "read timed out"))
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertEqual(str(e.reason), 'None: read timed out')

        retry = Retry(total=1)
        try:
            retry = retry.increment('POST', '/')
            retry = retry.increment('POST', '/')
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertTrue(isinstance(e.reason, ResponseError),
                            "%s should be a ResponseError" % e.reason)
            self.assertEqual(str(e.reason), ResponseError.GENERIC_ERROR)

        retry = Retry(total=1)
        try:
            response = HTTPResponse(status=500)
            retry = retry.increment('POST', '/', response=response)
            retry = retry.increment('POST', '/', response=response)
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            msg = ResponseError.SPECIFIC_ERROR.format(status_code=500)
            self.assertEqual(str(e.reason), msg)

        retry = Retry(connect=1)
        try:
            retry = retry.increment(error=ConnectTimeoutError('conntimeout'))
            retry = retry.increment(error=ConnectTimeoutError('conntimeout'))
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertEqual(str(e.reason), 'conntimeout')
Exemplo n.º 50
0
    def test_error_message(self):
        retry = Retry(total=0)
        try:
            retry = retry.increment(method='GET',
                                    error=ReadTimeoutError(None, "/", "read timed out"))
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertEqual(str(e.reason), 'None: read timed out')

        retry = Retry(total=1)
        try:
            retry = retry.increment('POST', '/')
            retry = retry.increment('POST', '/')
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertTrue(isinstance(e.reason, ResponseError),
                            "%s should be a ResponseError" % e.reason)
            self.assertEqual(str(e.reason), ResponseError.GENERIC_ERROR)

        retry = Retry(total=1)
        try:
            response = HTTPResponse(status=500)
            retry = retry.increment('POST', '/', response=response)
            retry = retry.increment('POST', '/', response=response)
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            msg = ResponseError.SPECIFIC_ERROR.format(status_code=500)
            self.assertEqual(str(e.reason), msg)

        retry = Retry(connect=1)
        try:
            retry = retry.increment(error=ConnectTimeoutError('conntimeout'))
            retry = retry.increment(error=ConnectTimeoutError('conntimeout'))
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertEqual(str(e.reason), 'conntimeout')
Exemplo n.º 51
0
    def test_configurable_backoff_max(self) -> None:
        """Configurable backoff is computed correctly"""
        max_backoff = 1

        retry = Retry(total=100, backoff_factor=0.2, backoff_max=max_backoff)
        assert retry.get_backoff_time() == 0  # First request

        retry = retry.increment(method="GET")
        assert retry.get_backoff_time() == 0  # First retry

        retry = retry.increment(method="GET")
        assert retry.backoff_factor == 0.2
        assert retry.total == 98
        assert retry.get_backoff_time() == 0.4  # Start backoff

        retry = retry.increment(method="GET")
        assert retry.get_backoff_time() == 0.8

        retry = retry.increment(method="GET")
        assert retry.get_backoff_time() == max_backoff

        retry = retry.increment(method="GET")
        assert retry.get_backoff_time() == max_backoff
Exemplo n.º 52
0
    def test_error_message(self):
        retry = Retry(total=0)
        try:
            retry = retry.increment(error=ReadTimeoutError(None, "/", "read timed out"))
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertEqual(str(e.reason), 'None: read timed out')

        retry = Retry(total=1)
        try:
            retry = retry.increment('POST', '/')
            retry = retry.increment('POST', '/')
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertEqual(str(e.reason), 'received erroneous response too many times')

        retry = Retry(total=1)
        try:
            response = HTTPResponse(status=500)
            retry = retry.increment('POST', '/', response=response)
            retry = retry.increment('POST', '/', response=response)
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertEqual(str(e.reason), 'received 500 server error too many times')

        retry = Retry(connect=1)
        try:
            retry = retry.increment(error=ConnectTimeoutError('conntimeout'))
            retry = retry.increment(error=ConnectTimeoutError('conntimeout'))
            raise AssertionError("Should have raised a MaxRetryError")
        except MaxRetryError as e:
            assert 'Caused by redirect' not in str(e)
            self.assertEqual(str(e.reason), 'conntimeout')
Exemplo n.º 53
0
 def test_zero_backoff(self):
     retry = Retry()
     assert retry.get_backoff_time() == 0
     retry = retry.increment(method='GET')
     retry = retry.increment(method='GET')
     assert retry.get_backoff_time() == 0
Exemplo n.º 54
0
 def test_retry_method_not_allowed(self) -> None:
     error = ReadTimeoutError(DUMMY_POOL, "/", "read timed out")
     retry = Retry()
     with pytest.raises(ReadTimeoutError):
         retry.increment(method="POST", error=error)
Exemplo n.º 55
0
 def test_retry_method_not_in_whitelist(self):
     error = ReadTimeoutError(None, "/", "read timed out")
     retry = Retry()
     with pytest.raises(ReadTimeoutError):
         retry.increment(method='POST', error=error)
Exemplo n.º 56
0
 def test_zero_backoff(self):
     retry = Retry()
     self.assertEqual(retry.get_backoff_time(), 0)
     retry = retry.increment()
     retry = retry.increment()
     self.assertEqual(retry.get_backoff_time(), 0)
Exemplo n.º 57
0
 def test_sleep(self):
     # sleep a very small amount of time so our code coverage is happy
     retry = Retry(backoff_factor=0.0001)
     retry = retry.increment()
     retry = retry.increment()
     retry.sleep()