summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJesper Jensen <jesper@jnsn.dev>2026-02-16 21:43:36 +0100
committerJesper Jensen <jesper@jnsn.dev>2026-02-16 21:43:36 +0100
commitc9e3a4b2816ad23aa201a4f43f357a376947bd49 (patch)
tree042530b79b1e3c7c36872b991850002bec9268a8 /test
INITIAL COMMIT
Diffstat (limited to 'test')
-rw-r--r--test/http.c227
1 files changed, 227 insertions, 0 deletions
diff --git a/test/http.c b/test/http.c
new file mode 100644
index 0000000..fa7755d
--- /dev/null
+++ b/test/http.c
@@ -0,0 +1,227 @@
+#include "web.h"
+
+#include "mytime.h"
+
+#include <assert.h>
+#include <curl/curl.h>
+#include <stdlib.h>
+#include <string.h>
+
+// @PASTE Stolen from libcurl documentation
+struct memory {
+ char *body;
+ size_t size;
+};
+
+static size_t write_to_memory(char *data, size_t size, size_t nmemb, void *clientp) {
+ size_t realsize = size * nmemb;
+ struct memory *mem = (struct memory *)clientp;
+
+ char *ptr = realloc(mem->body, mem->size + realsize + 1);
+ if(!ptr) return 0; /* out of memory */
+
+ mem->body = ptr;
+ memcpy(&(mem->body[mem->size]), data, realsize);
+ mem->size += realsize;
+ mem->body[mem->size] = 0;
+
+ return realsize;
+}
+
+static size_t read_from_memory(char *data, size_t size, size_t nmemb, void *clientp) {
+ size_t realsize = size * nmemb;
+ struct memory *mem = (struct memory *)clientp;
+
+ realsize = realsize > mem->size ? mem->size : realsize;
+
+ memcpy(data, mem->body, realsize);
+ mem->size -= realsize;
+ mem->body += realsize;
+
+ return realsize;
+}
+
+int main(int argc, char **argv) {
+ enable_fake_time();
+
+ // @DEP: The shared-cache mode is deprecated in sqlite, but it's still
+ // there and useful right now.
+ struct App app = {
+ .dbname = "file::memory:?cache=shared",
+ };
+ prepare_database(&app);
+ struct Server server = {
+ .app = &app,
+ };
+ web_begin(&server, 8080);
+ curl_global_init(CURL_GLOBAL_ALL);
+ CURLcode curlRes;
+ CURL *curl = curl_easy_init();
+ assert(curl != NULL);
+
+ {
+ curlRes = curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/");
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_to_memory);
+ assert(curlRes == CURLE_OK);
+
+ struct memory body = {0};
+ curlRes = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_perform(curl);
+ assert(curlRes == CURLE_OK);
+
+ long code;
+ curlRes = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
+ assert(code == 200);
+
+ char *ct;
+ curlRes = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
+ assert(curlRes == CURLE_OK);
+
+ }
+
+ {
+ curlRes = curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/api/client");
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_POST, 1L);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_from_memory);
+ assert(curlRes == CURLE_OK);
+
+ struct memory req_body = {
+ .body = "{\"name\": \"client1\"}",
+ .size = strlen(req_body.body),
+ };
+ curlRes = curl_easy_setopt(curl, CURLOPT_READDATA, &req_body);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_to_memory);
+ assert(curlRes == CURLE_OK);
+
+ struct memory body = {0};
+ curlRes = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_perform(curl);
+ assert(curlRes == CURLE_OK);
+
+ long code;
+ curlRes = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
+ assert(code == 200);
+
+ char *ct;
+ curlRes = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
+ assert(curlRes == CURLE_OK);
+ assert(ct != NULL);
+ assert(strcmp(ct, "application/json") == 0);
+
+ assert(body.size >= 0);
+ assert(strcmp(
+ body.body,
+ "{ "
+ "\"id\": \"1\" "
+ "}"
+ ) == 0);
+ body = (struct memory){0};
+ }
+
+ {
+ curlRes = curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/api/report");
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_POST, 1L);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_from_memory);
+ assert(curlRes == CURLE_OK);
+
+ struct memory req_body = {
+ .body = "{\"client\": \"client1\", \"event\": \"begin_backup\"}",
+ .size = strlen(req_body.body),
+ };
+ curlRes = curl_easy_setopt(curl, CURLOPT_READDATA, &req_body);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_to_memory);
+ assert(curlRes == CURLE_OK);
+
+ struct memory body = {0};
+ curlRes = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_perform(curl);
+ assert(curlRes == CURLE_OK);
+
+ long code;
+ curlRes = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
+ assert(code == 204);
+
+ char *ct;
+ curlRes = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
+ assert(curlRes == CURLE_OK);
+ assert(ct != NULL);
+ assert(strcmp(ct, "application/json") == 0);
+
+ assert(body.size == 0);
+ body = (struct memory){0};
+ }
+
+ progress_time(TIME_JOIN(0, 30, 0));
+
+ {
+ curlRes = curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/api/report");
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_POST, 1L);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_from_memory);
+ assert(curlRes == CURLE_OK);
+
+ struct memory req_body = {
+ .body = "{\"client\": \"client1\", \"event\": \"end_backup\"}",
+ .size = strlen(req_body.body),
+ };
+ curlRes = curl_easy_setopt(curl, CURLOPT_READDATA, &req_body);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_to_memory);
+ assert(curlRes == CURLE_OK);
+
+ struct memory body = {0};
+ curlRes = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
+ assert(curlRes == CURLE_OK);
+
+ curlRes = curl_easy_perform(curl);
+ assert(curlRes == CURLE_OK);
+
+ long code;
+ curlRes = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
+ assert(code == 204);
+
+ char *ct;
+ curlRes = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
+ assert(curlRes == CURLE_OK);
+ assert(ct != NULL);
+ assert(strcmp(ct, "application/json") == 0);
+
+ assert(body.size == 0);
+ body = (struct memory){0};
+ }
+
+ web_join(&server);
+}