gh-93353: regrtest supports checking tmp files with -j2 (#93909)

regrtest now also implements checking for leaked temporary files and
directories when using -jN for N >= 2. Use tempfile.mkdtemp() to
create the temporary directory. Skip this check on WASI.
This commit is contained in:
Victor Stinner 2022-06-16 21:48:26 +02:00 committed by GitHub
parent 138db8e48b
commit 4f85cec9e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 11 deletions

View file

@ -6,6 +6,7 @@ import shlex
import signal import signal
import subprocess import subprocess
import sys import sys
import tempfile
import threading import threading
import time import time
import traceback import traceback
@ -273,14 +274,16 @@ class TestWorkerProcess(threading.Thread):
self.current_test_name = None self.current_test_name = None
def _runtest(self, test_name: str) -> MultiprocessResult: 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, # gh-93353: Check for leaked temporary files in the parent process,
# since the deletion of temporary files can happen late during # since the deletion of temporary files can happen late during
# Python finalization: too late for libregrtest. # 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) tmp_dir = os.path.abspath(tmp_dir)
try: try:
os.mkdir(tmp_dir)
retcode, stdout = self._run_process(test_name, tmp_dir) retcode, stdout = self._run_process(test_name, tmp_dir)
finally: finally:
tmp_files = os.listdir(tmp_dir) tmp_files = os.listdir(tmp_dir)

View file

@ -1357,6 +1357,8 @@ class ArgsTestCase(BaseTestCase):
for name in names: for name in names:
self.assertFalse(os.path.exists(name), name) 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): def test_leak_tmp_file(self):
code = textwrap.dedent(r""" code = textwrap.dedent(r"""
import os.path import os.path
@ -1369,15 +1371,17 @@ class ArgsTestCase(BaseTestCase):
with open(filename, "wb") as fp: with open(filename, "wb") as fp:
fp.write(b'content') 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) output = self.run_tests("--fail-env-changed", "-v", "-j2", *testnames, exitcode=3)
self.check_executed_tests(output, [testname], self.check_executed_tests(output, testnames,
env_changed=[testname], env_changed=testnames,
fail_env_changed=True) fail_env_changed=True,
self.assertIn(f"Warning -- {testname} leaked temporary " randomize=True)
f"files (1): mytmpfile", for testname in testnames:
output) self.assertIn(f"Warning -- {testname} leaked temporary "
f"files (1): mytmpfile",
output)
class TestUtils(unittest.TestCase): class TestUtils(unittest.TestCase):

View file

@ -0,0 +1,2 @@
regrtest now checks if a test leaks temporary files or directories if run
with -jN option. Patch by Victor Stinner.