aboutsummaryrefslogtreecommitdiff
path: root/testparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'testparser.c')
-rw-r--r--testparser.c80
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;
+}
+