Remove asyncio.test_utils to fix tests in Docker/Python 3.7 (#12102)
The module `asyncio.test_utils` has been removed from Python in the 3.7 branch, because it was intended to be a private module for internal testing of asyncio. For more information, see the upstream bug report at https://bugs.python.org/issue32273 and the upstream PR at https://github.com/python/cpython/pull/4785. For this commit, I have migrated the small amount of functionality that was being used from the `asyncio.test_utils` directly into the `RunThreadsafeTests` Class. To see the original `asyncio.test_utils.TestCase` class, which I pulled some functionality from, please see: https://github.com/python/cpython/blob/3.6/Lib/asyncio/test_utils.py#L440 Note: In addition to being broken in 3.7, this test case also seems to be broken in Python 3.6.4 when using Docker. This PR fixes the test when run in docker. To reproduce: `./script/test_docker -- tests/util/test_async.py` failing output (prior to this commit): ``` ... trimmed ... py36 runtests: PYTHONHASHSEED='3262989550' py36 runtests: commands[0] | py.test --timeout=9 --duration=10 --cov --cov-report= tests/util/test_async.py Test session starts (platform: linux, Python 3.6.4, pytest 3.3.1, pytest-sugar 0.9.0) rootdir: /usr/src/app, inifile: setup.cfg plugins: timeout-1.2.1, sugar-0.9.0, cov-2.5.1, aiohttp-0.3.0 timeout: 9.0s method: signal ―――――――――――――――――― ERROR collecting tests/util/test_async.py ―――――――――――――――――――――――― ImportError while importing test module '/usr/src/app/tests/util/test_async.py'. Hint: make sure your test modules/packages have valid Python names. Traceback: tests/util/test_async.py:3: in <module> from asyncio import test_utils /usr/local/lib/python3.6/asyncio/test_utils.py:36: in <module> from test import support E ImportError: cannot import name 'support' ```pull/12136/head
parent
87c0fd98c7
commit
72c35468b3
|
@ -1,7 +1,7 @@
|
|||
"""Tests for async util methods from Python source."""
|
||||
import asyncio
|
||||
from asyncio import test_utils
|
||||
from unittest.mock import MagicMock, patch
|
||||
from unittest import TestCase
|
||||
|
||||
import pytest
|
||||
|
||||
|
@ -104,14 +104,32 @@ def test_run_callback_threadsafe_from_inside_event_loop(mock_ident, _):
|
|||
assert len(loop.call_soon_threadsafe.mock_calls) == 2
|
||||
|
||||
|
||||
class RunThreadsafeTests(test_utils.TestCase):
|
||||
"""Test case for asyncio.run_coroutine_threadsafe."""
|
||||
class RunThreadsafeTests(TestCase):
|
||||
"""Test case for hasync.run_coroutine_threadsafe."""
|
||||
|
||||
def setUp(self):
|
||||
"""Test setup method."""
|
||||
super().setUp()
|
||||
self.loop = asyncio.new_event_loop()
|
||||
self.set_event_loop(self.loop) # Will cleanup properly
|
||||
|
||||
def tearDown(self):
|
||||
"""Test teardown method."""
|
||||
executor = self.loop._default_executor
|
||||
if executor is not None:
|
||||
executor.shutdown(wait=True)
|
||||
self.loop.close()
|
||||
|
||||
@staticmethod
|
||||
def run_briefly(loop):
|
||||
"""Momentarily run a coroutine on the given loop."""
|
||||
@asyncio.coroutine
|
||||
def once():
|
||||
pass
|
||||
gen = once()
|
||||
t = loop.create_task(gen)
|
||||
try:
|
||||
loop.run_until_complete(t)
|
||||
finally:
|
||||
gen.close()
|
||||
|
||||
def add_callback(self, a, b, fail, invalid):
|
||||
"""Return a + b."""
|
||||
|
@ -185,7 +203,7 @@ class RunThreadsafeTests(test_utils.TestCase):
|
|||
future = self.loop.run_in_executor(None, callback)
|
||||
with self.assertRaises(asyncio.TimeoutError):
|
||||
self.loop.run_until_complete(future)
|
||||
test_utils.run_briefly(self.loop)
|
||||
self.run_briefly(self.loop)
|
||||
# Check that there's no pending task (add has been cancelled)
|
||||
for task in asyncio.Task.all_tasks(self.loop):
|
||||
self.assertTrue(task.done())
|
||||
|
|
Loading…
Reference in New Issue