X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=t%2Funit%2Ffrontend%2Fparser_test.c;h=a10185469f2397accd253425025dbf9fe097c62c;hp=f1e656982cbb21de211fd850b64e456da68ee84f;hb=3f0db5bd32f136de9e7cfa8250f0c20469261241;hpb=33d51d5f84495bc8d7805c2370af45948e46c30b diff --git a/t/unit/frontend/parser_test.c b/t/unit/frontend/parser_test.c index f1e6569..a101854 100644 --- a/t/unit/frontend/parser_test.c +++ b/t/unit/frontend/parser_test.c @@ -58,87 +58,118 @@ START_TEST(test_parse) { "LIST;", -1, 1, CONNECTION_LIST }, { "LIST; INVALID", 5, 1, CONNECTION_LIST }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "host = 'host'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE NOT " + { "LOOKUP hosts MATCHING NOT " "host = 'host'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "host =~ 'p' AND " "service =~ 'p'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE NOT " + { "LOOKUP hosts MATCHING NOT " "host =~ 'p' AND " "service =~ 'p'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "host =~ 'p' AND " "service =~ 'p' OR " "service =~ 'r'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE NOT " + { "LOOKUP hosts MATCHING NOT " "host =~ 'p' AND " "service =~ 'p' OR " "service =~ 'r'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "host =~ 'p' " + "FILTER :age > 1D", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "host =~ 'p' " + "FILTER :age > 1D AND " + ":interval < 240s" , -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "host =~ 'p' " + "FILTER NOT :age>1D", -1, 1, CONNECTION_LOOKUP }, /* numeric constants */ - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "1234", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo != " "+234", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo < " "-234", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo > " "12.4", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo <= " - "12.", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + "12. + .3", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " "attribute.foo >= " ".4", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "+12e3", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "+12e-3", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "-12e+3", -1, 1, CONNECTION_LOOKUP }, + /* date, time, interval constants */ + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "1 Y 42D", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "1s 42D", -1, 1, CONNECTION_LOOKUP }, + /* + * TODO: Something like 1Y42D should work as well but it doesn't since + * the scanner will tokenize it into {digit}{identifier} :-/ + * + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "1Y42D", -1, 1, CONNECTION_LOOKUP }, + */ + /* NULL */ - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo " "IS NULL", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo " "IS NOT NULL", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "NOT attribute.foo " "IS NULL", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "host IS NULL", -1, -1, 0 }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "service IS NULL", -1, -1, 0 }, /* invalid numeric constants */ - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "+-12e+3", -1, -1, 0 }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "-12e-+3", -1, -1, 0 }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "e+3", -1, -1, 0 }, - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "3e", -1, -1, 0 }, /* following SQL standard, we don't support hex numbers */ - { "LOOKUP hosts WHERE " + { "LOOKUP hosts MATCHING " "attribute.foo = " "0x12", -1, -1, 0 }, + /* invalid expressions */ + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "1.23 + 'foo'", -1, -1, 0 }, + /* comments */ { "/* some comment */", -1, 0, 0 }, { "-- another comment", -1, 0, 0 }, @@ -150,7 +181,7 @@ START_TEST(test_parse) { "/* some incomplete", -1, -1, 0 }, { "LOOKUP hosts", -1, -1, 0 }, - { "LOOKUP foo WHERE " + { "LOOKUP foo MATCHING " "host = 'host'", -1, -1, 0 }, }; @@ -236,6 +267,15 @@ START_TEST(test_parse_matcher) { "attribute.foo IS NULL", -1, MATCHER_ISNULL }, { "attribute.foo IS NOT NULL", -1, MATCHER_NOT }, + /* object field matchers */ + { ":last_update < 10s", -1, MATCHER_LT }, + { ":AGE <= 1m", -1, MATCHER_LE }, + { ":interval = 10h", -1, MATCHER_EQ }, + { ":Last_Update >= 24D", -1, MATCHER_GE }, + { ":age > 1M", -1, MATCHER_GT }, + { ":age != 20Y", -1, MATCHER_NOT }, + { ":backend != 'be'", -1, MATCHER_NOT }, + /* check operator precedence */ { "host = 'name' OR " "service = 'name' AND "