diff options
author | Victor Stinner <vstinner@python.org> | 2023-09-09 22:51:24 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-09 22:51:24 (GMT) |
commit | 24fa8f2046965b46c70a750a5a004708a63ac770 (patch) | |
tree | fc09e33076782715647e83d26f5e1d8cc0a16f87 | |
parent | d3ed9921cdd8ac291fbfe3adf42f7730d3a14dbc (diff) | |
download | cpython-24fa8f2046965b46c70a750a5a004708a63ac770.zip cpython-24fa8f2046965b46c70a750a5a004708a63ac770.tar.gz cpython-24fa8f2046965b46c70a750a5a004708a63ac770.tar.bz2 |
gh-109162: libregrtest: fix _decode_worker_job() (#109202)
Decode also HuntRefleak() object inside the RunTests object.
Add an unit test on huntrleaks with multiprocessing (-R -jN).
-rw-r--r-- | Lib/test/libregrtest/runtest.py | 6 | ||||
-rw-r--r-- | Lib/test/libregrtest/runtest_mp.py | 2 | ||||
-rw-r--r-- | Lib/test/test_regrtest.py | 18 |
3 files changed, 21 insertions, 5 deletions
diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 4f12176..ab59d81 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -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 diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 4bff7f9..4e3148f 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -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__') diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 8cced1f..23896fd 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -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): |