diff options
author | Yury Selivanov <yselivanov@sprymix.com> | 2015-11-13 17:28:48 (GMT) |
---|---|---|
committer | Yury Selivanov <yselivanov@sprymix.com> | 2015-11-13 17:28:48 (GMT) |
commit | abe9625eeb71e40f042ccfccfe6a4489a6dcdf35 (patch) | |
tree | cce1bb4939dfcea84b717b563e8ddcae8838b7bc /Lib | |
parent | 9cccfcecc8883c9bcfdc5bc5fb88c37e1e1113b8 (diff) | |
download | cpython-abe9625eeb71e40f042ccfccfe6a4489a6dcdf35.zip cpython-abe9625eeb71e40f042ccfccfe6a4489a6dcdf35.tar.gz cpython-abe9625eeb71e40f042ccfccfe6a4489a6dcdf35.tar.bz2 |
asyncio: Fix sporadic failing unittests in debug mode
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_asyncio/test_tasks.py | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index b492cf0..04d19ac 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -2101,20 +2101,16 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase): class RunCoroutineThreadsafeTests(test_utils.TestCase): - """Test case for futures.submit_to_loop.""" + """Test case for asyncio.run_coroutine_threadsafe.""" def setUp(self): - self.loop = self.new_test_loop(self.time_gen) - - def time_gen(self): - """Handle the timer.""" - yield 0 # second - yield 1 # second + self.loop = asyncio.new_event_loop() + self.set_event_loop(self.loop) # Will cleanup properly @asyncio.coroutine def add(self, a, b, fail=False, cancel=False): - """Wait 1 second and return a + b.""" - yield from asyncio.sleep(1, loop=self.loop) + """Wait 0.05 second and return a + b.""" + yield from asyncio.sleep(0.05, loop=self.loop) if fail: raise RuntimeError("Fail!") if cancel: @@ -2122,10 +2118,20 @@ class RunCoroutineThreadsafeTests(test_utils.TestCase): yield return a + b - def target(self, fail=False, cancel=False, timeout=None): + def target(self, fail=False, cancel=False, timeout=None, + advance_coro=False): """Run add coroutine in the event loop.""" coro = self.add(1, 2, fail=fail, cancel=cancel) future = asyncio.run_coroutine_threadsafe(coro, self.loop) + if advance_coro: + # this is for test_run_coroutine_threadsafe_task_factory_exception; + # otherwise it spills errors and breaks **other** unittests, since + # 'target' is interacting with threads. + + # With this call, `coro` will be advanced, so that + # CoroWrapper.__del__ won't do anything when asyncio tests run + # in debug mode. + self.loop.call_soon_threadsafe(coro.send, None) try: return future.result(timeout) finally: @@ -2152,7 +2158,6 @@ class RunCoroutineThreadsafeTests(test_utils.TestCase): future = self.loop.run_in_executor(None, callback) with self.assertRaises(asyncio.TimeoutError): self.loop.run_until_complete(future) - # Clear the time generator and tasks test_utils.run_briefly(self.loop) # Check that there's no pending task (add has been cancelled) for task in asyncio.Task.all_tasks(self.loop): @@ -2169,10 +2174,9 @@ class RunCoroutineThreadsafeTests(test_utils.TestCase): def test_run_coroutine_threadsafe_task_factory_exception(self): """Test coroutine submission from a tread to an event loop when the task factory raise an exception.""" - # Clear the time generator - asyncio.ensure_future(self.add(1, 2), loop=self.loop) # Schedule the target - future = self.loop.run_in_executor(None, self.target) + future = self.loop.run_in_executor( + None, lambda: self.target(advance_coro=True)) # Set corrupted task factory self.loop.set_task_factory(lambda loop, coro: wrong_name) # Set exception handler |