diff --git a/cliboa/adapter/http.py b/cliboa/adapter/http.py index 6dd87c67..07e5efa0 100644 --- a/cliboa/adapter/http.py +++ b/cliboa/adapter/http.py @@ -44,7 +44,7 @@ def request(self): def execute(self): self._logger.info("local path: %s" % self._dest_path) res = None - for _ in range(self._retry_cnt): + for attempt in range(self._retry_cnt): try: res = self.request() res.raise_for_status() @@ -55,11 +55,13 @@ def execute(self): except Exception as e: self._logger.warning(e) - self._logger.warning( - "Unexpected error occurred during http request. Retry will start in %s", - self._retry_intvl_sec, - ) - sleep(self._retry_intvl_sec) + # Sleep only when another attempt is scheduled. + if attempt < self._retry_cnt - 1: + self._logger.warning( + "Unexpected error occurred during http request. Retry will start in %s", + self._retry_intvl_sec, + ) + sleep(self._retry_intvl_sec) if res is not None: raise HTTPError("Http request failed. HTTP Status code: %s" % res.status_code) diff --git a/tests/adapter/test_http.py b/tests/adapter/test_http.py index 09cf5f72..9a2d8884 100644 --- a/tests/adapter/test_http.py +++ b/tests/adapter/test_http.py @@ -61,6 +61,37 @@ def test_execute_ng(self, mock_get): assert "Http request failed" in str(execinfo.value) + @patch("cliboa.adapter.http.sleep") + @patch("cliboa.adapter.http.requests.get") + def test_execute_ng_no_sleep_after_final_failure(self, mock_get, mock_sleep): + # Final failed attempt should not sleep when no further retry is scheduled. + mock_get.side_effect = HTTPError("Http request failed.") + + url = "https://spam.com/get" + timeout = 1 + retry_cnt = 1 + retry_intvl_sec = 1 + d = Download(url, self._dest_path, timeout, retry_cnt, retry_intvl_sec) + with pytest.raises(HTTPError): + d.execute() + mock_sleep.assert_not_called() + + @patch("cliboa.adapter.http.sleep") + @patch("cliboa.adapter.http.requests.get") + def test_execute_ng_sleeps_between_retries(self, mock_get, mock_sleep): + mock_get.side_effect = HTTPError("Http request failed.") + + url = "https://spam.com/get" + timeout = 1 + retry_cnt = 3 + retry_intvl_sec = 2 + d = Download(url, self._dest_path, timeout, retry_cnt, retry_intvl_sec) + with pytest.raises(HTTPError): + d.execute() + assert mock_sleep.call_count == 2 + mock_sleep.assert_called_with(2) + + class TestUpload(object): def setup_method(self, method): self._dest_path = "/tmp/test.result"