https://github.com/python/cpython/commit/14305a83d381ccdcae814abd9e2c28dda066720b
commit: 14305a83d381ccdcae814abd9e2c28dda066720b
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-05-12T19:09:11+03:00
summary:
gh-133677: Fix tests when running in non-UTF-8 locale (GH-133865)
files:
M Lib/test/support/strace_helper.py
M Lib/test/test_argparse.py
M Lib/test/test_asyncio/test_tools.py
M Lib/test/test_pathlib/test_pathlib.py
M Lib/test/test_urllib.py
M Lib/test/test_zipfile/test_core.py
diff --git a/Lib/test/support/strace_helper.py
b/Lib/test/support/strace_helper.py
index 1a9d2b520b7b23..cf95f7bdc7d2ca 100644
--- a/Lib/test/support/strace_helper.py
+++ b/Lib/test/support/strace_helper.py
@@ -38,7 +38,7 @@ def events(self):
This assumes the program under inspection doesn't print any non-utf8
strings which would mix into the strace output."""
- decoded_events = self.event_bytes.decode('utf-8')
+ decoded_events = self.event_bytes.decode('utf-8', 'surrogateescape')
matches = [
_syscall_regex.match(event)
for event in decoded_events.splitlines()
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 5a6be1180c1a3e..8a264b101bc3ba 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -6973,7 +6973,7 @@ def make_zip_script(self, script_name, name_in_zip=None):
def check_usage(self, expected, *args, **kwargs):
res = script_helper.assert_python_ok('-Xutf8', *args, '-h', **kwargs)
- self.assertEqual(res.out.splitlines()[0].decode(),
+ self.assertEqual(os.fsdecode(res.out.splitlines()[0]),
f'usage: {expected} [-h]')
def test_script(self, compiled=False):
diff --git a/Lib/test/test_asyncio/test_tools.py
b/Lib/test/test_asyncio/test_tools.py
index 0413e236c27dfa..ba36e759ccdd61 100644
--- a/Lib/test/test_asyncio/test_tools.py
+++ b/Lib/test/test_asyncio/test_tools.py
@@ -791,21 +791,21 @@ def test_table_output_format(self):
class TestAsyncioToolsEdgeCases(unittest.TestCase):
def test_task_awaits_self(self):
- """A task directly awaits itself – should raise a cycle."""
+ """A task directly awaits itself - should raise a cycle."""
input_ = [(1, [(1, "Self-Awaiter", [[["loopback"], 1]])])]
with self.assertRaises(tools.CycleFoundException) as ctx:
tools.build_async_tree(input_)
self.assertIn([1, 1], ctx.exception.cycles)
def test_task_with_missing_awaiter_id(self):
- """Awaiter ID not in task list – should not crash, just show
'Unknown'."""
+ """Awaiter ID not in task list - should not crash, just show
'Unknown'."""
input_ = [(1, [(1, "Task-A", [[["coro"], 999]])])] # 999 not defined
table = tools.build_task_table(input_)
self.assertEqual(len(table), 1)
self.assertEqual(table[0][4], "Unknown")
def test_duplicate_coroutine_frames(self):
- """Same coroutine frame repeated under a parent – should
deduplicate."""
+ """Same coroutine frame repeated under a parent - should
deduplicate."""
input_ = [
(
1,
@@ -829,7 +829,7 @@ def test_duplicate_coroutine_frames(self):
self.assertIn("Task-1", flat)
def test_task_with_no_name(self):
- """Task with no name in id2name – should still render with fallback."""
+ """Task with no name in id2name - should still render with fallback."""
input_ = [(1, [(1, "root", [[["f1"], 2]]), (2, None, [])])]
# If name is None, fallback to string should not crash
tree = tools.build_async_tree(input_)
diff --git a/Lib/test/test_pathlib/test_pathlib.py
b/Lib/test/test_pathlib/test_pathlib.py
index 8a313cc4292574..37ef9fa1946376 100644
--- a/Lib/test/test_pathlib/test_pathlib.py
+++ b/Lib/test/test_pathlib/test_pathlib.py
@@ -20,7 +20,7 @@
from test.support import is_emscripten, is_wasi
from test.support import infinite_recursion
from test.support import os_helper
-from test.support.os_helper import TESTFN, FakePath
+from test.support.os_helper import TESTFN, FS_NONASCII, FakePath
try:
import fcntl
except ImportError:
@@ -770,12 +770,16 @@ def test_as_uri_windows(self):
self.assertEqual(self.make_uri(P('c:/')), 'file:///c:/')
self.assertEqual(self.make_uri(P('c:/a/b.c')), 'file:///c:/a/b.c')
self.assertEqual(self.make_uri(P('c:/a/b%#c')),
'file:///c:/a/b%25%23c')
- self.assertEqual(self.make_uri(P('c:/a/b\xe9')),
'file:///c:/a/b%C3%A9')
self.assertEqual(self.make_uri(P('//some/share/')),
'file://some/share/')
self.assertEqual(self.make_uri(P('//some/share/a/b.c')),
'file://some/share/a/b.c')
- self.assertEqual(self.make_uri(P('//some/share/a/b%#c\xe9')),
- 'file://some/share/a/b%25%23c%C3%A9')
+
+ from urllib.parse import quote_from_bytes
+ QUOTED_FS_NONASCII = quote_from_bytes(os.fsencode(FS_NONASCII))
+ self.assertEqual(self.make_uri(P('c:/a/b' + FS_NONASCII)),
+ 'file:///c:/a/b' + QUOTED_FS_NONASCII)
+ self.assertEqual(self.make_uri(P('//some/share/a/b%#c' + FS_NONASCII)),
+ 'file://some/share/a/b%25%23c' + QUOTED_FS_NONASCII)
@needs_windows
def test_ordering_windows(self):
diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
index c965860fbb10ef..bc1030eea60c35 100644
--- a/Lib/test/test_urllib.py
+++ b/Lib/test/test_urllib.py
@@ -109,7 +109,7 @@ def setUp(self):
finally:
f.close()
self.pathname = os_helper.TESTFN
- self.quoted_pathname = urllib.parse.quote(self.pathname)
+ self.quoted_pathname = urllib.parse.quote(os.fsencode(self.pathname))
self.returned_obj = urllib.request.urlopen("file:%s" %
self.quoted_pathname)
def tearDown(self):
diff --git a/Lib/test/test_zipfile/test_core.py
b/Lib/test/test_zipfile/test_core.py
index ae898150658565..43056978848c03 100644
--- a/Lib/test/test_zipfile/test_core.py
+++ b/Lib/test/test_zipfile/test_core.py
@@ -3642,7 +3642,7 @@ def test_cli_with_metadata_encoding_extract(self):
except OSError:
pass
except UnicodeEncodeError:
- self.skipTest(f'cannot encode file name {fn!r}')
+ self.skipTest(f'cannot encode file name {fn!a}')
zipfile.main(["--metadata-encoding=shift_jis", "-e", TESTFN, TESTFN2])
listing = os.listdir(TESTFN2)
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]