Code

parser_test: Fixed a sign-compare warning/error on GCC.
[sysdb.git] / t / frontend / parser_test.c
index bebe15efeabaeb1c413db3f2c136f4767f4ff727..8a2b2d50a8a5151809b99464d4f5551da44ffb0e 100644 (file)
@@ -26,6 +26,8 @@
  */
 
 #include "frontend/connection.h"
+#include "frontend/parser.h"
+#include "core/object.h"
 #include "libsysdb_test.h"
 
 #include <check.h>
@@ -38,41 +40,109 @@ START_TEST(test_parse)
 {
        struct {
                const char *query;
+               int len;
                int expected;
+               sdb_conn_state_t expected_cmd;
        } golden_data[] = {
                /* empty commands */
-               { NULL,                 -1 },
-               { "",                    0 },
-               { ";",                   0 },
-               { ";;",                  0 },
+               { NULL,                 -1, -1, 0 },
+               { "",                   -1,  0, 0 },
+               { ";",                  -1,  0, 0 },
+               { ";;",                 -1,  0, 0 },
 
                /* valid commands */
-               { "LIST",                0 },
-               { "LIST;",               0 },
+               { "FETCH '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  },
 
                /* comments */
-               { "/* some comment */",  0 },
-               { "-- another comment",  0 },
+               { "/* some comment */", -1,  0, 0 },
+               { "-- another comment", -1,  0, 0 },
 
                /* syntax errors */
-               { "INVALID",            -1 },
-               { "/* some incomplete", -1 },
+               { "INVALID",            -1, -1, 0 },
+               { "FETCH host",         -1, -1, 0 },
+               { "LIST; INVALID",       8, -1, 0 },
+               { "/* some incomplete", -1, -1, 0 },
        };
 
        size_t i;
-       int check;
+       sdb_llist_t *check;
 
        for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
+               sdb_object_t *obj;
                _Bool ok;
 
-               check = sdb_fe_parse(golden_data[i].query);
+               check = sdb_fe_parse(golden_data[i].query, golden_data[i].len);
                if (golden_data[i].expected < 0)
-                       ok = check < 0;
+                       ok = check == 0;
                else
-                       ok = check == golden_data[i].expected;
+                       ok = sdb_llist_len(check) == (size_t)golden_data[i].expected;
+
+               fail_unless(ok, "sdb_fe_parse(%s) = %p (len: %zu); expected: %d",
+                               golden_data[i].query, check, sdb_llist_len(check),
+                               golden_data[i].expected);
+
+               if (! check)
+                       continue;
+
+               if ((! golden_data[i].expected_cmd)
+                               || (golden_data[i].expected <= 0)) {
+                       sdb_llist_destroy(check);
+                       continue;
+               }
+
+               obj = sdb_llist_get(check, 0);
+               fail_unless(SDB_CONN_NODE(obj)->cmd == golden_data[i].expected_cmd,
+                               "sdb_fe_parse(%s)->cmd = %i; expected: %d",
+                               golden_data[i].query, SDB_CONN_NODE(obj)->cmd,
+                               golden_data[i].expected_cmd);
+               sdb_object_deref(obj);
+               sdb_llist_destroy(check);
+       }
+}
+END_TEST
+
+START_TEST(test_parse_matcher)
+{
+       struct {
+               const char *expr;
+               int len;
+               int expected;
+       } golden_data[] = {
+               /* empty expressions */
+               { NULL,                 -1, -1 },
+               { "",                   -1, -1 },
+
+               /* valid expressions */
+               { "'localhost'",        -1,  0 },
+               { "'localhost' -- foo", -1,  0 },
+               { "'host' <garbage>",    6,  0 },
+
+               /* syntax errors */
+               { "LIST",               -1, -1 },
+               { "foo &^ bar",         -1, -1 },
+       };
+
+       size_t i;
+       sdb_store_matcher_t *m;
+
+       for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
+               _Bool ok;
+
+               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" : "<matcher>");
 
-               fail_unless(ok, "sdb_fe_parse(%s) = %d; expected: %d",
-                               golden_data[i].query, check, golden_data[i].expected);
+               sdb_object_deref(SDB_OBJ(m));
        }
 }
 END_TEST
@@ -85,6 +155,7 @@ fe_parser_suite(void)
 
        tc = tcase_create("core");
        tcase_add_test(tc, test_parse);
+       tcase_add_test(tc, test_parse_matcher);
        suite_add_tcase(s, tc);
 
        return s;