[Python-checkins] cpython (3.4): asyncio: Fix formatting of the "Future exception was never retrieved" in

victor.stinner python-checkins at python.org
Thu Nov 20 14:20:43 CET 2014


https://hg.python.org/cpython/rev/307cf392914e
changeset: 93516:307cf392914e
branch: 3.4
parent: 93512:fb06c8ccfd41
user: Victor Stinner <victor.stinner at gmail.com>
date: Thu Nov 20 14:16:31 2014 +0100
summary:
 asyncio: Fix formatting of the "Future exception was never retrieved" in
release mode
files:
 Lib/asyncio/futures.py | 7 +-
 Lib/test/test_asyncio/test_events.py | 34 ++++---
 Lib/test/test_asyncio/test_futures.py | 65 +++++++++-----
 3 files changed, 64 insertions(+), 42 deletions(-)
diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py
--- a/Lib/asyncio/futures.py
+++ b/Lib/asyncio/futures.py
@@ -104,10 +104,11 @@
 
 def __del__(self):
 if self.tb:
- msg = 'Future/Task exception was never retrieved'
+ msg = 'Future/Task exception was never retrieved\n'
 if self.source_traceback:
- msg += '\nFuture/Task created at (most recent call last):\n'
- msg += ''.join(traceback.format_list(self.source_traceback))
+ src = ''.join(traceback.format_list(self.source_traceback))
+ msg += 'Future/Task created at (most recent call last):\n'
+ msg += '%s\n' % src.rstrip()
 msg += ''.join(self.tb).rstrip()
 self.loop.call_exception_handler({'message': msg})
 
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -606,27 +606,29 @@
 self.assertGreater(pr.nbytes, 0)
 tr.close()
 
- if ssl:
- def _dummy_ssl_create_context(self, purpose=ssl.Purpose.SERVER_AUTH, *,
- cafile=None, capath=None, cadata=None):
- """
- A ssl.create_default_context() replacement that doesn't enable
- cert validation.
- """
- self.assertEqual(purpose, ssl.Purpose.SERVER_AUTH)
- return test_utils.dummy_ssl_context()
-
 def _test_create_ssl_connection(self, httpd, create_connection,
 check_sockname=True):
 conn_fut = create_connection(ssl=test_utils.dummy_ssl_context())
 self._basetest_create_ssl_connection(conn_fut, check_sockname)
 
- # With ssl=True, ssl.create_default_context() should be called
- with mock.patch('ssl.create_default_context',
- side_effect=self._dummy_ssl_create_context) as m:
- conn_fut = create_connection(ssl=True)
- self._basetest_create_ssl_connection(conn_fut, check_sockname)
- self.assertEqual(m.call_count, 1)
+ # ssl.Purpose was introduced in Python 3.4
+ if hasattr(ssl, 'Purpose'):
+ def _dummy_ssl_create_context(purpose=ssl.Purpose.SERVER_AUTH, *,
+ cafile=None, capath=None,
+ cadata=None):
+ """
+ A ssl.create_default_context() replacement that doesn't enable
+ cert validation.
+ """
+ self.assertEqual(purpose, ssl.Purpose.SERVER_AUTH)
+ return test_utils.dummy_ssl_context()
+
+ # With ssl=True, ssl.create_default_context() should be called
+ with mock.patch('ssl.create_default_context',
+ side_effect=_dummy_ssl_create_context) as m:
+ conn_fut = create_connection(ssl=True)
+ self._basetest_create_ssl_connection(conn_fut, check_sockname)
+ self.assertEqual(m.call_count, 1)
 
 # With the real ssl.create_default_context(), certificate
 # validation will fail
diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py
--- a/Lib/test/test_asyncio/test_futures.py
+++ b/Lib/test/test_asyncio/test_futures.py
@@ -307,8 +307,8 @@
 'test_future_source_traceback'))
 
 @mock.patch('asyncio.base_events.logger')
- def test_future_exception_never_retrieved(self, m_log):
- self.loop.set_debug(True)
+ def check_future_exception_never_retrieved(self, debug, m_log):
+ self.loop.set_debug(debug)
 
 def memory_error():
 try:
@@ -318,40 +318,59 @@
 exc = memory_error()
 
 future = asyncio.Future(loop=self.loop)
- source_traceback = future._source_traceback
+ if debug:
+ source_traceback = future._source_traceback
 future.set_exception(exc)
 future = None
 test_utils.run_briefly(self.loop)
 support.gc_collect()
 
 if sys.version_info >= (3, 4):
- frame = source_traceback[-1]
- regex = (r'^Future exception was never retrieved\n'
- r'future: <Future finished exception=MemoryError\(\) created at {filename}:{lineno}>\n'
- r'source_traceback: Object created at \(most recent call last\):\n'
- r' File'
- r'.*\n'
- r' File "{filename}", line {lineno}, in test_future_exception_never_retrieved\n'
- r' future = asyncio\.Future\(loop=self\.loop\)$'
- ).format(filename=re.escape(frame[0]), lineno=frame[1])
+ if debug:
+ frame = source_traceback[-1]
+ regex = (r'^Future exception was never retrieved\n'
+ r'future: <Future finished exception=MemoryError\(\) created at {filename}:{lineno}>\n'
+ r'source_traceback: Object created at \(most recent call last\):\n'
+ r' File'
+ r'.*\n'
+ r' File "{filename}", line {lineno}, in check_future_exception_never_retrieved\n'
+ r' future = asyncio\.Future\(loop=self\.loop\)$'
+ ).format(filename=re.escape(frame[0]), lineno=frame[1])
+ else:
+ regex = (r'^Future exception was never retrieved\n'
+ r'future: <Future finished exception=MemoryError\(\)>$'
+ )
 exc_info = (type(exc), exc, exc.__traceback__)
 m_log.error.assert_called_once_with(mock.ANY, exc_info=exc_info)
 else:
- frame = source_traceback[-1]
- regex = (r'^Future/Task exception was never retrieved\n'
- r'Future/Task created at \(most recent call last\):\n'
- r' File'
- r'.*\n'
- r' File "{filename}", line {lineno}, in test_future_exception_never_retrieved\n'
- r' future = asyncio\.Future\(loop=self\.loop\)\n'
- r'Traceback \(most recent call last\):\n'
- r'.*\n'
- r'MemoryError$'
- ).format(filename=re.escape(frame[0]), lineno=frame[1])
+ if debug:
+ frame = source_traceback[-1]
+ regex = (r'^Future/Task exception was never retrieved\n'
+ r'Future/Task created at \(most recent call last\):\n'
+ r' File'
+ r'.*\n'
+ r' File "{filename}", line {lineno}, in check_future_exception_never_retrieved\n'
+ r' future = asyncio\.Future\(loop=self\.loop\)\n'
+ r'Traceback \(most recent call last\):\n'
+ r'.*\n'
+ r'MemoryError$'
+ ).format(filename=re.escape(frame[0]), lineno=frame[1])
+ else:
+ regex = (r'^Future/Task exception was never retrieved\n'
+ r'Traceback \(most recent call last\):\n'
+ r'.*\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))
 
+ def test_future_exception_never_retrieved(self):
+ self.check_future_exception_never_retrieved(False)
+
+ def test_future_exception_never_retrieved_debug(self):
+ self.check_future_exception_never_retrieved(True)
+
 def test_set_result_unless_cancelled(self):
 fut = asyncio.Future(loop=self.loop)
 fut.cancel()
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /