]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109162: libregrtest: fix _decode_worker_job() (#109202)
authorVictor Stinner <vstinner@python.org>
Sat, 9 Sep 2023 22:51:24 +0000 (00:51 +0200)
committerGitHub <noreply@github.com>
Sat, 9 Sep 2023 22:51:24 +0000 (00:51 +0200)
Decode also HuntRefleak() object inside the RunTests object.

Add an unit test on huntrleaks with multiprocessing (-R -jN).

Lib/test/libregrtest/runtest.py
Lib/test/libregrtest/runtest_mp.py
Lib/test/test_regrtest.py

index 4f12176ced5c874022d8a2d4eb3434cf93b03250..ab59d8123013da8ad54e21bba94d858024988507 100644 (file)
@@ -249,6 +249,12 @@ class RunTests:
         else:
             yield from self.tests
 
+    @staticmethod
+    def from_json_dict(json_dict):
+        if json_dict['hunt_refleak']:
+            json_dict['hunt_refleak'] = HuntRefleak(**json_dict['hunt_refleak'])
+        return RunTests(**json_dict)
+
 
 # Minimum duration of a test to display its duration or to mention that
 # the test is running in background
index 4bff7f9996411930d57dce5664dbccafd573c79d..4e3148fa8e2e6788c23420c80247814a9f0a8eb4 100644 (file)
@@ -68,7 +68,7 @@ class _EncodeWorkerJob(json.JSONEncoder):
 def _decode_worker_job(d: dict[str, Any]) -> WorkerJob | dict[str, Any]:
     if "__worker_job__" in d:
         d.pop('__worker_job__')
-        d['runtests'] = RunTests(**d['runtests'])
+        d['runtests'] = RunTests.from_json_dict(d['runtests'])
         return WorkerJob(**d)
     if "__namespace__" in d:
         d.pop('__namespace__')
index 8cced1f5185c2fc8ce6c4c93b6e91c229ce05426..23896fdedaccace1dd550d3d82cee007ea7b4f11 100644 (file)
@@ -1018,12 +1018,16 @@ class ArgsTestCase(BaseTestCase):
                                   stats=TestStats(4, 1),
                                   forever=True)
 
-    def check_leak(self, code, what):
+    def check_leak(self, code, what, *, multiprocessing=False):
         test = self.create_test('huntrleaks', code=code)
 
         filename = 'reflog.txt'
         self.addCleanup(os_helper.unlink, filename)
-        output = self.run_tests('--huntrleaks', '6:3:', test,
+        cmd = ['--huntrleaks', '6:3:']
+        if multiprocessing:
+            cmd.append('-j1')
+        cmd.append(test)
+        output = self.run_tests(*cmd,
                                 exitcode=EXITCODE_BAD_TEST,
                                 stderr=subprocess.STDOUT)
         self.check_executed_tests(output, [test], failed=test, stats=1)
@@ -1039,7 +1043,7 @@ class ArgsTestCase(BaseTestCase):
             self.assertIn(line2, reflog)
 
     @unittest.skipUnless(support.Py_DEBUG, 'need a debug build')
-    def test_huntrleaks(self):
+    def check_huntrleaks(self, *, multiprocessing: bool):
         # test --huntrleaks
         code = textwrap.dedent("""
             import unittest
@@ -1050,7 +1054,13 @@ class ArgsTestCase(BaseTestCase):
                 def test_leak(self):
                     GLOBAL_LIST.append(object())
         """)
-        self.check_leak(code, 'references')
+        self.check_leak(code, 'references', multiprocessing=multiprocessing)
+
+    def test_huntrleaks(self):
+        self.check_huntrleaks(multiprocessing=False)
+
+    def test_huntrleaks_mp(self):
+        self.check_huntrleaks(multiprocessing=True)
 
     @unittest.skipUnless(support.Py_DEBUG, 'need a debug build')
     def test_huntrleaks_fd_leak(self):