From c53173aa00689aa1be17ce5406289718f6b30532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kul=C3=ADk?= Date: Tue, 2 Jul 2019 12:46:01 +0200 Subject: [PATCH] bpo-37335: Fix test_c_locale_coercion to handle any ASCII alias (GH-14449) Fix unexpected ASCII aliases in locale coercion tests: normalize encoding names with codecs.lookup(encoding).name. --- Lib/test/test_c_locale_coercion.py | 34 ++++++------------- .../2019-06-28-16-54-46.bpo-37335.LLzOx8.rst | 2 ++ 2 files changed, 12 insertions(+), 24 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2019-06-28-16-54-46.bpo-37335.LLzOx8.rst diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py index f2351fa5a2e..94391c87995 100644 --- a/Lib/test/test_c_locale_coercion.py +++ b/Lib/test/test_c_locale_coercion.py @@ -97,11 +97,11 @@ _EncodingDetails = namedtuple("EncodingDetails", _fields) class EncodingDetails(_EncodingDetails): # XXX (ncoghlan): Using JSON for child state reporting may be less fragile CHILD_PROCESS_SCRIPT = ";".join([ - "import sys, os", - "print(sys.getfilesystemencoding())", - "print(sys.stdin.encoding + ':' + sys.stdin.errors)", - "print(sys.stdout.encoding + ':' + sys.stdout.errors)", - "print(sys.stderr.encoding + ':' + sys.stderr.errors)", + "import sys, os, codecs", + "print(codecs.lookup(sys.getfilesystemencoding()).name)", + "print(codecs.lookup(sys.stdin.encoding).name + ':' + sys.stdin.errors)", + "print(codecs.lookup(sys.stdout.encoding).name + ':' + sys.stdout.errors)", + "print(codecs.lookup(sys.stderr.encoding).name + ':' + sys.stderr.errors)", "print(os.environ.get('LANG', 'not set'))", "print(os.environ.get('LC_CTYPE', 'not set'))", "print(os.environ.get('LC_ALL', 'not set'))", @@ -116,28 +116,15 @@ class EncodingDetails(_EncodingDetails): stream_info = 2*[_stream.format("surrogateescape")] # stderr should always use backslashreplace stream_info.append(_stream.format("backslashreplace")) - expected_lang = env_vars.get("LANG", "not set").lower() + expected_lang = env_vars.get("LANG", "not set") if coercion_expected: - expected_lc_ctype = CLI_COERCION_TARGET.lower() + expected_lc_ctype = CLI_COERCION_TARGET else: - expected_lc_ctype = env_vars.get("LC_CTYPE", "not set").lower() - expected_lc_all = env_vars.get("LC_ALL", "not set").lower() + expected_lc_ctype = env_vars.get("LC_CTYPE", "not set") + expected_lc_all = env_vars.get("LC_ALL", "not set") env_info = expected_lang, expected_lc_ctype, expected_lc_all return dict(cls(fs_encoding, *stream_info, *env_info)._asdict()) - @staticmethod - def _handle_output_variations(data): - """Adjust the output to handle platform specific idiosyncrasies - - * Some platforms report ASCII as ANSI_X3.4-1968 - * Some platforms report ASCII as US-ASCII - * Some platforms report UTF-8 instead of utf-8 - """ - data = data.replace(b"ANSI_X3.4-1968", b"ascii") - data = data.replace(b"US-ASCII", b"ascii") - data = data.lower() - return data - @classmethod def get_child_details(cls, env_vars): """Retrieves fsencoding and standard stream details from a child process @@ -157,8 +144,7 @@ class EncodingDetails(_EncodingDetails): if not result.rc == 0: result.fail(py_cmd) # All subprocess outputs in this test case should be pure ASCII - adjusted_output = cls._handle_output_variations(result.out) - stdout_lines = adjusted_output.decode("ascii").splitlines() + stdout_lines = result.out.decode("ascii").splitlines() child_encoding_details = dict(cls(*stdout_lines)._asdict()) stderr_lines = result.err.decode("ascii").rstrip().splitlines() return child_encoding_details, stderr_lines diff --git a/Misc/NEWS.d/next/Tests/2019-06-28-16-54-46.bpo-37335.LLzOx8.rst b/Misc/NEWS.d/next/Tests/2019-06-28-16-54-46.bpo-37335.LLzOx8.rst new file mode 100644 index 00000000000..71fad15dd8e --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-28-16-54-46.bpo-37335.LLzOx8.rst @@ -0,0 +1,2 @@ +Improve locale coercion tests by using codec lookup instead of more fragile +replace().