]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-110367: Make regrtest --verbose3 compatible with --huntrleaks -jN (GH-11157...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 1 Nov 2023 03:57:23 +0000 (04:57 +0100)
committerGitHub <noreply@github.com>
Wed, 1 Nov 2023 03:57:23 +0000 (03:57 +0000)
gh-110367: Make regrtest --verbose3 compatible with --huntrleaks -jN (GH-111577)

"./python -m test -j1 -R 3:3 --verbose3" now works as expected, since
run_single_test() does not replace sys.stdout with StringIO in this
case.
(cherry picked from commit d9a5530d2327efa1fe66a04d31b5c67e42dbcd9c)

Co-authored-by: Victor Stinner <vstinner@python.org>
Lib/test/libregrtest/cmdline.py
Lib/test/test_regrtest.py
Misc/NEWS.d/next/Tests/2023-10-31-22-09-25.gh-issue-110367.UhQi44.rst [new file with mode: 0644]

index 905b3f862281f16d4a19127566be4d65f0095e11..9ba6ec63cad9f8ec456f7a4ead0f55ba725e1ec0 100644 (file)
@@ -494,10 +494,16 @@ def _parse_args(args, **kwargs):
         ns.randomize = True
     if ns.verbose:
         ns.header = True
-    if ns.huntrleaks and ns.verbose3:
+    # When -jN option is used, a worker process does not use --verbose3
+    # and so -R 3:3 -jN --verbose3 just works as expected: there is no false
+    # alarm about memory leak.
+    if ns.huntrleaks and ns.verbose3 and ns.use_mp is None:
         ns.verbose3 = False
+        # run_single_test() replaces sys.stdout with io.StringIO if verbose3
+        # is true. In this case, huntrleaks sees an write into StringIO as
+        # a memory leak, whereas it is not (gh-71290).
         print("WARNING: Disable --verbose3 because it's incompatible with "
-              "--huntrleaks: see http://bugs.python.org/issue27103",
+              "--huntrleaks without -jN option",
               file=sys.stderr)
     if ns.forever:
         # --forever implies --failfast
index aa3f65487a288e67ff3b164f9fa28aff08796ca6..2f1bb03bc0ba4eedfed261083aa54328d628343e 100644 (file)
@@ -2120,6 +2120,29 @@ class ArgsTestCase(BaseTestCase):
             self.assertIn(f"Exit code {exitcode} (SIGSEGV)", output)
         self.check_line(output, "just before crash!", full=True, regex=False)
 
+    def test_verbose3(self):
+        code = textwrap.dedent(r"""
+            import unittest
+            from test import support
+
+            class VerboseTests(unittest.TestCase):
+                def test_pass(self):
+                    print("SPAM SPAM SPAM")
+        """)
+        testname = self.create_test(code=code)
+
+        # Run sequentially
+        output = self.run_tests("--verbose3", testname)
+        self.check_executed_tests(output, testname, stats=1)
+        self.assertNotIn('SPAM SPAM SPAM', output)
+
+        # -R option needs a debug build
+        if support.Py_DEBUG:
+            # Check for reference leaks, run in parallel
+            output = self.run_tests("-R", "3:3", "-j1", "--verbose3", testname)
+            self.check_executed_tests(output, testname, stats=1, parallel=True)
+            self.assertNotIn('SPAM SPAM SPAM', output)
+
 
 class TestUtils(unittest.TestCase):
     def test_format_duration(self):
diff --git a/Misc/NEWS.d/next/Tests/2023-10-31-22-09-25.gh-issue-110367.UhQi44.rst b/Misc/NEWS.d/next/Tests/2023-10-31-22-09-25.gh-issue-110367.UhQi44.rst
new file mode 100644 (file)
index 0000000..0254288
--- /dev/null
@@ -0,0 +1,3 @@
+Make regrtest ``--verbose3`` option compatible with ``--huntrleaks -jN``
+options. The ``./python -m test -j1 -R 3:3 --verbose3`` command now works as
+expected. Patch by Victor Stinner.