From 7900f4c3ef0a5bf6b2b8b7a3604410d841dd333a Mon Sep 17 00:00:00 2001 From: Devon Stewart Date: Sat, 15 Mar 2025 22:40:16 -0700 Subject: [PATCH] Switch from context manager to a straight binding to avoid deadlock --- tests/river_fixtures/clientserver.py | 46 ++++++++++++++++------------ 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/tests/river_fixtures/clientserver.py b/tests/river_fixtures/clientserver.py index 7c9d3172..3f4ff446 100644 --- a/tests/river_fixtures/clientserver.py +++ b/tests/river_fixtures/clientserver.py @@ -38,32 +38,38 @@ async def client( transport_options: TransportOptions, no_logging_error: NoErrors, ) -> AsyncGenerator[Client, None]: + binding = None try: - async with serve(server.serve, "127.0.0.1") as binding: - sockets = list(binding.sockets) - assert len(sockets) == 1, "Too many sockets!" - socket = sockets[0] + binding = await serve(server.serve, "127.0.0.1") + sockets = list(binding.sockets) + assert len(sockets) == 1, "Too many sockets!" + socket = sockets[0] - async def websocket_uri_factory() -> UriAndMetadata[None]: - return { - "uri": "ws://%s:%d" % socket.getsockname(), - "metadata": None, - } + async def websocket_uri_factory() -> UriAndMetadata[None]: + return { + "uri": "ws://%s:%d" % socket.getsockname(), + "metadata": None, + } + + client: Client[Literal[None]] = Client[None]( + uri_and_metadata_factory=websocket_uri_factory, + client_id="test_client", + server_id="test_server", + transport_options=transport_options, + ) + try: + yield client + finally: + logging.debug("Start closing test client : %s", "test_client") + await client.close() - client: Client[Literal[None]] = Client[None]( - uri_and_metadata_factory=websocket_uri_factory, - client_id="test_client", - server_id="test_server", - transport_options=transport_options, - ) - try: - yield client - finally: - logging.debug("Start closing test client : %s", "test_client") - await client.close() finally: await asyncio.sleep(1) logging.debug("Start closing test server") + if binding: + binding.close() await server.close() + if binding: + await binding.wait_closed() # Server should close normally no_logging_error()