-
Notifications
You must be signed in to change notification settings - Fork 151
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1) Test case (test_async_fixtures_with_finalizer) refactoring to pass…
… on python 3.6 & 3.5 2) An additional test case (test_module_with_get_event_loop_finalizer). Refactoring previous test case I got to another potential issue: Finalizers using get_event_loop() instead of event_loop [on a module scope fixture] To be able to pass this new test case I needed some additional changes on next event_loop fixture block( https://github.com/pytest-dev/pytest-asyncio/blob/v0.12.0/pytest_asyncio/plugin.py#L54-L66): - This block needs to apply on all event_loop fixture scopes (so I remove 'asyncio' in request.keywords, that only apply to function scope) - The get_event_loop() method inside this block has following side effects (See https://github.com/python/cpython/blob/3.8/Lib/asyncio/events.py#L636): - As no loop is still set, then L636 is executed, and so a new event_loop (let's call it L2) is first created and then set. - And then finalizer will restore L2 at the end of test. What has no sense, to restore L2 that wasn't before the test. And additionally this L2 is never closed. So it seeems that get_event_loop() should be removed, and so I see no reasons for any finalizer. 3) DRY: New FixtureStripper to avoid repeating code
- Loading branch information
Showing
3 changed files
with
86 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 51 additions & 0 deletions
51
tests/async_fixtures/test_async_fixtures_with_finalizer.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
import asyncio | ||
import contextlib | ||
import functools | ||
import pytest | ||
|
||
|
||
@pytest.mark.asyncio | ||
async def test_module_with_event_loop_finalizer(port1): | ||
await asyncio.sleep(0.01) | ||
assert port1 | ||
|
||
@pytest.mark.asyncio | ||
async def test_module_with_get_event_loop_finalizer(port2): | ||
await asyncio.sleep(0.01) | ||
assert port2 | ||
|
||
@pytest.fixture(scope="module") | ||
def event_loop(): | ||
"""Change event_loop fixture to module level.""" | ||
policy = asyncio.get_event_loop_policy() | ||
loop = policy.new_event_loop() | ||
yield loop | ||
loop.close() | ||
|
||
|
||
@pytest.fixture(scope="module") | ||
async def port1(request, event_loop): | ||
def port_finalizer(finalizer): | ||
async def port_afinalizer(): | ||
# await task inside get_event_loop() | ||
# RantimeError is raised if task is created on a different loop | ||
await finalizer | ||
event_loop.run_until_complete(port_afinalizer()) | ||
|
||
worker = asyncio.create_task(asyncio.sleep(0.2)) | ||
request.addfinalizer(functools.partial(port_finalizer, worker)) | ||
return True | ||
|
||
|
||
@pytest.fixture(scope="module") | ||
async def port2(request, event_loop): | ||
def port_finalizer(finalizer): | ||
async def port_afinalizer(): | ||
# await task inside get_event_loop() | ||
# if loop is different a RuntimeError is raised | ||
await finalizer | ||
asyncio.get_event_loop().run_until_complete(port_afinalizer()) | ||
|
||
worker = asyncio.create_task(asyncio.sleep(0.2)) | ||
request.addfinalizer(functools.partial(port_finalizer, worker)) | ||
return True |
38 changes: 0 additions & 38 deletions
38
tests/async_fixtures/test_async_fixtures_with_finalizer_scope.py
This file was deleted.
Oops, something went wrong.