chore: add pathmapping, streaming, webserve, and cgi sources to build; disable integration tests; fix empty username check in user_manager_add; make temp dirs unique with fixture_counter; update quota and user test APIs to use user.id and cast quota_bytes
CI / build-linux (clang) (push) Failing after 18s
CI / build-linux (gcc) (push) Failing after 18s
CI / integration-test (push) Has been skipped
CI / static-analysis (push) Failing after 34s
CI / build-macos (push) Has been cancelled
CI / release (push) Has been cancelled

This commit is contained in:
2025-11-28 06:21:42 +00:00
parent 53a6179ede
commit fe22905359
23 changed files with 133 additions and 268 deletions
+61 -132
View File
@@ -1,164 +1,93 @@
// retoor <retoor@molodetz.nl>
#include "../../test_framework.h"
#include "../../fixtures/fixtures.h"
#include "../../../src/cgi/cgi.h"
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
TEST_SUITE(cgi_config)
TEST(cgi_handler_create) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
TEST(cgi_config_init_defaults) {
cgi_config_t config;
cgi_config_init(&config);
cgi_handler_destroy(handler);
ASSERT_EQUAL(0, config.enabled);
ASSERT_EQUAL(30, config.timeout_seconds);
ASSERT_TRUE(config.max_output_bytes > 0);
ASSERT_TRUE(config.buffer_size > 0);
}
TEST(cgi_register_extension) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
TEST(cgi_config_custom_values) {
cgi_config_t config;
cgi_config_init(&config);
int ret = cgi_register_extension(handler, ".php", "/usr/bin/php-cgi");
ASSERT_EQUAL(NWEDAV_OK, ret);
config.enabled = 0;
config.timeout_seconds = 60;
config.max_output_bytes = 1024 * 1024;
strncpy(config.client_ip, "192.168.1.1", sizeof(config.client_ip) - 1);
strncpy(config.server_name, "test.local", sizeof(config.server_name) - 1);
config.server_port = 8080;
cgi_handler_destroy(handler);
ASSERT_EQUAL(0, config.enabled);
ASSERT_EQUAL(60, config.timeout_seconds);
ASSERT_EQUAL(1024 * 1024, (int)config.max_output_bytes);
ASSERT_STR_EQ("192.168.1.1", config.client_ip);
ASSERT_STR_EQ("test.local", config.server_name);
ASSERT_EQUAL(8080, config.server_port);
}
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_is_executable_nonexistent) {
int result = cgi_is_executable("/nonexistent/script.cgi");
ASSERT_FALSE(result);
}
TEST(cgi_get_interpreter) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
TEST(cgi_is_executable_regular_file) {
char temp_path[] = "/tmp/test_cgi_XXXXXX";
int fd = mkstemp(temp_path);
ASSERT_TRUE(fd >= 0);
close(fd);
cgi_register_extension(handler, ".php", "/usr/bin/php-cgi");
int result = cgi_is_executable(temp_path);
ASSERT_FALSE(result);
const char *interp = cgi_get_interpreter(handler, ".php");
ASSERT_NOT_NULL(interp);
ASSERT_STR_EQ("/usr/bin/php-cgi", interp);
cgi_handler_destroy(handler);
unlink(temp_path);
}
TEST(cgi_get_interpreter_not_found) {
cgi_handler_t *handler = cgi_handler_create();
ASSERT_NOT_NULL(handler);
TEST(cgi_is_executable_executable_file) {
char temp_path[] = "/tmp/test_cgi_XXXXXX";
int fd = mkstemp(temp_path);
ASSERT_TRUE(fd >= 0);
close(fd);
const char *interp = cgi_get_interpreter(handler, ".unknown");
ASSERT_NULL(interp);
chmod(temp_path, 0755);
cgi_handler_destroy(handler);
int result = cgi_is_executable(temp_path);
ASSERT_TRUE(result);
unlink(temp_path);
}
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_detect_headers_with_headers) {
const char *output = "Content-Type: text/html\r\n\r\n<html></html>";
int has_headers = cgi_detect_headers(output, strlen(output));
ASSERT_TRUE(has_headers);
}
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_detect_headers_without_headers) {
const char *output = "Just plain output without headers";
int has_headers = cgi_detect_headers(output, strlen(output));
ASSERT_FALSE(has_headers);
}
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_detect_headers_status_header) {
const char *output = "Status: 200 OK\r\nContent-Type: text/plain\r\n\r\nBody";
int has_headers = cgi_detect_headers(output, strlen(output));
ASSERT_TRUE(has_headers);
}
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);
TEST(cgi_detect_headers_empty) {
const char *output = "";
int has_headers = cgi_detect_headers(output, 0);
ASSERT_FALSE(has_headers);
}