#include #include #include "browse.h" #include "http.h" #include "upload.h" #include "url.h" /* minunit, see https://jera.com/techinfo/jtns/jtn002 */ #define mu_assert(message, test) do { if (!(test)) return message; } while (0) #define mu_run_test(test) do { char* message = test(); tests_run++; \ if(message) return message; } while (0) #define BUF_SZ 1000 int tests_run; static char * test_browse_invalid_traversal() { struct kreq r; struct http_ret ret; /* attempt to traverse out of DATA_DIR... */ r = (struct kreq) { .path = "..", .suffix = "", .mime = KMIME_TEXT_HTML }; ret = browse(&r); /* ...should return an error */ mu_assert("error, browse allowed invalid traversal!", ret.code >= KHTTP_400); return 0; } static char * test_browse_path_too_long() { struct kreq r; struct http_ret ret; /* a lengthy path should cause URL overflow... */ r = (struct kreq) { .path = "this/is/a/very/very/lengthy/path/that/should/overflow/the/maximum/allowed/path/length/of/PATH_MAX/well/of/course/this/limit/is/platform/dependent", .suffix = "", .mime = KMIME_TEXT_HTML }; ret = browse(&r); mu_assert("error, browse allowed invalid traversal!", ret.code >= KHTTP_400); return 0; } static char * test_upload_post() { char *file_content; struct kreq r; struct http_ret ret; struct kpair fields[2]; file_content = "text file"; fields[0] = (struct kpair) { .key = "file", .file = "bob.txt", .val = file_content, .valsz = strlen(file_content) }; fields[1] = (struct kpair) { .key = "file", .file = "alice.txt", .val = file_content, .valsz = strlen(file_content) }; r = (struct kreq) { .pname = "/vault", .path = "", .method = KMETHOD_POST, .fieldsz = 2, .fields = fields }; ret = upload(&r); mu_assert("error, POST upload failed!", ret.code <= KHTTP_400); return 0; } static char * test_url_build() { char dst[BUF_SZ], *expected; size_t dst_len; expected = "/vault/browse"; dst_len = url_build(dst, BUF_SZ, "/vault/browse", "", NULL); mu_assert("test_url_build failed", dst_len > 0 && dst_len < BUF_SZ); mu_assert("test_url_build failed", strncmp(expected, dst, BUF_SZ) == 0); expected = "/vault/browse/hello/world"; dst_len = url_build(dst, BUF_SZ, "/vault/browse", "hello", "world", NULL); mu_assert("test_url_build failed", dst_len > 0 && dst_len < BUF_SZ); mu_assert("test_url_build failed", strncmp(expected, dst, BUF_SZ) == 0); expected = "/vault/browse"; dst_len = url_build(dst, BUF_SZ, "/vault/", "browse/", NULL); mu_assert("test_url_build failed", dst_len > 0 && dst_len < BUF_SZ); mu_assert("test_url_build failed", strncmp(expected, dst, BUF_SZ) == 0); dst_len = url_build(dst, BUF_SZ, "", "", NULL); mu_assert("test_url_build failed", dst_len == 0); dst_len = url_build(dst, BUF_SZ, NULL); mu_assert("test_url_build failed", dst_len == 0); return 0; } static char * all_tests() { mu_run_test(test_browse_invalid_traversal); mu_run_test(test_browse_path_too_long); mu_run_test(test_url_build); mu_run_test(test_upload_post); return 0; } int main(void) { char *result = all_tests(); if (result != 0) { printf("%s\n", result); } else { printf("ALL TESTS PASSED\n"); } printf("Tests run: %d\n", tests_run); return result != 0; }