From f4a08b6ddfcacadfe9ff8364bf1c6c54f5dd370f Mon Sep 17 00:00:00 2001 From: Carlton Gibson Date: Tue, 28 May 2024 19:36:34 +0200 Subject: [PATCH] Refs #35059 -- Used asyncio.Event in ASGITest.test_asyncio_cancel_error to enforce specific interleaving. Sleep call leads to a hard to trace error in CI. Using an Event is more deterministic, and should be less prone to environment variations. Bug in 11393ab1316f973c5fbb534305750740d909b4e4. --- tests/asgi/tests.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/asgi/tests.py b/tests/asgi/tests.py index 963f45f798..658e9d853e 100644 --- a/tests/asgi/tests.py +++ b/tests/asgi/tests.py @@ -475,6 +475,7 @@ class ASGITest(SimpleTestCase): sync_waiter.active_threads.clear() async def test_asyncio_cancel_error(self): + view_started = asyncio.Event() # Flag to check if the view was cancelled. view_did_cancel = False # Track request_finished signal. @@ -484,9 +485,10 @@ class ASGITest(SimpleTestCase): # A view that will listen for the cancelled error. async def view(request): - nonlocal view_did_cancel + nonlocal view_started, view_did_cancel + view_started.set() try: - await asyncio.sleep(0.2) + await asyncio.sleep(0.1) return HttpResponse("Hello World!") except asyncio.CancelledError: # Set the flag. @@ -522,6 +524,7 @@ class ASGITest(SimpleTestCase): self.assertNotEqual(handler_call["thread"], threading.current_thread()) # The signal sender is the handler class. self.assertEqual(handler_call["kwargs"], {"sender": TestASGIHandler}) + view_started.clear() # Request cycle with a disconnect before the view can respond. application = TestASGIHandler() @@ -529,7 +532,7 @@ class ASGITest(SimpleTestCase): communicator = ApplicationCommunicator(application, scope) await communicator.send_input({"type": "http.request"}) # Let the view actually start. - await asyncio.sleep(0.1) + await view_started.wait() # Disconnect the client. await communicator.send_input({"type": "http.disconnect"}) # The handler should not send a response.