X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=t%2Ffrontend%2Fparser_test.c;h=f64b9ebca95b05e66bb568a9c6535f72cc7f7462;hb=723ce33d539d7089e4bf675eddf724d7d8df76b9;hp=1a7dc2bb3370de382d49b1b61a66f023bc868c79;hpb=a2c999f4a7c1368c8cdaf554219fb4123068a3f7;p=sysdb.git diff --git a/t/frontend/parser_test.c b/t/frontend/parser_test.c index 1a7dc2b..f64b9eb 100644 --- a/t/frontend/parser_test.c +++ b/t/frontend/parser_test.c @@ -27,6 +27,7 @@ #include "frontend/connection.h" #include "frontend/parser.h" +#include "core/store-private.h" #include "core/object.h" #include "libsysdb_test.h" @@ -59,13 +60,22 @@ START_TEST(test_parse) { "LOOKUP hosts WHERE " "host.name = 'host'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts WHERE NOT " + "host.name = 'host'", -1, 1, CONNECTION_LOOKUP }, { "LOOKUP hosts WHERE " "host.name =~ 'p' AND " "service.name =~ 'p'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts WHERE NOT " + "host.name =~ 'p' AND " + "service.name =~ 'p'", -1, 1, CONNECTION_LOOKUP }, { "LOOKUP hosts WHERE " "host.name =~ 'p' AND " "service.name =~ 'p' OR " "service.name =~ 'r'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts WHERE NOT " + "host.name =~ 'p' AND " + "service.name =~ 'p' OR " + "service.name =~ 'r'", -1, 1, CONNECTION_LOOKUP }, /* comments */ { "/* some comment */", -1, 0, 0 }, @@ -131,13 +141,52 @@ START_TEST(test_parse_matcher) { "", -1, -1 }, /* valid expressions */ - { "host.name = 'localhost'", -1, 0 }, - { "host.name = 'localhost' -- foo", -1, 0 }, - { "host.name = 'host' ", 18, 0 }, + { "host.name = 'localhost'", -1, MATCHER_HOST }, + { "host.name != 'localhost'", -1, MATCHER_NOT }, + { "host.name =~ 'host'", -1, MATCHER_HOST }, + { "host.name !~ 'host'", -1, MATCHER_NOT }, + { "host.name = 'localhost' -- foo", -1, MATCHER_HOST }, + { "host.name = 'host' ", 18, MATCHER_HOST }, + /* match hosts by service */ + { "service.name = 'name'", -1, MATCHER_HOST }, + { "service.name != 'name'", -1, MATCHER_NOT }, + { "service.name =~ 'pattern'", -1, MATCHER_HOST }, + { "service.name !~ 'pattern'", -1, MATCHER_NOT }, + /* match hosts by attribute */ + { "attribute.name = 'name'", -1, MATCHER_HOST }, + { "attribute.name != 'name'", -1, MATCHER_NOT }, + { "attribute.name =~ 'pattern'", -1, MATCHER_HOST }, + { "attribute.name !~ 'pattern'", -1, MATCHER_NOT }, + /* composite expressions */ { "host.name =~ 'pattern' AND " - "service.name =~ 'pattern'", -1, 0 }, + "service.name =~ 'pattern'", -1, MATCHER_AND }, { "host.name =~ 'pattern' OR " - "service.name =~ 'pattern'", -1, 0 }, + "service.name =~ 'pattern'", -1, MATCHER_OR }, + { "NOT host.name = 'host'", -1, MATCHER_NOT }, + + /* check operator precedence */ + { "host.name = 'name' OR " + "service.name = 'name' AND " + "attribute.name = 'name' OR " + "attribute.foo = 'bar'", -1, MATCHER_OR }, + { "host.name = 'name' AND " + "service.name = 'name' AND " + "attribute.name = 'name' OR " + "attribute.foo = 'bar'", -1, MATCHER_OR }, + { "host.name = 'name' AND " + "service.name = 'name' OR " + "attribute.name = 'name' AND " + "attribute.foo = 'bar'", -1, MATCHER_OR }, + { "(host.name = 'name' OR " + "service.name = 'name') AND " + "(attribute.name = 'name' OR " + "attribute.foo = 'bar')", -1, MATCHER_AND }, + { "NOT host.name = 'name' OR " + "service.name = 'name'", -1, MATCHER_OR }, + { "NOT host.name = 'name' OR " + "NOT service.name = 'name'", -1, MATCHER_OR }, + { "NOT (host.name = 'name' OR " + "NOT service.name = 'name')", -1, MATCHER_NOT }, /* syntax errors */ { "LIST", -1, -1 }, @@ -145,20 +194,24 @@ START_TEST(test_parse_matcher) }; size_t i; - sdb_store_matcher_t *m; for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { - _Bool ok; - + sdb_store_matcher_t *m; 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" : ""); + if (golden_data[i].expected < 0) { + fail_unless(m == NULL, + "sdb_fe_parse_matcher(%s) = %p; expected: NULL", + golden_data[i].expr, m); + continue; + } + + fail_unless(m != NULL, "sdb_fe_parse_matcher(%s) = NULL; " + "expected: ", golden_data[i].expr); + fail_unless(M(m)->type == golden_data[i].expected, + "sdb_fe_parse_matcher(%s) returned matcher of type %d; " + "expected: %d", golden_data[i].expr, M(m)->type, + golden_data[i].expected); sdb_object_deref(SDB_OBJ(m)); }