chore: add CMake test infrastructure and placeholder unit test files for future coverage

This commit is contained in:
2025-11-28 05:41:42 +00:00
parent 4afdcf567b
commit 53a6179ede
38 changed files with 5192 additions and 21 deletions
@@ -0,0 +1,164 @@
// retoor <retoor@molodetz.nl>
#include "../../test_framework.h"
#include "../../fixtures/fixtures.h"
#include "../../../src/cgi/cgi.h"
#include <string.h>
TEST_SUITE(cgi_config)
TEST(cgi_handler_create) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
cgi_handler_destroy(handler);
}
TEST(cgi_register_extension) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
int ret = cgi_register_extension(handler, ".php", "/usr/bin/php-cgi");
ASSERT_EQUAL(NWEDAV_OK, ret);
cgi_handler_destroy(handler);
}
TEST(cgi_register_multiple_extensions) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
cgi_register_extension(handler, ".php", "/usr/bin/php-cgi");
cgi_register_extension(handler, ".py", "/usr/bin/python3");
cgi_register_extension(handler, ".pl", "/usr/bin/perl");
int count = cgi_get_extension_count(handler);
ASSERT_EQUAL(3, count);
cgi_handler_destroy(handler);
}
TEST(cgi_get_interpreter) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
cgi_register_extension(handler, ".php", "/usr/bin/php-cgi");
const char *interp = cgi_get_interpreter(handler, ".php");
ASSERT_NOT_NULL(interp);
ASSERT_STR_EQ("/usr/bin/php-cgi", interp);
cgi_handler_destroy(handler);
}
TEST(cgi_get_interpreter_not_found) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
const char *interp = cgi_get_interpreter(handler, ".unknown");
ASSERT_NULL(interp);
cgi_handler_destroy(handler);
}
TEST(cgi_is_cgi_file) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
cgi_register_extension(handler, ".php", "/usr/bin/php-cgi");
int is_cgi = cgi_is_cgi_file(handler, "/script.php");
ASSERT_TRUE(is_cgi);
is_cgi = cgi_is_cgi_file(handler, "/page.html");
ASSERT_FALSE(is_cgi);
cgi_handler_destroy(handler);
}
TEST(cgi_unregister_extension) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
cgi_register_extension(handler, ".php", "/usr/bin/php-cgi");
int ret = cgi_unregister_extension(handler, ".php");
ASSERT_EQUAL(NWEDAV_OK, ret);
const char *interp = cgi_get_interpreter(handler, ".php");
ASSERT_NULL(interp);
cgi_handler_destroy(handler);
}
TEST(cgi_set_document_root) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
int ret = cgi_set_document_root(handler, "/var/www/html");
ASSERT_EQUAL(NWEDAV_OK, ret);
const char *root = cgi_get_document_root(handler);
ASSERT_NOT_NULL(root);
ASSERT_STR_EQ("/var/www/html", root);
cgi_handler_destroy(handler);
}
TEST(cgi_set_timeout) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
int ret = cgi_set_timeout(handler, 60);
ASSERT_EQUAL(NWEDAV_OK, ret);
int timeout = cgi_get_timeout(handler);
ASSERT_EQUAL(60, timeout);
cgi_handler_destroy(handler);
}
TEST(cgi_set_env_variable) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
int ret = cgi_set_env(handler, "CUSTOM_VAR", "custom_value");
ASSERT_EQUAL(NWEDAV_OK, ret);
const char *val = cgi_get_env(handler, "CUSTOM_VAR");
ASSERT_NOT_NULL(val);
ASSERT_STR_EQ("custom_value", val);
cgi_handler_destroy(handler);
}
TEST(cgi_clear_env) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
cgi_set_env(handler, "VAR1", "val1");
cgi_set_env(handler, "VAR2", "val2");
int ret = cgi_clear_env(handler);
ASSERT_EQUAL(NWEDAV_OK, ret);
const char *val = cgi_get_env(handler, "VAR1");
ASSERT_NULL(val);
cgi_handler_destroy(handler);
}
TEST(cgi_extension_case_insensitive) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
cgi_register_extension(handler, ".PHP", "/usr/bin/php-cgi");
int is_cgi = cgi_is_cgi_file(handler, "/script.php");
ASSERT_TRUE(is_cgi);
is_cgi = cgi_is_cgi_file(handler, "/script.PHP");
ASSERT_TRUE(is_cgi);
cgi_handler_destroy(handler);
}
@@ -0,0 +1,155 @@
// retoor <retoor@molodetz.nl>
#include "../../test_framework.h"
#include "../../fixtures/fixtures.h"
#include "../../../src/user/usermgr.h"
#include "../../../src/storage/backend.h"
#include <string.h>
TEST_SUITE(quota_management)
TEST(set_user_quota) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "quotauser", "pass", "q@test.com", 0);
int ret = user_manager_set_quota(fixture->user_mgr, "quotauser", 10 * 1024 * 1024);
ASSERT_EQUAL(NWEDAV_OK, ret);
user_t user;
user_manager_get_by_username(fixture->user_mgr, "quotauser", &user);
ASSERT_EQUAL(10 * 1024 * 1024, user.quota_bytes);
fixture_destroy(fixture);
}
TEST(quota_zero_means_unlimited) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "unlimited", "pass", "u@test.com", 0);
user_t user;
user_manager_get_by_username(fixture->user_mgr, "unlimited", &user);
ASSERT_EQUAL(0, user.quota_bytes);
fixture_destroy(fixture);
}
TEST(quota_check_under_limit) {
test_fixture_t *fixture = fixture_create_with_storage();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "underquota", "pass", "uq@test.com",
10 * 1024 * 1024);
int within = user_manager_check_quota(fixture->user_mgr, "underquota", 1024);
ASSERT_TRUE(within);
fixture_destroy(fixture);
}
TEST(quota_check_over_limit) {
test_fixture_t *fixture = fixture_create_with_storage();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "overquota", "pass", "oq@test.com", 1024);
int within = user_manager_check_quota(fixture->user_mgr, "overquota",
2 * 1024 * 1024);
ASSERT_FALSE(within);
fixture_destroy(fixture);
}
TEST(quota_update_usage) {
test_fixture_t *fixture = fixture_create_with_storage();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "usageuser", "pass", "uu@test.com",
10 * 1024 * 1024);
int ret = user_manager_update_usage(fixture->user_mgr, "usageuser", 5000);
ASSERT_EQUAL(NWEDAV_OK, ret);
user_t user;
user_manager_get_by_username(fixture->user_mgr, "usageuser", &user);
ASSERT_EQUAL(5000, user.used_bytes);
fixture_destroy(fixture);
}
TEST(quota_get_remaining) {
test_fixture_t *fixture = fixture_create_with_storage();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "remaining", "pass", "r@test.com", 10000);
user_manager_update_usage(fixture->user_mgr, "remaining", 3000);
int64_t remaining = user_manager_get_remaining_quota(fixture->user_mgr, "remaining");
ASSERT_EQUAL(7000, remaining);
fixture_destroy(fixture);
}
TEST(quota_get_remaining_unlimited) {
test_fixture_t *fixture = fixture_create_with_storage();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "unlim", "pass", "ul@test.com", 0);
int64_t remaining = user_manager_get_remaining_quota(fixture->user_mgr, "unlim");
ASSERT_TRUE(remaining < 0 || remaining > 1000000000);
fixture_destroy(fixture);
}
TEST(quota_percentage_used) {
test_fixture_t *fixture = fixture_create_with_storage();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "percent", "pass", "p@test.com", 10000);
user_manager_update_usage(fixture->user_mgr, "percent", 2500);
int percent = user_manager_get_usage_percent(fixture->user_mgr, "percent");
ASSERT_EQUAL(25, percent);
fixture_destroy(fixture);
}
TEST(quota_enforcement_on_write) {
test_fixture_t *fixture = fixture_create_with_storage();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "enforced", "pass", "e@test.com", 100);
char large_data[200];
memset(large_data, 'X', sizeof(large_data));
int can_write = user_manager_check_quota(fixture->user_mgr, "enforced",
sizeof(large_data));
ASSERT_FALSE(can_write);
fixture_destroy(fixture);
}
TEST(quota_multiple_users_independent) {
test_fixture_t *fixture = fixture_create_with_storage();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "user_a", "p", "a@test.com", 10000);
user_manager_add(fixture->user_mgr, "user_b", "p", "b@test.com", 5000);
user_manager_update_usage(fixture->user_mgr, "user_a", 8000);
user_manager_update_usage(fixture->user_mgr, "user_b", 1000);
user_t user_a, user_b;
user_manager_get_by_username(fixture->user_mgr, "user_a", &user_a);
user_manager_get_by_username(fixture->user_mgr, "user_b", &user_b);
ASSERT_EQUAL(8000, user_a.used_bytes);
ASSERT_EQUAL(1000, user_b.used_bytes);
fixture_destroy(fixture);
}
@@ -0,0 +1,171 @@
// retoor <retoor@molodetz.nl>
#include "../../test_framework.h"
#include "../../fixtures/fixtures.h"
#include "../../../src/user/usermgr.h"
#include <string.h>
TEST_SUITE(user_crud)
TEST(create_user) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
int ret = user_manager_add(fixture->user_mgr, "newuser", "password",
"new@example.com", 1024 * 1024);
ASSERT_EQUAL(NWEDAV_OK, ret);
user_t user;
ret = user_manager_get_by_username(fixture->user_mgr, "newuser", &user);
ASSERT_EQUAL(NWEDAV_OK, ret);
ASSERT_STR_EQ("newuser", user.username);
ASSERT_STR_EQ("new@example.com", user.email);
ASSERT_EQUAL(1024 * 1024, user.quota_bytes);
fixture_destroy(fixture);
}
TEST(read_user) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "readuser", "pass", "read@test.com", 5000);
user_t user;
int ret = user_manager_get_by_username(fixture->user_mgr, "readuser", &user);
ASSERT_EQUAL(NWEDAV_OK, ret);
ASSERT_STR_EQ("readuser", user.username);
ASSERT_STR_EQ("read@test.com", user.email);
ASSERT_EQUAL(5000, user.quota_bytes);
ASSERT_EQUAL(1, user.enabled);
fixture_destroy(fixture);
}
TEST(update_user_password) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "updateuser", "oldpass", "u@test.com", 0);
int ret = user_manager_set_password(fixture->user_mgr, "updateuser", "newpass");
ASSERT_EQUAL(NWEDAV_OK, ret);
user_t user;
ret = user_manager_authenticate(fixture->user_mgr, "updateuser", "newpass", &user);
ASSERT_EQUAL(NWEDAV_OK, ret);
ret = user_manager_authenticate(fixture->user_mgr, "updateuser", "oldpass", &user);
ASSERT_NOT_EQUAL(NWEDAV_OK, ret);
fixture_destroy(fixture);
}
TEST(update_user_email) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "emailuser", "pass", "old@test.com", 0);
int ret = user_manager_set_email(fixture->user_mgr, "emailuser", "new@test.com");
ASSERT_EQUAL(NWEDAV_OK, ret);
user_t user;
user_manager_get_by_username(fixture->user_mgr, "emailuser", &user);
ASSERT_STR_EQ("new@test.com", user.email);
fixture_destroy(fixture);
}
TEST(delete_user) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "deleteuser", "pass", "del@test.com", 0);
int ret = user_manager_delete(fixture->user_mgr, "deleteuser");
ASSERT_EQUAL(NWEDAV_OK, ret);
user_t user;
ret = user_manager_get_by_username(fixture->user_mgr, "deleteuser", &user);
ASSERT_EQUAL(NWEDAV_ERROR_NOT_FOUND, ret);
fixture_destroy(fixture);
}
TEST(delete_nonexistent_user) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
int ret = user_manager_delete(fixture->user_mgr, "doesnotexist");
ASSERT_EQUAL(NWEDAV_ERROR_NOT_FOUND, ret);
fixture_destroy(fixture);
}
TEST(list_users) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "user1", "p", "u1@test.com", 0);
user_manager_add(fixture->user_mgr, "user2", "p", "u2@test.com", 0);
user_manager_add(fixture->user_mgr, "user3", "p", "u3@test.com", 0);
int count = user_manager_count(fixture->user_mgr);
ASSERT_EQUAL(3, count);
fixture_destroy(fixture);
}
TEST(enable_disable_user) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "toggleuser", "pass", "t@test.com", 0);
user_t user;
user_manager_get_by_username(fixture->user_mgr, "toggleuser", &user);
ASSERT_EQUAL(1, user.enabled);
user_manager_enable(fixture->user_mgr, "toggleuser", 0);
user_manager_get_by_username(fixture->user_mgr, "toggleuser", &user);
ASSERT_EQUAL(0, user.enabled);
user_manager_enable(fixture->user_mgr, "toggleuser", 1);
user_manager_get_by_username(fixture->user_mgr, "toggleuser", &user);
ASSERT_EQUAL(1, user.enabled);
fixture_destroy(fixture);
}
TEST(duplicate_username_fails) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
user_manager_add(fixture->user_mgr, "duplicate", "p1", "d1@test.com", 0);
int ret = user_manager_add(fixture->user_mgr, "duplicate", "p2", "d2@test.com", 0);
ASSERT_NOT_EQUAL(NWEDAV_OK, ret);
fixture_destroy(fixture);
}
TEST(empty_username_fails) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
int ret = user_manager_add(fixture->user_mgr, "", "pass", "e@test.com", 0);
ASSERT_NOT_EQUAL(NWEDAV_OK, ret);
fixture_destroy(fixture);
}
TEST(null_username_fails) {
test_fixture_t *fixture = fixture_create();
ASSERT_NOT_NULL(fixture);
int ret = user_manager_add(fixture->user_mgr, NULL, "pass", "n@test.com", 0);
ASSERT_NOT_EQUAL(NWEDAV_OK, ret);
fixture_destroy(fixture);
}