]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-97669: Fix test_tools reference leak (#98216)
authorVictor Stinner <vstinner@python.org>
Wed, 12 Oct 2022 15:26:21 +0000 (17:26 +0200)
committerGitHub <noreply@github.com>
Wed, 12 Oct 2022 15:26:21 +0000 (17:26 +0200)
test_tools.test_sundry() now uses an unittest mock to prevent the
logging module to register a real "atfork" function which kept the
logging module dictionary alive. So the logging module can be
properly unloaded. Previously, the logging module was loaded before
test_sundry(), but it's no longer the case since recent test_tools
sub-tests removals.

Lib/test/support/import_helper.py
Lib/test/test_importlib/test_threaded_import.py
Lib/test/test_tools/test_sundry.py

index 5201dc84cf6df4ea2d25a8480750dd0c29e7f1ea..63a8a7952db7a679fe76b17439609434265d4964 100644 (file)
@@ -246,3 +246,11 @@ def modules_cleanup(oldmodules):
     # do currently). Implicitly imported *real* modules should be left alone
     # (see issue 10556).
     sys.modules.update(oldmodules)
+
+
+def mock_register_at_fork(func):
+    # bpo-30599: Mock os.register_at_fork() when importing the random module,
+    # since this function doesn't allow to unregister callbacks and would leak
+    # memory.
+    from unittest import mock
+    return mock.patch('os.register_at_fork', create=True)(func)
index 9aeeb5e686e93687b7f4484646c9c81625ff92b7..85c3032aed53b182a75abd494797ef9ba9788c65 100644 (file)
@@ -15,7 +15,7 @@ import threading
 import unittest
 from unittest import mock
 from test.support import verbose
-from test.support.import_helper import forget
+from test.support.import_helper import forget, mock_register_at_fork
 from test.support.os_helper import (TESTFN, unlink, rmtree)
 from test.support import script_helper, threading_helper
 
@@ -41,12 +41,6 @@ def task(N, done, done_tasks, errors):
         if finished:
             done.set()
 
-def mock_register_at_fork(func):
-    # bpo-30599: Mock os.register_at_fork() when importing the random module,
-    # since this function doesn't allow to unregister callbacks and would leak
-    # memory.
-    return mock.patch('os.register_at_fork', create=True)(func)
-
 # Create a circular import structure: A -> C -> B -> D -> A
 # NOTE: `time` is already loaded and therefore doesn't threaten to deadlock.
 
index 04e38acdb3484e7321c445223f63ba11aea8281d..81f06763980a325050e6c5acc368fae0e85fa998 100644 (file)
@@ -27,7 +27,11 @@ class TestSundryScripts(unittest.TestCase):
 
     skiplist = denylist + allowlist + other
 
-    def test_sundry(self):
+    # import logging registers "atfork" functions which keep indirectly the
+    # logging module dictionary alive. Mock the function to be able to unload
+    # cleanly the logging module.
+    @import_helper.mock_register_at_fork
+    def test_sundry(self, mock_os):
         old_modules = import_helper.modules_setup()
         try:
             for fn in os.listdir(scriptsdir):