]> granicus.if.org Git - python/commitdiff
bpo-30635: Fix refleak in test_c_locale_coercion (#2126)
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 13 Jun 2017 11:32:31 +0000 (13:32 +0200)
committerNick Coghlan <ncoghlan@gmail.com>
Tue, 13 Jun 2017 11:32:31 +0000 (21:32 +1000)
When checking for reference leaks, test_c_locale_coercion is run
multiple times and so _LocaleCoercionTargetsTestCase.setUpClass() is
called multiple times. setUpClass() appends new value at each call,
so it looks like a reference leak.

Moving the setup from setUpClass() to setUpModule() avoids
this, eliminating the false alarm.

Lib/test/test_c_locale_coercion.py

index c14d820a2d7931eefb252a3c24f584a8156bc3d3..f537f1d22aa47df36576b366df5beab133dcb063 100644 (file)
@@ -143,27 +143,29 @@ CLI_COERCION_WARNING_FMT = (
     "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior)."
 )
 
-class _LocaleCoercionTargetsTestCase(_ChildProcessEncodingTestCase):
-    # Base class for test cases that rely on coercion targets being defined
 
-    available_targets = []
-    targets_required = True
+AVAILABLE_TARGETS = None
 
-    @classmethod
-    def setUpClass(cls):
-        first_target_locale = None
-        available_targets = cls.available_targets
-        # Find the target locales available in the current system
-        for target_locale in _C_UTF8_LOCALES:
-            if _set_locale_in_subprocess(target_locale):
-                available_targets.append(target_locale)
-                if first_target_locale is None:
-                    first_target_locale = target_locale
-        if cls.targets_required and not available_targets:
-            raise unittest.SkipTest("No C-with-UTF-8 locale available")
-        # Expect coercion to use the first available locale
-        warning_msg = CLI_COERCION_WARNING_FMT.format(first_target_locale)
-        cls.EXPECTED_COERCION_WARNING = warning_msg
+def setUpModule():
+    global AVAILABLE_TARGETS
+
+    if AVAILABLE_TARGETS is not None:
+        # initialization already done
+        return
+    AVAILABLE_TARGETS = []
+
+    # Find the target locales available in the current system
+    for target_locale in _C_UTF8_LOCALES:
+        if _set_locale_in_subprocess(target_locale):
+            AVAILABLE_TARGETS.append(target_locale)
+    if not AVAILABLE_TARGETS:
+        raise unittest.SkipTest("No C-with-UTF-8 locale available")
+
+
+
+class _LocaleCoercionTargetsTestCase(_ChildProcessEncodingTestCase):
+    # Base class for test cases that rely on coercion targets being defined
+    pass
 
 
 class LocaleConfigurationTests(_LocaleCoercionTargetsTestCase):
@@ -183,7 +185,7 @@ class LocaleConfigurationTests(_LocaleCoercionTargetsTestCase):
             "LC_ALL": "",
         }
         for env_var in ("LANG", "LC_CTYPE"):
-            for locale_to_set in self.available_targets:
+            for locale_to_set in AVAILABLE_TARGETS:
                 with self.subTest(env_var=env_var,
                                   configured_locale=locale_to_set):
                     var_dict = base_var_dict.copy()
@@ -215,7 +217,9 @@ class LocaleCoercionTests(_LocaleCoercionTargetsTestCase):
 
         expected_warning = []
         if coerce_c_locale != "0":
-            expected_warning.append(self.EXPECTED_COERCION_WARNING)
+            # Expect coercion to use the first available locale
+            warning_msg = CLI_COERCION_WARNING_FMT.format(AVAILABLE_TARGETS[0])
+            expected_warning.append(warning_msg)
 
         base_var_dict = {
             "LANG": "",