From 2b43bc87961c04cde9f6b83c9e1c0848adc083a6 Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Tue, 4 Nov 2025 14:59:42 +0900 Subject: [PATCH] Increase timeout tests delay and use uvicorn Signed-off-by: Anuraag Agrawal --- test/test_errors.py | 58 +++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/test/test_errors.py b/test/test_errors.py index ba5fe5c..9ba218d 100644 --- a/test/test_errors.py +++ b/test/test_errors.py @@ -2,9 +2,9 @@ import time from http import HTTPStatus from typing import NoReturn -from wsgiref.simple_server import WSGIServer, make_server import pytest +import uvicorn from httpx import ( ASGITransport, AsyncClient, @@ -320,31 +320,41 @@ async def make_hat(self, request, ctx): # To exercise timeouts, can't use mock transports @pytest.fixture(scope="module") -def sync_timeout_server(): - class SleepingHaberdasherSync(HaberdasherSync): +def timeout_server(): + class SleepingHaberdasher(Haberdasher): def make_hat(self, request, ctx) -> NoReturn: time.sleep(10) raise AssertionError("Should be timedout already") - app = HaberdasherWSGIApplication(SleepingHaberdasherSync()) + app = HaberdasherASGIApplication(SleepingHaberdasher()) + config = uvicorn.Config( + app, port=0, log_level="critical", timeout_graceful_shutdown=0 + ) + server = uvicorn.Server(config) + # Since we want to target the server from sync clients as well as async, + # it's best to use a sync fixture with the server on a background thread. + thread = threading.Thread(target=server.run) + thread.daemon = True + thread.start() + + for _ in range(50): + if server.started: + break + time.sleep(0.1) + assert server.started + + port = server.servers[0].sockets[0].getsockname()[1] + + yield f"http://localhost:{port}" - with make_server("", 0, app) as httpd: - thread = threading.Thread(target=httpd.serve_forever) - thread.daemon = True - thread.start() - try: - yield httpd - finally: - # Don't wait for sleeping server to shutdown cleanly for this - # test, we don't care anyways. - pass + server.should_exit = True @pytest.mark.parametrize( - ("client_timeout_ms", "call_timeout_ms"), [(1, None), (None, 1)] + ("client_timeout_ms", "call_timeout_ms"), [(50, None), (None, 50)] ) def test_sync_client_timeout( - client_timeout_ms, call_timeout_ms, sync_timeout_server: WSGIServer + client_timeout_ms, call_timeout_ms, timeout_server: str ) -> None: recorded_timeout_header = "" @@ -365,9 +375,7 @@ def modify_timeout_header(request: Request) -> None: event_hooks={"request": [modify_timeout_header]}, ) as session, HaberdasherClientSync( - f"http://localhost:{sync_timeout_server.server_port}", - timeout_ms=client_timeout_ms, - session=session, + timeout_server, timeout_ms=client_timeout_ms, session=session ) as client, pytest.raises(ConnectError) as exc_info, ): @@ -375,15 +383,15 @@ def modify_timeout_header(request: Request) -> None: assert exc_info.value.code == Code.DEADLINE_EXCEEDED assert exc_info.value.message == "Request timed out" - assert recorded_timeout_header == "1" + assert recorded_timeout_header == "50" @pytest.mark.asyncio @pytest.mark.parametrize( - ("client_timeout_ms", "call_timeout_ms"), [(1, None), (None, 1)] + ("client_timeout_ms", "call_timeout_ms"), [(50, None), (None, 50)] ) async def test_async_client_timeout( - client_timeout_ms, call_timeout_ms, sync_timeout_server: WSGIServer + client_timeout_ms, call_timeout_ms, timeout_server: str ) -> None: recorded_timeout_header = "" @@ -398,9 +406,7 @@ async def modify_timeout_header(request: Request) -> None: timeout=Timeout(None), event_hooks={"request": [modify_timeout_header]} ) as session, HaberdasherClient( - f"http://localhost:{sync_timeout_server.server_port}", - timeout_ms=client_timeout_ms, - session=session, + timeout_server, timeout_ms=client_timeout_ms, session=session ) as client, ): with pytest.raises(ConnectError) as exc_info: @@ -408,4 +414,4 @@ async def modify_timeout_header(request: Request) -> None: assert exc_info.value.code == Code.DEADLINE_EXCEEDED assert exc_info.value.message == "Request timed out" - assert recorded_timeout_header == "1" + assert recorded_timeout_header == "50"