diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index a901b582f27dac..71ababd19b876a 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -6,6 +6,7 @@ import signal import subprocess import sys +import tempfile import threading import time import traceback @@ -273,14 +274,16 @@ def _run_process(self, test_name: str, tmp_dir: str) -> tuple[int, str, str]: self.current_test_name = None def _runtest(self, test_name: str) -> MultiprocessResult: - if self.ns.use_mp == 1: + # Don't check for leaked temporary files and directories if Python is + # run on WASI. WASI don't pass environment variables like TMPDIR to + # worker processes. + if not support.is_wasi: # gh-93353: Check for leaked temporary files in the parent process, # since the deletion of temporary files can happen late during # Python finalization: too late for libregrtest. - tmp_dir = os.getcwd() + '_tmpdir' + tmp_dir = tempfile.mkdtemp(prefix="test_python_") tmp_dir = os.path.abspath(tmp_dir) try: - os.mkdir(tmp_dir) retcode, stdout = self._run_process(test_name, tmp_dir) finally: tmp_files = os.listdir(tmp_dir) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 93c0cae1473a0c..a36d18488a5ef7 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -1357,6 +1357,8 @@ def test_cleanup(self): for name in names: self.assertFalse(os.path.exists(name), name) + @unittest.skipIf(support.is_wasi, + 'checking temp files is not implemented on WASI') def test_leak_tmp_file(self): code = textwrap.dedent(r""" import os.path @@ -1369,15 +1371,17 @@ def test_leak_tmp_file(self): with open(filename, "wb") as fp: fp.write(b'content') """) - testname = self.create_test(code=code) + testnames = [self.create_test(code=code) for _ in range(3)] - output = self.run_tests("--fail-env-changed", "-v", "-j1", testname, exitcode=3) - self.check_executed_tests(output, [testname], - env_changed=[testname], - fail_env_changed=True) - self.assertIn(f"Warning -- {testname} leaked temporary " - f"files (1): mytmpfile", - output) + output = self.run_tests("--fail-env-changed", "-v", "-j2", *testnames, exitcode=3) + self.check_executed_tests(output, testnames, + env_changed=testnames, + fail_env_changed=True, + randomize=True) + for testname in testnames: + self.assertIn(f"Warning -- {testname} leaked temporary " + f"files (1): mytmpfile", + output) class TestUtils(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Tests/2022-06-16-17-50-58.gh-issue-93353.JdpATx.rst b/Misc/NEWS.d/next/Tests/2022-06-16-17-50-58.gh-issue-93353.JdpATx.rst new file mode 100644 index 00000000000000..4e232948f49ee7 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-06-16-17-50-58.gh-issue-93353.JdpATx.rst @@ -0,0 +1,2 @@ +regrtest now checks if a test leaks temporary files or directories if run +with -jN option. Patch by Victor Stinner.