mirror of
https://github.com/libexpat/libexpat.git
synced 2025-04-07 22:19:12 +00:00
Move some parameter entity tests out of runtests.c
This commit is contained in:
parent
16ddb05e82
commit
252e93dbdc
4 changed files with 97 additions and 91 deletions
|
@ -3150,6 +3150,66 @@ START_TEST(test_group_choice) {
|
|||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_standalone_parameter_entity) {
|
||||
const char *text = "<?xml version='1.0' standalone='yes'?>\n"
|
||||
"<!DOCTYPE doc SYSTEM 'http://example.org/' [\n"
|
||||
"<!ENTITY % entity '<!ELEMENT doc (#PCDATA)>'>\n"
|
||||
"%entity;\n"
|
||||
"]>\n"
|
||||
"<doc></doc>";
|
||||
char dtd_data[] = "<!ENTITY % e1 'foo'>\n";
|
||||
|
||||
XML_SetUserData(g_parser, dtd_data);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test skipping of parameter entity in an external DTD */
|
||||
/* Derived from ibm/invalid/P69/ibm69i01.xml */
|
||||
START_TEST(test_skipped_parameter_entity) {
|
||||
const char *text = "<?xml version='1.0'?>\n"
|
||||
"<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
|
||||
"<!ELEMENT root (#PCDATA|a)* >\n"
|
||||
"]>\n"
|
||||
"<root></root>";
|
||||
ExtTest dtd_data = {"%pe2;", NULL, NULL};
|
||||
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
|
||||
XML_SetUserData(g_parser, &dtd_data);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetSkippedEntityHandler(g_parser, dummy_skip_handler);
|
||||
init_dummy_handlers();
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
if (get_dummy_handler_flags() != DUMMY_SKIP_HANDLER_FLAG)
|
||||
fail("Skip handler not executed");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test recursive parameter entity definition rejected in external DTD */
|
||||
START_TEST(test_recursive_external_parameter_entity) {
|
||||
const char *text = "<?xml version='1.0'?>\n"
|
||||
"<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
|
||||
"<!ELEMENT root (#PCDATA|a)* >\n"
|
||||
"]>\n"
|
||||
"<root></root>";
|
||||
ExtFaults dtd_data = {"<!ENTITY % pe2 '%pe2;'>\n%pe2;",
|
||||
"Recursive external parameter entity not faulted", NULL,
|
||||
XML_ERROR_RECURSIVE_ENTITY_REF};
|
||||
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
|
||||
XML_SetUserData(g_parser, &dtd_data);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
|
||||
"Recursive external parameter not spotted");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
TCase *
|
||||
make_basic_test_case(Suite *s) {
|
||||
TCase *tc_basic = tcase_create("basic tests");
|
||||
|
@ -3290,6 +3350,10 @@ make_basic_test_case(Suite *s) {
|
|||
tcase_add_test(tc_basic, test_public_notation_no_sysid);
|
||||
tcase_add_test(tc_basic, test_nested_groups);
|
||||
tcase_add_test(tc_basic, test_group_choice);
|
||||
tcase_add_test(tc_basic, test_standalone_parameter_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_skipped_parameter_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic,
|
||||
test_recursive_external_parameter_entity);
|
||||
|
||||
return tc_basic; /* TEMPORARY: this will become a void function */
|
||||
}
|
||||
|
|
|
@ -847,6 +847,33 @@ external_entity_value_aborter(XML_Parser parser, const XML_Char *context,
|
|||
return XML_STATUS_OK;
|
||||
}
|
||||
|
||||
int XMLCALL
|
||||
external_entity_public(XML_Parser parser, const XML_Char *context,
|
||||
const XML_Char *base, const XML_Char *systemId,
|
||||
const XML_Char *publicId) {
|
||||
const char *text1 = (const char *)XML_GetUserData(parser);
|
||||
const char *text2 = "<!ATTLIST doc a CDATA 'value'>";
|
||||
const char *text = NULL;
|
||||
XML_Parser ext_parser;
|
||||
int parse_res;
|
||||
|
||||
UNUSED_P(base);
|
||||
ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
|
||||
if (ext_parser == NULL)
|
||||
return XML_STATUS_ERROR;
|
||||
if (systemId != NULL && ! xcstrcmp(systemId, XCS("http://example.org/"))) {
|
||||
text = text1;
|
||||
} else if (publicId != NULL && ! xcstrcmp(publicId, XCS("foo"))) {
|
||||
text = text2;
|
||||
} else
|
||||
fail("Unexpected parameters to external entity parser");
|
||||
assert(text != NULL);
|
||||
parse_res
|
||||
= _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
|
||||
XML_ParserFree(ext_parser);
|
||||
return parse_res;
|
||||
}
|
||||
|
||||
/* NotStandalone handlers */
|
||||
|
||||
int XMLCALL
|
||||
|
|
|
@ -254,6 +254,12 @@ extern int XMLCALL external_entity_value_aborter(XML_Parser parser,
|
|||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_public(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,93 +74,6 @@
|
|||
|
||||
XML_Parser g_parser = NULL;
|
||||
|
||||
static int XMLCALL
|
||||
external_entity_public(XML_Parser parser, const XML_Char *context,
|
||||
const XML_Char *base, const XML_Char *systemId,
|
||||
const XML_Char *publicId) {
|
||||
const char *text1 = (const char *)XML_GetUserData(parser);
|
||||
const char *text2 = "<!ATTLIST doc a CDATA 'value'>";
|
||||
const char *text = NULL;
|
||||
XML_Parser ext_parser;
|
||||
int parse_res;
|
||||
|
||||
UNUSED_P(base);
|
||||
ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
|
||||
if (ext_parser == NULL)
|
||||
return XML_STATUS_ERROR;
|
||||
if (systemId != NULL && ! xcstrcmp(systemId, XCS("http://example.org/"))) {
|
||||
text = text1;
|
||||
} else if (publicId != NULL && ! xcstrcmp(publicId, XCS("foo"))) {
|
||||
text = text2;
|
||||
} else
|
||||
fail("Unexpected parameters to external entity parser");
|
||||
assert(text != NULL);
|
||||
parse_res
|
||||
= _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
|
||||
XML_ParserFree(ext_parser);
|
||||
return parse_res;
|
||||
}
|
||||
|
||||
START_TEST(test_standalone_parameter_entity) {
|
||||
const char *text = "<?xml version='1.0' standalone='yes'?>\n"
|
||||
"<!DOCTYPE doc SYSTEM 'http://example.org/' [\n"
|
||||
"<!ENTITY % entity '<!ELEMENT doc (#PCDATA)>'>\n"
|
||||
"%entity;\n"
|
||||
"]>\n"
|
||||
"<doc></doc>";
|
||||
char dtd_data[] = "<!ENTITY % e1 'foo'>\n";
|
||||
|
||||
XML_SetUserData(g_parser, dtd_data);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test skipping of parameter entity in an external DTD */
|
||||
/* Derived from ibm/invalid/P69/ibm69i01.xml */
|
||||
START_TEST(test_skipped_parameter_entity) {
|
||||
const char *text = "<?xml version='1.0'?>\n"
|
||||
"<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
|
||||
"<!ELEMENT root (#PCDATA|a)* >\n"
|
||||
"]>\n"
|
||||
"<root></root>";
|
||||
ExtTest dtd_data = {"%pe2;", NULL, NULL};
|
||||
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
|
||||
XML_SetUserData(g_parser, &dtd_data);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetSkippedEntityHandler(g_parser, dummy_skip_handler);
|
||||
init_dummy_handlers();
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
if (get_dummy_handler_flags() != DUMMY_SKIP_HANDLER_FLAG)
|
||||
fail("Skip handler not executed");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test recursive parameter entity definition rejected in external DTD */
|
||||
START_TEST(test_recursive_external_parameter_entity) {
|
||||
const char *text = "<?xml version='1.0'?>\n"
|
||||
"<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
|
||||
"<!ELEMENT root (#PCDATA|a)* >\n"
|
||||
"]>\n"
|
||||
"<root></root>";
|
||||
ExtFaults dtd_data = {"<!ENTITY % pe2 '%pe2;'>\n%pe2;",
|
||||
"Recursive external parameter entity not faulted", NULL,
|
||||
XML_ERROR_RECURSIVE_ENTITY_REF};
|
||||
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
|
||||
XML_SetUserData(g_parser, &dtd_data);
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
|
||||
"Recursive external parameter not spotted");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test undefined parameter entity in external entity handler */
|
||||
static int XMLCALL
|
||||
external_entity_devaluer(XML_Parser parser, const XML_Char *context,
|
||||
|
@ -7489,10 +7402,6 @@ make_suite(void) {
|
|||
TCase *tc_accounting = tcase_create("accounting tests");
|
||||
#endif
|
||||
|
||||
tcase_add_test(tc_basic, test_standalone_parameter_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_skipped_parameter_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic,
|
||||
test_recursive_external_parameter_entity);
|
||||
tcase_add_test(tc_basic, test_undefined_ext_entity_in_external_dtd);
|
||||
tcase_add_test(tc_basic, test_suspend_xdecl);
|
||||
tcase_add_test(tc_basic, test_abort_epilog);
|
||||
|
|
Loading…
Add table
Reference in a new issue