Description
I tried to make a fixture to throw an exception after a certain amount of time to catch deadlocks in my tests, but the exception isn't causing the TaskGroup to error out.
Here is a minimal example fixture that interacts with a literally trivial test
https://github.com/sawalls/pytest-asyncio-example/blob/main/tests/conftest.py
@fixture(scope="function")
async def async_buddy():
mytasks = set()
async def forever_loop():
while True:
await sleep(1)
async def exception_task():
await sleep(5)
raise Exception("This is an exception")
async with TaskGroup() as tg:
mytasks.add(tg.create_task(forever_loop()))
mytasks.add(tg.create_task(exception_task()))
yield
---
async def test_example(async_buddy):
pass
It's inspired by the recipe in the python docs to terminate a TaskGroup:
https://docs.python.org/3/library/asyncio-task.html#terminating-a-task-group
Expected behavior:
- Make TaskGroup
- Make Tasks
- Yield to test, which returns immediately
- Enter context manager waiting for tasks
- Get Exception from exception task, cancel all tasks, and throw out of the fixture
Observed behavior:
- Make TaskGroup
- Make Tasks
- Yield to test, which returns immediately (so at this point the test has reported success)
- Enter context manager waiting for tasks
- Hangs indefinitely
Please let me know if there's anything about my intentions I can make more clear or documents I should read to get a better understanding.
Also, if you want to direct me at some code to understand the library's understanding of this, I may be able to try and reason about it.