1
0
mirror of https://github.com/django/django.git synced 2025-03-29 02:30:48 +00:00

[5.1.x] Refs -- 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.

Backport of f4a08b6ddfcacadfe9ff8364bf1c6c54f5dd370f from main.
This commit is contained in:
Carlton Gibson 2024-05-28 19:36:34 +02:00 committed by Natalia
parent 3fb3b8a4fd
commit 38248588f6

@ -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.