99import httpx
1010import pytest
1111import uvicorn
12+ import uvloop
1213from fastapi import APIRouter , BackgroundTasks , FastAPI
1314from pytest_simcore .helpers .logging_tools import log_context
1415from servicelib .fastapi .cancellation_middleware import RequestCancellationMiddleware
@@ -61,6 +62,7 @@ async def _sleep_in_the_back(sleep_time: float) -> None:
6162 await server_cancelled_mock ()
6263 finally :
6364 server_done_event .set ()
65+ ctx .logger .info ("current_loop_id=%s" , id (asyncio .get_running_loop ()))
6466
6567 @router .get ("/sleep-with-background-task" )
6668 async def sleep_with_background_task (
@@ -84,15 +86,19 @@ def fastapi_app(fastapi_router: APIRouter) -> FastAPI:
8486
8587@pytest .fixture
8688def uvicorn_server (fastapi_app : FastAPI ) -> Iterator [URL ]:
89+
90+ server_host = "127.0.0.1"
8791 server_port = unused_port ()
92+ server_url = f"http://{ server_host } :{ server_port } "
93+
8894 with log_context (
8995 logging .INFO ,
90- msg = f"with uvicorn server on 127.0.0.1: { server_port } " ,
96+ msg = f"with uvicorn server on { server_url } " ,
9197 ) as ctx :
9298
9399 config = uvicorn .Config (
94100 fastapi_app ,
95- host = "127.0.0.1" ,
101+ host = server_host ,
96102 port = server_port ,
97103 log_level = "error" ,
98104 loop = "uvloop" ,
@@ -103,8 +109,6 @@ def uvicorn_server(fastapi_app: FastAPI) -> Iterator[URL]:
103109 thread .daemon = True
104110 thread .start ()
105111
106- server_url = f"http://127.0.0.1:{ server_port } "
107-
108112 @retry (wait = wait_fixed (0.1 ), stop = stop_after_delay (10 ), reraise = True )
109113 def wait_for_server_ready () -> None :
110114 response = httpx .get (f"{ server_url } /" )
@@ -114,10 +118,7 @@ def wait_for_server_ready() -> None:
114118
115119 wait_for_server_ready ()
116120
117- ctx .logger .info (
118- "server ready at: %s" ,
119- server_url ,
120- )
121+ ctx .logger .info ("server ready at: %s" , server_url )
121122
122123 yield URL (server_url )
123124
@@ -131,6 +132,7 @@ async def test_server_cancels_when_client_disconnects(
131132 server_cancelled_mock : AsyncMock ,
132133):
133134 # Implementation of RequestCancellationMiddleware is under test here
135+ assert isinstance (asyncio .get_running_loop (), uvloop .Loop )
134136
135137 async with httpx .AsyncClient (base_url = f"{ uvicorn_server } " ) as client :
136138 # 1. check standard call still complete as expected
@@ -156,6 +158,8 @@ async def test_server_cancels_when_client_disconnects(
156158 )
157159 ctx .logger .info ("client disconnected from server" )
158160
161+ await asyncio .sleep (0.1 ) # ensure context switches ???
162+
159163 # request should have been cancelled after the ReadTimoeut!
160164 async with asyncio .timeout (5 ):
161165 await server_done_event .wait ()
0 commit comments