diff options
| author | Jesper Jensen <jesper@jnsn.dev> | 2026-02-16 21:43:36 +0100 |
|---|---|---|
| committer | Jesper Jensen <jesper@jnsn.dev> | 2026-02-16 21:43:36 +0100 |
| commit | c9e3a4b2816ad23aa201a4f43f357a376947bd49 (patch) | |
| tree | 042530b79b1e3c7c36872b991850002bec9268a8 /test | |
INITIAL COMMIT
Diffstat (limited to 'test')
| -rw-r--r-- | test/http.c | 227 |
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); +} |
