summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorYury Selivanov <yselivanov@sprymix.com>2015-11-13 17:28:48 (GMT)
committerYury Selivanov <yselivanov@sprymix.com>2015-11-13 17:28:48 (GMT)
commitabe9625eeb71e40f042ccfccfe6a4489a6dcdf35 (patch)
treecce1bb4939dfcea84b717b563e8ddcae8838b7bc /Lib
parent9cccfcecc8883c9bcfdc5bc5fb88c37e1e1113b8 (diff)
downloadcpython-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.py32
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