src/server/test/xml.c

branch
webdav
changeset 232
499711b2a970
parent 225
e4f3e1433098
child 319
a9b9344875aa
--- a/src/server/test/xml.c	Fri Jan 17 22:23:30 2020 +0100
+++ b/src/server/test/xml.c	Sat Jan 18 13:48:59 2020 +0100
@@ -36,6 +36,10 @@
 #include "testutils.h"
 
 #include "../public/webdav.h"
+#include "../util/writer.h"
+
+#include "../webdav/webdav.h"
+#include "../webdav/xml.h"
 
 typedef struct Test1Data {
     int beginCounter;
@@ -45,6 +49,7 @@
     int textErr;
     int err;
     int endErr;
+    int nodesWithAttributesCounter;
     xmlNode *prev;
 } Test1Data;
 
@@ -126,6 +131,27 @@
     return 0;
 }
 
+static int test2_begin(xmlNode *node, void *userdata) {
+    Test1Data *data = userdata;
+    data->beginCounter++;
+    if(node->type == XML_ELEMENT_NODE) {
+        data->elmCounter++;
+        if(node->properties) {
+            data->nodesWithAttributesCounter++;
+        }
+    }
+    return 0;
+}
+
+static int test2_end(xmlNode *node, void *userdata) {
+    Test1Data *data = userdata;
+    data->endCounter++;
+    if(node->type == XML_ELEMENT_NODE) {
+        data->endElmCounter++;
+    }
+    return 0;
+}
+
 UCX_TEST(test_wsxml_iterator) {
     Session *sn = testutil_session();
     
@@ -135,8 +161,11 @@
             XML_TESTDATA1, strlen(XML_TESTDATA1), NULL, NULL, 0);
     xmlDoc *doc2 = xmlReadMemory(
             XML_TESTDATA2, strlen(XML_TESTDATA2), NULL, NULL, 0);
+    xmlDoc *doc6 = xmlReadMemory(
+            XML_TESTDATA6, strlen(XML_TESTDATA6), NULL, NULL, 0);
     UCX_TEST_ASSERT(doc, "doc is NULL");
     UCX_TEST_ASSERT(doc2, "doc2 is NULL");
+    UCX_TEST_ASSERT(doc6, "doc6 is NULL");
     
     xmlNode *root = xmlDocGetRootElement(doc);
     
@@ -161,8 +190,18 @@
     UCX_TEST_ASSERT(!testdata.textErr, "test2: text order error");
     UCX_TEST_ASSERT(testdata.beginCounter == testdata.endCounter, "test2: begin/end counter not equal");
     
+    // Test 3: iterate over document with all kinds of node types
+    xmlNode *root6 = xmlDocGetRootElement(doc6);
+    ZERO(&testdata, sizeof(Test1Data));
+    ret = wsxml_iterator(sn->pool, root6, test2_begin, test2_end, &testdata);
+    UCX_TEST_ASSERT(ret == 0, "test3: wsxml_iterator failed");
+    UCX_TEST_ASSERT(testdata.elmCounter == testdata.endElmCounter, "test3: begin/end counter not equal");
+    UCX_TEST_ASSERT(testdata.elmCounter == 12, "test3: wrong elm counter");
+    UCX_TEST_ASSERT(testdata.nodesWithAttributesCounter == 5, "test3: wrong entity ref counter");
+    
     xmlFreeDoc(doc);
     xmlFreeDoc(doc2);
+    xmlFreeDoc(doc6);
     UCX_TEST_END;
 }
 
@@ -257,5 +296,42 @@
     UCX_TEST_ASSERT(!x3, "ns3: x3");
     UCX_TEST_ASSERT(!x4, "ns3: x4");
     
+    xmlFreeDoc(doc3);
+    xmlFreeDoc(doc4);
+    xmlFreeDoc(doc5);
     UCX_TEST_END;
 }
+
+UCX_TEST(test_wsxml_write_nodes) {
+    Session *sn = testutil_session();
+    TestIOStream *st = testutil_iostream(2048, TRUE);
+    
+    UCX_TEST_BEGIN;
+    xmlDoc *doc = xmlReadMemory(
+            XML_TESTDATA6, strlen(XML_TESTDATA6), NULL, NULL, 0);
+    UCX_TEST_ASSERT(doc, "xml parser error");
+    xmlNode *root = xmlDocGetRootElement(doc);
+    
+    Writer writer;
+    char buffer[1024];
+    writer_init(&writer, st, buffer, 1024);
+    
+    int err = wsxml_write_nodes(sn->pool, &writer, NULL, root);
+    writer_flush(&writer);
+    UCX_TEST_ASSERT(err == 0, "wsxml_write_nodes error");
+    UCX_TEST_ASSERT(st->buf->pos > 0, "buffer is empty");
+    
+    //printf("\n\n");
+    //printf("%.*s\n", (int)st->buf->size, st->buf->space);
+    //printf("\n\n");
+    
+    xmlDoc *genDoc = xmlReadMemory(
+            st->buf->space, st->buf->size, NULL, NULL, 0);
+    UCX_TEST_ASSERT(genDoc, "generated doc is not valid xml");
+    
+    xmlFreeDoc(doc);
+    xmlFreeDoc(genDoc);
+    
+    UCX_TEST_END;
+    testutil_iostream_destroy(st);
+}

mercurial