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:
parent
99f23eaabd
commit
f4a08b6ddf
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user