]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38912: regrtest logs unraisable exception into sys.__stderr__ (GH-21718)
authorVictor Stinner <vstinner@python.org>
Mon, 3 Aug 2020 20:51:23 +0000 (22:51 +0200)
committerGitHub <noreply@github.com>
Mon, 3 Aug 2020 20:51:23 +0000 (22:51 +0200)
regrtest_unraisable_hook() temporarily replaces sys.stderr with
sys.__stderr__ to help to display errors when a test captures stderr.

Lib/test/libregrtest/utils.py
Lib/test/test_regrtest.py

index 0368694b2adcb7d675fe18beea27230be98a56c1..71f538f0c453385d35b7af6335645130ce1bbb42 100644 (file)
@@ -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():
index 39af0d96d1e54d08025c4852825f454b81d853eb..38321e04b54a9e39958740c03443ec85a0555045 100644 (file)
@@ -1235,10 +1235,12 @@ class ArgsTestCase(BaseTestCase):
                          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 ArgsTestCase(BaseTestCase):
                 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 @@ class ArgsTestCase(BaseTestCase):
                                   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")