X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=t%2Funit%2Ffrontend%2Fquery_test.c;h=de8ab806843a34be4942f78939864dc275d06f1c;hp=7fb73a453f33dc7bf84a8989557f8c9470f93b10;hb=bdc839955f8ebe45f07f4c6f8886e6fc7afc2466;hpb=9345a64b2fa015c30d6b3fcba76211f8d0d7cfd6 diff --git a/t/unit/frontend/query_test.c b/t/unit/frontend/query_test.c index 7fb73a4..de8ab80 100644 --- a/t/unit/frontend/query_test.c +++ b/t/unit/frontend/query_test.c @@ -43,10 +43,19 @@ static void populate(void) { + sdb_store_t *store; sdb_data_t datum; - sdb_store_init(); + /* the frontend accesses the store via the plugin API */ + store = sdb_store_create(); + ck_assert(store != NULL); + ck_assert(sdb_plugin_register_writer("test-writer", + &sdb_store_writer, SDB_OBJ(store)) == 0); + ck_assert(sdb_plugin_register_reader("test-reader", + &sdb_store_reader, SDB_OBJ(store)) == 0); + sdb_object_deref(SDB_OBJ(store)); + /* populate the store */ sdb_plugin_store_host("h1", 1 * SDB_INTERVAL_SECOND); sdb_plugin_store_host("h2", 3 * SDB_INTERVAL_SECOND); @@ -60,7 +69,8 @@ populate(void) sdb_plugin_store_metric("h1", "m1", /* store */ NULL, 2 * SDB_INTERVAL_SECOND); sdb_plugin_store_metric("h1", "m2", /* store */ NULL, 1 * SDB_INTERVAL_SECOND); - sdb_plugin_store_metric("h2", "m1", /* store */ NULL, 1 * SDB_INTERVAL_SECOND); + sdb_plugin_store_metric("h2", "m1", /* store */ NULL, 5 * SDB_INTERVAL_SECOND); + sdb_plugin_store_metric("h2", "m1", /* store */ NULL, 10 * SDB_INTERVAL_SECOND); datum.type = SDB_TYPE_INTEGER; datum.data.integer = 42; @@ -78,6 +88,12 @@ populate(void) &datum, 1 * SDB_INTERVAL_SECOND); } /* populate */ +static void +turndown(void) +{ + sdb_plugin_unregister_all(); +} /* turndown */ + #define HOST_H1 \ "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ @@ -109,7 +125,38 @@ populate(void) "{\"name\": \"hostname\", \"value\": \"h1\", " \ "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}]}]}" +#define HOST_H2 \ + "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:03 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"metrics\": [" \ + "{\"name\": \"m1\", \"timeseries\": false, " \ + "\"last_update\": \"1970-01-01 00:00:10 +0000\", " \ + "\"update_interval\": \"5s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h2\", " \ + "\"last_update\": \"1970-01-01 00:00:10 +0000\", " \ + "\"update_interval\": \"5s\", \"backends\": []}]}], " \ + "\"services\": [" \ + "{\"name\": \"s1\", \"last_update\": \"1970-01-01 00:00:01 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h2\", " \ + "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}]}," \ + "{\"name\": \"s2\", \"last_update\": \"1970-01-01 00:00:02 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h2\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}," \ + "{\"name\": \"k1\", \"value\": 123, " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}," \ + "{\"name\": \"k2\", \"value\": 4711, " \ + "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}]}]}" #define HOST_H1_ARRAY "["HOST_H1"]" +#define HOST_H12_ARRAY "["HOST_H1","HOST_H2"]" #define HOST_H1_LISTING \ "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}" @@ -127,6 +174,28 @@ populate(void) "{\"name\": \"hostname\", \"value\": \"h2\", " \ "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}]}]}" +#define SERVICE_H2_S12 \ + "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:03 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"services\": [" \ + "{\"name\": \"s1\", \"last_update\": \"1970-01-01 00:00:01 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h2\", " \ + "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}]}," \ + "{\"name\": \"s2\", \"last_update\": \"1970-01-01 00:00:02 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h2\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}," \ + "{\"name\": \"k1\", \"value\": 123, " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}," \ + "{\"name\": \"k2\", \"value\": 4711, " \ + "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}]}]}" #define SERVICE_H2_S1_ARRAY "["SERVICE_H2_S1"]" #define SERVICE_H2_S12_LISTING \ "[{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:03 +0000\", " \ @@ -151,18 +220,19 @@ populate(void) "{\"name\": \"k3\", \"value\": 42, " \ "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}]}]}" -#define METRIC_H12_M1_ARRAY \ - "["METRIC_H1_M1"," \ +#define METRIC_H2_M1 \ "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:03 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ "\"metrics\": [" \ "{\"name\": \"m1\", \"timeseries\": false, " \ - "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ - "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"last_update\": \"1970-01-01 00:00:10 +0000\", " \ + "\"update_interval\": \"5s\", \"backends\": [], " \ "\"attributes\": [" \ "{\"name\": \"hostname\", \"value\": \"h2\", " \ - "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ - "\"update_interval\": \"0s\", \"backends\": []}]}]}]" + "\"last_update\": \"1970-01-01 00:00:10 +0000\", " \ + "\"update_interval\": \"5s\", \"backends\": []}]}]}" +#define METRIC_H12_M1_ARRAY \ + "["METRIC_H1_M1","METRIC_H2_M1"]" #define METRIC_H12_M12_LISTING \ "[{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ @@ -177,8 +247,8 @@ populate(void) "\"update_interval\": \"0s\", \"backends\": [], " \ "\"metrics\": [" \ "{\"name\": \"m1\", \"timeseries\": false, " \ - "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ - "\"update_interval\": \"0s\", \"backends\": []}]}]" + "\"last_update\": \"1970-01-01 00:00:10 +0000\", " \ + "\"update_interval\": \"5s\", \"backends\": []}]}]" typedef struct { sdb_conn_t conn; @@ -356,6 +426,14 @@ static struct { SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING name = 'h1' FILTER age >= 0s", -1, /* always matches */ 0, SDB_CONNECTION_DATA, 1112, SDB_CONNECTION_LOOKUP, HOST_H1_ARRAY, }, + { + SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING ANY backend = 'b'", -1, + 0, SDB_CONNECTION_DATA, 6, SDB_CONNECTION_LOOKUP, "[]", + }, + { + SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING ANY backend || 'b' = 'b'", -1, + 0, SDB_CONNECTION_DATA, 2205, SDB_CONNECTION_LOOKUP, HOST_H12_ARRAY, + }, { SDB_CONNECTION_QUERY, "FETCH host 'h1' FILTER age < 0s", -1, /* never matches */ -1, UINT32_MAX, 0, 0, NULL, /* FETCH fails if the object doesn't exist */ @@ -417,6 +495,27 @@ static struct { SDB_CONNECTION_QUERY, "LOOKUP services MATCHING name = 's1'", -1, 0, SDB_CONNECTION_DATA, 358, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, }, + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING host.name = 'h2'", -1, + 0, SDB_CONNECTION_DATA, 825, SDB_CONNECTION_LOOKUP, "["SERVICE_H2_S12"]", + }, + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING ANY host.metric.name = 'm1'", -1, + 0, SDB_CONNECTION_DATA, 825, SDB_CONNECTION_LOOKUP, "["SERVICE_H2_S12"]", + }, + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING ANY host.metric.last_update = 10s", -1, + 0, SDB_CONNECTION_DATA, 825, SDB_CONNECTION_LOOKUP, "["SERVICE_H2_S12"]", + }, + { + /* stupid but valid ;-) */ + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING ANY host.host.metric.metric.interval = 5s", -1, + 0, SDB_CONNECTION_DATA, 825, SDB_CONNECTION_LOOKUP, "["SERVICE_H2_S12"]", + }, + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING ANY host.metric.name = 'mX'", -1, + 0, SDB_CONNECTION_DATA, 6, SDB_CONNECTION_LOOKUP, "[]", + }, { SDB_CONNECTION_LOOKUP, "\0\0\0\2""name = 's1'", 16, 0, SDB_CONNECTION_DATA, 358, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, @@ -491,6 +590,16 @@ static struct { SDB_CONNECTION_QUERY, "LOOKUP metrics MATCHING name = 'm1'", -1, 0, SDB_CONNECTION_DATA, 864, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, }, + { + /* stupid but valid ;-) */ + SDB_CONNECTION_QUERY, "LOOKUP metrics MATCHING metric.metric.name = 'm1'", -1, + 0, SDB_CONNECTION_DATA, 864, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, + }, + { + /* also stupid but valid ;-) */ + SDB_CONNECTION_QUERY, "LOOKUP metrics MATCHING metric.metric.host.host.last_update = 3s", -1, + 0, SDB_CONNECTION_DATA, 378, SDB_CONNECTION_LOOKUP, "["METRIC_H2_M1"]", + }, { SDB_CONNECTION_LOOKUP, "\0\0\0\3""name = 'm1'", 16, 0, SDB_CONNECTION_DATA, 864, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, @@ -665,27 +774,27 @@ START_TEST(test_query) switch (conn->cmd) { case SDB_CONNECTION_QUERY: - check = sdb_fe_query(conn); + check = sdb_conn_query(conn); break; case SDB_CONNECTION_FETCH: - check = sdb_fe_fetch(conn); + check = sdb_conn_fetch(conn); break; case SDB_CONNECTION_LIST: - check = sdb_fe_list(conn); + check = sdb_conn_list(conn); break; case SDB_CONNECTION_LOOKUP: - check = sdb_fe_lookup(conn); + check = sdb_conn_lookup(conn); break; /* SDB_CONNECTION_TIMESERIES not supported yet */ case SDB_CONNECTION_STORE: - check = sdb_fe_store(conn); + check = sdb_conn_store(conn); break; default: fail("Invalid command %#x", conn->cmd); } fail_unless(check == query_data[_i].expected, - "sdb_fe_query(%s) = %d; expected: %d (err: %s)", + "sdb_conn_query(%s) = %d; expected: %d (err: %s)", query_data[_i].query, check, query_data[_i].expected, sdb_strbuf_string(conn->errbuf)); @@ -694,7 +803,7 @@ START_TEST(test_query) if (query_data[_i].code == UINT32_MAX) { fail_unless(len == 0, - "sdb_fe_query(%s) returned data on error: '%s'", + "sdb_conn_query(%s) returned data on error: '%s'", query_data[_i].query, data); mock_conn_destroy(conn); return; @@ -707,14 +816,14 @@ START_TEST(test_query) fail_unless((code == query_data[_i].code) && ((size_t)msg_len == query_data[_i].len), - "sdb_fe_query(%s) returned %u, %u; expected: %u, %zu", + "sdb_conn_query(%s) returned %u, %u; expected: %u, %zu", query_data[_i].query, code, msg_len, query_data[_i].code, query_data[_i].len); if (code == SDB_CONNECTION_DATA) { tmp = sdb_proto_unmarshal_int32(data, len, &code); fail_unless(code == query_data[_i].type, - "sdb_fe_query(%s) returned %s object; expected: %s", + "sdb_conn_query(%s) returned %s object; expected: %s", query_data[_i].query, SDB_CONN_MSGTYPE_TO_STRING((int)code), SDB_CONN_MSGTYPE_TO_STRING((int)query_data[_i].type)); data += tmp; @@ -722,7 +831,7 @@ START_TEST(test_query) } fail_if_strneq(data, query_data[_i].data, (size_t)msg_len, - "sdb_fe_query(%s) returned unexpected data", + "sdb_conn_query(%s) returned unexpected data", query_data[_i].query, data, query_data[_i].data); mock_conn_destroy(conn); @@ -732,7 +841,7 @@ END_TEST TEST_MAIN("frontend::query") { TCase *tc = tcase_create("core"); - tcase_add_checked_fixture(tc, populate, sdb_store_clear); + tcase_add_checked_fixture(tc, populate, turndown); TC_ADD_LOOP_TEST(tc, query); ADD_TCASE(tc); }