diff options
Diffstat (limited to 'testparser.c')
-rw-r--r-- | testparser.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/testparser.c b/testparser.c new file mode 100644 index 00000000..625ba100 --- /dev/null +++ b/testparser.c @@ -0,0 +1,80 @@ +/* + * testparser.c: Additional parser tests + * + * See Copyright for the status of this software. + */ + +#include <libxml/parser.h> + +#ifdef LIBXML_PUSH_ENABLED +static int +testHugePush(void) { + xmlParserCtxtPtr ctxt; + int err, i; + + ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL); + + /* + * Push parse a document larger than XML_MAX_LOOKUP_LIMIT + * (10,000,000 bytes). This mainly tests whether shrinking the + * buffer works when push parsing. + */ + xmlParseChunk(ctxt, "<doc>", 5, 0); + for (i = 0; i < 1000000; i++) + xmlParseChunk(ctxt, "<elem>text</elem>", 17, 0); + xmlParseChunk(ctxt, "</doc>", 6, 1); + + err = ctxt->wellFormed ? 0 : 1; + xmlFreeDoc(ctxt->myDoc); + xmlFreeParserCtxt(ctxt); + + return err; +} + +static int +testHugeEncodedChunk(void) { + xmlBufferPtr buf; + xmlChar *chunk; + xmlParserCtxtPtr ctxt; + int err, i; + + /* + * Test the push parser with a built-in encoding handler like ISO-8859-1 + * and a chunk larger than the initial decoded buffer (currently 4 KB). + */ + buf = xmlBufferCreate(); + xmlBufferCat(buf, + BAD_CAST "<?xml version='1.0' encoding='ISO-8859-1'?>\n"); + xmlBufferCat(buf, BAD_CAST "<doc><!-- "); + for (i = 0; i < 2000; i++) + xmlBufferCat(buf, BAD_CAST "0123456789"); + xmlBufferCat(buf, BAD_CAST " --></doc>"); + chunk = xmlBufferDetach(buf); + xmlBufferFree(buf); + + ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL); + + xmlParseChunk(ctxt, (char *) chunk, xmlStrlen(chunk), 0); + xmlParseChunk(ctxt, NULL, 0, 1); + + err = ctxt->wellFormed ? 0 : 1; + xmlFreeDoc(ctxt->myDoc); + xmlFreeParserCtxt(ctxt); + xmlFree(chunk); + + return err; +} +#endif + +int +main(void) { + int err = 0; + +#ifdef LIBXML_PUSH_ENABLED + err |= testHugePush(); + err |= testHugeEncodedChunk(); +#endif + + return err; +} + |