Skip to content

Commit a43a7b5

Browse files
Askaholicseifertm
authored andcommitted
Move cleanup code to pytest_fixture_post_finalizer
1 parent 046154d commit a43a7b5

File tree

1 file changed

+16
-18
lines changed

1 file changed

+16
-18
lines changed

pytest_asyncio/plugin.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -361,8 +361,15 @@ def pytest_fixture_post_finalizer(fixturedef: FixtureDef, request: SubRequest) -
361361
except RuntimeError:
362362
loop = None
363363
if loop is not None:
364-
# Clean up existing loop to avoid ResourceWarnings
365-
loop.close()
364+
# Cleanup code based on the implementation of asyncio.run()
365+
try:
366+
if not loop.is_closed():
367+
asyncio.runners._cancel_all_tasks(loop)
368+
loop.run_until_complete(loop.shutdown_asyncgens())
369+
if sys.version_info >= (3, 9):
370+
loop.run_until_complete(loop.shutdown_default_executor())
371+
finally:
372+
loop.close()
366373
new_loop = policy.new_event_loop() # Replace existing event loop
367374
# Ensure subsequent calls to get_event_loop() succeed
368375
policy.set_event_loop(new_loop)
@@ -487,22 +494,13 @@ def pytest_runtest_setup(item: pytest.Item) -> None:
487494
@pytest.fixture
488495
def event_loop(request: "pytest.FixtureRequest") -> Iterator[asyncio.AbstractEventLoop]:
489496
"""Create an instance of the default event loop for each test case."""
490-
loop = asyncio.get_event_loop_policy().new_event_loop()
491-
yield loop
492-
# Cleanup code copied from the implementation of asyncio.run()
493-
try:
494-
if not loop.is_closed():
495-
asyncio.runners._cancel_all_tasks(loop)
496-
loop.run_until_complete(loop.shutdown_asyncgens())
497-
if sys.version_info >= (3, 9):
498-
loop.run_until_complete(loop.shutdown_default_executor())
499-
finally:
500-
loop.close()
501-
# Call the garbage collector to trigger ResourceWarning's as soon
502-
# as possible (these are triggered in various __del__ methods).
503-
# Without this, resources opened in one test can fail other tests
504-
# when the warning is generated.
505-
gc.collect()
497+
return asyncio.get_event_loop_policy().new_event_loop()
498+
# Call the garbage collector to trigger ResourceWarning's as soon
499+
# as possible (these are triggered in various __del__ methods).
500+
# Without this, resources opened in one test can fail other tests
501+
# when the warning is generated.
502+
gc.collect()
503+
# Event loop cleanup handled by pytest_fixture_post_finalizer
506504

507505

508506
def _unused_port(socket_type: int) -> int:

0 commit comments

Comments
 (0)