Code

frontend/grammar: Changed '<obj> <cmp> <expr>' to 'ANY <obj> <cmp> <expr>'.
[sysdb.git] / t / unit / frontend / parser_test.c
index 8898e8b082852b5212fe307e76ece7a538dc251b..fd9e32fa3ee19ee7e99edf7b1e0dc3fc49be1538 100644 (file)
@@ -65,10 +65,10 @@ START_TEST(test_parse)
                  "host = 'host'",       -1,  1, CONNECTION_LIST   },
                { "LIST services",       -1,  1, CONNECTION_LIST   },
                { "LIST services FILTER "
-                 "service = 'svc'",     -1,  1, CONNECTION_LIST   },
+                 "ANY service = 'svc'", -1,  1, CONNECTION_LIST   },
                { "LIST metrics",        -1,  1, CONNECTION_LIST   },
                { "LIST metrics FILTER "
-                 "metric = 'metric'",   -1,  1, CONNECTION_LIST   },
+                 "ANY metric = 'm'",    -1,  1, CONNECTION_LIST   },
 
                { "LOOKUP hosts",        -1,  1, CONNECTION_LOOKUP },
                { "LOOKUP hosts MATCHING "
@@ -77,18 +77,18 @@ START_TEST(test_parse)
                  "host = 'host'",       -1,  1, CONNECTION_LOOKUP },
                { "LOOKUP hosts MATCHING "
                  "host =~ 'p' AND "
-                 "service =~ 'p'",      -1,  1, CONNECTION_LOOKUP },
+                 "ANY service =~ 'p'",  -1,  1, CONNECTION_LOOKUP },
                { "LOOKUP hosts MATCHING NOT "
                  "host =~ 'p' AND "
-                 "service =~ 'p'",      -1,  1, CONNECTION_LOOKUP },
+                 "ANY service =~ 'p'",  -1,  1, CONNECTION_LOOKUP },
                { "LOOKUP hosts MATCHING "
                  "host =~ 'p' AND "
-                 "service =~ 'p' OR "
-                 "service =~ 'r'",      -1,  1, CONNECTION_LOOKUP },
+                 "ANY service =~ 'p' OR "
+                 "ANY service =~ 'r'",  -1,  1, CONNECTION_LOOKUP },
                { "LOOKUP hosts MATCHING NOT "
                  "host =~ 'p' AND "
-                 "service =~ 'p' OR "
-                 "service =~ 'r'",      -1,  1, CONNECTION_LOOKUP },
+                 "ANY service =~ 'p' OR "
+                 "ANY service =~ 'r'",  -1,  1, CONNECTION_LOOKUP },
                { "LOOKUP hosts MATCHING "
                  "host =~ 'p' "
                  "FILTER .age > 1D",    -1,  1, CONNECTION_LOOKUP },
@@ -189,7 +189,7 @@ START_TEST(test_parse)
                { "LOOKUP hosts MATCHING "
                  "host IS NULL",        -1, -1, 0 },
                { "LOOKUP hosts MATCHING "
-                 "service IS NULL",     -1, -1, 0 },
+                 "ANY service IS NULL", -1, -1, 0 },
 
                /* invalid numeric constants */
                { "LOOKUP hosts MATCHING "
@@ -213,6 +213,10 @@ START_TEST(test_parse)
                { "LOOKUP hosts MATCHING "
                  "attribute['foo'] = "
                  "1.23 + 'foo'",        -1, -1, 0 },
+               { "LOOKUP hosts MATCHING "
+                 "attr['foo'] = 1.23",  -1, -1, 0 },
+               { "LOOKUP hosts MATCHING "
+                 "attr['foo'] IS NULL", -1, -1, 0 },
 
                /* comments */
                { "/* some comment */",  -1,  0, 0 },
@@ -301,28 +305,52 @@ START_TEST(test_parse_matcher)
                { NULL,                           -1, -1 },
                { "",                             -1, -1 },
 
-               /* valid expressions */
-               { "host = 'localhost'",           -1,  MATCHER_NAME },
-               { "host != 'localhost'",          -1,  MATCHER_NOT },
-               { "host =~ 'host'",               -1,  MATCHER_NAME },
-               { "host !~ 'host'",               -1,  MATCHER_NOT },
-               { "host = 'localhost' -- foo",    -1,  MATCHER_NAME },
-               { "host = 'host' <garbage>",      13,  MATCHER_NAME },
+               /* match hosts by name */
+               { "host < 'localhost'",           -1,  MATCHER_LT },
+               { "host <= 'localhost'",          -1,  MATCHER_LE },
+               { "host = 'localhost'",           -1,  MATCHER_EQ },
+               { "host != 'localhost'",          -1,  MATCHER_NE },
+               { "host >= 'localhost'",          -1,  MATCHER_GE },
+               { "host > 'localhost'",           -1,  MATCHER_GT },
+               { "host =~ 'host'",               -1,  MATCHER_REGEX },
+               { "host !~ 'host'",               -1,  MATCHER_NREGEX },
+               { "host = 'localhost' -- foo",    -1,  MATCHER_EQ },
+               { "host = 'host' <garbage>",      13,  MATCHER_EQ },
+               { "host &^ 'localhost'",          -1,  -1 },
                /* match hosts by service */
-               { "service = 'name'",             -1,  MATCHER_NAME },
-               { "service != 'name'",            -1,  MATCHER_NOT },
-               { "service =~ 'pattern'",         -1,  MATCHER_NAME },
-               { "service !~ 'pattern'",         -1,  MATCHER_NOT },
+               { "ANY service < 'name'",         -1,  MATCHER_ANY },
+               { "ANY service <= 'name'",        -1,  MATCHER_ANY },
+               { "ANY service = 'name'",         -1,  MATCHER_ANY },
+               { "ANY service != 'name'",        -1,  MATCHER_ANY },
+               { "ANY service >= 'name'",        -1,  MATCHER_ANY },
+               { "ANY service > 'name'",         -1,  MATCHER_ANY },
+               { "ANY service =~ 'pattern'",     -1,  MATCHER_ANY },
+               { "ANY service !~ 'pattern'",     -1,  MATCHER_ANY },
+               { "ANY service &^ 'name'",        -1,  -1 },
+               /* match hosts by metric */
+               { "ANY metric < 'name'",          -1,  MATCHER_ANY },
+               { "ANY metric <= 'name'",         -1,  MATCHER_ANY },
+               { "ANY metric = 'name'",          -1,  MATCHER_ANY },
+               { "ANY metric != 'name'",         -1,  MATCHER_ANY },
+               { "ANY metric >= 'name'",         -1,  MATCHER_ANY },
+               { "ANY metric > 'name'",          -1,  MATCHER_ANY },
+               { "ANY metric =~ 'pattern'",      -1,  MATCHER_ANY },
+               { "ANY metric !~ 'pattern'",      -1,  MATCHER_ANY },
                /* match hosts by attribute */
-               { "attribute = 'name'",           -1,  MATCHER_NAME },
-               { "attribute != 'name'",          -1,  MATCHER_NOT },
-               { "attribute =~ 'pattern'",       -1,  MATCHER_NAME },
-               { "attribute !~ 'pattern'",       -1,  MATCHER_NOT },
+               { "ANY attribute < 'name'",       -1,  MATCHER_ANY },
+               { "ANY attribute <= 'name'",      -1,  MATCHER_ANY },
+               { "ANY attribute = 'name'",       -1,  MATCHER_ANY },
+               { "ANY attribute != 'name'",      -1,  MATCHER_ANY },
+               { "ANY attribute >= 'name'",      -1,  MATCHER_ANY },
+               { "ANY attribute > 'name'",       -1,  MATCHER_ANY },
+               { "ANY attribute =~ 'pattern'",   -1,  MATCHER_ANY },
+               { "ANY attribute !~ 'pattern'",   -1,  MATCHER_ANY },
+               { "ANY attribute &^ 'pattern'",   -1,  -1 },
                /* composite expressions */
                { "host =~ 'pattern' AND "
-                 "service =~ 'pattern'",         -1,  MATCHER_AND },
+                 "ANY service =~ 'pattern'",     -1,  MATCHER_AND },
                { "host =~ 'pattern' OR "
-                 "service =~ 'pattern'",         -1,  MATCHER_OR },
+                 "ANY service =~ 'pattern'",     -1,  MATCHER_OR },
                { "NOT host = 'host'",            -1,  MATCHER_NOT },
                /* numeric expressions */
                { "attribute['foo'] < 123",       -1,  MATCHER_LT },
@@ -351,38 +379,60 @@ START_TEST(test_parse_matcher)
                { "attribute['foo'] IS NOT NULL", -1,  MATCHER_ISNNULL },
 
                /* object field matchers */
-               { ".last_update < 10s",           -1,  MATCHER_LT },
-               { ".AGE <= 1m",                   -1,  MATCHER_LE },
-               { ".interval = 10h",              -1,  MATCHER_EQ },
+               { ".name < 'a'",                  -1,  MATCHER_LT },
+               { ".name <= 'a'",                 -1,  MATCHER_LE },
+               { ".name = 'a'",                  -1,  MATCHER_EQ },
+               { ".name != 'a'",                 -1,  MATCHER_NE },
+               { ".name >= 'a'",                 -1,  MATCHER_GE },
+               { ".name > 'a'",                  -1,  MATCHER_GT },
+               { ".last_update < 2014-10-01",    -1,  MATCHER_LT },
+               { ".last_update <= 2014-10-01",   -1,  MATCHER_LE },
+               { ".last_update = 2014-10-01",    -1,  MATCHER_EQ },
+               { ".last_update != 2014-10-01",   -1,  MATCHER_NE },
+               { ".last_update >= 2014-10-01",   -1,  MATCHER_GE },
+               { ".last_update > 2014-10-01",    -1,  MATCHER_GT },
                { ".Last_Update >= 24D",          -1,  MATCHER_GE },
+               { ".age < 20s",                   -1,  MATCHER_LT },
+               { ".age <= 20s",                  -1,  MATCHER_LE },
+               { ".age = 20s",                   -1,  MATCHER_EQ },
+               { ".age != 20s",                  -1,  MATCHER_NE },
+               { ".age >= 20s",                  -1,  MATCHER_GE },
+               { ".age > 20s",                   -1,  MATCHER_GT },
+               { ".AGE <= 1m",                   -1,  MATCHER_LE },
                { ".age > 1M",                    -1,  MATCHER_GT },
-               { ".age != 20Y",                  -1,  MATCHER_NOT },
-               { ".backend != 'be'",             -1,  MATCHER_NOT },
+               { ".age != 20Y",                  -1,  MATCHER_NE },
                { ".age <= 2 * .interval",        -1,  MATCHER_LE },
+               { ".interval < 20s",              -1,  MATCHER_LT },
+               { ".interval <= 20s",             -1,  MATCHER_LE },
+               { ".interval = 20s",              -1,  MATCHER_EQ },
+               { ".interval != 20s",             -1,  MATCHER_NE },
+               { ".interval >= 20s",             -1,  MATCHER_GE },
+               { ".interval > 20s",              -1,  MATCHER_GT },
+               { "'be' IN .backend",             -1,  MATCHER_IN },
 
                /* check operator precedence */
                { "host = 'name' OR "
-                 "service = 'name' AND "
-                 "attribute = 'name' OR "
+                 "ANY service = 'name' AND "
+                 "ANY attribute = 'name' OR "
                  "attribute['foo'] = 'bar'",     -1,  MATCHER_OR },
                { "host = 'name' AND "
-                 "service = 'name' AND "
-                 "attribute = 'name' OR "
+                 "ANY service = 'name' AND "
+                 "ANY attribute = 'name' OR "
                  "attribute['foo'] = 'bar'",     -1,  MATCHER_OR },
                { "host = 'name' AND "
-                 "service = 'name' OR "
-                 "attribute = 'name' AND "
+                 "ANY service = 'name' OR "
+                 "ANY attribute = 'name' AND "
                  "attribute['foo'] = 'bar'",     -1,  MATCHER_OR },
                { "(host = 'name' OR "
-                 "service = 'name') AND "
-                 "(attribute = 'name' OR "
+                 "ANY service = 'name') AND "
+                 "(ANY attribute = 'name' OR "
                  "attribute['foo'] = 'bar')",    -1,  MATCHER_AND },
                { "NOT host = 'name' OR "
-                 "service = 'name'",             -1,  MATCHER_OR },
+                 "ANY service = 'name'",         -1,  MATCHER_OR },
                { "NOT host = 'name' OR "
-                 "NOT service = 'name'",         -1,  MATCHER_OR },
+                 "NOT ANY service = 'name'",     -1,  MATCHER_OR },
                { "NOT (host = 'name' OR "
-                 "NOT service = 'name')",        -1,  MATCHER_NOT },
+                 "NOT ANY service = 'name')",    -1,  MATCHER_NOT },
 
                /* syntax errors */
                { "LIST",                         -1, -1 },