r3/tests/check_tree.c

427 lines
10 KiB
C
Raw Normal View History

2014-05-16 19:14:09 -04:00
#include "config.h"
2014-05-14 12:15:19 -04:00
#include <stdio.h>
#include <check.h>
2014-05-16 06:03:52 -04:00
#include <stdlib.h>
2014-05-16 08:22:25 -04:00
#include "r3.h"
2014-05-16 18:40:08 -04:00
#include "r3_str.h"
2014-05-16 08:22:25 -04:00
#include "str_array.h"
2014-05-21 02:59:07 -04:00
#include "zmalloc.h"
2014-05-16 19:48:22 -04:00
#include "bench.h"
2014-05-14 12:15:19 -04:00
2014-05-16 06:03:52 -04:00
2014-05-15 00:53:48 -04:00
START_TEST (test_ltrim_slash)
{
fail_if( strcmp( ltrim_slash("/blog") , "blog" ) != 0 );
fail_if( strcmp( ltrim_slash("blog") , "blog" ) != 0 );
}
END_TEST
2014-05-20 04:18:17 -04:00
START_TEST (test_r3_node_construct_and_free)
2014-05-15 01:39:50 -04:00
{
2014-05-16 06:57:36 -04:00
node * n = r3_tree_create(10);
2014-05-21 06:12:14 -04:00
node * another_tree = r3_tree_create(3);
2014-05-16 06:57:36 -04:00
r3_tree_free(n);
2014-05-21 06:12:14 -04:00
r3_tree_free(another_tree);
2014-05-15 01:39:50 -04:00
}
END_TEST
2014-05-16 06:57:36 -04:00
START_TEST (test_r3_node_find_edge)
2014-05-15 01:39:50 -04:00
{
2014-05-16 06:57:36 -04:00
node * n = r3_tree_create(10);
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
node * child = r3_tree_create(3);
2014-05-15 01:39:50 -04:00
2014-05-23 01:49:18 -04:00
fail_if( r3_node_connect(n, zstrdup("/add") , child) == FALSE );
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
fail_if( r3_node_find_edge(n, "/add") == NULL );
fail_if( r3_node_find_edge(n, "/bar") != NULL );
2014-05-15 01:39:50 -04:00
2014-05-16 06:57:36 -04:00
r3_tree_free(n);
2014-05-15 01:39:50 -04:00
}
END_TEST
2014-05-15 00:53:48 -04:00
2014-05-23 03:48:26 -04:00
static node * create_simple_str_tree() {
2014-05-16 03:29:25 -04:00
node * n;
2014-05-16 06:57:36 -04:00
n = r3_tree_create(10);
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/zoo", NULL);
r3_tree_insert_path(n, "/foo", NULL);
r3_tree_insert_path(n, "/bar", NULL);
2014-05-16 06:57:36 -04:00
r3_tree_compile(n);
2014-05-23 03:48:26 -04:00
return n;
}
START_TEST (test_compile)
{
str_array *t;
node * n = create_simple_str_tree();
node *m;
edge *e ;
2014-05-15 09:17:30 -04:00
2014-05-16 06:03:52 -04:00
#ifdef DEBUG
2014-05-16 06:57:36 -04:00
r3_tree_dump(n, 0);
2014-05-16 06:03:52 -04:00
#endif
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/foo/{id}", NULL);
r3_tree_insert_path(n, "/{id}", NULL);
2014-05-16 06:57:36 -04:00
r3_tree_compile(n);
r3_tree_compile(n); // test double compile
r3_tree_dump(n, 0);
2014-05-16 07:12:01 -04:00
match_entry * entry;
2014-05-16 02:24:00 -04:00
2014-05-17 11:54:18 -04:00
entry = match_entry_createl( "foo" , strlen("/foo") );
2014-05-18 22:34:48 -04:00
m = r3_tree_matchl( n , "/foo", strlen("/foo"), entry);
2014-05-21 06:31:51 -04:00
ck_assert( m );
2014-05-16 02:24:00 -04:00
2014-05-17 11:54:18 -04:00
entry = match_entry_createl( "/zoo" , strlen("/zoo") );
2014-05-18 22:34:48 -04:00
m = r3_tree_matchl( n , "/zoo", strlen("/zoo"), entry);
2014-05-21 06:31:51 -04:00
ck_assert( m );
2014-05-16 02:24:00 -04:00
2014-05-17 11:54:18 -04:00
entry = match_entry_createl( "/bar" , strlen("/bar") );
2014-05-18 22:34:48 -04:00
m = r3_tree_matchl( n , "/bar", strlen("/bar"), entry);
2014-05-21 06:31:51 -04:00
ck_assert( m );
2014-05-16 02:36:48 -04:00
2014-05-17 11:54:18 -04:00
entry = match_entry_createl( "/xxx" , strlen("/xxx") );
2014-05-18 22:34:48 -04:00
m = r3_tree_matchl( n , "/xxx", strlen("/xxx"), entry);
2014-05-21 06:31:51 -04:00
ck_assert( m );
2014-05-16 02:42:05 -04:00
2014-05-17 11:54:18 -04:00
entry = match_entry_createl( "/foo/xxx" , strlen("/foo/xxx") );
2014-05-18 22:34:48 -04:00
m = r3_tree_matchl( n , "/foo/xxx", strlen("/foo/xxx"), entry);
2014-05-21 06:31:51 -04:00
ck_assert( m );
2014-05-16 03:29:25 -04:00
2014-05-17 11:54:18 -04:00
entry = match_entry_createl( "/some_id" , strlen("/some_id") );
2014-05-18 22:34:48 -04:00
m = r3_tree_matchl( n , "/some_id", strlen("/some_id"), entry);
2014-05-21 06:31:51 -04:00
ck_assert( m );
2014-05-15 09:17:30 -04:00
}
END_TEST
START_TEST (test_pcre_patterns_insert)
2014-05-15 08:38:07 -04:00
{
node * n = r3_tree_create(10);
2014-05-15 09:17:30 -04:00
// r3_tree_insert_path(n, "/foo-{user}-{id}", NULL, NULL);
r3_tree_insert_path(n, "/post/{handle:\\d+}-{id:\\d+}", NULL);
r3_tree_compile(n);
// r3_tree_dump(n, 0);
2014-05-15 09:17:30 -04:00
node *matched;
matched = r3_tree_matchl(n, "/post/111-222", strlen("/post/111-222"), NULL);
2014-05-21 06:31:51 -04:00
ck_assert(matched);
ck_assert(matched->endpoint > 0);
2014-05-15 09:17:30 -04:00
// incomplete string shouldn't match
matched = r3_tree_matchl(n, "/post/111-", strlen("/post/111-"), NULL);
ck_assert(! matched);
2014-05-15 09:17:30 -04:00
r3_tree_free(n);
2014-05-15 08:38:07 -04:00
}
END_TEST
/**
2014-05-20 12:55:43 -04:00
* Test for \d{2}/\d{2}
*/
START_TEST (test_pcre_patterns_insert_2)
{
node * n = r3_tree_create(10);
r3_tree_insert_path(n, "/post/{idx:\\d{2}}/{idy:\\d{2}}", NULL);
2014-05-20 13:15:54 -04:00
r3_tree_insert_path(n, "/zoo", NULL);
r3_tree_insert_path(n, "/foo", NULL);
r3_tree_insert_path(n, "/bar", NULL);
r3_tree_compile(n);
r3_tree_dump(n, 0);
node *matched;
matched = r3_tree_match(n, "/post/11/22", NULL);
2014-05-21 03:50:37 -04:00
ck_assert((int)matched);
ck_assert(matched->endpoint > 0);
}
END_TEST
/**
2014-05-20 12:55:43 -04:00
* Test for (\d{2})/([^/]+)
*/
START_TEST (test_pcre_patterns_insert_3)
{
node * n = r3_tree_create(10);
2014-05-20 13:15:54 -04:00
printf("Inserting /post/{idx:\\d{2}}/{idy}\n");
2014-05-20 12:49:08 -04:00
r3_tree_insert_path(n, "/post/{idx:\\d{2}}/{idy}", NULL);
2014-05-20 13:15:54 -04:00
r3_tree_dump(n, 0);
printf("Inserting /zoo\n");
r3_tree_insert_path(n, "/zoo", NULL);
r3_tree_dump(n, 0);
r3_tree_insert_path(n, "/foo", NULL);
r3_tree_insert_path(n, "/bar", NULL);
r3_tree_compile(n);
r3_tree_dump(n, 0);
node *matched;
2014-05-20 13:15:54 -04:00
matched = r3_tree_match(n, "/post/11/22", NULL);
2014-05-21 03:50:37 -04:00
ck_assert((int)matched);
2014-05-20 13:15:54 -04:00
2014-05-20 12:49:08 -04:00
matched = r3_tree_match(n, "/post/11", NULL);
ck_assert(!matched);
matched = r3_tree_match(n, "/post/11/", NULL);
ck_assert(!matched);
2014-05-20 13:15:54 -04:00
/*
2014-05-20 12:49:08 -04:00
matched = r3_tree_match(n, "/post/113", NULL);
ck_assert(!matched);
2014-05-20 13:15:54 -04:00
*/
}
END_TEST
2014-05-20 12:47:09 -04:00
START_TEST (testr3_tree_insert_pathl)
2014-05-15 06:02:10 -04:00
{
2014-05-16 06:57:36 -04:00
node * n = r3_tree_create(10);
2014-05-15 06:02:10 -04:00
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/foo/bar", NULL);
2014-05-16 06:57:36 -04:00
// r3_tree_dump(n, 0);
2014-05-15 10:57:13 -04:00
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/foo/zoo", NULL);
2014-05-16 06:57:36 -04:00
// r3_tree_dump(n, 0);
2014-05-15 10:57:13 -04:00
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/f/id" , NULL);
2014-05-16 06:57:36 -04:00
// r3_tree_dump(n, 0);
2014-05-15 10:57:13 -04:00
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/post/{id}", NULL);
2014-05-16 06:57:36 -04:00
// r3_tree_dump(n, 0);
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/post/{handle}", NULL);
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/post/{handle}-{id}", NULL);
2014-05-16 06:57:36 -04:00
r3_tree_compile(n);
2014-05-15 06:02:10 -04:00
2014-05-16 06:03:52 -04:00
#ifdef DEBUG
2014-05-16 06:57:36 -04:00
r3_tree_dump(n, 0);
2014-05-16 06:03:52 -04:00
#endif
2014-05-16 06:57:36 -04:00
r3_tree_free(n);
2014-05-15 06:02:10 -04:00
}
END_TEST
2014-05-14 22:08:42 -04:00
2014-05-16 06:03:52 -04:00
START_TEST (test_str_array)
2014-05-14 22:08:42 -04:00
{
2014-05-16 06:03:52 -04:00
str_array * l = str_array_create(3);
2014-05-14 23:52:45 -04:00
fail_if( l == NULL );
2014-05-14 22:08:42 -04:00
fail_if( FALSE == str_array_append(l, zstrdup("abc") ) );
2014-05-15 00:53:48 -04:00
fail_if( l->len != 1 );
fail_if( FALSE == str_array_append(l, zstrdup("foo") ) );
2014-05-15 00:53:48 -04:00
fail_if( l->len != 2 );
fail_if( FALSE == str_array_append(l, zstrdup("bar") ) );
2014-05-15 00:53:48 -04:00
fail_if( l->len != 3 );
fail_if( FALSE == str_array_append(l, zstrdup("zoo") ) );
2014-05-15 00:53:48 -04:00
fail_if( l->len != 4 );
2014-05-16 06:03:52 -04:00
fail_if( FALSE == str_array_resize(l, l->cap * 2) );
str_array_free(l);
}
END_TEST
START_TEST(test_route_cmp)
{
route *r1 = r3_route_create("/blog/post");
2014-05-18 00:56:53 -04:00
match_entry * m = match_entry_create("/blog/post");
fail_if( r3_route_cmp(r1, m) == -1, "should match");
r1->request_method = METHOD_GET;
2014-05-18 00:56:53 -04:00
m->request_method = METHOD_GET;
fail_if( r3_route_cmp(r1, m) == -1, "should match");
r1->request_method = METHOD_GET;
2014-05-18 00:56:53 -04:00
m->request_method = METHOD_POST;
fail_if( r3_route_cmp(r1, m) == 0, "should be different");
2014-05-18 00:56:53 -04:00
r1->request_method = METHOD_GET;
m->request_method = METHOD_POST | METHOD_GET;
fail_if( r3_route_cmp(r1, m) == -1, "should match");
2014-05-18 00:24:07 -04:00
r3_route_free(r1);
2014-05-18 00:56:53 -04:00
match_entry_free(m);
}
END_TEST
2014-05-17 07:25:25 -04:00
2014-05-18 02:13:04 -04:00
START_TEST(test_pcre_pattern_simple)
{
match_entry * entry;
entry = match_entry_createl( "/user/123" , strlen("/user/123") );
2014-05-18 02:18:47 -04:00
node * n = r3_tree_create(10);
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/user/{id:\\d+}", NULL);
r3_tree_insert_path(n, "/user", NULL);
2014-05-18 02:13:04 -04:00
r3_tree_compile(n);
// r3_tree_dump(n, 0);
2014-05-18 02:30:00 -04:00
node *matched;
2014-05-18 22:34:48 -04:00
matched = r3_tree_matchl(n, "/user/123", strlen("/user/123"), entry);
2014-05-21 06:31:51 -04:00
ck_assert(matched);
ck_assert(entry->vars->len > 0);
2014-05-18 02:30:00 -04:00
ck_assert_str_eq(entry->vars->tokens[0],"123");
2014-05-20 04:18:17 -04:00
r3_tree_free(n);
2014-05-18 02:30:00 -04:00
}
END_TEST
START_TEST(test_pcre_pattern_more)
{
match_entry * entry;
entry = match_entry_createl( "/user/123" , strlen("/user/123") );
node * n = r3_tree_create(10);
2014-05-18 03:00:11 -04:00
int var0 = 5;
int var1 = 100;
int var2 = 200;
int var3 = 300;
2014-05-18 03:06:11 -04:00
info("var0: %p\n", &var0);
info("var1: %p\n", &var1);
info("var2: %p\n", &var2);
info("var3: %p\n", &var3);
2014-05-18 02:13:04 -04:00
2014-05-18 22:12:41 -04:00
r3_tree_insert_path(n, "/user/{id:\\d+}", &var1);
r3_tree_insert_path(n, "/user2/{id:\\d+}", &var2);
r3_tree_insert_path(n, "/user3/{id:\\d{3}}", &var3);
r3_tree_insert_path(n, "/user", &var0);
2014-05-18 02:30:00 -04:00
r3_tree_compile(n);
2014-05-20 13:15:54 -04:00
r3_tree_dump(n, 0);
2014-05-18 02:13:04 -04:00
node *matched;
2014-05-18 02:30:00 -04:00
2014-05-18 22:34:48 -04:00
matched = r3_tree_matchl(n, "/user/123", strlen("/user/123"), entry);
2014-05-21 06:31:51 -04:00
ck_assert(matched);
ck_assert(entry->vars->len > 0);
2014-05-18 02:30:00 -04:00
ck_assert_str_eq(entry->vars->tokens[0],"123");
2014-05-18 03:06:11 -04:00
info("matched %p\n", matched->data);
info("matched %p\n", matched->data);
ck_assert_int_eq( *((int*) matched->data), var1);
2014-05-18 22:34:48 -04:00
matched = r3_tree_matchl(n, "/user2/123", strlen("/user2/123"), entry);
2014-05-21 06:31:51 -04:00
ck_assert(matched);
ck_assert(entry->vars->len > 0);
2014-05-18 02:30:00 -04:00
ck_assert_str_eq(entry->vars->tokens[0],"123");
2014-05-18 03:06:11 -04:00
ck_assert_int_eq( *((int*)matched->data), var2);
2014-05-18 02:30:00 -04:00
2014-05-18 22:34:48 -04:00
matched = r3_tree_matchl(n, "/user3/123", strlen("/user3/123"), entry);
2014-05-21 06:31:51 -04:00
ck_assert(matched);
ck_assert(entry->vars->len > 0);
2014-05-18 02:18:47 -04:00
ck_assert_str_eq(entry->vars->tokens[0],"123");
2014-05-18 03:06:11 -04:00
ck_assert_int_eq( *((int*)matched->data), var3);
2014-05-20 04:18:17 -04:00
r3_tree_free(n);
2014-05-18 02:13:04 -04:00
}
2014-05-18 02:18:47 -04:00
END_TEST
2014-05-17 07:25:25 -04:00
2014-05-18 02:30:00 -04:00
2014-05-18 00:24:07 -04:00
START_TEST(test_insert_route)
{
int var1 = 22;
int var2 = 33;
route *r1 = r3_route_create("/blog/post");
route *r2 = r3_route_create("/blog/post");
2014-05-18 00:24:07 -04:00
r1->request_method = METHOD_GET;
r2->request_method = METHOD_POST;
2014-05-17 07:25:25 -04:00
2014-05-18 00:24:07 -04:00
match_entry * entry = match_entry_create("/blog/post");
2014-05-18 01:04:17 -04:00
entry->request_method = METHOD_GET;
2014-05-17 07:25:25 -04:00
2014-05-18 00:24:07 -04:00
node * n = r3_tree_create(2);
r3_tree_insert_route(n, r1, &var1);
r3_tree_insert_route(n, r2, &var2);
2014-05-17 07:25:25 -04:00
2014-05-18 22:34:48 -04:00
route *c = r3_tree_match_route(n, entry);
2014-05-18 00:56:53 -04:00
fail_if(c == NULL);
2014-05-18 00:24:07 -04:00
match_entry_free(entry);
r3_route_free(r1);
r3_route_free(r2);
2014-05-17 07:25:25 -04:00
}
END_TEST
2014-05-18 00:24:07 -04:00
2014-05-22 05:07:02 -04:00
START_TEST(test_feedback)
{
node * t = r3_tree_create(1);
r3_tree_insert_path(t, "/foo/bar/baz", NULL);
r3_tree_insert_path(t, "/foo/grault/bar", NULL);
r3_tree_insert_path(t, "/garply/corge/grault", NULL);
r3_tree_compile(t);
2014-05-22 05:22:54 -04:00
node * m1 = r3_tree_match(t, "/foo/grault/bar", NULL);
node * m2 = r3_tree_match(t, "/garply/corge/grault", NULL);
ck_assert(m1 != NULL);
ck_assert(m2 != NULL);
2014-05-22 05:07:02 -04:00
2014-05-22 05:22:54 -04:00
for ( int i = 0 ; i < 120 ; i++ ) {
r3_tree_feedback(t, m1);
}
for ( int i = 0 ; i < 200 ; i++ ) {
r3_tree_feedback(t, m2);
}
r3_tree_dump(t, 0);
2014-05-22 05:07:02 -04:00
r3_tree_free(t);
}
END_TEST
2014-05-17 07:25:25 -04:00
2014-05-14 22:08:42 -04:00
Suite* r3_suite (void) {
2014-05-23 22:30:35 -04:00
Suite *suite = suite_create("route tests");
2014-05-14 22:08:42 -04:00
TCase *tcase = tcase_create("testcase");
2014-05-22 10:06:11 -04:00
tcase_set_timeout(tcase, 30);
2014-05-20 04:18:17 -04:00
tcase_add_test(tcase, test_r3_node_construct_and_free);
2014-05-16 06:03:52 -04:00
tcase_add_test(tcase, test_str_array);
2014-05-15 00:53:48 -04:00
tcase_add_test(tcase, test_ltrim_slash);
2014-05-16 06:57:36 -04:00
tcase_add_test(tcase, test_r3_node_find_edge);
2014-05-20 12:47:09 -04:00
tcase_add_test(tcase, testr3_tree_insert_pathl);
2014-05-16 02:05:51 -04:00
tcase_add_test(tcase, test_compile);
tcase_add_test(tcase, test_route_cmp);
2014-05-18 01:04:17 -04:00
tcase_add_test(tcase, test_insert_route);
2014-05-18 02:30:00 -04:00
tcase_add_test(tcase, test_pcre_pattern_simple);
tcase_add_test(tcase, test_pcre_pattern_more);
tcase_add_test(tcase, test_pcre_patterns_insert);
tcase_add_test(tcase, test_pcre_patterns_insert_2);
2014-05-20 12:49:08 -04:00
tcase_add_test(tcase, test_pcre_patterns_insert_3);
2014-05-22 05:22:54 -04:00
tcase_add_test(tcase, test_feedback);
2014-05-22 09:18:17 -04:00
tcase_set_timeout(tcase, 30);
2014-05-16 06:03:52 -04:00
2014-05-14 12:15:19 -04:00
suite_add_tcase(suite, tcase);
2014-05-14 22:08:42 -04:00
2014-05-14 12:15:19 -04:00
return suite;
}
int main (int argc, char *argv[]) {
int number_failed;
2014-05-14 22:08:42 -04:00
Suite *suite = r3_suite();
2014-05-14 12:15:19 -04:00
SRunner *runner = srunner_create(suite);
2014-05-23 22:39:07 -04:00
srunner_run_all(runner, CK_VERBOSE);
2014-05-14 12:15:19 -04:00
number_failed = srunner_ntests_failed(runner);
srunner_free(runner);
return number_failed;
}