X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=t%2Ffrontend%2Fparser_test.c;h=8a2b2d50a8a5151809b99464d4f5551da44ffb0e;hb=f613ee778d8f94ba91b81f049c41eb13306664d6;hp=bebe15efeabaeb1c413db3f2c136f4767f4ff727;hpb=4215d1d8c69367c1d43bed9d39d428a92b329a92;p=sysdb.git diff --git a/t/frontend/parser_test.c b/t/frontend/parser_test.c index bebe15e..8a2b2d5 100644 --- a/t/frontend/parser_test.c +++ b/t/frontend/parser_test.c @@ -26,6 +26,8 @@ */ #include "frontend/connection.h" +#include "frontend/parser.h" +#include "core/object.h" #include "libsysdb_test.h" #include @@ -38,41 +40,109 @@ START_TEST(test_parse) { struct { const char *query; + int len; int expected; + sdb_conn_state_t expected_cmd; } golden_data[] = { /* empty commands */ - { NULL, -1 }, - { "", 0 }, - { ";", 0 }, - { ";;", 0 }, + { NULL, -1, -1, 0 }, + { "", -1, 0, 0 }, + { ";", -1, 0, 0 }, + { ";;", -1, 0, 0 }, /* valid commands */ - { "LIST", 0 }, - { "LIST;", 0 }, + { "FETCH 'host'", -1, 1, CONNECTION_FETCH }, + { "LIST", -1, 1, CONNECTION_LIST }, + { "LIST -- comment", -1, 1, CONNECTION_LIST }, + { "LIST;", -1, 1, CONNECTION_LIST }, + { "LIST; INVALID", 5, 1, CONNECTION_LIST }, /* comments */ - { "/* some comment */", 0 }, - { "-- another comment", 0 }, + { "/* some comment */", -1, 0, 0 }, + { "-- another comment", -1, 0, 0 }, /* syntax errors */ - { "INVALID", -1 }, - { "/* some incomplete", -1 }, + { "INVALID", -1, -1, 0 }, + { "FETCH host", -1, -1, 0 }, + { "LIST; INVALID", 8, -1, 0 }, + { "/* some incomplete", -1, -1, 0 }, }; size_t i; - int check; + sdb_llist_t *check; for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + sdb_object_t *obj; _Bool ok; - check = sdb_fe_parse(golden_data[i].query); + check = sdb_fe_parse(golden_data[i].query, golden_data[i].len); if (golden_data[i].expected < 0) - ok = check < 0; + ok = check == 0; else - ok = check == golden_data[i].expected; + ok = sdb_llist_len(check) == (size_t)golden_data[i].expected; + + fail_unless(ok, "sdb_fe_parse(%s) = %p (len: %zu); expected: %d", + golden_data[i].query, check, sdb_llist_len(check), + golden_data[i].expected); + + if (! check) + continue; + + if ((! golden_data[i].expected_cmd) + || (golden_data[i].expected <= 0)) { + sdb_llist_destroy(check); + continue; + } + + obj = sdb_llist_get(check, 0); + fail_unless(SDB_CONN_NODE(obj)->cmd == golden_data[i].expected_cmd, + "sdb_fe_parse(%s)->cmd = %i; expected: %d", + golden_data[i].query, SDB_CONN_NODE(obj)->cmd, + golden_data[i].expected_cmd); + sdb_object_deref(obj); + sdb_llist_destroy(check); + } +} +END_TEST + +START_TEST(test_parse_matcher) +{ + struct { + const char *expr; + int len; + int expected; + } golden_data[] = { + /* empty expressions */ + { NULL, -1, -1 }, + { "", -1, -1 }, + + /* valid expressions */ + { "'localhost'", -1, 0 }, + { "'localhost' -- foo", -1, 0 }, + { "'host' ", 6, 0 }, + + /* syntax errors */ + { "LIST", -1, -1 }, + { "foo &^ bar", -1, -1 }, + }; + + size_t i; + sdb_store_matcher_t *m; + + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + _Bool ok; + + m = sdb_fe_parse_matcher(golden_data[i].expr, golden_data[i].len); + if (golden_data[i].expected < 0) + ok = m == NULL; + else + ok = m != NULL; + + fail_unless(ok, "sdb_fe_parse_matcher(%s) = %p; expected: %s", + golden_data[i].expr, m, (golden_data[i].expected < 0) + ? "NULL" : ""); - fail_unless(ok, "sdb_fe_parse(%s) = %d; expected: %d", - golden_data[i].query, check, golden_data[i].expected); + sdb_object_deref(SDB_OBJ(m)); } } END_TEST @@ -85,6 +155,7 @@ fe_parser_suite(void) tc = tcase_create("core"); tcase_add_test(tc, test_parse); + tcase_add_test(tc, test_parse_matcher); suite_add_tcase(s, tc); return s;