Mailing List Archive

bpo-38912: regrtest logs unraisable exception into sys.__stderr__ (GH-21718)
https://github.com/python/cpython/commit/701b63894fdb75b12865b9be6261ce4913da76f5
commit: 701b63894fdb75b12865b9be6261ce4913da76f5
branch: master
author: Victor Stinner <vstinner@python.org>
committer: GitHub <noreply@github.com>
date: 2020-08-03T22:51:23+02:00
summary:

bpo-38912: regrtest logs unraisable exception into sys.__stderr__ (GH-21718)

regrtest_unraisable_hook() temporarily replaces sys.stderr with
sys.__stderr__ to help to display errors when a test captures stderr.

files:
M Lib/test/libregrtest/utils.py
M Lib/test/test_regrtest.py

diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py
index 0368694b2adcb..71f538f0c4533 100644
--- a/Lib/test/libregrtest/utils.py
+++ b/Lib/test/libregrtest/utils.py
@@ -72,7 +72,12 @@ def regrtest_unraisable_hook(unraisable):
global orig_unraisablehook
support.environment_altered = True
print_warning("Unraisable exception")
- orig_unraisablehook(unraisable)
+ old_stderr = sys.stderr
+ try:
+ sys.stderr = sys.__stderr__
+ orig_unraisablehook(unraisable)
+ finally:
+ sys.stderr = old_stderr


def setup_unraisable_hook():
diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
index 39af0d96d1e54..38321e04b54a9 100644
--- a/Lib/test/test_regrtest.py
+++ b/Lib/test/test_regrtest.py
@@ -1235,10 +1235,12 @@ def test_sleep(self):
re.compile('%s timed out' % testname, re.MULTILINE))

def test_unraisable_exc(self):
- # --fail-env-changed must catch unraisable exception
+ # --fail-env-changed must catch unraisable exception.
+ # The exceptioin must be displayed even if sys.stderr is redirected.
code = textwrap.dedent(r"""
import unittest
import weakref
+ from test.support import captured_stderr

class MyObject:
pass
@@ -1250,9 +1252,11 @@ class Tests(unittest.TestCase):
def test_unraisable_exc(self):
obj = MyObject()
ref = weakref.ref(obj, weakref_callback)
- # call weakref_callback() which logs
- # an unraisable exception
- obj = None
+ with captured_stderr() as stderr:
+ # call weakref_callback() which logs
+ # an unraisable exception
+ obj = None
+ self.assertEqual(stderr.getvalue(), '')
""")
testname = self.create_test(code=code)

@@ -1261,6 +1265,7 @@ def test_unraisable_exc(self):
env_changed=[testname],
fail_env_changed=True)
self.assertIn("Warning -- Unraisable exception", output)
+ self.assertIn("Exception: weakref callback bug", output)

def test_cleanup(self):
dirname = os.path.join(self.tmptestdir, "test_python_123")

_______________________________________________
Python-checkins mailing list
Python-checkins@python.org
https://mail.python.org/mailman/listinfo/python-checkins