diff -r 4714468b9b7e -r 499711b2a970 src/server/test/xml.c --- 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); +}