1
0
mirror of https://github.com/django/django.git synced 2024-12-22 17:16:24 +00:00

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 11393ab131.
This commit is contained in:
Carlton Gibson 2024-05-28 19:36:34 +02:00 committed by GitHub
parent 99f23eaabd
commit f4a08b6ddf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -475,6 +475,7 @@ class ASGITest(SimpleTestCase):
sync_waiter.active_threads.clear() sync_waiter.active_threads.clear()
async def test_asyncio_cancel_error(self): async def test_asyncio_cancel_error(self):
view_started = asyncio.Event()
# Flag to check if the view was cancelled. # Flag to check if the view was cancelled.
view_did_cancel = False view_did_cancel = False
# Track request_finished signal. # Track request_finished signal.
@ -484,9 +485,10 @@ class ASGITest(SimpleTestCase):
# A view that will listen for the cancelled error. # A view that will listen for the cancelled error.
async def view(request): async def view(request):
nonlocal view_did_cancel nonlocal view_started, view_did_cancel
view_started.set()
try: try:
await asyncio.sleep(0.2) await asyncio.sleep(0.1)
return HttpResponse("Hello World!") return HttpResponse("Hello World!")
except asyncio.CancelledError: except asyncio.CancelledError:
# Set the flag. # Set the flag.
@ -522,6 +524,7 @@ class ASGITest(SimpleTestCase):
self.assertNotEqual(handler_call["thread"], threading.current_thread()) self.assertNotEqual(handler_call["thread"], threading.current_thread())
# The signal sender is the handler class. # The signal sender is the handler class.
self.assertEqual(handler_call["kwargs"], {"sender": TestASGIHandler}) self.assertEqual(handler_call["kwargs"], {"sender": TestASGIHandler})
view_started.clear()
# Request cycle with a disconnect before the view can respond. # Request cycle with a disconnect before the view can respond.
application = TestASGIHandler() application = TestASGIHandler()
@ -529,7 +532,7 @@ class ASGITest(SimpleTestCase):
communicator = ApplicationCommunicator(application, scope) communicator = ApplicationCommunicator(application, scope)
await communicator.send_input({"type": "http.request"}) await communicator.send_input({"type": "http.request"})
# Let the view actually start. # Let the view actually start.
await asyncio.sleep(0.1) await view_started.wait()
# Disconnect the client. # Disconnect the client.
await communicator.send_input({"type": "http.disconnect"}) await communicator.send_input({"type": "http.disconnect"})
# The handler should not send a response. # The handler should not send a response.