Code

parser_test: Test further error cases and error propagation in the analyzer.
[sysdb.git] / t / unit / frontend / parser_test.c
index 48a1a97856b0304e159d2c26bddbb5ad340f18c2..3f426cecde0a5d9d874446da80d03be2c5169f75 100644 (file)
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#if HAVE_CONFIG_H
+#      include "config.h"
+#endif
+
 #include "frontend/connection.h"
 #include "frontend/parser.h"
 #include "core/store-private.h"
 #include "core/object.h"
-#include "libsysdb_test.h"
+#include "testutils.h"
 
 #include <check.h>
 #include <limits.h>
@@ -248,6 +252,67 @@ struct {
        { "LOOKUP hosts MATCHING "
          "backend = ['a','b']", -1,  1, SDB_CONNECTION_LOOKUP },
 
+       /* array iteration */
+       { "LOOKUP hosts MATCHING "
+         "'foo' IN backend",   -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING 'foo' "
+         "NOT IN backend",   -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "['foo','bar'] "
+         "IN backend ",        -1,   1, SDB_CONNECTION_LOOKUP },
+       /* attribute type is unknown */
+       { "LOOKUP hosts MATCHING "
+         "attribute['backend'] "
+         "IN backend ",        -1,   1, SDB_CONNECTION_LOOKUP },
+       /* type mismatch */
+       { "LOOKUP hosts MATCHING "
+         "1 IN backend ",      -1,  -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "1 NOT IN backend ",  -1,  -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "ANY backend < 'b'",  -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ANY backend <= 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ANY backend = 'b'",  -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ANY backend != 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ANY backend >= 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ANY backend > 'b'",  -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ANY backend =~ 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ANY backend !~ 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       /* right operand is an array */
+       { "LOOKUP hosts MATCHING "
+         "ANY backend !~ backend",
+                               -1,  -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "ALL backend < 'b'",  -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ALL backend <= 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ALL backend = 'b'",  -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ALL backend != 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ALL backend >= 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ALL backend > 'b'",  -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ALL backend =~ 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       { "LOOKUP hosts MATCHING "
+         "ALL backend !~ 'b'", -1,   1, SDB_CONNECTION_LOOKUP },
+       /* attribute type is unknown */
+       { "LOOKUP hosts MATCHING "
+         "ANY backend = attribute['backend']",
+                               -1,   1, SDB_CONNECTION_LOOKUP },
+       /* type mismatch */
+       { "LOOKUP hosts MATCHING "
+         "ANY backend = 1",    -1,  -1, 0 },
+
        /* valid operand types */
        { "LOOKUP hosts MATCHING "
          "age * 1 > 0s",        -1,  1, SDB_CONNECTION_LOOKUP },
@@ -309,6 +374,8 @@ struct {
        /* type mismatches */
        { "LOOKUP hosts MATCHING "
          "age > 0",             -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "NOT age > 0",         -1, -1, 0 },
        { "LOOKUP hosts MATCHING "
          "age >= 0",            -1, -1, 0 },
        { "LOOKUP hosts MATCHING "
@@ -336,6 +403,56 @@ struct {
          "name / 1 = ''",       -1, -1, 0 },
        { "LOOKUP hosts MATCHING "
          "name % 1 = ''",       -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "(name % 1) + 1 = ''", -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "1 + (name % 1) = ''", -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "'' = 1 + (name % 1)", -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "age > 0 AND "
+         "age = 0s",            -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "age = 0s AND "
+         "age > 0",             -1, -1, 0 },
+       { "LOOKUP services MATCHING "
+         "host.name > 0",       -1, -1, 0 },
+       { "LOOKUP services MATCHING "
+         "backend > 'b'",       -1, -1, 0 },
+       { "LOOKUP services MATCHING "
+         "'b' > backend",       -1, -1, 0 },
+       { "LOOKUP services MATCHING "
+         "attribute['a'] > backend",
+                                -1, -1, 0 },
+       { "LOOKUP services MATCHING "
+         "backend > attribute['a']",
+                                -1, -1, 0 },
+       { "LOOKUP services MATCHING "
+         "host.name + 1 = ''",  -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "'a' + 1 IN 'b'",      -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "'a' IN 'b' - 1",      -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "name + 1 IN 'b'",     -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "'a' IN name - 1",     -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "'b' IN 'abc'",        -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "1 IN age",            -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "name =~ 'a' + 1",     -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "name =~ name + 1",    -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "name + 1 =~ 'a'",     -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "name =~ 1",           -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "name + 1 IS NULL",    -1, -1, 0 },
+       { "LOOKUP hosts FILTER "
+         "name + 1 IS NULL",    -1, -1, 0 },
 
        /* comments */
        { "/* some comment */",  -1,  0, 0 },
@@ -384,6 +501,8 @@ struct {
          "'f' || oo",           -1, -1, 0 },
        { "LOOKUP hosts MATCHING "
          "ANY host = 'host'",   -1, -1, 0 },
+       { "LOOKUP hosts MATCHING "
+         "ANY service > 1",     -1, -1, 0 },
        { "LOOKUP hosts MATCHING "
          "service.name = 's'",  -1, -1, 0 },
        { "LOOKUP services MATCHING "
@@ -634,6 +753,9 @@ struct {
        { "interval >= 20s",              -1,  MATCHER_GE },
        { "interval > 20s",               -1,  MATCHER_GT },
        { "'be' IN backend",              -1,  MATCHER_IN },
+       { "'be' NOT IN backend",          -1,  MATCHER_NIN },
+       { "['a','b'] IN backend",         -1,  MATCHER_IN },
+       { "['a','b'] NOT IN backend",     -1,  MATCHER_NIN },
 
        /* check operator precedence */
        { "name = 'name' OR "
@@ -787,20 +909,15 @@ START_TEST(test_parse_expr)
 }
 END_TEST
 
-Suite *
-fe_parser_suite(void)
+TEST_MAIN("frontend::parser")
 {
-       Suite *s = suite_create("frontend::parser");
-       TCase *tc;
-
-       tc = tcase_create("core");
+       TCase *tc = tcase_create("core");
        TC_ADD_LOOP_TEST(tc, parse);
        TC_ADD_LOOP_TEST(tc, parse_matcher);
        TC_ADD_LOOP_TEST(tc, parse_expr);
-       suite_add_tcase(s, tc);
-
-       return s;
-} /* util_parser_suite */
+       ADD_TCASE(tc);
+}
+TEST_MAIN_END
 
 /* vim: set tw=78 sw=4 ts=4 noexpandtab : */