commit 6e0f240c0e241a6608e796151ff69d6591f49d1d
parent 8caeb3557ad13c6881f5496b22ec55b26bfc204f
Author: quantumish <freifeld.david@gmail.com>
Date: Tue, 11 Apr 2023 20:15:05 -0700
Experiment with adding tests
Diffstat:
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);