summaryrefslogtreecommitdiff
path: root/tests/test_futures.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_futures.py')
-rw-r--r--tests/test_futures.py98
1 files changed, 39 insertions, 59 deletions
diff --git a/tests/test_futures.py b/tests/test_futures.py
index f9c3ad2..387e552 100644
--- a/tests/test_futures.py
+++ b/tests/test_futures.py
@@ -1,19 +1,26 @@
"""Tests for futures.py."""
-import concurrent.futures
+try:
+ import concurrent.futures
+except ImportError:
+ concurrent = None
import re
import sys
import threading
import unittest
-from unittest import mock
-import asyncio
-from asyncio import test_utils
+import trollius as asyncio
+from trollius import compat
+from trollius import test_utils
+from trollius.test_utils import mock
try:
from test import support # gc_collect
except ImportError:
- from asyncio import test_support as support
+ from trollius import test_support as support
+
+def get_thread_ident():
+ return threading.current_thread().ident
def _fakefunc(f):
return f
@@ -42,10 +49,6 @@ class FutureTests(test_utils.TestCase):
f = asyncio.Future()
self.assertIs(f._loop, self.loop)
- def test_constructor_positional(self):
- # Make sure Future doesn't accept a positional argument
- self.assertRaises(TypeError, asyncio.Future, 42)
-
def test_cancel(self):
f = asyncio.Future(loop=self.loop)
self.assertTrue(f.cancel())
@@ -89,24 +92,6 @@ class FutureTests(test_utils.TestCase):
f.set_exception(RuntimeError)
self.assertIsInstance(f.exception(), RuntimeError)
- def test_yield_from_twice(self):
- f = asyncio.Future(loop=self.loop)
-
- def fixture():
- yield 'A'
- x = yield from f
- yield 'B', x
- y = yield from f
- yield 'C', y
-
- g = fixture()
- self.assertEqual(next(g), 'A') # yield 'A'.
- self.assertEqual(next(g), f) # First yield from f.
- f.set_result(42)
- self.assertEqual(next(g), ('B', 42)) # yield 'B', x.
- # The second "yield from f" does not yield f.
- self.assertEqual(next(g), ('C', 42)) # yield 'C', y.
-
def test_future_repr(self):
self.loop.set_debug(True)
f_pending_debug = asyncio.Future(loop=self.loop)
@@ -138,7 +123,8 @@ class FutureTests(test_utils.TestCase):
def func_repr(func):
filename, lineno = test_utils.get_function_source(func)
- text = '%s() at %s:%s' % (func.__qualname__, filename, lineno)
+ func_name = getattr(func, '__qualname__', func.__name__)
+ text = '%s() at %s:%s' % (func_name, filename, lineno)
return re.escape(text)
f_one_callbacks = asyncio.Future(loop=self.loop)
@@ -197,32 +183,20 @@ class FutureTests(test_utils.TestCase):
newf_cancelled._copy_state(f_cancelled)
self.assertTrue(newf_cancelled.cancelled())
- def test_iter(self):
- fut = asyncio.Future(loop=self.loop)
-
- def coro():
- yield from fut
-
- def test():
- arg1, arg2 = coro()
-
- self.assertRaises(AssertionError, test)
- fut.cancel()
-
- @mock.patch('asyncio.base_events.logger')
+ @mock.patch('trollius.base_events.logger')
def test_tb_logger_abandoned(self, m_log):
fut = asyncio.Future(loop=self.loop)
del fut
self.assertFalse(m_log.error.called)
- @mock.patch('asyncio.base_events.logger')
+ @mock.patch('trollius.base_events.logger')
def test_tb_logger_result_unretrieved(self, m_log):
fut = asyncio.Future(loop=self.loop)
fut.set_result(42)
del fut
self.assertFalse(m_log.error.called)
- @mock.patch('asyncio.base_events.logger')
+ @mock.patch('trollius.base_events.logger')
def test_tb_logger_result_retrieved(self, m_log):
fut = asyncio.Future(loop=self.loop)
fut.set_result(42)
@@ -230,15 +204,18 @@ class FutureTests(test_utils.TestCase):
del fut
self.assertFalse(m_log.error.called)
- @mock.patch('asyncio.base_events.logger')
+ @mock.patch('trollius.base_events.logger')
def test_tb_logger_exception_unretrieved(self, m_log):
+ self.loop.set_debug(True)
+ asyncio.set_event_loop(self.loop)
fut = asyncio.Future(loop=self.loop)
fut.set_exception(RuntimeError('boom'))
del fut
test_utils.run_briefly(self.loop)
+ support.gc_collect()
self.assertTrue(m_log.error.called)
- @mock.patch('asyncio.base_events.logger')
+ @mock.patch('trollius.base_events.logger')
def test_tb_logger_exception_retrieved(self, m_log):
fut = asyncio.Future(loop=self.loop)
fut.set_exception(RuntimeError('boom'))
@@ -246,7 +223,7 @@ class FutureTests(test_utils.TestCase):
del fut
self.assertFalse(m_log.error.called)
- @mock.patch('asyncio.base_events.logger')
+ @mock.patch('trollius.base_events.logger')
def test_tb_logger_exception_result_retrieved(self, m_log):
fut = asyncio.Future(loop=self.loop)
fut.set_exception(RuntimeError('boom'))
@@ -254,32 +231,35 @@ class FutureTests(test_utils.TestCase):
del fut
self.assertFalse(m_log.error.called)
+ @test_utils.skipIf(concurrent is None, 'need concurrent.futures')
def test_wrap_future(self):
def run(arg):
- return (arg, threading.get_ident())
+ return (arg, get_thread_ident())
ex = concurrent.futures.ThreadPoolExecutor(1)
f1 = ex.submit(run, 'oi')
f2 = asyncio.wrap_future(f1, loop=self.loop)
res, ident = self.loop.run_until_complete(f2)
self.assertIsInstance(f2, asyncio.Future)
self.assertEqual(res, 'oi')
- self.assertNotEqual(ident, threading.get_ident())
+ self.assertNotEqual(ident, get_thread_ident())
def test_wrap_future_future(self):
f1 = asyncio.Future(loop=self.loop)
f2 = asyncio.wrap_future(f1)
self.assertIs(f1, f2)
- @mock.patch('asyncio.futures.events')
+ @test_utils.skipIf(concurrent is None, 'need concurrent.futures')
+ @mock.patch('trollius.futures.events')
def test_wrap_future_use_global_loop(self, m_events):
def run(arg):
- return (arg, threading.get_ident())
+ return (arg, get_thread_ident())
ex = concurrent.futures.ThreadPoolExecutor(1)
f1 = ex.submit(run, 'oi')
f2 = asyncio.wrap_future(f1)
self.assertIs(m_events.get_event_loop.return_value, f2._loop)
+ @test_utils.skipIf(concurrent is None, 'need concurrent.futures')
def test_wrap_future_cancel(self):
f1 = concurrent.futures.Future()
f2 = asyncio.wrap_future(f1, loop=self.loop)
@@ -288,6 +268,7 @@ class FutureTests(test_utils.TestCase):
self.assertTrue(f1.cancelled())
self.assertTrue(f2.cancelled())
+ @test_utils.skipIf(concurrent is None, 'need concurrent.futures')
def test_wrap_future_cancel2(self):
f1 = concurrent.futures.Future()
f2 = asyncio.wrap_future(f1, loop=self.loop)
@@ -302,14 +283,9 @@ class FutureTests(test_utils.TestCase):
self.loop.set_debug(True)
future = asyncio.Future(loop=self.loop)
- lineno = sys._getframe().f_lineno - 1
- self.assertIsInstance(future._source_traceback, list)
- self.assertEqual(future._source_traceback[-1][:3],
- (__file__,
- lineno,
- 'test_future_source_traceback'))
-
- @mock.patch('asyncio.base_events.logger')
+ self.check_soure_traceback(future._source_traceback, -1)
+
+ @mock.patch('trollius.base_events.logger')
def check_future_exception_never_retrieved(self, debug, m_log):
self.loop.set_debug(debug)
@@ -358,12 +334,16 @@ class FutureTests(test_utils.TestCase):
r'.*\n'
r'MemoryError$'
).format(filename=re.escape(frame[0]), lineno=frame[1])
- else:
+ elif compat.PY3:
regex = (r'^Future/Task exception was never retrieved\n'
r'Traceback \(most recent call last\):\n'
r'.*\n'
r'MemoryError$'
)
+ else:
+ regex = (r'^Future/Task exception was never retrieved\n'
+ r'MemoryError$'
+ )
m_log.error.assert_called_once_with(mock.ANY, exc_info=False)
message = m_log.error.call_args[0][0]
self.assertRegex(message, re.compile(regex, re.DOTALL))