]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-116608: Ignore UTF-16 BOM in importlib.resources._functional tests (GH-117569)
authorPetr Viktorin <encukou@gmail.com>
Fri, 5 Apr 2024 15:00:29 +0000 (17:00 +0200)
committerGitHub <noreply@github.com>
Fri, 5 Apr 2024 15:00:29 +0000 (17:00 +0200)
gh-116609: Ignore UTF-16 BOM in importlib.resources._functional tests

To test the `errors` argument, we read a UTF-16 file as UTF-8
with "backslashreplace" error handling. However, the utf-16
codec adds an endian-specific byte-order mark, so on big-endian
machines the expectation doesn't match the test file (which was
saved on a little-endian machine).

Use endswith to ignore the BOM.

Lib/test/test_importlib/resources/test_functional.py

index fd02fc7c0e7b1500990f19f26a0c32925f2453c9..d60a2bedd89798e65eb91f30d70ddbf24e82d55f 100644 (file)
@@ -32,6 +32,12 @@ class FunctionalAPIBase:
             with self.subTest(path_parts=path_parts):
                 yield path_parts
 
+    def assertEndsWith(self, string, suffix):
+        """Assert that `string` ends with `suffix`.
+
+        Used to ignore an architecture-specific UTF-16 byte-order mark."""
+        self.assertEqual(string[-len(suffix):], suffix)
+
     def test_read_text(self):
         self.assertEqual(
             resources.read_text(self.anchor01, 'utf-8.file'),
@@ -65,12 +71,12 @@ class FunctionalAPIBase:
             ),
             '\x00\x01\x02\x03',
         )
-        self.assertEqual(
+        self.assertEndsWith(  # ignore the BOM
             resources.read_text(
                 self.anchor01, 'utf-16.file',
                 errors='backslashreplace',
             ),
-            'Hello, UTF-16 world!\n'.encode('utf-16').decode(
+            'Hello, UTF-16 world!\n'.encode('utf-16-le').decode(
                 errors='backslashreplace',
             ),
         )
@@ -112,9 +118,9 @@ class FunctionalAPIBase:
             self.anchor01, 'utf-16.file',
             errors='backslashreplace',
         ) as f:
-            self.assertEqual(
+            self.assertEndsWith(  # ignore the BOM
                 f.read(),
-                'Hello, UTF-16 world!\n'.encode('utf-16').decode(
+                'Hello, UTF-16 world!\n'.encode('utf-16-le').decode(
                     errors='backslashreplace',
                 ),
             )