mirror of
https://github.com/libexpat/libexpat.git
synced 2025-04-07 22:19:12 +00:00
Move remaining ignore section tests out of runtests.c
This commit is contained in:
parent
eda657484c
commit
5509b7df8a
4 changed files with 146 additions and 136 deletions
|
@ -2867,6 +2867,87 @@ START_TEST(test_ignore_section) {
|
|||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ignore_section_utf16) {
|
||||
const char text[] =
|
||||
/* <!DOCTYPE d SYSTEM 's'> */
|
||||
"<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
|
||||
"\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n\0"
|
||||
/* <d><e>&en;</e></d> */
|
||||
"<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>\0";
|
||||
const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore_utf16);
|
||||
XML_SetDefaultHandler(g_parser, accumulate_characters);
|
||||
XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
|
||||
XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
|
||||
XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
|
||||
XML_SetStartElementHandler(g_parser, dummy_start_element);
|
||||
XML_SetEndElementHandler(g_parser, dummy_end_element);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ignore_section_utf16_be) {
|
||||
const char text[] =
|
||||
/* <!DOCTYPE d SYSTEM 's'> */
|
||||
"\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
|
||||
"\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n"
|
||||
/* <d><e>&en;</e></d> */
|
||||
"\0<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>";
|
||||
const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetExternalEntityRefHandler(g_parser,
|
||||
external_entity_load_ignore_utf16_be);
|
||||
XML_SetDefaultHandler(g_parser, accumulate_characters);
|
||||
XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
|
||||
XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
|
||||
XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
|
||||
XML_SetStartElementHandler(g_parser, dummy_start_element);
|
||||
XML_SetEndElementHandler(g_parser, dummy_end_element);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test mis-formatted conditional exclusion */
|
||||
START_TEST(test_bad_ignore_section) {
|
||||
const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
|
||||
"<doc><e>&entity;</e></doc>";
|
||||
ExtFaults faults[]
|
||||
= {{"<![IGNORE[<!ELEM", "Broken-off declaration not faulted", NULL,
|
||||
XML_ERROR_SYNTAX},
|
||||
{"<![IGNORE[\x01]]>", "Invalid XML character not faulted", NULL,
|
||||
XML_ERROR_INVALID_TOKEN},
|
||||
{/* FIrst two bytes of a three-byte char */
|
||||
"<![IGNORE[\xe2\x82", "Partial XML character not faulted", NULL,
|
||||
XML_ERROR_PARTIAL_CHAR},
|
||||
{NULL, NULL, NULL, XML_ERROR_NONE}};
|
||||
ExtFaults *fault;
|
||||
|
||||
for (fault = &faults[0]; fault->parse_text != NULL; fault++) {
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
|
||||
XML_SetUserData(g_parser, fault);
|
||||
expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
|
||||
"Incomplete IGNORE section not failed");
|
||||
XML_ParserReset(g_parser, NULL);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
TCase *
|
||||
make_basic_test_case(Suite *s) {
|
||||
TCase *tc_basic = tcase_create("basic tests");
|
||||
|
@ -2994,6 +3075,9 @@ make_basic_test_case(Suite *s) {
|
|||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_tag_in_dtd);
|
||||
tcase_add_test(tc_basic, test_not_predefined_entities);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16_be);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_bad_ignore_section);
|
||||
|
||||
return tc_basic; /* TEMPORARY: this will become a void function */
|
||||
}
|
||||
|
|
|
@ -675,6 +675,58 @@ external_entity_load_ignore(XML_Parser parser, const XML_Char *context,
|
|||
return XML_STATUS_OK;
|
||||
}
|
||||
|
||||
int XMLCALL
|
||||
external_entity_load_ignore_utf16(XML_Parser parser, const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId) {
|
||||
const char text[] =
|
||||
/* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
|
||||
"<\0!\0[\0I\0G\0N\0O\0R\0E\0[\0"
|
||||
"<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 \0"
|
||||
"(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>\0";
|
||||
XML_Parser ext_parser;
|
||||
|
||||
UNUSED_P(base);
|
||||
UNUSED_P(systemId);
|
||||
UNUSED_P(publicId);
|
||||
ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
|
||||
if (ext_parser == NULL)
|
||||
fail("Could not create external entity parser");
|
||||
if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(parser);
|
||||
|
||||
XML_ParserFree(ext_parser);
|
||||
return XML_STATUS_OK;
|
||||
}
|
||||
|
||||
int XMLCALL
|
||||
external_entity_load_ignore_utf16_be(XML_Parser parser, const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId) {
|
||||
const char text[] =
|
||||
/* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
|
||||
"\0<\0!\0[\0I\0G\0N\0O\0R\0E\0["
|
||||
"\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 "
|
||||
"\0(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>";
|
||||
XML_Parser ext_parser;
|
||||
|
||||
UNUSED_P(base);
|
||||
UNUSED_P(systemId);
|
||||
UNUSED_P(publicId);
|
||||
ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
|
||||
if (ext_parser == NULL)
|
||||
fail("Could not create external entity parser");
|
||||
if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(parser);
|
||||
|
||||
XML_ParserFree(ext_parser);
|
||||
return XML_STATUS_OK;
|
||||
}
|
||||
|
||||
/* NotStandalone handlers */
|
||||
|
||||
int XMLCALL
|
||||
|
|
|
@ -226,6 +226,16 @@ extern int XMLCALL external_entity_load_ignore(XML_Parser parser,
|
|||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_load_ignore_utf16(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_load_ignore_utf16_be(
|
||||
XML_Parser parser, const XML_Char *context, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId);
|
||||
|
||||
/* NotStandalone handlers */
|
||||
|
||||
extern int XMLCALL reject_not_standalone_handler(void *userData);
|
||||
|
|
|
@ -74,139 +74,6 @@
|
|||
|
||||
XML_Parser g_parser = NULL;
|
||||
|
||||
static int XMLCALL
|
||||
external_entity_load_ignore_utf16(XML_Parser parser, const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId) {
|
||||
const char text[] =
|
||||
/* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
|
||||
"<\0!\0[\0I\0G\0N\0O\0R\0E\0[\0"
|
||||
"<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 \0"
|
||||
"(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>\0";
|
||||
XML_Parser ext_parser;
|
||||
|
||||
UNUSED_P(base);
|
||||
UNUSED_P(systemId);
|
||||
UNUSED_P(publicId);
|
||||
ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
|
||||
if (ext_parser == NULL)
|
||||
fail("Could not create external entity parser");
|
||||
if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(parser);
|
||||
|
||||
XML_ParserFree(ext_parser);
|
||||
return XML_STATUS_OK;
|
||||
}
|
||||
|
||||
START_TEST(test_ignore_section_utf16) {
|
||||
const char text[] =
|
||||
/* <!DOCTYPE d SYSTEM 's'> */
|
||||
"<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
|
||||
"\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n\0"
|
||||
/* <d><e>&en;</e></d> */
|
||||
"<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>\0";
|
||||
const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore_utf16);
|
||||
XML_SetDefaultHandler(g_parser, accumulate_characters);
|
||||
XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
|
||||
XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
|
||||
XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
|
||||
XML_SetStartElementHandler(g_parser, dummy_start_element);
|
||||
XML_SetEndElementHandler(g_parser, dummy_end_element);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
static int XMLCALL
|
||||
external_entity_load_ignore_utf16_be(XML_Parser parser, const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId) {
|
||||
const char text[] =
|
||||
/* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
|
||||
"\0<\0!\0[\0I\0G\0N\0O\0R\0E\0["
|
||||
"\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 "
|
||||
"\0(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>";
|
||||
XML_Parser ext_parser;
|
||||
|
||||
UNUSED_P(base);
|
||||
UNUSED_P(systemId);
|
||||
UNUSED_P(publicId);
|
||||
ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
|
||||
if (ext_parser == NULL)
|
||||
fail("Could not create external entity parser");
|
||||
if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(parser);
|
||||
|
||||
XML_ParserFree(ext_parser);
|
||||
return XML_STATUS_OK;
|
||||
}
|
||||
|
||||
START_TEST(test_ignore_section_utf16_be) {
|
||||
const char text[] =
|
||||
/* <!DOCTYPE d SYSTEM 's'> */
|
||||
"\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
|
||||
"\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n"
|
||||
/* <d><e>&en;</e></d> */
|
||||
"\0<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>";
|
||||
const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetExternalEntityRefHandler(g_parser,
|
||||
external_entity_load_ignore_utf16_be);
|
||||
XML_SetDefaultHandler(g_parser, accumulate_characters);
|
||||
XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
|
||||
XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
|
||||
XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
|
||||
XML_SetStartElementHandler(g_parser, dummy_start_element);
|
||||
XML_SetEndElementHandler(g_parser, dummy_end_element);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test mis-formatted conditional exclusion */
|
||||
START_TEST(test_bad_ignore_section) {
|
||||
const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
|
||||
"<doc><e>&entity;</e></doc>";
|
||||
ExtFaults faults[]
|
||||
= {{"<![IGNORE[<!ELEM", "Broken-off declaration not faulted", NULL,
|
||||
XML_ERROR_SYNTAX},
|
||||
{"<![IGNORE[\x01]]>", "Invalid XML character not faulted", NULL,
|
||||
XML_ERROR_INVALID_TOKEN},
|
||||
{/* FIrst two bytes of a three-byte char */
|
||||
"<![IGNORE[\xe2\x82", "Partial XML character not faulted", NULL,
|
||||
XML_ERROR_PARTIAL_CHAR},
|
||||
{NULL, NULL, NULL, XML_ERROR_NONE}};
|
||||
ExtFaults *fault;
|
||||
|
||||
for (fault = &faults[0]; fault->parse_text != NULL; fault++) {
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
|
||||
XML_SetUserData(g_parser, fault);
|
||||
expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
|
||||
"Incomplete IGNORE section not failed");
|
||||
XML_ParserReset(g_parser, NULL);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test recursive parsing */
|
||||
static int XMLCALL
|
||||
external_entity_valuer(XML_Parser parser, const XML_Char *context,
|
||||
|
@ -7951,9 +7818,6 @@ make_suite(void) {
|
|||
TCase *tc_accounting = tcase_create("accounting tests");
|
||||
#endif
|
||||
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16_be);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_bad_ignore_section);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_external_entity_values);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_not_standalone);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_value_abort);
|
||||
|
|
Loading…
Add table
Reference in a new issue