add tests for dav_exists, dav_create and dav_set_content/dav_store dav-2 tip

Sun, 25 Jan 2026 17:53:31 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 25 Jan 2026 17:53:31 +0100
branch
dav-2
changeset 903
457faa53fd7e
parent 902
06fa328989ee

add tests for dav_exists, dav_create and dav_set_content/dav_store

libidav/resource.c file | annotate | diff | comparison | revisions
libidav/webdav.h file | annotate | diff | comparison | revisions
test/main.c file | annotate | diff | comparison | revisions
test/webdav_resource.c file | annotate | diff | comparison | revisions
test/webdav_resource.h file | annotate | diff | comparison | revisions
test/wsgidav.c file | annotate | diff | comparison | revisions
--- a/libidav/resource.c	Sat Jan 24 13:56:19 2026 +0100
+++ b/libidav/resource.c	Sun Jan 25 17:53:31 2026 +0100
@@ -761,7 +761,7 @@
     data->length = 0;
 }
 
-void dav_set_content_data(DavResource *res, char *content, size_t length) {
+void dav_set_content_data(DavResource *res, const char *content, size_t length) {
     DavSession *sn = res->session;
     DavResourceData *data = res->data;
     data->content = dav_session_malloc(sn, length);
--- a/libidav/webdav.h	Sat Jan 24 13:56:19 2026 +0100
+++ b/libidav/webdav.h	Sun Jan 25 17:53:31 2026 +0100
@@ -371,7 +371,7 @@
 DavPropName* dav_get_property_names(DavResource *res, size_t *count);
 
 void dav_set_content(DavResource *res, void *stream, dav_read_func read_func, dav_seek_func seek_func);
-void dav_set_content_data(DavResource *res, char *content, size_t length);
+void dav_set_content_data(DavResource *res, const char *content, size_t length);
 void dav_set_content_length(DavResource *res, size_t length);
 
 int dav_load(DavResource *res);
--- a/test/main.c	Sat Jan 24 13:56:19 2026 +0100
+++ b/test/main.c	Sun Jan 25 17:53:31 2026 +0100
@@ -86,6 +86,9 @@
     test_webdav_init();
     if(dav_client_tests) {
         cx_test_register(suite_webdav, test_dav_load_webdav);
+        cx_test_register(suite_webdav, test_dav_exists_webdav);
+        cx_test_register(suite_webdav, test_dav_create_webdav);
+        cx_test_register(suite_webdav, test_dav_store_content_webdav);
     }
     
     cx_test_run_stdout(suite);
--- a/test/webdav_resource.c	Sat Jan 24 13:56:19 2026 +0100
+++ b/test/webdav_resource.c	Sun Jan 25 17:53:31 2026 +0100
@@ -29,6 +29,16 @@
 #include "webdav.h"
 #include "webdav_resource.h"
 
+CX_TEST_SUBROUTINE(test_default_properties, DavResource *res) {
+    CX_TEST_ASSERT(res->contentlength > 0);
+    CX_TEST_ASSERT(res->creationdate > 0);
+    CX_TEST_ASSERT(res->lastmodified > 0);
+    CX_TEST_ASSERT(res->exists);
+    CX_TEST_ASSERT(res->contenttype);
+    CX_TEST_ASSERT(!res->iscollection);
+    CX_TEST_ASSERT(res->href);
+}
+
 CX_TEST(test_dav_load_webdav) {
     CX_TEST_DO {
         DavSession *sn = get_test_webdav_session();
@@ -36,12 +46,60 @@
         CX_TEST_ASSERT(res);
         int ret = dav_load(res);
         CX_TEST_ASSERT(ret == 0);
-        CX_TEST_ASSERT(res->contentlength > 0);
-        CX_TEST_ASSERT(res->creationdate > 0);
-        CX_TEST_ASSERT(res->lastmodified > 0);
-        CX_TEST_ASSERT(res->exists);
-        CX_TEST_ASSERT(res->contenttype);
-        CX_TEST_ASSERT(!res->iscollection);
-        CX_TEST_ASSERT(res->href);
+        CX_TEST_CALL_SUBROUTINE(test_default_properties, res);
+        dav_session_destroy(sn);
+    }
+}
+
+CX_TEST(test_dav_exists_webdav) {
+    CX_TEST_DO {
+        DavSession *sn = get_test_webdav_session();
+        DavResource *res = dav_resource_new(sn, "/hello.txt");
+        CX_TEST_ASSERT(res);
+        int exists = dav_exists(res);
+        CX_TEST_ASSERT(exists);
+        CX_TEST_CALL_SUBROUTINE(test_default_properties, res);
+        dav_session_destroy(sn);
     }
 }
+
+CX_TEST(test_dav_create_webdav) {
+    CX_TEST_DO {
+        DavSession *sn = get_test_webdav_session();
+        // test1: check if the resource exists and create it after that
+        DavResource *res = dav_resource_new(sn, "/test_create.txt");
+        CX_TEST_ASSERT(res);
+        int exists = dav_exists(res); // the resource should not exist yet
+        CX_TEST_ASSERT(!exists);
+        int ret = dav_create(res); // create the resource
+        CX_TEST_ASSERT(!ret);
+        exists = dav_exists(res); // the resource should exist now
+        CX_TEST_ASSERT(exists);
+        CX_TEST_ASSERT(res->lastmodified > 0); // some properties should be loaded by dav_exists()
+        CX_TEST_ASSERT(res->contenttype);
+        
+        // test2: create a resource without calling dav_exists first
+        DavResource *res2 = dav_resource_new(sn, "/test_create2.txt");
+        ret = dav_create(res2);
+        CX_TEST_ASSERT(!ret);
+        CX_TEST_ASSERT(dav_exists(res2));
+        CX_TEST_ASSERT(res2->lastmodified > 0);
+        CX_TEST_ASSERT(res2->contenttype);
+        
+        dav_session_destroy(sn);
+    }
+}
+
+CX_TEST(test_dav_store_content_webdav) {
+    CX_TEST_DO {
+        DavSession *sn = get_test_webdav_session();
+        DavResource *res = dav_resource_new(sn, "/test_store_content.txt");
+        cxstring content = cx_str("test_store_content test content\n");
+        dav_set_content_data(res, content.ptr, content.length);
+        int ret = dav_store(res);
+        CX_TEST_ASSERT(!ret);
+        CX_TEST_ASSERT(!dav_load(res));
+        CX_TEST_ASSERT(res->contentlength == content.length);
+        dav_session_destroy(sn);
+    }
+}
--- a/test/webdav_resource.h	Sat Jan 24 13:56:19 2026 +0100
+++ b/test/webdav_resource.h	Sun Jan 25 17:53:31 2026 +0100
@@ -36,6 +36,9 @@
 #endif
 
 CX_TEST(test_dav_load_webdav);
+CX_TEST(test_dav_exists_webdav);
+CX_TEST(test_dav_create_webdav);
+CX_TEST(test_dav_store_content_webdav);
 
 
 #ifdef __cplusplus
--- a/test/wsgidav.c	Sat Jan 24 13:56:19 2026 +0100
+++ b/test/wsgidav.c	Sun Jan 25 17:53:31 2026 +0100
@@ -243,7 +243,7 @@
     }
     
     // delete previous testrepo directory
-    char *args1[] = { "rm", "-Rf", "testrepo", NULL };
+    char *args1[] = { "rm", "-Rf", "testrepo", "wsgidav.yaml", NULL };
     Process p_rm = process_spawn("/bin/rm", args1);
     cxmutstr err = process_err_read_string(&p_rm);
     if(process_close(&p_rm) != 0) {
@@ -264,9 +264,20 @@
     }
     free(err.ptr);
     
+    // copy the config file to the build directory
+    char *args3[] = { "cp", "../test/wsgidav/wsgidav.yaml", "wsgidav.yaml", NULL };
+    Process p_cp2 = process_spawn("/bin/cp", args3);
+    err = process_err_read_string(&p_cp2);
+    if(process_close(&p_cp2) != 0) {
+        cxmutstr s = cx_strtrim(err);
+        fprintf(stderr, "cp failed: %.*s\n", (int)s.length, s.ptr);
+        return 1;
+    }
+    free(err.ptr);
+    
     // start wsgidav
-    char *args3[] = { "wsgidav", "-c", "../test/wsgidav/wsgidav.yaml", NULL };
-    wsgidav_process = process_spawn(wsgidav_exec_path, args3);
+    char *args4[] = { "wsgidav", "-c", "wsgidav.yaml", NULL };
+    wsgidav_process = process_spawn(wsgidav_exec_path, args4);
     
     // TODO: parse log or try to connect to localhost
     sleep(1);

mercurial