X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=t%2Funit%2Fparser%2Fparser_test.c;h=d3667d1a4b5da8c40e2e0ae804736263e3f64e7c;hp=c3aa09acb866d6083534989f6b94b98168e4b608;hb=f1975b0bdc00eff623288b34961b9de7d83e7ba1;hpb=c8d51914ef24f01f935d2853d57f05d0b0a0af9e diff --git a/t/unit/parser/parser_test.c b/t/unit/parser/parser_test.c index c3aa09a..d3667d1 100644 --- a/t/unit/parser/parser_test.c +++ b/t/unit/parser/parser_test.c @@ -172,8 +172,10 @@ struct { { "TIMESERIES 'host'.'metric' " "START 2014-02-02 " "14:02", -1, 1, SDB_AST_TYPE_TIMESERIES, 0 }, + /* the end time has to be greater than the start time; + * we'll be safe for about 200 years ;-) */ { "TIMESERIES 'host'.'metric' " - "END 2014-02-02", -1, 1, SDB_AST_TYPE_TIMESERIES, 0 }, + "END 2214-02-02", -1, 1, SDB_AST_TYPE_TIMESERIES, 0 }, { "TIMESERIES " "'host'.'metric'", -1, 1, SDB_AST_TYPE_TIMESERIES, 0 }, @@ -407,14 +409,21 @@ struct { * syntactically correct but semantically invalid commands */ -#if 0 /* invalid fields */ + { "LIST hosts FILTER " + "field = 'a'", -1, -1, 0, 0 }, + { "LIST services FILTER " + "field = 'a'", -1, -1, 0, 0 }, + { "LIST metrics FILTER " + "field = 'a'", -1, -1, 0, 0 }, +#if 0 { "LIST hosts FILTER " "value = 'a'", -1, -1, 0, 0 }, { "LIST services FILTER " "value = 'a'", -1, -1, 0, 0 }, { "LIST metrics FILTER " "value = 'a'", -1, -1, 0, 0 }, +#endif /* type mismatches */ { "LOOKUP hosts MATCHING " @@ -447,6 +456,7 @@ struct { "age + 1 > 0s", -1, -1, 0, 0 }, { "LOOKUP hosts MATCHING " "age - 1 > 0s", -1, -1, 0, 0 }, + /* datetime integer is allowed */ { "LOOKUP hosts MATCHING " "age || 1 > 0s", -1, -1, 0, 0 }, @@ -513,6 +523,7 @@ struct { { "LOOKUP hosts MATCHING " "ANY 'patt' =~ 'p'", -1, -1, 0, 0 }, +#if 0 /* invalid LIST commands */ { "LIST", -1, -1, 0, 0 }, { "LIST foo", -1, -1, 0, 0 }, @@ -898,6 +909,11 @@ START_TEST(test_parse_conditional) "expected: %d", parse_conditional_data[_i].expr, SDB_AST_ITER(node)->kind, parse_conditional_data[_i].expected); + fail_unless(node->data_type == -1, + "sdb_parser_parse_conditional(%s) returned conditional of data-type %s; " + "expected: %s", parse_conditional_data[_i].expr, + SDB_TYPE_TO_STRING(node->data_type), SDB_TYPE_TO_STRING(-1)); + sdb_object_deref(SDB_OBJ(node)); sdb_strbuf_destroy(errbuf); } @@ -907,63 +923,64 @@ struct { const char *expr; int len; int expected; + int data_type; } parse_arith_data[] = { /* empty expressions */ - { NULL, -1, -1 }, - { "", -1, -1 }, + { NULL, -1, -1, -1 }, + { "", -1, -1, -1 }, /* constant expressions */ - { "'localhost'", -1, SDB_AST_TYPE_CONST }, - { "123", -1, SDB_AST_TYPE_CONST }, - { "2014-08-16", -1, SDB_AST_TYPE_CONST }, - { "17:23", -1, SDB_AST_TYPE_CONST }, - { "17:23:53", -1, SDB_AST_TYPE_CONST }, - { "17:23:53.123", -1, SDB_AST_TYPE_CONST }, - { "17:23:53.123456789", -1, SDB_AST_TYPE_CONST }, - { "2014-08-16 17:23", -1, SDB_AST_TYPE_CONST }, - { "2014-08-16 17:23:53", -1, SDB_AST_TYPE_CONST }, - { "10s", -1, SDB_AST_TYPE_CONST }, - { "60m", -1, SDB_AST_TYPE_CONST }, - { "10Y 24D 1h", -1, SDB_AST_TYPE_CONST }, + { "'localhost'", -1, SDB_AST_TYPE_CONST, SDB_TYPE_STRING }, + { "123", -1, SDB_AST_TYPE_CONST, SDB_TYPE_INTEGER }, + { "42.3", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DECIMAL }, + { "2014-08-16", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "17:23", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "17:23:53", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "17:23:53.123", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "17:23:53.123456789", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "2014-08-16 17:23", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "2014-08-16 17:23:53", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "10s", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "60m", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, + { "10Y 24D 1h", -1, SDB_AST_TYPE_CONST, SDB_TYPE_DATETIME }, /* TODO: the analyzer and/or optimizer should turn these into constants */ - { "123 + 456", -1, SDB_AST_ADD }, - { "'foo' || 'bar'", -1, SDB_AST_CONCAT }, - { "456 - 123", -1, SDB_AST_SUB }, - { "1.2 * 3.4", -1, SDB_AST_MUL }, - { "1.2 / 3.4", -1, SDB_AST_DIV }, - { "5 % 2", -1, SDB_AST_MOD }, + { "123 + 456", -1, SDB_AST_ADD, SDB_TYPE_INTEGER }, + { "'foo' || 'bar'", -1, SDB_AST_CONCAT, SDB_TYPE_STRING }, + { "456 - 123", -1, SDB_AST_SUB, SDB_TYPE_INTEGER }, + { "1.2 * 3.4", -1, SDB_AST_MUL, SDB_TYPE_DECIMAL }, + { "1.2 / 3.4", -1, SDB_AST_DIV, SDB_TYPE_DECIMAL }, + { "5 % 2", -1, SDB_AST_MOD, SDB_TYPE_INTEGER }, /* queryable fields */ - { "last_update", -1, SDB_AST_TYPE_VALUE }, - { "AGE", -1, SDB_AST_TYPE_VALUE }, - { "interval", -1, SDB_AST_TYPE_VALUE }, - { "Last_Update", -1, SDB_AST_TYPE_VALUE }, - { "backend", -1, SDB_AST_TYPE_VALUE }, + { "last_update", -1, SDB_AST_TYPE_VALUE, SDB_TYPE_DATETIME }, + { "AGE", -1, SDB_AST_TYPE_VALUE, SDB_TYPE_DATETIME }, + { "interval", -1, SDB_AST_TYPE_VALUE, SDB_TYPE_DATETIME }, + { "Last_Update", -1, SDB_AST_TYPE_VALUE, SDB_TYPE_DATETIME }, + { "backend", -1, SDB_AST_TYPE_VALUE, SDB_TYPE_ARRAY | SDB_TYPE_STRING }, /* attributes */ - { "attribute['foo']", -1, SDB_AST_TYPE_VALUE }, + { "attribute['foo']", -1, SDB_AST_TYPE_VALUE, -1 }, /* arithmetic expressions */ - { "age + age", -1, SDB_AST_ADD }, - { "age - age", -1, SDB_AST_SUB }, - { "age * age", -1, SDB_AST_MUL }, - { "age / age", -1, SDB_AST_DIV }, - { "age \% age", -1, SDB_AST_MOD }, - { "age || age", -1, SDB_AST_CONCAT }, + { "age + age", -1, SDB_AST_ADD, SDB_TYPE_DATETIME }, + { "age - age", -1, SDB_AST_SUB, SDB_TYPE_DATETIME }, + { "age * age", -1, SDB_AST_MUL, SDB_TYPE_DATETIME }, + { "age / age", -1, SDB_AST_DIV, SDB_TYPE_DATETIME }, + { "age \% age", -1, SDB_AST_MOD, SDB_TYPE_DATETIME }, /* operator precedence */ - { "age + age * age", -1, SDB_AST_ADD }, - { "age * age + age", -1, SDB_AST_ADD }, - { "age + age - age", -1, SDB_AST_SUB }, - { "age - age + age", -1, SDB_AST_ADD }, - { "(age + age) * age", -1, SDB_AST_MUL }, - { "age + (age * age)", -1, SDB_AST_ADD }, + { "age + age * age", -1, SDB_AST_ADD, SDB_TYPE_DATETIME }, + { "age * age + age", -1, SDB_AST_ADD, SDB_TYPE_DATETIME }, + { "age + age - age", -1, SDB_AST_SUB, SDB_TYPE_DATETIME }, + { "age - age + age", -1, SDB_AST_ADD, SDB_TYPE_DATETIME }, + { "(age + age) * age", -1, SDB_AST_MUL, SDB_TYPE_DATETIME }, + { "age + (age * age)", -1, SDB_AST_ADD, SDB_TYPE_DATETIME }, /* syntax errors */ - { "LIST", -1, -1 }, - { "foo &^ bar", -1, -1 }, - { "invalid", -1, -1 }, + { "LIST", -1, -1, -1 }, + { "foo &^ bar", -1, -1, -1 }, + { "invalid", -1, -1, -1 }, }; START_TEST(test_parse_arith) @@ -997,6 +1014,12 @@ START_TEST(test_parse_arith) "expected: %d", parse_arith_data[_i].expr, node->type, parse_arith_data[_i].expected); + fail_unless(node->data_type == parse_arith_data[_i].data_type, + "sdb_parser_parse_arith(%s) returned expression of data-type %s; " + "expected: %s", parse_arith_data[_i].expr, + SDB_TYPE_TO_STRING(node->data_type), + SDB_TYPE_TO_STRING(parse_arith_data[_i].data_type)); + sdb_object_deref(SDB_OBJ(node)); sdb_strbuf_destroy(errbuf); }