Move remaining declaration, comment and PI tests out of runtests.c

This commit is contained in:
Rhodri James 2022-10-31 16:57:03 +00:00
parent e827f83974
commit 932748bf1b
4 changed files with 216 additions and 211 deletions

View file

@ -46,6 +46,7 @@
#include "common.h"
#include "minicheck.h"
#include "dummy.h"
#include "handlers.h"
#include "alloc_tests.h"
void
@ -93,6 +94,196 @@ START_TEST(test_alloc_parse_xdecl) {
}
END_TEST
/* As above, but with an encoding big enough to cause storing the
* version information to expand the string pool being used.
*/
START_TEST(test_alloc_parse_xdecl_2) {
const char *text
= "<?xml version='1.0' encoding='"
/* Each line is 64 characters */
"ThisIsAStupidlyLongEncodingNameIntendedToTriggerPoolGrowth123456"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN"
"'?>"
"<doc>Hello, world</doc>";
int i;
const int max_alloc_count = 20;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
XML_SetUnknownEncodingHandler(g_parser, long_encoding_handler, NULL);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
/* Test the effects of allocation failures on a straightforward parse */
START_TEST(test_alloc_parse_pi) {
const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
"<?pi unknown?>\n"
"<doc>"
"Hello, world"
"</doc>";
int i;
const int max_alloc_count = 15;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
START_TEST(test_alloc_parse_pi_2) {
const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
"<doc>"
"Hello, world"
"<?pi unknown?>\n"
"</doc>";
int i;
const int max_alloc_count = 15;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
START_TEST(test_alloc_parse_pi_3) {
const char *text
= "<?"
/* 64 characters per line */
"This processing instruction should be long enough to ensure that"
"it triggers the growth of an internal string pool when the "
"allocator fails at a cruicial moment FGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"Q?><doc/>";
int i;
const int max_alloc_count = 20;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
START_TEST(test_alloc_parse_comment) {
const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
"<!-- Test parsing this comment -->"
"<doc>Hi</doc>";
int i;
const int max_alloc_count = 15;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetCommentHandler(g_parser, dummy_comment_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
START_TEST(test_alloc_parse_comment_2) {
const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
"<doc>"
"Hello, world"
"<!-- Parse this comment too -->"
"</doc>";
int i;
const int max_alloc_count = 15;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetCommentHandler(g_parser, dummy_comment_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
TCase *
make_alloc_test_case(Suite *s) {
TCase *tc_alloc = tcase_create("allocation tests");
@ -101,6 +292,12 @@ make_alloc_test_case(Suite *s) {
tcase_add_checked_fixture(tc_alloc, alloc_setup, alloc_teardown);
tcase_add_test(tc_alloc, test_alloc_parse_xdecl);
tcase_add_test(tc_alloc, test_alloc_parse_xdecl_2);
tcase_add_test(tc_alloc, test_alloc_parse_pi);
tcase_add_test(tc_alloc, test_alloc_parse_pi_2);
tcase_add_test(tc_alloc, test_alloc_parse_pi_3);
tcase_add_test(tc_alloc, test_alloc_parse_comment);
tcase_add_test(tc_alloc, test_alloc_parse_comment_2);
return tc_alloc; /* TEMPORARY: this will become a void function */
}

View file

@ -389,6 +389,21 @@ MiscEncodingHandler(void *data, const XML_Char *encoding, XML_Encoding *info) {
return XML_STATUS_OK;
}
int XMLCALL
long_encoding_handler(void *userData, const XML_Char *encoding,
XML_Encoding *info) {
int i;
UNUSED_P(userData);
UNUSED_P(encoding);
for (i = 0; i < 256; i++)
info->map[i] = i;
info->data = NULL;
info->convert = NULL;
info->release = NULL;
return XML_STATUS_OK;
}
/* External Entity Handlers */
int XMLCALL

View file

@ -147,6 +147,10 @@ extern int XMLCALL unknown_released_encoding_handler(void *data,
extern int XMLCALL MiscEncodingHandler(void *data, const XML_Char *encoding,
XML_Encoding *info);
extern int XMLCALL long_encoding_handler(void *userData,
const XML_Char *encoding,
XML_Encoding *info);
/* External Entity Handlers */
typedef struct ExtOption {

View file

@ -76,211 +76,6 @@
XML_Parser g_parser = NULL;
/* As above, but with an encoding big enough to cause storing the
* version information to expand the string pool being used.
*/
static int XMLCALL
long_encoding_handler(void *userData, const XML_Char *encoding,
XML_Encoding *info) {
int i;
UNUSED_P(userData);
UNUSED_P(encoding);
for (i = 0; i < 256; i++)
info->map[i] = i;
info->data = NULL;
info->convert = NULL;
info->release = NULL;
return XML_STATUS_OK;
}
START_TEST(test_alloc_parse_xdecl_2) {
const char *text
= "<?xml version='1.0' encoding='"
/* Each line is 64 characters */
"ThisIsAStupidlyLongEncodingNameIntendedToTriggerPoolGrowth123456"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN"
"'?>"
"<doc>Hello, world</doc>";
int i;
const int max_alloc_count = 20;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
XML_SetUnknownEncodingHandler(g_parser, long_encoding_handler, NULL);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
/* Test the effects of allocation failures on a straightforward parse */
START_TEST(test_alloc_parse_pi) {
const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
"<?pi unknown?>\n"
"<doc>"
"Hello, world"
"</doc>";
int i;
const int max_alloc_count = 15;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
START_TEST(test_alloc_parse_pi_2) {
const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
"<doc>"
"Hello, world"
"<?pi unknown?>\n"
"</doc>";
int i;
const int max_alloc_count = 15;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
START_TEST(test_alloc_parse_pi_3) {
const char *text
= "<?"
/* 64 characters per line */
"This processing instruction should be long enough to ensure that"
"it triggers the growth of an internal string pool when the "
"allocator fails at a cruicial moment FGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
"Q?><doc/>";
int i;
const int max_alloc_count = 20;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
START_TEST(test_alloc_parse_comment) {
const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
"<!-- Test parsing this comment -->"
"<doc>Hi</doc>";
int i;
const int max_alloc_count = 15;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetCommentHandler(g_parser, dummy_comment_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
START_TEST(test_alloc_parse_comment_2) {
const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
"<doc>"
"Hello, world"
"<!-- Parse this comment too -->"
"</doc>";
int i;
const int max_alloc_count = 15;
for (i = 0; i < max_alloc_count; i++) {
g_allocation_count = i;
XML_SetCommentHandler(g_parser, dummy_comment_handler);
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
!= XML_STATUS_ERROR)
break;
/* See comment in test_alloc_parse_xdecl() */
alloc_teardown();
alloc_setup();
}
if (i == 0)
fail("Parse succeeded despite failing allocator");
if (i == max_alloc_count)
fail("Parse failed with max allocations");
}
END_TEST
static int XMLCALL
external_entity_duff_loader(XML_Parser parser, const XML_Char *context,
const XML_Char *base, const XML_Char *systemId,
@ -4130,12 +3925,6 @@ make_suite(void) {
TCase *tc_accounting = tcase_create("accounting tests");
#endif
tcase_add_test(tc_alloc, test_alloc_parse_xdecl_2);
tcase_add_test(tc_alloc, test_alloc_parse_pi);
tcase_add_test(tc_alloc, test_alloc_parse_pi_2);
tcase_add_test(tc_alloc, test_alloc_parse_pi_3);
tcase_add_test(tc_alloc, test_alloc_parse_comment);
tcase_add_test(tc_alloc, test_alloc_parse_comment_2);
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_create_external_parser);
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_run_external_parser);
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_copy_default_atts);