src/server/test/webdav.c

branch
webdav
changeset 245
a193c42fc809
parent 244
e59abb210584
child 249
3b302093945c
--- a/src/server/test/webdav.c	Sat Feb 01 18:44:31 2020 +0100
+++ b/src/server/test/webdav.c	Sun Feb 02 17:42:05 2020 +0100
@@ -124,7 +124,9 @@
     backend2_proppatch_do,
     backend2_proppatch_finish,
     NULL, // opt_mkcol
+    NULL, // opt_mkcol_finish
     NULL, // opt_delete
+    NULL, // opt_delete_finish
     0,
     NULL
 };
@@ -224,7 +226,9 @@
     backend1_proppatch_do,
     backend1_proppatch_finish,
     NULL, // opt_mkcol
+    NULL, // opt_mkcol_finish
     NULL, // opt_delete
+    NULL, // opt_delete_finish
     0,
     &backend2
 };
@@ -1102,7 +1106,9 @@
     st = testutil_iostream(2048, TRUE);
     sn->csd = st;
     
-    testutil_request_body(sn, rq, request_body, strlen(request_body));
+    if(request_body) {
+        testutil_request_body(sn, rq, request_body, strlen(request_body));
+    }
     
     pb = pblock_create_pool(sn->pool, 4);
     
@@ -1472,3 +1478,153 @@
     
     UCX_TEST_END;
 }
+
+
+/* -------------------------------------------------------------------------
+ * 
+ *                          WEBDAV VFS TESTS
+ * 
+ * ------------------------------------------------------------------------ */
+
+static int mkcol_data1 = 10;
+static int mkcol_data2 = 20;
+static int mkcol_data3 = 30;
+static int mkcol_data4 = 40;
+
+static int mkcol_count = 0;
+static int mkcol_finish_count = 0;
+
+static int mkcol_err = 0;
+
+static int set_created = 0;
+
+static int test_webdav_mkcol(WebdavVFSRequest *req, WSBool *created) {
+    mkcol_count++;
+    
+    switch(mkcol_count) {
+        case 1: {
+            req->userdata = &mkcol_data1;
+            break;
+        }
+        case 2: {
+            req->userdata = &mkcol_data2;
+            break;
+        }
+        case 3: {
+            req->userdata = &mkcol_data3;
+            break;
+        }
+        case 4: {
+            req->userdata = &mkcol_data4;
+            break;
+        }
+        default: break;
+    }
+    
+    if(set_created) {
+        *created = TRUE;
+        set_created = 0;
+    }
+    
+    return 0;
+}
+
+static int test_webdav_mkcol_finish(WebdavVFSRequest *req, WSBool success) {
+    mkcol_finish_count++;
+    
+    if(mkcol_finish_count == 1) {
+        int *data = req->userdata;
+        if(data != &mkcol_data1) {
+            mkcol_err = 1;
+        }
+    } else if(mkcol_finish_count == 3) {
+        int *data = req->userdata;
+        if(data != &mkcol_data3) {
+            mkcol_err = 1;
+        }
+    } else {
+        int *data = req->userdata;
+        // data4 should never be used
+        if(data == &mkcol_data4) {
+            mkcol_err = 1;
+        }
+    }
+    
+    return 0;
+}
+
+static int test_webdav_mkcol_fail(WebdavVFSRequest *req, WSBool *created) {
+    mkcol_count++;
+    return 1;
+}
+
+
+
+UCX_TEST(test_webdav_vfs_op_do) {
+    Session *sn;
+    Request *rq; 
+    TestIOStream *st;
+    pblock *pb;
+    
+    init_test_webdav_method(&sn, &rq, &st, &pb, "MKCOL", NULL);
+    rq->vfs = testvfs_create(sn);
+    
+    WebdavBackend dav1;
+    ZERO(&dav1, sizeof(WebdavBackend));
+    dav1.opt_mkcol = test_webdav_mkcol;
+    dav1.opt_mkcol_finish = test_webdav_mkcol_finish;
+    
+    WebdavBackend dav2;
+    ZERO(&dav2, sizeof(WebdavBackend));
+    dav2.opt_mkcol_finish = test_webdav_mkcol_finish;
+    
+    WebdavBackend dav3;
+    ZERO(&dav3, sizeof(WebdavBackend));
+    dav3.opt_mkcol = test_webdav_mkcol;
+    
+    WebdavBackend dav4;
+    ZERO(&dav4, sizeof(WebdavBackend));
+    dav4.opt_mkcol = test_webdav_mkcol;
+    dav4.opt_mkcol_finish = test_webdav_mkcol_finish;
+    
+    dav1.next = &dav2;
+    dav2.next = &dav3;
+    dav3.next = &dav4;
+    
+    rq->davCollection = &dav1;
+    
+    UCX_TEST_BEGIN;
+    
+    WebdavVFSOperation *op1 = webdav_vfs_op(sn, rq, &dav1, FALSE);
+    
+    int ret = webdav_vfs_op_do(op1, WEBDAV_VFS_MKDIR);
+    
+    UCX_TEST_ASSERT(!ret, "webdav_vfs_op_do failed");
+    UCX_TEST_ASSERT(mkcol_count == 3, "wrong mkcol_count");
+    UCX_TEST_ASSERT(mkcol_finish_count == 3, "wrong mkcol_finish_count");
+    UCX_TEST_ASSERT(mkcol_err == 0, "mkcol_err");
+    
+    // test without VFS, but set *created to TRUE to skip VFS usage
+    rq->vfs = NULL;
+    set_created = 1;
+    
+    WebdavVFSOperation *op2 = webdav_vfs_op(sn, rq, &dav1, FALSE);
+    ret = webdav_vfs_op_do(op2, WEBDAV_VFS_MKDIR);
+    
+    UCX_TEST_ASSERT(!ret, "op2 failed");
+    
+    // test 3: abort after first backend
+    mkcol_count = 0;
+    mkcol_finish_count = 0;
+    dav1.opt_mkcol = test_webdav_mkcol_fail;
+    
+    WebdavVFSOperation *op3 = webdav_vfs_op(sn, rq, &dav1, FALSE);
+    ret = webdav_vfs_op_do(op3, WEBDAV_VFS_MKDIR);
+    
+    UCX_TEST_ASSERT(ret, "op3 should fail");
+    UCX_TEST_ASSERT(mkcol_count == 1, "op3: wrong mkcol_count");
+    UCX_TEST_ASSERT(mkcol_finish_count == 1, "op3: wrong mkcol_finish_count");
+    
+    
+    UCX_TEST_END;
+}

mercurial