chore: started routing tests

routing
Jef Roosens 2024-02-22 18:17:26 +01:00
parent 386d83ec93
commit de4e509c9c
Signed by: Jef Roosens
GPG Key ID: B75D4F293C7052DB
3 changed files with 40 additions and 6 deletions

View File

@ -11,6 +11,7 @@ struct lnm_http_router {
struct lnm_http_router *exact_children[128];
struct lnm_http_router *single_segment_child;
lnm_http_route *routes[lnm_http_method_total];
bool represents_route;
};
lnm_err lnm_http_route_init(lnm_http_route **out);

View File

@ -1,3 +1,4 @@
#include <stdio.h>
#include <string.h>
#include "lnm/common.h"
@ -51,7 +52,10 @@ lnm_err lnm_http_router_add(lnm_http_route **out, lnm_http_router *http_router,
switch (c) {
case ':':
LNM_RES(lnm_http_router_init(&http_router->single_segment_child));
if (http_router->single_segment_child == NULL) {
LNM_RES(lnm_http_router_init(&http_router->single_segment_child));
}
http_router = http_router->single_segment_child;
// All other characters in the segment are ignored
@ -62,7 +66,10 @@ lnm_err lnm_http_router_add(lnm_http_route **out, lnm_http_router *http_router,
// TODO multi-segment wildcard
break;
default:
LNM_RES(lnm_http_router_init(&http_router->exact_children[c]));
if (http_router->exact_children[c] == NULL) {
LNM_RES(lnm_http_router_init(&http_router->exact_children[c]));
}
http_router = http_router->exact_children[c];
path++;
break;
@ -74,7 +81,11 @@ lnm_err lnm_http_router_add(lnm_http_route **out, lnm_http_router *http_router,
}
LNM_RES(lnm_http_route_init(&http_router->routes[method]));
*out = http_router->routes[method];
http_router->represents_route = true;
if (out != NULL) {
*out = http_router->routes[method];
}
return lnm_err_ok;
}
@ -88,10 +99,16 @@ lnm_http_route_err lnm_http_router_route(const lnm_http_route **out,
}
if (*path == '\0') {
*out = router->routes[method];
if (!router->represents_route) {
return lnm_http_route_err_unknown_route;
}
return *out == NULL ? lnm_http_route_err_unknown_method
: lnm_http_route_err_match;
if (out != NULL) {
*out = router->routes[method];
}
return router->routes[method] == NULL ? lnm_http_route_err_unknown_method
: lnm_http_route_err_match;
}
lnm_http_route_err res = lnm_http_route_err_unknown_route;

View File

@ -1,5 +1,21 @@
#include "test.h"
#include "lnm/http/router.h"
void test_routing_simple() {
lnm_http_router *router;
lnm_http_router_init(&router);
lnm_http_router_add(NULL, router, lnm_http_method_get, "/test");
lnm_http_router_add(NULL, router, lnm_http_method_get, "/test/test2");
TEST_CHECK(lnm_http_router_route(NULL, router, lnm_http_method_get, "/test") == lnm_http_route_err_match);
TEST_CHECK(lnm_http_router_route(NULL, router, lnm_http_method_get, "/test/te") == lnm_http_route_err_unknown_route);
TEST_CHECK(lnm_http_router_route(NULL, router, lnm_http_method_head, "/test/test2") == lnm_http_route_err_unknown_method);
TEST_CHECK(lnm_http_router_route(NULL, router, lnm_http_method_get, "/test/test2") == lnm_http_route_err_match);
}
TEST_LIST = {
{ "routing simple", test_routing_simple },
{ NULL, NULL }
};