From 2f832a03ee78ef317456792f9d157631a0ac2731 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 19 Sep 2019 16:06:27 +0200 Subject: [PATCH 1/2] bpo-34037: test_asyncio uses shutdown_default_executor() --- Lib/test/test_asyncio/test_base_events.py | 14 ++++++++++++-- Lib/test/test_asyncio/test_tasks.py | 2 ++ Lib/test/test_asyncio/utils.py | 8 +++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index ccdd3bae733679..a33cf37823cb6c 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -152,11 +152,20 @@ class BaseEventLoopTests(test_utils.TestCase): def setUp(self): super().setUp() self.loop = base_events.BaseEventLoop() - self.loop._selector = mock.Mock() - self.loop._selector.select.return_value = () + self.mock_event_loop(self.loop) self.set_event_loop(self.loop) + def mock_event_loop(self, loop): + loop._selector = mock.Mock() + loop._selector.select.return_value = () + loop._process_events = mock.Mock() + loop._write_to_self = mock.Mock() + def test_not_implemented(self): + # setUp() calls mock_event_loop() which mocks _process_events + self.loop = base_events.BaseEventLoop() + self.set_event_loop(self.loop) + m = mock.Mock() self.assertRaises( NotImplementedError, @@ -784,6 +793,7 @@ def create_task(self, coro): return MyTask(coro, loop=loop) loop = EventLoop() + self.mock_event_loop(loop) self.set_event_loop(loop) coro = test() diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 6e832eab6d5835..576714faa8884b 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -3232,6 +3232,8 @@ def task_factory(loop, coro): self.loop.set_exception_handler(callback) # Set corrupted task factory + self.addCleanup(self.loop.set_task_factory, + self.loop.get_task_factory()) self.loop.set_task_factory(task_factory) # Run event loop diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index 5b4bb123a9ec45..ea608f4a10c7f7 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -509,9 +509,11 @@ def get_function_source(func): class TestCase(unittest.TestCase): @staticmethod def close_loop(loop): - executor = loop._default_executor - if executor is not None: - executor.shutdown(wait=True) + if loop._default_executor is not None: + if not loop.is_closed(): + loop.run_until_complete(loop.shutdown_default_executor()) + else: + loop._default_executor.shutdown(wait=True) loop.close() policy = support.maybe_get_event_loop_policy() if policy is not None: From 4cf7cd30aae0e194127eade88ecab08c07ddf30f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 19 Sep 2019 16:25:12 +0200 Subject: [PATCH 2/2] Simplify change --- Lib/test/test_asyncio/test_base_events.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index a33cf37823cb6c..66191d9d1c1ad7 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -152,20 +152,11 @@ class BaseEventLoopTests(test_utils.TestCase): def setUp(self): super().setUp() self.loop = base_events.BaseEventLoop() - self.mock_event_loop(self.loop) + self.loop._selector = mock.Mock() + self.loop._selector.select.return_value = () self.set_event_loop(self.loop) - def mock_event_loop(self, loop): - loop._selector = mock.Mock() - loop._selector.select.return_value = () - loop._process_events = mock.Mock() - loop._write_to_self = mock.Mock() - def test_not_implemented(self): - # setUp() calls mock_event_loop() which mocks _process_events - self.loop = base_events.BaseEventLoop() - self.set_event_loop(self.loop) - m = mock.Mock() self.assertRaises( NotImplementedError, @@ -225,6 +216,9 @@ def submit(self, fn, *args, **kwargs): raise NotImplementedError( 'cannot submit into a dummy executor') + self.loop._process_events = mock.Mock() + self.loop._write_to_self = mock.Mock() + executor = DummyExecutor() self.loop.set_default_executor(executor) self.assertIs(executor, self.loop._default_executor) @@ -235,6 +229,9 @@ def test_set_default_executor_deprecation_warnings(self): with self.assertWarns(DeprecationWarning): self.loop.set_default_executor(executor) + # Avoid cleaning up the executor mock + self.loop._default_executor = None + def test_call_soon(self): def cb(): pass @@ -793,7 +790,6 @@ def create_task(self, coro): return MyTask(coro, loop=loop) loop = EventLoop() - self.mock_event_loop(loop) self.set_event_loop(loop) coro = test()