diff options
| author | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-12-11 11:14:09 -0500 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-12-11 12:28:29 -0500 |
| commit | 9b6751dba0c84073a2ee463293a2d7cfb3aa7184 (patch) | |
| tree | ba8f133b22770855628b6b09c139f91556e33140 | |
| parent | 10d1d2c55ed8ec1e8421e00674b3b6b8448318eb (diff) | |
[4.2.x] Refs #27890 -- Avoided overwriting TMPDIR in runtests.py under forkserver mode.
This variable should only be set once. Under forkserver, this module
was getting executed multiple times, causing nested temporary dirs
that didn't clean up properly, raising FileNotFoundError.
This similar to #27890 although a slightly different cause.
Backport of cd6278c4c09e4af9b2988d585b372d9abeeb63ee from main.
| -rwxr-xr-x | tests/runtests.py | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/tests/runtests.py b/tests/runtests.py index b678988391..b3150ab698 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -65,16 +65,6 @@ RUNTESTS_DIR = os.path.abspath(os.path.dirname(__file__)) TEMPLATE_DIR = os.path.join(RUNTESTS_DIR, "templates") -# Create a specific subdirectory for the duration of the test suite. -TMPDIR = tempfile.mkdtemp(prefix="django_") -# Set the TMPDIR environment variable in addition to tempfile.tempdir -# so that children processes inherit it. -tempfile.tempdir = os.environ["TMPDIR"] = TMPDIR - -# Removing the temporary TMPDIR. -atexit.register(shutil.rmtree, TMPDIR) - - # This is a dict mapping RUNTESTS_DIR subdirectory to subdirectories of that # directory to skip when searching for test modules. SUBDIRS_TO_SKIP = { @@ -197,6 +187,7 @@ def get_filtered_test_modules(start_at, start_after, gis_enabled, test_labels=No def setup_collect_tests(start_at, start_after, test_labels=None): + TMPDIR = os.environ["TMPDIR"] state = { "INSTALLED_APPS": settings.INSTALLED_APPS, "ROOT_URLCONF": getattr(settings, "ROOT_URLCONF", ""), @@ -334,13 +325,6 @@ def setup_run_tests(verbosity, start_at, start_after, test_labels=None): def teardown_run_tests(state): teardown_collect_tests(state) - # Discard the multiprocessing.util finalizer that tries to remove a - # temporary directory that's already removed by this script's - # atexit.register(shutil.rmtree, TMPDIR) handler. Prevents - # FileNotFoundError at the end of a test run (#27890). - from multiprocessing.util import _finalizer_registry - - _finalizer_registry.pop((-100, 0), None) del os.environ["RUNNING_DJANGOS_TEST_SUITE"] @@ -539,6 +523,14 @@ def paired_tests(paired_test, options, test_labels, start_at, start_after): if __name__ == "__main__": + # Create a specific subdirectory for the duration of the test suite. + TMPDIR = tempfile.mkdtemp(prefix="django_") + # Set the TMPDIR environment variable in addition to tempfile.tempdir + # so that children processes inherit it. + tempfile.tempdir = os.environ["TMPDIR"] = TMPDIR + # Remove the temporary TMPDIR. + atexit.register(shutil.rmtree, TMPDIR) + parser = argparse.ArgumentParser(description="Run the Django test suite.") parser.add_argument( "modules", |
