bpo-33562: Check the global asyncio event loop policy isn't set after any tests (GH-7328)

This commit is contained in:
Brett Cannon 2018-06-01 20:34:09 -07:00 committed by GitHub
parent de6516264e
commit 8425de4147
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 98 additions and 2 deletions

View file

@ -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):

View file

@ -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

View file

@ -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 = []

View file

@ -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 (

View file

@ -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

View file

@ -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):

View file

@ -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':

View file

@ -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

View file

@ -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):

View file

@ -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):

View file

@ -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

View file

@ -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):

View file

@ -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):

View file

@ -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):

View file

@ -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):

View file

@ -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'

View file

@ -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()

View file

@ -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

View file

@ -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

View file

@ -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 = []

View file

@ -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):

View file

@ -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):

View file

@ -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'])

View file

@ -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',

View file

@ -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'):

View file

@ -0,0 +1,2 @@
Check that a global asyncio event loop policy is not left behind by any
tests.