mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
bpo-33562: Check the global asyncio event loop policy isn't set after any tests (GH-7328)
This commit is contained in:
parent
de6516264e
commit
8425de4147
26 changed files with 98 additions and 2 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
import asyncio
|
||||||
import builtins
|
import builtins
|
||||||
import locale
|
import locale
|
||||||
import logging
|
import logging
|
||||||
|
@ -65,8 +66,14 @@ class saved_test_environment:
|
||||||
'sysconfig._CONFIG_VARS', 'sysconfig._INSTALL_SCHEMES',
|
'sysconfig._CONFIG_VARS', 'sysconfig._INSTALL_SCHEMES',
|
||||||
'files', 'locale', 'warnings.showwarning',
|
'files', 'locale', 'warnings.showwarning',
|
||||||
'shutil_archive_formats', 'shutil_unpack_formats',
|
'shutil_archive_formats', 'shutil_unpack_formats',
|
||||||
|
'asyncio.events._event_loop_policy',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_asyncio_events__event_loop_policy(self):
|
||||||
|
return support.maybe_get_event_loop_policy()
|
||||||
|
def restore_asyncio_events__event_loop_policy(self, policy):
|
||||||
|
asyncio.set_event_loop_policy(policy)
|
||||||
|
|
||||||
def get_sys_argv(self):
|
def get_sys_argv(self):
|
||||||
return id(sys.argv), sys.argv, sys.argv[:]
|
return id(sys.argv), sys.argv, sys.argv[:]
|
||||||
def restore_sys_argv(self, saved_argv):
|
def restore_sys_argv(self, saved_argv):
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
if __name__ != 'test.support':
|
if __name__ != 'test.support':
|
||||||
raise ImportError('support must be imported from the test package')
|
raise ImportError('support must be imported from the test package')
|
||||||
|
|
||||||
|
import asyncio.events
|
||||||
import collections.abc
|
import collections.abc
|
||||||
import contextlib
|
import contextlib
|
||||||
import errno
|
import errno
|
||||||
|
@ -2878,3 +2879,8 @@ class FakePath:
|
||||||
raise self.path
|
raise self.path
|
||||||
else:
|
else:
|
||||||
return self.path
|
return self.path
|
||||||
|
|
||||||
|
|
||||||
|
def maybe_get_event_loop_policy():
|
||||||
|
"""Return the global event loop policy if one is set, else return None."""
|
||||||
|
return asyncio.events._event_loop_policy
|
||||||
|
|
|
@ -328,6 +328,7 @@ class AsyncGenAsyncioTest(unittest.TestCase):
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.loop.close()
|
self.loop.close()
|
||||||
self.loop = None
|
self.loop = None
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
async def to_list(self, gen):
|
async def to_list(self, gen):
|
||||||
res = []
|
res = []
|
||||||
|
|
|
@ -24,6 +24,10 @@ MOCK_ANY = mock.ANY
|
||||||
PY34 = sys.version_info >= (3, 4)
|
PY34 = sys.version_info >= (3, 4)
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
def mock_socket_module():
|
def mock_socket_module():
|
||||||
m_socket = mock.MagicMock(spec=socket)
|
m_socket = mock.MagicMock(spec=socket)
|
||||||
for name in (
|
for name in (
|
||||||
|
|
|
@ -4,6 +4,10 @@ import unittest
|
||||||
from test.test_asyncio import functional as func_tests
|
from test.test_asyncio import functional as func_tests
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class ReceiveStuffProto(asyncio.BufferedProtocol):
|
class ReceiveStuffProto(asyncio.BufferedProtocol):
|
||||||
def __init__(self, cb, con_lost_fut):
|
def __init__(self, cb, con_lost_fut):
|
||||||
self.cb = cb
|
self.cb = cb
|
||||||
|
|
|
@ -3,6 +3,10 @@ import decimal
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class DecimalContextTest(unittest.TestCase):
|
class DecimalContextTest(unittest.TestCase):
|
||||||
|
|
||||||
def test_asyncio_task_decimal_context(self):
|
def test_asyncio_task_decimal_context(self):
|
||||||
|
|
|
@ -37,6 +37,10 @@ from test.test_asyncio import utils as test_utils
|
||||||
from test import support
|
from test import support
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
def osx_tiger():
|
def osx_tiger():
|
||||||
"""Return True if the platform is Mac OS 10.4 or older."""
|
"""Return True if the platform is Mac OS 10.4 or older."""
|
||||||
if sys.platform != 'darwin':
|
if sys.platform != 'darwin':
|
||||||
|
|
|
@ -14,6 +14,10 @@ from test.test_asyncio import utils as test_utils
|
||||||
from test import support
|
from test import support
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
def _fakefunc(f):
|
def _fakefunc(f):
|
||||||
return f
|
return f
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,10 @@ STR_RGX_REPR = (
|
||||||
RGX_REPR = re.compile(STR_RGX_REPR)
|
RGX_REPR = re.compile(STR_RGX_REPR)
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class LockTests(test_utils.TestCase):
|
class LockTests(test_utils.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
|
@ -11,6 +11,10 @@ import asyncio
|
||||||
from test.test_asyncio import utils as test_utils
|
from test.test_asyncio import utils as test_utils
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
# Test that asyncio.iscoroutine() uses collections.abc.Coroutine
|
# Test that asyncio.iscoroutine() uses collections.abc.Coroutine
|
||||||
class FakeCoro:
|
class FakeCoro:
|
||||||
def send(self, value):
|
def send(self, value):
|
||||||
|
|
|
@ -16,6 +16,10 @@ from test import support
|
||||||
from test.test_asyncio import utils as test_utils
|
from test.test_asyncio import utils as test_utils
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
def close_transport(transport):
|
def close_transport(transport):
|
||||||
# Don't call transport.close() because the event loop and the IOCP proactor
|
# Don't call transport.close() because the event loop and the IOCP proactor
|
||||||
# are mocked
|
# are mocked
|
||||||
|
|
|
@ -7,6 +7,10 @@ import asyncio
|
||||||
from test.test_asyncio import utils as test_utils
|
from test.test_asyncio import utils as test_utils
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class _QueueTestBase(test_utils.TestCase):
|
class _QueueTestBase(test_utils.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
|
@ -22,6 +22,10 @@ from test.test_asyncio import utils as test_utils
|
||||||
MOCK_ANY = mock.ANY
|
MOCK_ANY = mock.ANY
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class TestBaseSelectorEventLoop(BaseSelectorEventLoop):
|
class TestBaseSelectorEventLoop(BaseSelectorEventLoop):
|
||||||
|
|
||||||
def _make_self_pipe(self):
|
def _make_self_pipe(self):
|
||||||
|
|
|
@ -9,6 +9,10 @@ from test.test_asyncio import utils as test_utils
|
||||||
from test.test_asyncio import functional as func_tests
|
from test.test_asyncio import functional as func_tests
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class BaseStartServer(func_tests.FunctionalTestCaseMixin):
|
class BaseStartServer(func_tests.FunctionalTestCaseMixin):
|
||||||
|
|
||||||
def new_loop(self):
|
def new_loop(self):
|
||||||
|
|
|
@ -17,6 +17,10 @@ from test.test_asyncio import utils as test_utils
|
||||||
from test.test_asyncio import functional as func_tests
|
from test.test_asyncio import functional as func_tests
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipIf(ssl is None, 'No ssl module')
|
@unittest.skipIf(ssl is None, 'No ssl module')
|
||||||
class SslProtoHandshakeTests(test_utils.TestCase):
|
class SslProtoHandshakeTests(test_utils.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,10 @@ import asyncio
|
||||||
from test.test_asyncio import utils as test_utils
|
from test.test_asyncio import utils as test_utils
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class StreamTests(test_utils.TestCase):
|
class StreamTests(test_utils.TestCase):
|
||||||
|
|
||||||
DATA = b'line1\nline2\nline3\n'
|
DATA = b'line1\nline2\nline3\n'
|
||||||
|
|
|
@ -23,6 +23,11 @@ PROGRAM_CAT = [
|
||||||
'data = sys.stdin.buffer.read()',
|
'data = sys.stdin.buffer.read()',
|
||||||
'sys.stdout.buffer.write(data)'))]
|
'sys.stdout.buffer.write(data)'))]
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class TestSubprocessTransport(base_subprocess.BaseSubprocessTransport):
|
class TestSubprocessTransport(base_subprocess.BaseSubprocessTransport):
|
||||||
def _start(self, *args, **kwargs):
|
def _start(self, *args, **kwargs):
|
||||||
self._proc = mock.Mock()
|
self._proc = mock.Mock()
|
||||||
|
|
|
@ -24,6 +24,10 @@ from test import support
|
||||||
from test.support.script_helper import assert_python_ok
|
from test.support.script_helper import assert_python_ok
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def coroutine_function():
|
def coroutine_function():
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -31,6 +31,10 @@ from test.test_asyncio import utils as test_utils
|
||||||
MOCK_ANY = mock.ANY
|
MOCK_ANY = mock.ANY
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
def close_pipe_transport(transport):
|
def close_pipe_transport(transport):
|
||||||
# Don't call transport.close() because the event loop and the selector
|
# Don't call transport.close() because the event loop and the selector
|
||||||
# are mocked
|
# are mocked
|
||||||
|
|
|
@ -15,6 +15,10 @@ from asyncio import windows_events
|
||||||
from test.test_asyncio import utils as test_utils
|
from test.test_asyncio import utils as test_utils
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class UpperProto(asyncio.Protocol):
|
class UpperProto(asyncio.Protocol):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.buf = []
|
self.buf = []
|
||||||
|
|
|
@ -10,10 +10,15 @@ if sys.platform != 'win32':
|
||||||
import _overlapped
|
import _overlapped
|
||||||
import _winapi
|
import _winapi
|
||||||
|
|
||||||
|
import asyncio
|
||||||
from asyncio import windows_utils
|
from asyncio import windows_utils
|
||||||
from test import support
|
from test import support
|
||||||
|
|
||||||
|
|
||||||
|
def tearDownModule():
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
|
|
||||||
class PipeTests(unittest.TestCase):
|
class PipeTests(unittest.TestCase):
|
||||||
|
|
||||||
def test_pipe_overlapped(self):
|
def test_pipe_overlapped(self):
|
||||||
|
|
|
@ -18,7 +18,7 @@ def _async_test(func):
|
||||||
return loop.run_until_complete(coro)
|
return loop.run_until_complete(coro)
|
||||||
finally:
|
finally:
|
||||||
loop.close()
|
loop.close()
|
||||||
asyncio.set_event_loop(None)
|
asyncio.set_event_loop_policy(None)
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
@ -295,6 +295,7 @@ class TestAsyncExitStack(TestBaseExitStack, unittest.TestCase):
|
||||||
self.loop = asyncio.new_event_loop()
|
self.loop = asyncio.new_event_loop()
|
||||||
asyncio.set_event_loop(self.loop)
|
asyncio.set_event_loop(self.loop)
|
||||||
self.addCleanup(self.loop.close)
|
self.addCleanup(self.loop.close)
|
||||||
|
self.addCleanup(asyncio.set_event_loop_policy, None)
|
||||||
|
|
||||||
@_async_test
|
@_async_test
|
||||||
async def test_async_callback(self):
|
async def test_async_callback(self):
|
||||||
|
|
|
@ -2142,7 +2142,7 @@ class CoroAsyncIOCompatTest(unittest.TestCase):
|
||||||
pass
|
pass
|
||||||
finally:
|
finally:
|
||||||
loop.close()
|
loop.close()
|
||||||
asyncio.set_event_loop(None)
|
asyncio.set_event_loop_policy(None)
|
||||||
|
|
||||||
self.assertEqual(buffer, [1, 2, 'MyException'])
|
self.assertEqual(buffer, [1, 2, 'MyException'])
|
||||||
|
|
||||||
|
|
|
@ -745,6 +745,7 @@ def test_pdb_next_command_for_coroutine():
|
||||||
... loop = asyncio.new_event_loop()
|
... loop = asyncio.new_event_loop()
|
||||||
... loop.run_until_complete(test_main())
|
... loop.run_until_complete(test_main())
|
||||||
... loop.close()
|
... loop.close()
|
||||||
|
... asyncio.set_event_loop_policy(None)
|
||||||
... print("finished")
|
... print("finished")
|
||||||
|
|
||||||
>>> with PdbTestInput(['step',
|
>>> with PdbTestInput(['step',
|
||||||
|
@ -804,6 +805,7 @@ def test_pdb_next_command_for_asyncgen():
|
||||||
... loop = asyncio.new_event_loop()
|
... loop = asyncio.new_event_loop()
|
||||||
... loop.run_until_complete(test_main())
|
... loop.run_until_complete(test_main())
|
||||||
... loop.close()
|
... loop.close()
|
||||||
|
... asyncio.set_event_loop_policy(None)
|
||||||
... print("finished")
|
... print("finished")
|
||||||
|
|
||||||
>>> with PdbTestInput(['step',
|
>>> with PdbTestInput(['step',
|
||||||
|
@ -915,6 +917,7 @@ def test_pdb_return_command_for_coroutine():
|
||||||
... loop = asyncio.new_event_loop()
|
... loop = asyncio.new_event_loop()
|
||||||
... loop.run_until_complete(test_main())
|
... loop.run_until_complete(test_main())
|
||||||
... loop.close()
|
... loop.close()
|
||||||
|
... asyncio.set_event_loop_policy(None)
|
||||||
... print("finished")
|
... print("finished")
|
||||||
|
|
||||||
>>> with PdbTestInput(['step',
|
>>> with PdbTestInput(['step',
|
||||||
|
@ -1005,6 +1008,7 @@ def test_pdb_until_command_for_coroutine():
|
||||||
... loop = asyncio.new_event_loop()
|
... loop = asyncio.new_event_loop()
|
||||||
... loop.run_until_complete(test_main())
|
... loop.run_until_complete(test_main())
|
||||||
... loop.close()
|
... loop.close()
|
||||||
|
... asyncio.set_event_loop_policy(None)
|
||||||
... print("finished")
|
... print("finished")
|
||||||
|
|
||||||
>>> with PdbTestInput(['step',
|
>>> with PdbTestInput(['step',
|
||||||
|
|
|
@ -667,6 +667,7 @@ class JumpTestCase(unittest.TestCase):
|
||||||
with self.assertRaisesRegex(*error):
|
with self.assertRaisesRegex(*error):
|
||||||
asyncio.run(func(output))
|
asyncio.run(func(output))
|
||||||
sys.settrace(None)
|
sys.settrace(None)
|
||||||
|
asyncio.set_event_loop_policy(None)
|
||||||
self.compare_jump_output(expected, output)
|
self.compare_jump_output(expected, output)
|
||||||
|
|
||||||
def jump_test(jumpFrom, jumpTo, expected, error=None, event='line'):
|
def jump_test(jumpFrom, jumpTo, expected, error=None, event='line'):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Check that a global asyncio event loop policy is not left behind by any
|
||||||
|
tests.
|
Loading…
Add table
Add a link
Reference in a new issue