]> granicus.if.org Git - libexpat/commitdiff
Test UTF-16BE vs explicit UTF-16LE encoding
authorRhodri James <rhodri@kynesim.co.uk>
Mon, 12 Jun 2017 16:20:10 +0000 (17:20 +0100)
committerSebastian Pipping <sebastian@pipping.org>
Sat, 22 Jul 2017 20:49:18 +0000 (22:49 +0200)
expat/tests/runtests.c

index 59d3b35bbcb106bf81735d27debfe42a3c6f5550..1f4757f789e0971d8613c70a121ecf5d8e7ba501 100644 (file)
@@ -5776,6 +5776,40 @@ START_TEST(test_ext_entity_utf16_be)
 }
 END_TEST
 
+/* Test big-endian UTF-16 given an explicit little-endian encoding */
+START_TEST(test_ext_entity_utf16_le)
+{
+    const char *text =
+        "<!DOCTYPE doc [\n"
+        "  <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+        "]>\n"
+        "<doc>&en;</doc>";
+    ExtTest2 test_data = {
+        "\0<\0e\0/\0>",
+        8,
+        "utf-16le",
+        NULL,
+        EE_PARSE_NONE
+    };
+    const XML_Char *expected =
+        "\xe3\xb0\x80"  /* U+3C00 */
+        "\xe6\x94\x80"  /* U+6A00 */
+        "\xe2\xbc\x80"  /* U+2F00 */
+        "\xe3\xb8\x80"; /* U+3E00 */
+    CharData storage;
+
+    CharData_Init(&storage);
+    test_data.storage = &storage;
+    XML_SetExternalEntityRefHandler(parser, external_entity_loader2);
+    XML_SetUserData(parser, &test_data);
+    XML_SetCharacterDataHandler(parser, ext2_accumulate_characters);
+    if (_XML_Parse_SINGLE_BYTES(parser, text, strlen(text),
+                                XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+    CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
 /* Test not-quite-UTF-8 BOM (0xEF 0xBB 0xBF) */
 START_TEST(test_ext_entity_utf8_non_bom)
 {
@@ -11106,6 +11140,7 @@ make_suite(void)
     tcase_add_test(tc_basic, test_ext_entity_latin1_utf16le_bom2);
     tcase_add_test(tc_basic, test_ext_entity_latin1_utf16be_bom2);
     tcase_add_test(tc_basic, test_ext_entity_utf16_be);
+    tcase_add_test(tc_basic, test_ext_entity_utf16_le);
     tcase_add_test(tc_basic, test_ext_entity_utf8_non_bom);
 
     suite_add_tcase(s, tc_namespace);