Code

frontend/parser: Let ‘LIST’ and ‘FETCH’ accept optional filters as well.
[sysdb.git] / t / unit / frontend / parser_test.c
index 59de563f760c74e291ec47998081b03344c442c4..bca86452dffc44afe22f2fb5b3418eaa7e6f42f3 100644 (file)
@@ -53,11 +53,17 @@ START_TEST(test_parse)
 
                /* valid commands */
                { "FETCH 'host'",        -1,  1, CONNECTION_FETCH  },
+               { "FETCH 'host' FILTER "
+                 "host = '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   },
+               { "LIST FILTER "
+                 "host = 'host'",       -1,  1, CONNECTION_LIST   },
 
+               { "LOOKUP hosts",        -1,  1, CONNECTION_LOOKUP },
                { "LOOKUP hosts MATCHING "
                  "host = 'host'",       -1,  1, CONNECTION_LOOKUP },
                { "LOOKUP hosts MATCHING NOT "
@@ -76,6 +82,20 @@ START_TEST(test_parse)
                  "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 },
+               { "LOOKUP hosts MATCHING "
+                 "host =~ 'p' "
+                 "FILTER :age>"
+                 ":interval",           -1,  1, CONNECTION_LOOKUP },
 
                /* numeric constants */
                { "LOOKUP hosts MATCHING "
@@ -106,6 +126,22 @@ START_TEST(test_parse)
                  "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 MATCHING "
                  "attribute.foo "
@@ -154,9 +190,19 @@ START_TEST(test_parse)
                { "LIST; INVALID",        8, -1, 0 },
                { "/* some incomplete",  -1, -1, 0 },
 
-               { "LOOKUP hosts",        -1, -1, 0 },
+               { "LIST MATCHING "
+                 "host = 'host'",       -1, -1, 0 },
+               { "FETCH 'host' MATCHING "
+                 "host = 'host'",       -1, -1, 0 },
+
+               { "LOOKUP foo",          -1, -1, 0 },
                { "LOOKUP foo MATCHING "
                  "host = 'host'",       -1, -1, 0 },
+               { "LOOKUP foo FILTER "
+                 "host = 'host'",       -1, -1, 0 },
+               { "LOOKUP foo MATCHING "
+                 "host = 'host' FILTER "
+                 "host = 'host'",       -1, -1, 0 },
        };
 
        size_t i;
@@ -241,6 +287,16 @@ 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 },
+               { ":age <= 2 * :interval",     -1,  MATCHER_LE },
+
                /* check operator precedence */
                { "host = 'name' OR "
                  "service = 'name' AND "