test/webdav_resource.c

Fri, 30 Jan 2026 17:50:20 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 30 Jan 2026 17:50:20 +0100
branch
dav-2
changeset 908
69a2c7fe642c
parent 907
119197afb22d
permissions
-rw-r--r--

add test_dav_load_content_webdav

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2026 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "webdav.h"
#include "webdav_resource.h"

#include <cx/buffer.h>
#include <cx/printf.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();
        DavResource *res = dav_resource_new(sn, "/hello.txt");
        CX_TEST_ASSERT(res);
        int ret = dav_load(res);
        CX_TEST_ASSERT(ret == 0);
        CX_TEST_CALL_SUBROUTINE(test_default_properties, res);
        dav_session_destroy(sn);
    }
}

CX_TEST(test_dav_load_content_webdav) {
    CX_TEST_DO {
        DavSession *sn = get_test_webdav_session();
        CxBuffer *buf = cxBufferCreate(NULL, NULL, 1024, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
        DavResource *res = dav_resource_new(sn, "/hello.txt");
        CX_TEST_ASSERT(res);
        int ret = dav_load(res);
        CX_TEST_ASSERT(!ret);
        ret = dav_get_content(res, buf, (dav_write_func)cxBufferWrite);
        CX_TEST_ASSERT(!ret);
        CX_TEST_ASSERT(!cx_strcmp(cx_strn(buf->space, buf->size), cx_str("Hello World!\n")));
        dav_session_destroy(sn);
        cxBufferFree(buf);
    }
}

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));
        if(!test_session_is_encrypted()) {
            CX_TEST_ASSERT(res->contentlength == content.length);
        }
        dav_session_destroy(sn);
    }
}

CX_TEST(test_dav_store_stream_webdav) {
    CX_TEST_DO {
        FILE *f = fopen("test_dav_store_stream_webdav.txt", "w+");
        cxstring line = cx_str("test_dav_store_stream_webdav test content\n");
        for(int i=0;i<1000;i++) {
            fwrite(line.ptr, 1, line.length, f);
        }
        fseek(f, 0, SEEK_SET);
        size_t len = 1000 * line.length;

        DavSession *sn = get_test_webdav_session();
        DavResource *res = dav_resource_new(sn, "/test_store_file.txt");
        dav_set_content(res, f, (dav_read_func)fread, (dav_seek_func)fseek);

        int ret = dav_store(res);
        CX_TEST_ASSERT(!ret);
        CX_TEST_ASSERT(!dav_load(res));
        if(!test_session_is_encrypted()) {
            CX_TEST_ASSERT(res->contentlength == len);
        }
        dav_session_destroy(sn);
        fclose(f);
    }
}

CX_TEST(test_dav_store_load_webdav) {
    CX_TEST_DO {
        CxBuffer *buf1 = cxBufferCreate(NULL, NULL, 1024, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
        CxBuffer *buf2 = cxBufferCreate(NULL, NULL, 1024, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
        CxBuffer *buf3 = cxBufferCreate(NULL, NULL, 1024, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
        
        CxBuffer *resultBuf = cxBufferCreate(NULL, NULL, 1024, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
        
        for(int i=0;i<100;i++) {
            cx_bprintf(buf1, "Test Content %d\n", i);
        }
        for(int i=0;i<1234;i++) {
            cx_bprintf(buf2, "%d Medium Buffer Content\n", i);
        }
        for(int i=0;i<345678;i++) {
            cx_bprintf(buf3, "%d Large Buffer Content %d\n", i, i*7);
        }
        
        DavSession *sn = get_test_webdav_session();
        
        // test buf1
        buf1->pos = 0;
        DavResource *res1 = dav_resource_new(sn, "/test_store_load1.txt");
        dav_set_content(res1, buf1, (dav_read_func)cxBufferRead, (dav_seek_func)cxBufferSeek);
        int ret = dav_store(res1);
        CX_TEST_ASSERT(!ret);
        ret = dav_load(res1);
        CX_TEST_ASSERT(!ret);
        ret = dav_get_content(res1, resultBuf, (dav_write_func)cxBufferWrite);
        CX_TEST_ASSERT(!ret);
        CX_TEST_ASSERT(resultBuf->size == buf1->size);
        CX_TEST_ASSERT(!memcmp(resultBuf->space, buf1->space, buf1->size));
        cxBufferReset(resultBuf);
        
        // test buf2
        buf2->pos = 0;
        DavResource *res2 = dav_resource_new(sn, "/test_store_load2.txt");
        dav_set_content(res2, buf2, (dav_read_func)cxBufferRead, (dav_seek_func)cxBufferSeek);
        ret = dav_store(res2);
        CX_TEST_ASSERT(!ret);
        ret = dav_load(res2);
        CX_TEST_ASSERT(!ret);
        ret = dav_get_content(res2, resultBuf, (dav_write_func)cxBufferWrite);
        CX_TEST_ASSERT(!ret);
        CX_TEST_ASSERT(resultBuf->size == buf2->size);
        CX_TEST_ASSERT(!memcmp(resultBuf->space, buf2->space, buf2->size));
        cxBufferReset(resultBuf);
        
        // test buf3
        buf3->pos = 0;
        DavResource *res3 = dav_resource_new(sn, "/test_store_load3.txt");
        dav_set_content(res3, buf3, (dav_read_func)cxBufferRead, (dav_seek_func)cxBufferSeek);
        ret = dav_store(res3);
        CX_TEST_ASSERT(!ret);
        ret = dav_load(res3);
        CX_TEST_ASSERT(!ret);
        ret = dav_get_content(res3, resultBuf, (dav_write_func)cxBufferWrite);
        CX_TEST_ASSERT(!ret);
        CX_TEST_ASSERT(resultBuf->size == buf3->size);
        CX_TEST_ASSERT(!memcmp(resultBuf->space, buf3->space, buf3->size));
        cxBufferReset(resultBuf);
        
        dav_session_destroy(sn);
        cxBufferFree(buf1);
        cxBufferFree(buf2);
        cxBufferFree(buf3);
    }
}

mercurial