From: Serhiy Storchaka Date: Fri, 24 Jul 2026 12:54:47 +0000 (+0300) Subject: [3.13] gh-154582: Fix test_invalid_utf8_arg in non-UTF-8 multibyte locales (GH-154584... X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3871923d65c30cb8cd8306820a6f235547c0bcb4;p=thirdparty%2FPython%2Fcpython.git [3.13] gh-154582: Fix test_invalid_utf8_arg in non-UTF-8 multibyte locales (GH-154584) (GH-154605) Arbitrary bytes round-trip through surrogateescape only in UTF-8 and single-byte encodings, not in a stateful multibyte encoding such as EUC-JP. (cherry picked from commit b1e530ebf3b68e884ab37882d690d95e5d82aef5) Co-authored-by: Claude Opus 4.8 --- diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 797615c915c3..7c2e1b98c28d 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -326,8 +326,26 @@ class CmdLineTest(unittest.TestCase): ) test_args = [valid_utf8, invalid_utf8] - for run_cmd in (run_default, run_c_locale, run_utf8_mode): - with self.subTest(run_cmd=run_cmd): + for run_cmd, encoding in ( + (run_default, sys.getfilesystemencoding()), + (run_c_locale, None), + (run_utf8_mode, None), + ): + with self.subTest(run_cmd=run_cmd.__name__): + # Arbitrary bytes round-trip through surrogateescape only in + # UTF-8 and single-byte encodings, not in a multibyte encoding + # such as EUC-JP. + if encoding is not None: + try: + lossless = len(bytes(range(256)).decode( + encoding, 'surrogateescape')) == 256 + except UnicodeError: + lossless = False + else: + lossless = True + if not lossless: + self.skipTest(f'{encoding} cannot losslessly ' + f'round-trip arbitrary bytes') for arg in test_args: proc = run_cmd(arg) self.assertEqual(proc.stdout.rstrip(), ascii(arg))