📄 runtests.c
字号:
#include <assert.h>#include <check.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include "expat.h"#include "chardata.h"static XML_Parser parser;static voidbasic_setup(void){ parser = XML_ParserCreate(NULL); if (parser == NULL) fail("Parser not created.");}static voidbasic_teardown(void){ if (parser != NULL) XML_ParserFree(parser);}/* Generate a failure using the parser state to create an error message; this should be used when the parser reports an error we weren't expecting.*/static void_xml_failure(XML_Parser parser, const char *file, int line){ char buffer[1024]; sprintf(buffer, "\n %s (line %d, offset %d)\n reported from %s, line %d", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser), XML_GetCurrentColumnNumber(parser), file, line); _fail_unless(0, file, line, buffer);}#define xml_failure(parser) _xml_failure((parser), __FILE__, __LINE__)static void_expect_failure(char *text, enum XML_Error errorCode, char *errorMessage, char *file, int lineno){ if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_OK) /* Hackish use of _fail_unless() macro, but let's us report the right filename and line number. */ _fail_unless(0, file, lineno, errorMessage); if (XML_GetErrorCode(parser) != errorCode) _xml_failure(parser, file, lineno);}#define expect_failure(text, errorCode, errorMessage) \ _expect_failure((text), (errorCode), (errorMessage), \ __FILE__, __LINE__)/* Dummy handlers for when we need to set a handler to tickle a bug, but it doesn't need to do anything.*/static voiddummy_start_doctype_handler(void *userData, const XML_Char *doctypeName, const XML_Char *sysid, const XML_Char *pubid, int has_internal_subset){}static voiddummy_end_doctype_handler(void *userData){}static voiddummy_entity_decl_handler(void *userData, const XML_Char *entityName, int is_parameter_entity, const XML_Char *value, int value_length, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName){}static voiddummy_notation_decl_handler(void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId){}static voiddummy_element_decl_handler(void *userData, const XML_Char *name, XML_Content *model){}static voiddummy_attlist_decl_handler(void *userData, const XML_Char *elname, const XML_Char *attname, const XML_Char *att_type, const XML_Char *dflt, int isrequired){}static voiddummy_comment_handler(void *userData, const XML_Char *data){}static voiddummy_pi_handler(void *userData, const XML_Char *target, const XML_Char *data){}static voiddummy_start_element(void *userData, const XML_Char *name, const XML_Char **atts){}/* * Character & encoding tests. */START_TEST(test_nul_byte){ char text[] = "<doc>\0</doc>"; /* test that a NUL byte (in US-ASCII data) is an error */ if (XML_Parse(parser, text, sizeof(text) - 1, XML_TRUE) == XML_STATUS_OK) fail("Parser did not report error on NUL-byte."); if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN) xml_failure(parser);}END_TESTSTART_TEST(test_u0000_char){ /* test that a NUL byte (in US-ASCII data) is an error */ expect_failure("<doc>�</doc>", XML_ERROR_BAD_CHAR_REF, "Parser did not report error on NUL-byte.");}END_TESTSTART_TEST(test_bom_utf8){ /* This test is really just making sure we don't core on a UTF-8 BOM. */ char *text = "\357\273\277<e/>"; if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) xml_failure(parser);}END_TESTSTART_TEST(test_bom_utf16_be){ char text[] = "\376\377\0<\0e\0/\0>"; if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR) xml_failure(parser);}END_TESTSTART_TEST(test_bom_utf16_le){ char text[] = "\377\376<\0e\0/\0>\0"; if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR) xml_failure(parser);}END_TESTstatic voidaccumulate_characters(void *userData, const XML_Char *s, int len){ CharData_AppendXMLChars((CharData *)userData, s, len);}static voidaccumulate_attribute(void *userData, const XML_Char *name, const XML_Char **atts){ CharData *storage = (CharData *)userData; if (storage->count < 0 && atts != NULL && atts[0] != NULL) { /* "accumulate" the value of the first attribute we see */ CharData_AppendXMLChars(storage, atts[1], -1); }}static void_run_character_check(XML_Char *text, XML_Char *expected, const char *file, int line){ CharData storage; CharData_Init(&storage); XML_SetUserData(parser, &storage); XML_SetCharacterDataHandler(parser, accumulate_characters); if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) _xml_failure(parser, file, line); CharData_CheckXMLChars(&storage, expected);}#define run_character_check(text, expected) \ _run_character_check(text, expected, __FILE__, __LINE__)static void_run_attribute_check(XML_Char *text, XML_Char *expected, const char *file, int line){ CharData storage; CharData_Init(&storage); XML_SetUserData(parser, &storage); XML_SetStartElementHandler(parser, accumulate_attribute); if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) _xml_failure(parser, file, line); CharData_CheckXMLChars(&storage, expected);}#define run_attribute_check(text, expected) \ _run_attribute_check(text, expected, __FILE__, __LINE__)/* Regression test for SF bug #491986. */START_TEST(test_danish_latin1){ char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n" "<e>J鴕gen 骧迤嘏</e>"; run_character_check(text, "J\xC3\xB8rgen \xC3\xA6\xC3\xB8\xC3\xA5\xC3\x86\xC3\x98\xC3\x85");}END_TEST/* Regression test for SF bug #514281. */START_TEST(test_french_charref_hexidecimal){ char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n" "<doc>éèàçêÈ</doc>"; run_character_check(text, "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");}END_TESTSTART_TEST(test_french_charref_decimal){ char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n" "<doc>éèàçêÈ</doc>"; run_character_check(text, "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");}END_TESTSTART_TEST(test_french_latin1){ char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n" "<doc>\xE9\xE8\xE0\xE7\xEa\xC8</doc>"; run_character_check(text, "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");}END_TESTSTART_TEST(test_french_utf8){ char *text = "<?xml version='1.0' encoding='utf-8'?>\n" "<doc>\xC3\xA9</doc>"; run_character_check(text, "\xC3\xA9");}END_TEST/* Regression test for SF bug #600479. XXX There should be a test that exercises all legal XML Unicode characters as PCDATA and attribute value content, and XML Name characters as part of element and attribute names.*/START_TEST(test_utf8_false_rejection){ char *text = "<doc>\xEF\xBA\xBF</doc>"; run_character_check(text, "\xEF\xBA\xBF");}END_TEST/* Regression test for SF bug #477667. This test assures that any 8-bit character followed by a 7-bit character will not be mistakenly interpreted as a valid UTF-8 sequence.*/START_TEST(test_illegal_utf8){ char text[100]; int i; for (i = 128; i <= 255; ++i) { sprintf(text, "<e>%ccd</e>", i); if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_OK) { sprintf(text, "expected token error for '%c' (ordinal %d) in UTF-8 text", i, i); fail(text); } else if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN) xml_failure(parser); /* Reset the parser since we use the same parser repeatedly. */ XML_ParserReset(parser, NULL); }}END_TESTSTART_TEST(test_utf16){ /* <?xml version="1.0" encoding="UTF-16"?> <doc a='123'>some text</doc> */ char text[] = "\000<\000?\000x\000m\000\154\000 \000v\000e\000r\000s\000i\000o" "\000n\000=\000'\0001\000.\000\060\000'\000 \000e\000n\000c\000o" "\000d\000i\000n\000g\000=\000'\000U\000T\000F\000-\0001\000\066" "\000'\000?\000>\000\n" "\000<\000d\000o\000c\000 \000a\000=\000'\0001\0002\0003\000'" "\000>\000s\000o\000m\000e\000 \000t\000e\000x\000t\000<\000/" "\000d\000o\000c\000>"; if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR) xml_failure(parser);}END_TESTSTART_TEST(test_utf16_le_epilog_newline){ int first_chunk_bytes = 17; char text[] = "\xFF\xFE" /* BOM */ "<\000e\000/\000>\000" /* document element */ "\r\000\n\000\r\000\n\000"; /* epilog */ if (first_chunk_bytes >= sizeof(text) - 1) fail("bad value of first_chunk_bytes"); if ( XML_Parse(parser, text, first_chunk_bytes, XML_FALSE) == XML_STATUS_ERROR) xml_failure(parser); else { enum XML_Status rc; rc = XML_Parse(parser, text + first_chunk_bytes, sizeof(text) - first_chunk_bytes - 1, XML_TRUE); if (rc == XML_STATUS_ERROR) xml_failure(parser); }}END_TEST/* Regression test for SF bug #481609. */START_TEST(test_latin1_umlauts){ char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n" "<e a='
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -