[Python-checkins] gh-101758: Fix Refleak-Related Failures in test_singlephase_variants (gh-101969)

ericsnowcurrently webhook-mailer at python.org
Thu Feb 16 19:21:58 EST 2023


https://github.com/python/cpython/commit/984f8ab018f847fe8d66768af962f69ec0e81849
commit: 984f8ab018f847fe8d66768af962f69ec0e81849
branch: main
author: Eric Snow <ericsnowcurrently at gmail.com>
committer: ericsnowcurrently <ericsnowcurrently at gmail.com>
date: 2023-02-16T17:21:22-07:00
summary:

gh-101758: Fix Refleak-Related Failures in test_singlephase_variants (gh-101969)

gh-101891 is causing failures under `$> ./python -m test test_imp -R 3:3`.  Furthermore, with that fixed, "test_singlephase_variants" is leaking references.  This change addresses the first part, but skips the leaking tests until we can follow up with a fix.

https://github.com/python/cpython/issues/101758

files:
M Lib/test/test_imp.py

diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
index 5997ffad8e12..2292bb209395 100644
--- a/Lib/test/test_imp.py
+++ b/Lib/test/test_imp.py
@@ -263,6 +263,7 @@ def test_issue16421_multiple_modules_in_one_dll(self):
         with self.assertRaises(ImportError):
             imp.load_dynamic('nonexistent', pathname)
 
+    @unittest.skip('known refleak (temporarily skipping)')
     @requires_subinterpreters
     @requires_load_dynamic
     def test_singlephase_multiple_interpreters(self):
@@ -329,9 +330,10 @@ def clean_up():
         # However, globals are still shared.
         _interpreters.run_string(interp2, script % 2)
 
+    @unittest.skip('known refleak (temporarily skipping)')
     @requires_load_dynamic
     def test_singlephase_variants(self):
-        '''Exercise the most meaningful variants described in Python/import.c.'''
+        # Exercise the most meaningful variants described in Python/import.c.
         self.maxDiff = None
 
         basename = '_testsinglephase'
@@ -343,6 +345,11 @@ def clean_up():
             _testsinglephase._clear_globals()
         self.addCleanup(clean_up)
 
+        def add_ext_cleanup(name):
+            def clean_up():
+                _testinternalcapi.clear_extension(name, pathname)
+            self.addCleanup(clean_up)
+
         modules = {}
         def load(name):
             assert name not in modules
@@ -440,6 +447,7 @@ def check_with_reinit_reloaded(module, lookedup, initialized,
         # Check the "basic" module.
 
         name = basename
+        add_ext_cleanup(name)
         expected_init_count = 1
         with self.subTest(name):
             mod = load(name)
@@ -457,6 +465,7 @@ def check_with_reinit_reloaded(module, lookedup, initialized,
         # Check its indirect variants.
 
         name = f'{basename}_basic_wrapper'
+        add_ext_cleanup(name)
         expected_init_count += 1
         with self.subTest(name):
             mod = load(name)
@@ -480,6 +489,7 @@ def check_with_reinit_reloaded(module, lookedup, initialized,
         # Check its direct variant.
 
         name = f'{basename}_basic_copy'
+        add_ext_cleanup(name)
         expected_init_count += 1
         with self.subTest(name):
             mod = load(name)
@@ -500,6 +510,7 @@ def check_with_reinit_reloaded(module, lookedup, initialized,
         # Check the non-basic variant that has no state.
 
         name = f'{basename}_with_reinit'
+        add_ext_cleanup(name)
         with self.subTest(name):
             mod = load(name)
             lookedup, initialized, cached = check_common(name, mod)
@@ -518,6 +529,7 @@ def check_with_reinit_reloaded(module, lookedup, initialized,
         # Check the basic variant that has state.
 
         name = f'{basename}_with_state'
+        add_ext_cleanup(name)
         with self.subTest(name):
             mod = load(name)
             lookedup, initialized, cached = check_common(name, mod)



More information about the Python-checkins mailing list