📄 runtests.c
字号:
xml_failure(parser);
CharData_CheckString(&storage, result);
}
/* Regression test for SF bug #566334. */
START_TEST(test_ns_tagname_overwrite)
{
char *text =
"<n:e xmlns:n='http://xml.libexpat.org/'>\n"
" <n:f n:attr='foo'/>\n"
" <n:g n:attr2='bar'/>\n"
"</n:e>";
char *result =
"start http://xml.libexpat.org/ e\n"
"start http://xml.libexpat.org/ f\n"
"attribute http://xml.libexpat.org/ attr\n"
"end http://xml.libexpat.org/ f\n"
"start http://xml.libexpat.org/ g\n"
"attribute http://xml.libexpat.org/ attr2\n"
"end http://xml.libexpat.org/ g\n"
"end http://xml.libexpat.org/ e\n";
run_ns_tagname_overwrite_test(text, result);
}
END_TEST
/* Regression test for SF bug #566334. */
START_TEST(test_ns_tagname_overwrite_triplet)
{
char *text =
"<n:e xmlns:n='http://xml.libexpat.org/'>\n"
" <n:f n:attr='foo'/>\n"
" <n:g n:attr2='bar'/>\n"
"</n:e>";
char *result =
"start http://xml.libexpat.org/ e n\n"
"start http://xml.libexpat.org/ f n\n"
"attribute http://xml.libexpat.org/ attr n\n"
"end http://xml.libexpat.org/ f n\n"
"start http://xml.libexpat.org/ g n\n"
"attribute http://xml.libexpat.org/ attr2 n\n"
"end http://xml.libexpat.org/ g n\n"
"end http://xml.libexpat.org/ e n\n";
XML_SetReturnNSTriplet(parser, XML_TRUE);
run_ns_tagname_overwrite_test(text, result);
}
END_TEST
/* Regression test for SF bug #620343. */
static void XMLCALL
start_element_fail(void *userData,
const XML_Char *name, const XML_Char **atts)
{
/* We should never get here. */
fail("should never reach start_element_fail()");
}
static void XMLCALL
start_ns_clearing_start_element(void *userData,
const XML_Char *prefix,
const XML_Char *uri)
{
XML_SetStartElementHandler((XML_Parser) userData, NULL);
}
START_TEST(test_start_ns_clears_start_element)
{
/* This needs to use separate start/end tags; using the empty tag
syntax doesn't cause the problematic path through Expat to be
taken.
*/
char *text = "<e xmlns='http://xml.libexpat.org/'></e>";
XML_SetStartElementHandler(parser, start_element_fail);
XML_SetStartNamespaceDeclHandler(parser, start_ns_clearing_start_element);
XML_UseParserAsHandlerArg(parser);
if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
xml_failure(parser);
}
END_TEST
/* Regression test for SF bug #616863. */
static int XMLCALL
external_entity_handler(XML_Parser parser,
const XML_Char *context,
const XML_Char *base,
const XML_Char *systemId,
const XML_Char *publicId)
{
int callno = 1 + (int)XML_GetUserData(parser);
char *text;
XML_Parser p2;
if (callno == 1)
text = ("<!ELEMENT doc (e+)>\n"
"<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
"<!ELEMENT e EMPTY>\n");
else
text = ("<?xml version='1.0' encoding='us-ascii'?>"
"<e/>");
XML_SetUserData(parser, (void *) callno);
p2 = XML_ExternalEntityParserCreate(parser, context, NULL);
if (XML_Parse(p2, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) {
xml_failure(p2);
return 0;
}
XML_ParserFree(p2);
return 1;
}
START_TEST(test_default_ns_from_ext_subset_and_ext_ge)
{
char *text =
"<?xml version='1.0'?>\n"
"<!DOCTYPE doc SYSTEM 'http://xml.libexpat.org/doc.dtd' [\n"
" <!ENTITY en SYSTEM 'http://xml.libexpat.org/entity.ent'>\n"
"]>\n"
"<doc xmlns='http://xml.libexpat.org/ns1'>\n"
"&en;\n"
"</doc>";
XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
XML_SetExternalEntityRefHandler(parser, external_entity_handler);
/* We actually need to set this handler to tickle this bug. */
XML_SetStartElementHandler(parser, dummy_start_element);
XML_SetUserData(parser, NULL);
if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
xml_failure(parser);
}
END_TEST
/* Regression test #1 for SF bug #673791. */
START_TEST(test_ns_prefix_with_empty_uri_1)
{
char *text =
"<doc xmlns:prefix='http://xml.libexpat.org/'>\n"
" <e xmlns:prefix=''/>\n"
"</doc>";
expect_failure(text,
XML_ERROR_UNDECLARING_PREFIX,
"Did not report re-setting namespace"
" URI with prefix to ''.");
}
END_TEST
/* Regression test #2 for SF bug #673791. */
START_TEST(test_ns_prefix_with_empty_uri_2)
{
char *text =
"<?xml version='1.0'?>\n"
"<docelem xmlns:pre=''/>";
expect_failure(text,
XML_ERROR_UNDECLARING_PREFIX,
"Did not report setting namespace URI with prefix to ''.");
}
END_TEST
/* Regression test #3 for SF bug #673791. */
START_TEST(test_ns_prefix_with_empty_uri_3)
{
char *text =
"<!DOCTYPE doc [\n"
" <!ELEMENT doc EMPTY>\n"
" <!ATTLIST doc\n"
" xmlns:prefix CDATA ''>\n"
"]>\n"
"<doc/>";
expect_failure(text,
XML_ERROR_UNDECLARING_PREFIX,
"Didn't report attr default setting NS w/ prefix to ''.");
}
END_TEST
/* Regression test #4 for SF bug #673791. */
START_TEST(test_ns_prefix_with_empty_uri_4)
{
char *text =
"<!DOCTYPE doc [\n"
" <!ELEMENT prefix:doc EMPTY>\n"
" <!ATTLIST prefix:doc\n"
" xmlns:prefix CDATA 'http://xml.libexpat.org/'>\n"
"]>\n"
"<prefix:doc/>";
/* Packaged info expected by the end element handler;
the weird structuring lets us re-use the triplet_end_checker()
function also used for another test. */
char *elemstr[] = {
"http://xml.libexpat.org/ doc prefix"
};
XML_SetReturnNSTriplet(parser, XML_TRUE);
XML_SetUserData(parser, elemstr);
XML_SetEndElementHandler(parser, triplet_end_checker);
if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
xml_failure(parser);
}
END_TEST
START_TEST(test_ns_default_with_empty_uri)
{
char *text =
"<doc xmlns='http://xml.libexpat.org/'>\n"
" <e xmlns=''/>\n"
"</doc>";
if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
xml_failure(parser);
}
END_TEST
/* Regression test for SF bug #692964: two prefixes for one namespace. */
START_TEST(test_ns_duplicate_attrs_diff_prefixes)
{
char *text =
"<doc xmlns:a='http://xml.libexpat.org/a'\n"
" xmlns:b='http://xml.libexpat.org/a'\n"
" a:a='v' b:a='v' />";
expect_failure(text,
XML_ERROR_DUPLICATE_ATTRIBUTE,
"did not report multiple attributes with same URI+name");
}
END_TEST
/* Regression test for SF bug #695401: unbound prefix. */
START_TEST(test_ns_unbound_prefix_on_attribute)
{
char *text = "<doc a:attr=''/>";
expect_failure(text,
XML_ERROR_UNBOUND_PREFIX,
"did not report unbound prefix on attribute");
}
END_TEST
/* Regression test for SF bug #695401: unbound prefix. */
START_TEST(test_ns_unbound_prefix_on_element)
{
char *text = "<a:doc/>";
expect_failure(text,
XML_ERROR_UNBOUND_PREFIX,
"did not report unbound prefix on element");
}
END_TEST
static Suite *
make_suite(void)
{
Suite *s = suite_create("basic");
TCase *tc_basic = tcase_create("basic tests");
TCase *tc_namespace = tcase_create("XML namespaces");
suite_add_tcase(s, tc_basic);
tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown);
tcase_add_test(tc_basic, test_nul_byte);
tcase_add_test(tc_basic, test_u0000_char);
tcase_add_test(tc_basic, test_bom_utf8);
tcase_add_test(tc_basic, test_bom_utf16_be);
tcase_add_test(tc_basic, test_bom_utf16_le);
tcase_add_test(tc_basic, test_illegal_utf8);
tcase_add_test(tc_basic, test_utf16);
tcase_add_test(tc_basic, test_utf16_le_epilog_newline);
tcase_add_test(tc_basic, test_latin1_umlauts);
/* Regression test for SF bug #491986. */
tcase_add_test(tc_basic, test_danish_latin1);
/* Regression test for SF bug #514281. */
tcase_add_test(tc_basic, test_french_charref_hexidecimal);
tcase_add_test(tc_basic, test_french_charref_decimal);
tcase_add_test(tc_basic, test_french_latin1);
tcase_add_test(tc_basic, test_french_utf8);
tcase_add_test(tc_basic, test_utf8_false_rejection);
tcase_add_test(tc_basic, test_line_number_after_parse);
tcase_add_test(tc_basic, test_column_number_after_parse);
tcase_add_test(tc_basic, test_line_and_column_numbers_inside_handlers);
tcase_add_test(tc_basic, test_line_number_after_error);
tcase_add_test(tc_basic, test_column_number_after_error);
tcase_add_test(tc_basic, test_really_long_lines);
tcase_add_test(tc_basic, test_end_element_events);
tcase_add_test(tc_basic, test_attr_whitespace_normalization);
tcase_add_test(tc_basic, test_xmldecl_misplaced);
tcase_add_test(tc_basic, test_unknown_encoding_internal_entity);
tcase_add_test(tc_basic,
test_wfc_undeclared_entity_unread_external_subset);
tcase_add_test(tc_basic, test_wfc_undeclared_entity_no_external_subset);
tcase_add_test(tc_basic, test_wfc_undeclared_entity_standalone);
tcase_add_test(tc_basic, test_wfc_undeclared_entity_with_external_subset);
tcase_add_test(tc_basic,
test_wfc_undeclared_entity_with_external_subset_standalone);
tcase_add_test(tc_basic, test_wfc_no_recursive_entity_refs);
tcase_add_test(tc_basic, test_ext_entity_set_encoding);
tcase_add_test(tc_basic, test_dtd_default_handling);
tcase_add_test(tc_basic, test_empty_ns_without_namespaces);
tcase_add_test(tc_basic, test_ns_in_attribute_default_without_namespaces);
suite_add_tcase(s, tc_namespace);
tcase_add_checked_fixture(tc_namespace,
namespace_setup, namespace_teardown);
tcase_add_test(tc_namespace, test_return_ns_triplet);
tcase_add_test(tc_namespace, test_ns_tagname_overwrite);
tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet);
tcase_add_test(tc_namespace, test_start_ns_clears_start_element);
tcase_add_test(tc_namespace, test_default_ns_from_ext_subset_and_ext_ge);
tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1);
tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2);
tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3);
tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4);
tcase_add_test(tc_namespace, test_ns_default_with_empty_uri);
tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes);
tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute);
tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element);
return s;
}
#ifdef AMIGA_SHARED_LIB
int
amiga_main(int argc, char *argv[])
#else
int
main(int argc, char *argv[])
#endif
{
int i, nf;
int forking = 0, forking_set = 0;
int verbosity = CK_NORMAL;
Suite *s = make_suite();
SRunner *sr = srunner_create(s);
/* run the tests for internal helper functions */
testhelper_is_whitespace_normalized();
for (i = 1; i < argc; ++i) {
char *opt = argv[i];
if (strcmp(opt, "-v") == 0 || strcmp(opt, "--verbose") == 0)
verbosity = CK_VERBOSE;
else if (strcmp(opt, "-q") == 0 || strcmp(opt, "--quiet") == 0)
verbosity = CK_SILENT;
else if (strcmp(opt, "-f") == 0 || strcmp(opt, "--fork") == 0) {
forking = 1;
forking_set = 1;
}
else if (strcmp(opt, "-n") == 0 || strcmp(opt, "--no-fork") == 0) {
forking = 0;
forking_set = 1;
}
else {
fprintf(stderr, "runtests: unknown option '%s'\n", opt);
return 2;
}
}
if (forking_set)
srunner_set_fork_status(sr, forking ? CK_FORK : CK_NOFORK);
if (verbosity != CK_SILENT)
printf("Expat version: %s\n", XML_ExpatVersion());
srunner_run_all(sr, verbosity);
nf = srunner_ntests_failed(sr);
srunner_free(sr);
return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -