bunkum

an old and silly c99 web server with some fun features
Log | Files | Refs | README

commit 6e0f240c0e241a6608e796151ff69d6591f49d1d
parent 8caeb3557ad13c6881f5496b22ec55b26bfc204f
Author: quantumish <freifeld.david@gmail.com>
Date:   Tue, 11 Apr 2023 20:15:05 -0700

Experiment with adding tests

Diffstat:
MMakefile | 8++++----
Mhttp/request.c | 22++++++++++++++++++++++
Mtest.c | 8+++-----
Atest.h | 11+++++++++++
Atestutils.c | 25+++++++++++++++++++++++++
Mutils/shitvec.c | 17+++++++++++++++--
Mutils/shitvec.h | 4+++-
7 files changed, 83 insertions(+), 12 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,21 +1,21 @@ CFLAGS?=-O2 -g LIBS:=-lz -lpthread -LIBS = $(wildcard utils/*.c) $(wildcard http/*.c) +CLIBS = $(wildcard utils/*.c) $(wildcard http/*.c) OBJ = $(wildcard build/*.o) .PHONY: all clean run test all: serv -serv: $(LIBS) http.c +serv: $(CLIBS) http.c $(CC) -o $@ $^ $(CFLAGS) $(LIBS) run: serv sudo docker build -t bunkum-dev . sudo docker run -it -p "8080:8082" bunkum-dev -test: $(LIBS) test.c - $(CC) $(LIBS) -shared -fPIC $(CFLAGS) -o libbunkum.so +test: $(CLIBS) test.c + $(CC) $(CLIBS) testutils.c -shared -fPIC $(CFLAGS) -o libbunkum.so $(LIBS) -DTEST $(CC) test.c -o test -ldl ./test libbunkum.so diff --git a/http/request.c b/http/request.c @@ -89,3 +89,25 @@ void req_free(request_t* req) { shitvec_free(&req->headers); } +#ifdef TEST +#include <stdlib.h> +#include "../test.h" + +static void assert_method_eq(enum http_method a, enum http_method b) { + if (a != b) { + printf("(%s != %s)", method_name(a), method_name(b)); + exit(1); + } +} + +void test_method_str_to_enum() { + assert_method_eq(method_enum("GET"), GET); + assert_method_eq(method_enum("HEAD"), HEAD); + assert_method_eq(method_enum("POST"), POST); + assert_method_eq(method_enum("PUT"), PUT); + assert_method_eq(method_enum("DELETE"), DELETE); + assert_method_eq(method_enum("CONNECT"), CONNECT); + assert_method_eq(method_enum("OPTIONS"), OPTIONS); + assert_method_eq(method_enum("TRACE"), TRACE); +}; +#endif diff --git a/test.c b/test.c @@ -66,16 +66,14 @@ int main(int argc, char** argv) { char path[64] = {0}; sprintf(path, "./%s", argv[1]); void* lib = dlopen(path, RTLD_LAZY); - if (!lib) { - printf("uh oh: %s\n", dlerror()); - } for (char* sym = symbols; sym < symbols_off; sym+=MAX_SYMBOL_LEN) { - printf("%s", sym); + printf("%s ", sym+5); fflush(STDIN_FILENO); bool(*testf)(void) = dlsym(lib, sym); pid_t pid = fork(); if (pid == 0) { - exit(!testf()); + testf(); + exit(0); } else { int status; waitpid(pid, &status, 0); diff --git a/test.h b/test.h @@ -0,0 +1,11 @@ +#ifndef TEST_H +#define TEST_H + +#include <stdbool.h> +#include <stddef.h> + +void assert_str_eq(char* a, char* b); +void assert_size_eq(size_t a, size_t b); +void assert_bool(bool expr); + +#endif diff --git a/testutils.c b/testutils.c @@ -0,0 +1,25 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "test.h" + +void assert_str_eq(char* a, char* b) { + if (strcmp(a, b) != 0) { + printf("(%s != %s)", a, b); + exit(1); + } +} + +void assert_size_eq(size_t a, size_t b) { + if (a != b) { + printf("(%zu != %zu)", a, b); + exit(1); + } +} + +void assert_bool(bool expr) { + if (!expr) { + exit(1); + } +} diff --git a/utils/shitvec.c b/utils/shitvec.c @@ -37,7 +37,7 @@ void shitvec_subpush(shitvec_t* sv, void* item, size_t sz) { memcpy(sv->arr+(sv->vec_sz * sv->e_sz), item, sz); } -bool shitvec_check(shitvec_t* sv, void* item, int(cmp)(void*, void*)) { +bool shitvec_check(shitvec_t* sv, void* item, sv_cmp_t cmp) { for (size_t i = 0; i < sv->vec_sz; i++) { if (cmp(sv->arr+(i*sv->e_sz), item) == 0) { return true; @@ -54,4 +54,17 @@ void shitvec_free(shitvec_t* sv) { free(sv->arr); } -int test_shitvec() { return 1; }; +#ifdef TEST +#include "../test.h" + +void test_shitvec_sanity() { + shitvec_t sv = shitvec_new(8); + shitvec_push(&sv, "whee"); + shitvec_push(&sv, "whoo"); + assert_str_eq("whee", shitvec_get(&sv, 0)); + assert_str_eq("whoo", shitvec_get(&sv, 1)); + assert_size_eq(2, sv.vec_sz); + assert_size_eq(8, sv.e_sz); + assert_bool(shitvec_check(&sv, "whoo", (sv_cmp_t)strcmp)); +}; +#endif diff --git a/utils/shitvec.h b/utils/shitvec.h @@ -13,11 +13,13 @@ typedef struct shitvec { size_t vec_sz; } shitvec_t; +typedef int(*sv_cmp_t)(void*, void*); + shitvec_t shitvec_new(size_t e_sz); void* shitvec_get(shitvec_t* sv, size_t index); void shitvec_push(shitvec_t* sv, void* item); void shitvec_subpush(shitvec_t* sv, void* item, size_t sz); -bool shitvec_check(shitvec_t* sv, void* item, int(cmp)(void*, void*)); +bool shitvec_check(shitvec_t* sv, void* item, sv_cmp_t cmp); void shitvec_sort(shitvec_t* sv, int(*cmp)(const void*, const void*)); void shitvec_free(shitvec_t* sv);