Commit 023564bf authored by Victor Stinner's avatar Victor Stinner Committed by Nick Coghlan

bpo-30635: Fix refleak in test_c_locale_coercion (#2126)

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.
parent eb52ac89
...@@ -143,27 +143,29 @@ CLI_COERCION_WARNING_FMT = ( ...@@ -143,27 +143,29 @@ CLI_COERCION_WARNING_FMT = (
"or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior)." "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 = [] AVAILABLE_TARGETS = None
targets_required = True
def setUpModule():
global AVAILABLE_TARGETS
if AVAILABLE_TARGETS is not None:
# initialization already done
return
AVAILABLE_TARGETS = []
@classmethod
def setUpClass(cls):
first_target_locale = None
available_targets = cls.available_targets
# Find the target locales available in the current system # Find the target locales available in the current system
for target_locale in _C_UTF8_LOCALES: for target_locale in _C_UTF8_LOCALES:
if _set_locale_in_subprocess(target_locale): if _set_locale_in_subprocess(target_locale):
available_targets.append(target_locale) AVAILABLE_TARGETS.append(target_locale)
if first_target_locale is None: if not AVAILABLE_TARGETS:
first_target_locale = target_locale
if cls.targets_required and not available_targets:
raise unittest.SkipTest("No C-with-UTF-8 locale available") 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
class _LocaleCoercionTargetsTestCase(_ChildProcessEncodingTestCase):
# Base class for test cases that rely on coercion targets being defined
pass
class LocaleConfigurationTests(_LocaleCoercionTargetsTestCase): class LocaleConfigurationTests(_LocaleCoercionTargetsTestCase):
...@@ -183,7 +185,7 @@ class LocaleConfigurationTests(_LocaleCoercionTargetsTestCase): ...@@ -183,7 +185,7 @@ class LocaleConfigurationTests(_LocaleCoercionTargetsTestCase):
"LC_ALL": "", "LC_ALL": "",
} }
for env_var in ("LANG", "LC_CTYPE"): 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, with self.subTest(env_var=env_var,
configured_locale=locale_to_set): configured_locale=locale_to_set):
var_dict = base_var_dict.copy() var_dict = base_var_dict.copy()
...@@ -215,7 +217,9 @@ class LocaleCoercionTests(_LocaleCoercionTargetsTestCase): ...@@ -215,7 +217,9 @@ class LocaleCoercionTests(_LocaleCoercionTargetsTestCase):
expected_warning = [] expected_warning = []
if coerce_c_locale != "0": 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 = { base_var_dict = {
"LANG": "", "LANG": "",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment