summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorYury Selivanov <yselivanov@sprymix.com>2014-02-18 23:02:19 (GMT)
committerYury Selivanov <yselivanov@sprymix.com>2014-02-18 23:02:19 (GMT)
commitff827f08ac9201f56b14cb19ccb9d511434c858b (patch)
tree75a1b4b19c5eb74fa2fbf43d8df438b7c42b6e4d /Lib/test
parent065efc3072c244ba34ce521ba0edaa4168fa8953 (diff)
downloadcpython-ff827f08ac9201f56b14cb19ccb9d511434c858b.zip
cpython-ff827f08ac9201f56b14cb19ccb9d511434c858b.tar.gz
cpython-ff827f08ac9201f56b14cb19ccb9d511434c858b.tar.bz2
asyncio: New error handling API. Issue #20681.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_asyncio/test_base_events.py194
-rw-r--r--Lib/test/test_asyncio/test_events.py44
-rw-r--r--Lib/test/test_asyncio/test_futures.py12
-rw-r--r--Lib/test/test_asyncio/test_proactor_events.py8
-rw-r--r--Lib/test/test_asyncio/test_selector_events.py20
-rw-r--r--Lib/test/test_asyncio/test_unix_events.py39
6 files changed, 258 insertions, 59 deletions
diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
index 9fa9841..f664ccc 100644
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -15,6 +15,10 @@ from asyncio import constants
from asyncio import test_utils
+MOCK_ANY = unittest.mock.ANY
+PY34 = sys.version_info >= (3, 4)
+
+
class BaseEventLoopTests(unittest.TestCase):
def setUp(self):
@@ -49,20 +53,21 @@ class BaseEventLoopTests(unittest.TestCase):
self.assertRaises(NotImplementedError, next, iter(gen))
def test__add_callback_handle(self):
- h = asyncio.Handle(lambda: False, ())
+ h = asyncio.Handle(lambda: False, (), self.loop)
self.loop._add_callback(h)
self.assertFalse(self.loop._scheduled)
self.assertIn(h, self.loop._ready)
def test__add_callback_timer(self):
- h = asyncio.TimerHandle(time.monotonic()+10, lambda: False, ())
+ h = asyncio.TimerHandle(time.monotonic()+10, lambda: False, (),
+ self.loop)
self.loop._add_callback(h)
self.assertIn(h, self.loop._scheduled)
def test__add_callback_cancelled_handle(self):
- h = asyncio.Handle(lambda: False, ())
+ h = asyncio.Handle(lambda: False, (), self.loop)
h.cancel()
self.loop._add_callback(h)
@@ -137,15 +142,15 @@ class BaseEventLoopTests(unittest.TestCase):
self.assertRaises(
AssertionError, self.loop.run_in_executor,
- None, asyncio.Handle(cb, ()), ('',))
+ None, asyncio.Handle(cb, (), self.loop), ('',))
self.assertRaises(
AssertionError, self.loop.run_in_executor,
- None, asyncio.TimerHandle(10, cb, ()))
+ None, asyncio.TimerHandle(10, cb, (), self.loop))
def test_run_once_in_executor_cancelled(self):
def cb():
pass
- h = asyncio.Handle(cb, ())
+ h = asyncio.Handle(cb, (), self.loop)
h.cancel()
f = self.loop.run_in_executor(None, h)
@@ -156,7 +161,7 @@ class BaseEventLoopTests(unittest.TestCase):
def test_run_once_in_executor_plain(self):
def cb():
pass
- h = asyncio.Handle(cb, ())
+ h = asyncio.Handle(cb, (), self.loop)
f = asyncio.Future(loop=self.loop)
executor = unittest.mock.Mock()
executor.submit.return_value = f
@@ -175,8 +180,10 @@ class BaseEventLoopTests(unittest.TestCase):
f.cancel() # Don't complain about abandoned Future.
def test__run_once(self):
- h1 = asyncio.TimerHandle(time.monotonic() + 5.0, lambda: True, ())
- h2 = asyncio.TimerHandle(time.monotonic() + 10.0, lambda: True, ())
+ h1 = asyncio.TimerHandle(time.monotonic() + 5.0, lambda: True, (),
+ self.loop)
+ h2 = asyncio.TimerHandle(time.monotonic() + 10.0, lambda: True, (),
+ self.loop)
h1.cancel()
@@ -205,14 +212,15 @@ class BaseEventLoopTests(unittest.TestCase):
m_time.monotonic = monotonic
self.loop._scheduled.append(
- asyncio.TimerHandle(11.0, lambda: True, ()))
+ asyncio.TimerHandle(11.0, lambda: True, (), self.loop))
self.loop._process_events = unittest.mock.Mock()
self.loop._run_once()
self.assertEqual(logging.INFO, m_logger.log.call_args[0][0])
idx = -1
data = [10.0, 10.0, 10.3, 13.0]
- self.loop._scheduled = [asyncio.TimerHandle(11.0, lambda: True, ())]
+ self.loop._scheduled = [asyncio.TimerHandle(11.0, lambda: True, (),
+ self.loop)]
self.loop._run_once()
self.assertEqual(logging.DEBUG, m_logger.log.call_args[0][0])
@@ -225,7 +233,8 @@ class BaseEventLoopTests(unittest.TestCase):
processed = True
handle = loop.call_soon(lambda: True)
- h = asyncio.TimerHandle(time.monotonic() - 1, cb, (self.loop,))
+ h = asyncio.TimerHandle(time.monotonic() - 1, cb, (self.loop,),
+ self.loop)
self.loop._process_events = unittest.mock.Mock()
self.loop._scheduled.append(h)
@@ -287,6 +296,163 @@ class BaseEventLoopTests(unittest.TestCase):
self.loop.run_until_complete, self.loop.subprocess_shell,
asyncio.SubprocessProtocol, 'exit 0', bufsize=4096)
+ def test_default_exc_handler_callback(self):
+ self.loop._process_events = unittest.mock.Mock()
+
+ def zero_error(fut):
+ fut.set_result(True)
+ 1/0
+
+ # Test call_soon (events.Handle)
+ with unittest.mock.patch('asyncio.base_events.logger') as log:
+ fut = asyncio.Future(loop=self.loop)
+ self.loop.call_soon(zero_error, fut)
+ fut.add_done_callback(lambda fut: self.loop.stop())
+ self.loop.run_forever()
+ log.error.assert_called_with(
+ test_utils.MockPattern('Exception in callback.*zero'),
+ exc_info=(ZeroDivisionError, MOCK_ANY, MOCK_ANY))
+
+ # Test call_later (events.TimerHandle)
+ with unittest.mock.patch('asyncio.base_events.logger') as log:
+ fut = asyncio.Future(loop=self.loop)
+ self.loop.call_later(0.01, zero_error, fut)
+ fut.add_done_callback(lambda fut: self.loop.stop())
+ self.loop.run_forever()
+ log.error.assert_called_with(
+ test_utils.MockPattern('Exception in callback.*zero'),
+ exc_info=(ZeroDivisionError, MOCK_ANY, MOCK_ANY))
+
+ def test_default_exc_handler_coro(self):
+ self.loop._process_events = unittest.mock.Mock()
+
+ @asyncio.coroutine
+ def zero_error_coro():
+ yield from asyncio.sleep(0.01, loop=self.loop)
+ 1/0
+
+ # Test Future.__del__
+ with unittest.mock.patch('asyncio.base_events.logger') as log:
+ fut = asyncio.async(zero_error_coro(), loop=self.loop)
+ fut.add_done_callback(lambda *args: self.loop.stop())
+ self.loop.run_forever()
+ fut = None # Trigger Future.__del__ or futures._TracebackLogger
+ if PY34:
+ # Future.__del__ in Python 3.4 logs error with
+ # an actual exception context
+ log.error.assert_called_with(
+ test_utils.MockPattern('.*exception was never retrieved'),
+ exc_info=(ZeroDivisionError, MOCK_ANY, MOCK_ANY))
+ else:
+ # futures._TracebackLogger logs only textual traceback
+ log.error.assert_called_with(
+ test_utils.MockPattern(
+ '.*exception was never retrieved.*ZeroDiv'),
+ exc_info=False)
+
+ def test_set_exc_handler_invalid(self):
+ with self.assertRaisesRegex(TypeError, 'A callable object or None'):
+ self.loop.set_exception_handler('spam')
+
+ def test_set_exc_handler_custom(self):
+ def zero_error():
+ 1/0
+
+ def run_loop():
+ self.loop.call_soon(zero_error)
+ self.loop._run_once()
+
+ self.loop._process_events = unittest.mock.Mock()
+
+ mock_handler = unittest.mock.Mock()
+ self.loop.set_exception_handler(mock_handler)
+ run_loop()
+ mock_handler.assert_called_with(self.loop, {
+ 'exception': MOCK_ANY,
+ 'message': test_utils.MockPattern(
+ 'Exception in callback.*zero_error'),
+ 'handle': MOCK_ANY,
+ })
+ mock_handler.reset_mock()
+
+ self.loop.set_exception_handler(None)
+ with unittest.mock.patch('asyncio.base_events.logger') as log:
+ run_loop()
+ log.error.assert_called_with(
+ test_utils.MockPattern(
+ 'Exception in callback.*zero'),
+ exc_info=(ZeroDivisionError, MOCK_ANY, MOCK_ANY))
+
+ assert not mock_handler.called
+
+ def test_set_exc_handler_broken(self):
+ def run_loop():
+ def zero_error():
+ 1/0
+ self.loop.call_soon(zero_error)
+ self.loop._run_once()
+
+ def handler(loop, context):
+ raise AttributeError('spam')
+
+ self.loop._process_events = unittest.mock.Mock()
+
+ self.loop.set_exception_handler(handler)
+
+ with unittest.mock.patch('asyncio.base_events.logger') as log:
+ run_loop()
+ log.error.assert_called_with(
+ test_utils.MockPattern(
+ 'Unhandled error in exception handler'),
+ exc_info=(AttributeError, MOCK_ANY, MOCK_ANY))
+
+ def test_default_exc_handler_broken(self):
+ _context = None
+
+ class Loop(base_events.BaseEventLoop):
+
+ _selector = unittest.mock.Mock()
+ _process_events = unittest.mock.Mock()
+
+ def default_exception_handler(self, context):
+ nonlocal _context
+ _context = context
+ # Simulates custom buggy "default_exception_handler"
+ raise ValueError('spam')
+
+ loop = Loop()
+ asyncio.set_event_loop(loop)
+
+ def run_loop():
+ def zero_error():
+ 1/0
+ loop.call_soon(zero_error)
+ loop._run_once()
+
+ with unittest.mock.patch('asyncio.base_events.logger') as log:
+ run_loop()
+ log.error.assert_called_with(
+ 'Exception in default exception handler',
+ exc_info=True)
+
+ def custom_handler(loop, context):
+ raise ValueError('ham')
+
+ _context = None
+ loop.set_exception_handler(custom_handler)
+ with unittest.mock.patch('asyncio.base_events.logger') as log:
+ run_loop()
+ log.error.assert_called_with(
+ test_utils.MockPattern('Exception in default exception.*'
+ 'while handling.*in custom'),
+ exc_info=True)
+
+ # Check that original context was passed to default
+ # exception handler.
+ self.assertIn('context', _context)
+ self.assertIs(type(_context['context']['exception']),
+ ZeroDivisionError)
+
class MyProto(asyncio.Protocol):
done = None
@@ -716,7 +882,7 @@ class BaseEventLoopWithSelectorTests(unittest.TestCase):
self.loop._accept_connection(MyProto, sock)
self.assertFalse(sock.close.called)
- @unittest.mock.patch('asyncio.selector_events.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_accept_connection_exception(self, m_log):
sock = unittest.mock.Mock()
sock.fileno.return_value = 10
@@ -725,7 +891,7 @@ class BaseEventLoopWithSelectorTests(unittest.TestCase):
self.loop.call_later = unittest.mock.Mock()
self.loop._accept_connection(MyProto, sock)
- self.assertTrue(m_log.exception.called)
+ self.assertTrue(m_log.error.called)
self.assertFalse(sock.close.called)
self.loop.remove_reader.assert_called_with(10)
self.loop.call_later.assert_called_with(constants.ACCEPT_RETRY_DELAY,
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
index c9d04c0..a0a4d02 100644
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -1788,7 +1788,7 @@ class HandleTests(unittest.TestCase):
return args
args = ()
- h = asyncio.Handle(callback, args)
+ h = asyncio.Handle(callback, args, unittest.mock.Mock())
self.assertIs(h._callback, callback)
self.assertIs(h._args, args)
self.assertFalse(h._cancelled)
@@ -1808,28 +1808,37 @@ class HandleTests(unittest.TestCase):
'<function HandleTests.test_handle.<locals>.callback'))
self.assertTrue(r.endswith('())<cancelled>'), r)
- def test_handle(self):
+ def test_handle_from_handle(self):
def callback(*args):
return args
- h1 = asyncio.Handle(callback, ())
+ m_loop = object()
+ h1 = asyncio.Handle(callback, (), loop=m_loop)
self.assertRaises(
- AssertionError, asyncio.Handle, h1, ())
+ AssertionError, asyncio.Handle, h1, (), m_loop)
- @unittest.mock.patch('asyncio.events.logger')
- def test_callback_with_exception(self, log):
+ def test_callback_with_exception(self):
def callback():
raise ValueError()
- h = asyncio.Handle(callback, ())
+ m_loop = unittest.mock.Mock()
+ m_loop.call_exception_handler = unittest.mock.Mock()
+
+ h = asyncio.Handle(callback, (), m_loop)
h._run()
- self.assertTrue(log.exception.called)
+
+ m_loop.call_exception_handler.assert_called_with({
+ 'message': test_utils.MockPattern('Exception in callback.*'),
+ 'exception': unittest.mock.ANY,
+ 'handle': h
+ })
class TimerTests(unittest.TestCase):
def test_hash(self):
when = time.monotonic()
- h = asyncio.TimerHandle(when, lambda: False, ())
+ h = asyncio.TimerHandle(when, lambda: False, (),
+ unittest.mock.Mock())
self.assertEqual(hash(h), hash(when))
def test_timer(self):
@@ -1838,7 +1847,7 @@ class TimerTests(unittest.TestCase):
args = ()
when = time.monotonic()
- h = asyncio.TimerHandle(when, callback, args)
+ h = asyncio.TimerHandle(when, callback, args, unittest.mock.Mock())
self.assertIs(h._callback, callback)
self.assertIs(h._args, args)
self.assertFalse(h._cancelled)
@@ -1853,16 +1862,19 @@ class TimerTests(unittest.TestCase):
self.assertTrue(r.endswith('())<cancelled>'), r)
self.assertRaises(AssertionError,
- asyncio.TimerHandle, None, callback, args)
+ asyncio.TimerHandle, None, callback, args,
+ unittest.mock.Mock())
def test_timer_comparison(self):
+ loop = unittest.mock.Mock()
+
def callback(*args):
return args
when = time.monotonic()
- h1 = asyncio.TimerHandle(when, callback, ())
- h2 = asyncio.TimerHandle(when, callback, ())
+ h1 = asyncio.TimerHandle(when, callback, (), loop)
+ h2 = asyncio.TimerHandle(when, callback, (), loop)
# TODO: Use assertLess etc.
self.assertFalse(h1 < h2)
self.assertFalse(h2 < h1)
@@ -1878,8 +1890,8 @@ class TimerTests(unittest.TestCase):
h2.cancel()
self.assertFalse(h1 == h2)
- h1 = asyncio.TimerHandle(when, callback, ())
- h2 = asyncio.TimerHandle(when + 10.0, callback, ())
+ h1 = asyncio.TimerHandle(when, callback, (), loop)
+ h2 = asyncio.TimerHandle(when + 10.0, callback, (), loop)
self.assertTrue(h1 < h2)
self.assertFalse(h2 < h1)
self.assertTrue(h1 <= h2)
@@ -1891,7 +1903,7 @@ class TimerTests(unittest.TestCase):
self.assertFalse(h1 == h2)
self.assertTrue(h1 != h2)
- h3 = asyncio.Handle(callback, ())
+ h3 = asyncio.Handle(callback, (), loop)
self.assertIs(NotImplemented, h1.__eq__(h3))
self.assertIs(NotImplemented, h1.__ne__(h3))
diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py
index 8a6976b..2e4dbd4 100644
--- a/Lib/test/test_asyncio/test_futures.py
+++ b/Lib/test/test_asyncio/test_futures.py
@@ -174,20 +174,20 @@ class FutureTests(unittest.TestCase):
self.assertRaises(AssertionError, test)
fut.cancel()
- @unittest.mock.patch('asyncio.futures.logger')
+ @unittest.mock.patch('asyncio.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)
- @unittest.mock.patch('asyncio.futures.logger')
+ @unittest.mock.patch('asyncio.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)
- @unittest.mock.patch('asyncio.futures.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_tb_logger_result_retrieved(self, m_log):
fut = asyncio.Future(loop=self.loop)
fut.set_result(42)
@@ -195,7 +195,7 @@ class FutureTests(unittest.TestCase):
del fut
self.assertFalse(m_log.error.called)
- @unittest.mock.patch('asyncio.futures.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_tb_logger_exception_unretrieved(self, m_log):
fut = asyncio.Future(loop=self.loop)
fut.set_exception(RuntimeError('boom'))
@@ -203,7 +203,7 @@ class FutureTests(unittest.TestCase):
test_utils.run_briefly(self.loop)
self.assertTrue(m_log.error.called)
- @unittest.mock.patch('asyncio.futures.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_tb_logger_exception_retrieved(self, m_log):
fut = asyncio.Future(loop=self.loop)
fut.set_exception(RuntimeError('boom'))
@@ -211,7 +211,7 @@ class FutureTests(unittest.TestCase):
del fut
self.assertFalse(m_log.error.called)
- @unittest.mock.patch('asyncio.futures.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_tb_logger_exception_result_retrieved(self, m_log):
fut = asyncio.Future(loop=self.loop)
fut.set_exception(RuntimeError('boom'))
diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py
index 6bea1a3..816c973 100644
--- a/Lib/test/test_asyncio/test_proactor_events.py
+++ b/Lib/test/test_asyncio/test_proactor_events.py
@@ -207,13 +207,13 @@ class ProactorSocketTransportTests(unittest.TestCase):
test_utils.run_briefly(self.loop)
self.assertFalse(self.protocol.connection_lost.called)
- @unittest.mock.patch('asyncio.proactor_events.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_fatal_error(self, m_logging):
tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
tr._force_close = unittest.mock.Mock()
tr._fatal_error(None)
self.assertTrue(tr._force_close.called)
- self.assertTrue(m_logging.exception.called)
+ self.assertTrue(m_logging.error.called)
def test_force_close(self):
tr = _ProactorSocketTransport(self.loop, self.sock, self.protocol)
@@ -432,7 +432,7 @@ class BaseProactorEventLoopTests(unittest.TestCase):
def test_process_events(self):
self.loop._process_events([])
- @unittest.mock.patch('asyncio.proactor_events.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_create_server(self, m_log):
pf = unittest.mock.Mock()
call_soon = self.loop.call_soon = unittest.mock.Mock()
@@ -458,7 +458,7 @@ class BaseProactorEventLoopTests(unittest.TestCase):
fut.result.side_effect = OSError()
loop(fut)
self.assertTrue(self.sock.close.called)
- self.assertTrue(m_log.exception.called)
+ self.assertTrue(m_log.error.called)
def test_create_server_cancel(self):
pf = unittest.mock.Mock()
diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py
index 7741e19..04b0578 100644
--- a/Lib/test/test_asyncio/test_selector_events.py
+++ b/Lib/test/test_asyncio/test_selector_events.py
@@ -23,6 +23,9 @@ from asyncio.selector_events import _SelectorSocketTransport
from asyncio.selector_events import _SelectorDatagramTransport
+MOCK_ANY = unittest.mock.ANY
+
+
class TestBaseSelectorEventLoop(BaseSelectorEventLoop):
def _make_self_pipe(self):
@@ -643,14 +646,18 @@ class SelectorTransportTests(unittest.TestCase):
self.assertFalse(self.loop.readers)
self.assertEqual(1, self.loop.remove_reader_count[7])
- @unittest.mock.patch('asyncio.log.logger.exception')
+ @unittest.mock.patch('asyncio.log.logger.error')
def test_fatal_error(self, m_exc):
exc = OSError()
tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
tr._force_close = unittest.mock.Mock()
tr._fatal_error(exc)
- m_exc.assert_called_with('Fatal error for %s', tr)
+ m_exc.assert_called_with(
+ test_utils.MockPattern(
+ 'Fatal transport error\nprotocol:.*\ntransport:.*'),
+ exc_info=(OSError, MOCK_ANY, MOCK_ANY))
+
tr._force_close.assert_called_with(exc)
def test_connection_lost(self):
@@ -996,7 +1003,7 @@ class SelectorSocketTransportTests(unittest.TestCase):
transport._write_ready()
transport._fatal_error.assert_called_with(err)
- @unittest.mock.patch('asyncio.selector_events.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_write_ready_exception_and_close(self, m_log):
self.sock.send.side_effect = OSError()
remove_writer = self.loop.remove_writer = unittest.mock.Mock()
@@ -1651,14 +1658,17 @@ class SelectorDatagramTransportTests(unittest.TestCase):
self.assertFalse(transport._fatal_error.called)
self.assertTrue(self.protocol.error_received.called)
- @unittest.mock.patch('asyncio.log.logger.exception')
+ @unittest.mock.patch('asyncio.base_events.logger.error')
def test_fatal_error_connected(self, m_exc):
transport = _SelectorDatagramTransport(
self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
err = ConnectionRefusedError()
transport._fatal_error(err)
self.assertFalse(self.protocol.error_received.called)
- m_exc.assert_called_with('Fatal error for %s', transport)
+ m_exc.assert_called_with(
+ test_utils.MockPattern(
+ 'Fatal transport error\nprotocol:.*\ntransport:.*'),
+ exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY))
if __name__ == '__main__':
diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py
index 2fa1db4..e933079 100644
--- a/Lib/test/test_asyncio/test_unix_events.py
+++ b/Lib/test/test_asyncio/test_unix_events.py
@@ -25,6 +25,9 @@ from asyncio import test_utils
from asyncio import unix_events
+MOCK_ANY = unittest.mock.ANY
+
+
@unittest.skipUnless(signal, 'Signals are not supported')
class SelectorEventLoopSignalTests(unittest.TestCase):
@@ -45,7 +48,8 @@ class SelectorEventLoopSignalTests(unittest.TestCase):
self.loop._handle_signal(signal.NSIG + 1, ())
def test_handle_signal_cancelled_handler(self):
- h = asyncio.Handle(unittest.mock.Mock(), ())
+ h = asyncio.Handle(unittest.mock.Mock(), (),
+ loop=unittest.mock.Mock())
h.cancel()
self.loop._signal_handlers[signal.NSIG + 1] = h
self.loop.remove_signal_handler = unittest.mock.Mock()
@@ -91,7 +95,7 @@ class SelectorEventLoopSignalTests(unittest.TestCase):
signal.SIGINT, lambda: True)
@unittest.mock.patch('asyncio.unix_events.signal')
- @unittest.mock.patch('asyncio.unix_events.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_add_signal_handler_install_error2(self, m_logging, m_signal):
m_signal.NSIG = signal.NSIG
@@ -108,7 +112,7 @@ class SelectorEventLoopSignalTests(unittest.TestCase):
self.assertEqual(1, m_signal.set_wakeup_fd.call_count)
@unittest.mock.patch('asyncio.unix_events.signal')
- @unittest.mock.patch('asyncio.unix_events.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_add_signal_handler_install_error3(self, m_logging, m_signal):
class Err(OSError):
errno = errno.EINVAL
@@ -153,7 +157,7 @@ class SelectorEventLoopSignalTests(unittest.TestCase):
m_signal.signal.call_args[0])
@unittest.mock.patch('asyncio.unix_events.signal')
- @unittest.mock.patch('asyncio.unix_events.logger')
+ @unittest.mock.patch('asyncio.base_events.logger')
def test_remove_signal_handler_cleanup_error(self, m_logging, m_signal):
m_signal.NSIG = signal.NSIG
self.loop.add_signal_handler(signal.SIGHUP, lambda: True)
@@ -347,7 +351,7 @@ class UnixReadPipeTransportTests(unittest.TestCase):
test_utils.run_briefly(self.loop)
self.assertFalse(self.protocol.data_received.called)
- @unittest.mock.patch('asyncio.log.logger.exception')
+ @unittest.mock.patch('asyncio.log.logger.error')
@unittest.mock.patch('os.read')
def test__read_ready_error(self, m_read, m_logexc):
tr = unix_events._UnixReadPipeTransport(
@@ -359,7 +363,10 @@ class UnixReadPipeTransportTests(unittest.TestCase):
m_read.assert_called_with(5, tr.max_size)
tr._close.assert_called_with(err)
- m_logexc.assert_called_with('Fatal error for %s', tr)
+ m_logexc.assert_called_with(
+ test_utils.MockPattern(
+ 'Fatal transport error\nprotocol:.*\ntransport:.*'),
+ exc_info=(OSError, MOCK_ANY, MOCK_ANY))
@unittest.mock.patch('os.read')
def test_pause_reading(self, m_read):
@@ -423,7 +430,7 @@ class UnixReadPipeTransportTests(unittest.TestCase):
self.assertEqual(2, sys.getrefcount(self.protocol),
pprint.pformat(gc.get_referrers(self.protocol)))
self.assertIsNone(tr._loop)
- self.assertEqual(2, sys.getrefcount(self.loop),
+ self.assertEqual(4, sys.getrefcount(self.loop),
pprint.pformat(gc.get_referrers(self.loop)))
def test__call_connection_lost_with_err(self):
@@ -436,10 +443,11 @@ class UnixReadPipeTransportTests(unittest.TestCase):
self.pipe.close.assert_called_with()
self.assertIsNone(tr._protocol)
+
self.assertEqual(2, sys.getrefcount(self.protocol),
pprint.pformat(gc.get_referrers(self.protocol)))
self.assertIsNone(tr._loop)
- self.assertEqual(2, sys.getrefcount(self.loop),
+ self.assertEqual(4, sys.getrefcount(self.loop),
pprint.pformat(gc.get_referrers(self.loop)))
@@ -635,7 +643,7 @@ class UnixWritePipeTransportTests(unittest.TestCase):
self.loop.assert_writer(5, tr._write_ready)
self.assertEqual([b'data'], tr._buffer)
- @unittest.mock.patch('asyncio.log.logger.exception')
+ @unittest.mock.patch('asyncio.log.logger.error')
@unittest.mock.patch('os.write')
def test__write_ready_err(self, m_write, m_logexc):
tr = unix_events._UnixWritePipeTransport(
@@ -650,7 +658,10 @@ class UnixWritePipeTransportTests(unittest.TestCase):
self.assertFalse(self.loop.readers)
self.assertEqual([], tr._buffer)
self.assertTrue(tr._closing)
- m_logexc.assert_called_with('Fatal error for %s', tr)
+ m_logexc.assert_called_with(
+ test_utils.MockPattern(
+ 'Fatal transport error\nprotocol:.*\ntransport:.*'),
+ exc_info=(OSError, MOCK_ANY, MOCK_ANY))
self.assertEqual(1, tr._conn_lost)
test_utils.run_briefly(self.loop)
self.protocol.connection_lost.assert_called_with(err)
@@ -702,7 +713,7 @@ class UnixWritePipeTransportTests(unittest.TestCase):
self.assertEqual(2, sys.getrefcount(self.protocol),
pprint.pformat(gc.get_referrers(self.protocol)))
self.assertIsNone(tr._loop)
- self.assertEqual(2, sys.getrefcount(self.loop),
+ self.assertEqual(4, sys.getrefcount(self.loop),
pprint.pformat(gc.get_referrers(self.loop)))
def test__call_connection_lost_with_err(self):
@@ -718,7 +729,7 @@ class UnixWritePipeTransportTests(unittest.TestCase):
self.assertEqual(2, sys.getrefcount(self.protocol),
pprint.pformat(gc.get_referrers(self.protocol)))
self.assertIsNone(tr._loop)
- self.assertEqual(2, sys.getrefcount(self.loop),
+ self.assertEqual(4, sys.getrefcount(self.loop),
pprint.pformat(gc.get_referrers(self.loop)))
def test_close(self):
@@ -1285,10 +1296,10 @@ class ChildWatcherTestsMixin:
m.waitpid.side_effect = ValueError
with unittest.mock.patch.object(log.logger,
- "exception") as m_exception:
+ 'error') as m_error:
self.assertEqual(self.watcher._sig_chld(), None)
- self.assertTrue(m_exception.called)
+ self.assertTrue(m_error.called)
@waitpid_mocks
def test_sigchld_child_reaped_elsewhere(self, m):