X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=t%2Funit%2Ffrontend%2Fquery_test.c;h=e81bb5841e4fe28f31431367fc068fb5af351067;hp=73f3042ee9516a8605346393ab4ca456cdb2dd5c;hb=99a970fdf911d6885750508044153c920620423f;hpb=32a9483322ca1462e9be6889f053d6ea3ed1e9df diff --git a/t/unit/frontend/query_test.c b/t/unit/frontend/query_test.c index 73f3042..e81bb58 100644 --- a/t/unit/frontend/query_test.c +++ b/t/unit/frontend/query_test.c @@ -29,8 +29,9 @@ # include "config.h" #endif +#include "core/memstore.h" +#include "core/plugin.h" #include "frontend/connection.h" -#include "frontend/parser.h" #include "frontend/connection-private.h" #include "testutils.h" @@ -43,93 +44,212 @@ static void populate(void) { + sdb_memstore_t *store; sdb_data_t datum; - sdb_store_host("h1", 1); - sdb_store_host("h2", 3); + /* the frontend accesses the store via the plugin API */ + store = sdb_memstore_create(); + ck_assert(store != NULL); + ck_assert(sdb_plugin_register_writer("test-writer", + &sdb_memstore_writer, SDB_OBJ(store)) == 0); + ck_assert(sdb_plugin_register_reader("test-reader", + &sdb_memstore_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); datum.type = SDB_TYPE_STRING; datum.data.string = "v1"; - sdb_store_attribute("h1", "k1", &datum, 1); + sdb_plugin_store_attribute("h1", "k1", &datum, 1 * SDB_INTERVAL_SECOND); datum.data.string = "v2"; - sdb_store_attribute("h1", "k2", &datum, 2); + sdb_plugin_store_attribute("h1", "k2", &datum, 2 * SDB_INTERVAL_SECOND); datum.data.string = "v3"; - sdb_store_attribute("h1", "k3", &datum, 2); + sdb_plugin_store_attribute("h1", "k3", &datum, 2 * SDB_INTERVAL_SECOND); - sdb_store_metric("h1", "m1", /* store */ NULL, 2); - sdb_store_metric("h1", "m2", /* store */ NULL, 1); - sdb_store_metric("h2", "m1", /* store */ NULL, 1); + 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, 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; - sdb_store_metric_attr("h1", "m1", "k3", &datum, 2); + sdb_plugin_store_metric_attribute("h1", "m1", "k3", + &datum, 2 * SDB_INTERVAL_SECOND); - sdb_store_service("h2", "s1", 1); - sdb_store_service("h2", "s2", 2); + sdb_plugin_store_service("h2", "s1", 1 * SDB_INTERVAL_SECOND); + sdb_plugin_store_service("h2", "s2", 2 * SDB_INTERVAL_SECOND); datum.data.integer = 123; - sdb_store_service_attr("h2", "s2", "k1", &datum, 2); + sdb_plugin_store_service_attribute("h2", "s2", "k1", + &datum, 2 * SDB_INTERVAL_SECOND); datum.data.integer = 4711; - sdb_store_service_attr("h2", "s2", "k2", &datum, 1); + sdb_plugin_store_service_attribute("h2", "s2", "k2", + &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:00 +0000\", " \ + "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ "\"attributes\": [" \ "{\"name\": \"k1\", \"value\": \"v1\", " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}," \ "{\"name\": \"k2\", \"value\": \"v2\", " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}," \ "{\"name\": \"k3\", \"value\": \"v3\", " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}], " \ "\"metrics\": [" \ "{\"name\": \"m1\", \"timeseries\": false, " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ "\"attributes\": [" \ "{\"name\": \"hostname\", \"value\": \"h1\", " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}," \ "{\"name\": \"k3\", \"value\": 42, " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}]}," \ "{\"name\": \"m2\", \"timeseries\": false, " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ "\"attributes\": [" \ "{\"name\": \"hostname\", \"value\": \"h1\", " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"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\": []}" +#define HOST_H2_LISTING \ + "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:03 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}" #define SERVICE_H2_S1 \ - "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "{\"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\": []}]}]}" +#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:00 +0000\", " \ + "{\"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:00 +0000\", " \ + "\"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\", " \ + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"services\": [" \ + "{\"name\": \"s1\", \"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\": []}]}]" #define METRIC_H1_M1 \ - "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:01 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ "\"metrics\": [" \ "{\"name\": \"m1\", \"timeseries\": false, " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ "\"attributes\": [" \ "{\"name\": \"hostname\", \"value\": \"h1\", " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}," \ "{\"name\": \"k3\", \"value\": 42, " \ - "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}]}]}" +#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:10 +0000\", " \ + "\"update_interval\": \"5s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h2\", " \ + "\"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\": [], " \ + "\"metrics\": [" \ + "{\"name\": \"m1\", \"timeseries\": false, " \ + "\"last_update\": \"1970-01-01 00:00:02 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}," \ + "{\"name\": \"m2\", \"timeseries\": false, " \ + "\"last_update\": \"1970-01-01 00:00:01 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}]}," \ + "{\"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\": []}]}]" typedef struct { sdb_conn_t conn; @@ -239,165 +359,479 @@ fail_if_strneq(const char *got, const char *expected, size_t n, const char *fmt, * tests */ -static struct { - int type; - const char *hostname; - const char *name; - const char *filter; +#define VALUE "\0\0\0\4""v1" +#define VALUE_LEN 7 +static struct { + uint32_t cmd; + const char *query; + int query_len; int expected; uint32_t code; - size_t len; + uint32_t type; const char *data; -} exec_fetch_data[] = { +} query_data[] = { /* hosts */ { - SDB_HOST, "h1", NULL, NULL, - 0, SDB_CONNECTION_DATA, 1110, HOST_H1, + SDB_CONNECTION_QUERY, "LIST hosts", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, + "["HOST_H1_LISTING","HOST_H2_LISTING"]", }, { - SDB_HOST, "h1", NULL, "age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 1110, HOST_H1, + SDB_CONNECTION_LIST, "\0\0\0\1", 4, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, + "["HOST_H1_LISTING","HOST_H2_LISTING"]", }, { - SDB_HOST, "h1", NULL, "age < 0s", /* never matches */ + SDB_CONNECTION_LIST, "", 0, /* LIST defaults to hosts */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, + "["HOST_H1_LISTING","HOST_H2_LISTING"]", + }, + { + SDB_CONNECTION_QUERY, "LIST hosts; LIST hosts", -1, /* ignore second (and later) commands */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, + "["HOST_H1_LISTING","HOST_H2_LISTING"]", + }, + { + SDB_CONNECTION_QUERY, "LIST hosts FILTER name = 'h1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, "["HOST_H1_LISTING"]", + }, + { + SDB_CONNECTION_QUERY, "LIST hosts FILTER name = 's1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, "[]", + }, + /* SDB_CONNECTION_LIST doesn't support filters yet */ + { + SDB_CONNECTION_QUERY, "FETCH host 'h1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_FETCH, HOST_H1, + }, + { + SDB_CONNECTION_FETCH, "\0\0\0\1""h1", 7, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_FETCH, HOST_H1, + }, + { + SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING name = 'h1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, HOST_H1_ARRAY, + }, + { + SDB_CONNECTION_LOOKUP, "\0\0\0\1""name = 'h1'", 16, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, HOST_H1_ARRAY, + }, + { + SDB_CONNECTION_QUERY, "FETCH host 'h1' FILTER age >= 0s", -1, /* always matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_FETCH, HOST_H1, + }, + /* SDB_CONNECTION_FETCH doesn't support filters yet */ + { + SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING name = 'h1' FILTER age >= 0s", -1, /* always matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, HOST_H1_ARRAY, + }, + { + SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING ANY backend = 'b'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + { + SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING ANY backend || 'b' = 'b'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, HOST_H12_ARRAY, + }, + { + SDB_CONNECTION_QUERY, "FETCH host 'h1' FILTER age < 0s", -1, /* never matches */ -1, UINT32_MAX, 0, NULL, /* FETCH fails if the object doesn't exist */ }, + /* SDB_CONNECTION_FETCH doesn't support filters yet */ { - SDB_HOST, "x1", NULL, NULL, /* does not exist */ + SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING name = 'h1' FILTER age < 0s", -1, /* never matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + /* SDB_CONNECTION_LOOKUP doesn't support filters yet */ + { + SDB_CONNECTION_QUERY, "FETCH host 'x1'", -1, /* does not exist */ -1, UINT32_MAX, 0, NULL, }, { - SDB_HOST, "h1", "s1", NULL, /* invalid args */ + SDB_CONNECTION_FETCH, "\0\0\0\1x1", 7, + -1, UINT32_MAX, 0, NULL, + }, + { + SDB_CONNECTION_QUERY, "LOOKUP hosts MATCHING name = 'x1'", -1, /* does not exist */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + { + SDB_CONNECTION_LOOKUP, "\0\0\0\1""name = 'x1'", 16, /* does not exist */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + { + SDB_CONNECTION_QUERY, "FETCH host 'h1'.'s1'", -1, /* invalid args */ + -1, UINT32_MAX, 0, NULL, + }, + { + SDB_CONNECTION_QUERY, "LOOKUP hosts BY name = 'x1'", -1, /* does not exist */ -1, UINT32_MAX, 0, NULL, }, /* services */ { - SDB_SERVICE, "h2", "s1", NULL, - 0, SDB_CONNECTION_DATA, 356, SERVICE_H2_S1, + SDB_CONNECTION_QUERY, "LIST services", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, SERVICE_H2_S12_LISTING, + }, + { + SDB_CONNECTION_LIST, "\0\0\0\2", 4, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, SERVICE_H2_S12_LISTING, + }, + { + SDB_CONNECTION_QUERY, "LIST services FILTER host.name = 'h2'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, SERVICE_H2_S12_LISTING, + }, + { + SDB_CONNECTION_QUERY, "LIST services FILTER host.name = 'h1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, "[]", + }, + /* SDB_CONNECTION_LIST doesn't support filters yet */ + { + SDB_CONNECTION_QUERY, "FETCH service 'h2'.'s1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_FETCH, SERVICE_H2_S1, + }, + /* SDB_CONNECTION_FETCH doesn't support services yet */ + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING name = 's1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, + }, + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING host.name = 'h2'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "["SERVICE_H2_S12"]", + }, + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING ANY host.metric.name = 'm1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "["SERVICE_H2_S12"]", + }, + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING ANY host.metric.last_update = 10s", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "["SERVICE_H2_S12"]", }, { - SDB_SERVICE, "h2", "s1", "age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 356, SERVICE_H2_S1, + /* stupid but valid ;-) */ + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING ANY host.host.metric.metric.interval = 5s", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "["SERVICE_H2_S12"]", }, { - SDB_SERVICE, "h2", "s1", "age < 0s", /* never matches */ + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING ANY host.metric.name = 'mX'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + { + SDB_CONNECTION_LOOKUP, "\0\0\0\2""name = 's1'", 16, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, + }, + { + SDB_CONNECTION_QUERY, "FETCH service 'h2'.'s1' FILTER age >= 0s", -1, /* always matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_FETCH, SERVICE_H2_S1, + }, + /* SDB_CONNECTION_FETCH doesn't support services yet */ + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING name = 's1' FILTER age >= 0s", -1, /* always matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, + }, + { + SDB_CONNECTION_QUERY, "FETCH service 'h2'.'s1' FILTER age < 0s", -1, /* never matches */ -1, UINT32_MAX, 0, NULL, }, + /* SDB_CONNECTION_FETCH doesn't support services yet */ + { + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING name = 's1' FILTER age < 0s", -1, /* never matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + /* SDB_CONNECTION_LOOKUP doesn't support filters yet */ { - SDB_SERVICE, "h2", "s1", "name = 'h2'", /* only matches host */ + SDB_CONNECTION_QUERY, "FETCH service 'h2'.'s1' FILTER name = 'h2'", -1, /* only matches host */ -1, UINT32_MAX, 0, NULL, }, + /* SDB_CONNECTION_FETCH doesn't support services yet */ { - SDB_SERVICE, "h2", "x1", NULL, /* does not exist */ + SDB_CONNECTION_QUERY, "LOOKUP services MATCHING name = 's1' FILTER name = 'h2'", -1, /* only matches host */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + { + SDB_CONNECTION_QUERY, "FETCH service 'h2'.'x1'", -1, /* does not exist */ -1, UINT32_MAX, 0, NULL, }, + /* SDB_CONNECTION_FETCH doesn't support services yet */ { - SDB_SERVICE, "x2", "s1", NULL, /* does not exist */ + SDB_CONNECTION_QUERY, "FETCH service 'x2'.'s1'", -1, /* does not exist */ -1, UINT32_MAX, 0, NULL, }, + /* SDB_CONNECTION_FETCH doesn't support services yet */ { - SDB_SERVICE, "h2", NULL, NULL, /* invalid args */ + SDB_CONNECTION_QUERY, "FETCH service 'h2'", -1, /* invalid args */ -1, UINT32_MAX, 0, NULL, }, + /* SDB_CONNECTION_FETCH doesn't support services yet */ /* metrics */ { - SDB_METRIC, "h1", "m1", NULL, - 0, SDB_CONNECTION_DATA, 489, METRIC_H1_M1, + SDB_CONNECTION_QUERY, "LIST metrics", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, METRIC_H12_M12_LISTING, + }, + { + SDB_CONNECTION_LIST, "\0\0\0\3", 4, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, METRIC_H12_M12_LISTING, + }, + { + SDB_CONNECTION_QUERY, "LIST metrics FILTER age > 0s", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, METRIC_H12_M12_LISTING, + }, + { + SDB_CONNECTION_QUERY, "LIST metrics FILTER age < 0s", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LIST, "[]", + }, + /* SDB_CONNECTION_LIST doesn't support filters yet */ + { + SDB_CONNECTION_QUERY, "FETCH metric 'h1'.'m1'", -1, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_FETCH, METRIC_H1_M1, + }, + /* SDB_CONNECTION_FETCH doesn't support metrics yet */ + { + SDB_CONNECTION_QUERY, "LOOKUP metrics MATCHING name = 'm1'", -1, + 0, SDB_CONNECTION_DATA, 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, 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, SDB_CONNECTION_LOOKUP, "["METRIC_H2_M1"]", + }, + { + SDB_CONNECTION_LOOKUP, "\0\0\0\3""name = 'm1'", 16, + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, + }, + { + SDB_CONNECTION_QUERY, "FETCH metric 'h1'.'m1' FILTER age >= 0s", -1, /* always matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_FETCH, METRIC_H1_M1, + }, + /* SDB_CONNECTION_FETCH doesn't support metrics yet */ + { + SDB_CONNECTION_QUERY, "LOOKUP metrics MATCHING name = 'm1' FILTER age >= 0s", -1, /* always matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, + }, + { + SDB_CONNECTION_QUERY, "FETCH metric 'h1'.'m1' FILTER age < 0s", -1, /* never matches */ + -1, UINT32_MAX, 0, NULL, + }, + /* SDB_CONNECTION_FETCH doesn't support metrics yet */ + { + SDB_CONNECTION_QUERY, "LOOKUP metrics MATCHING name = 'm1' FILTER age < 0s", -1, /* never matches */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + /* SDB_CONEECTION_LOOKUP doesn't support filters yet */ + { + SDB_CONNECTION_QUERY, "FETCH metric 'h1'.'m1' FILTER name = 'h1'", -1, /* only matches host */ + -1, UINT32_MAX, 0, NULL, + }, + /* SDB_CONNECTION_FETCH doesn't support metrics yet */ + { + SDB_CONNECTION_QUERY, "LOOKUP metrics MATCHING name = 'm1' FILTER name = 'h1'", -1, /* only matches host */ + 0, SDB_CONNECTION_DATA, SDB_CONNECTION_LOOKUP, "[]", + }, + { + SDB_CONNECTION_QUERY, "FETCH metric 'h1'.'x1'", -1, /* does not exist */ + -1, UINT32_MAX, 0, NULL, + }, + /* SDB_CONNECTION_FETCH doesn't support metrics yet */ + { + SDB_CONNECTION_QUERY, "FETCH metric 'x1'.'m1'", -1, /* does not exist */ + -1, UINT32_MAX, 0, NULL, + }, + /* SDB_CONNECTION_FETCH doesn't support metrics yet */ + { + SDB_CONNECTION_QUERY, "FETCH metric 'x1'", -1, /* invalid args */ + -1, UINT32_MAX, 0, NULL, + }, + /* SDB_CONNECTION_FETCH doesn't support metrics yet */ + /* timeseries */ + { + SDB_CONNECTION_QUERY, "TIMESERIES 'h1'.'m1'", -1, + -1, UINT32_MAX, 0, NULL, /* no data-store available */ + }, + { + SDB_CONNECTION_QUERY, "TIMESERIES 'h1'.'x1'", -1, + -1, UINT32_MAX, 0, NULL, /* does not exist */ + }, + { + SDB_CONNECTION_QUERY, "TIMESERIES 'x1'.'m1'", -1, + -1, UINT32_MAX, 0, NULL, /* does not exist */ + }, + /* store commands */ + { + SDB_CONNECTION_QUERY, "STORE host 'hA' LAST UPDATE 01:00", -1, + 0, SDB_CONNECTION_OK, 0, "Successfully stored host hA", + }, + { + SDB_CONNECTION_STORE, "\0\0\0\1""\0\0\0\0\xd6\x93\xa4\0""hA", 15, + 0, SDB_CONNECTION_OK, 0, "Successfully stored host hA", + }, + { + SDB_CONNECTION_QUERY, "STORE host 'hA'", -1, + 0, SDB_CONNECTION_OK, 0, "Successfully stored host hA", + }, + { + SDB_CONNECTION_QUERY, "STORE host attribute 'h1'.'aA' 'vA'", -1, + 0, SDB_CONNECTION_OK, 0, "Successfully stored host attribute h1.aA", }, { - SDB_METRIC, "h1", "m1", "age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 489, METRIC_H1_M1, + SDB_CONNECTION_STORE, "\0\0\0\x11""\0\0\0\0\xd6\x93\xa4\0""h1\0aA\0"VALUE, 18+VALUE_LEN, + 0, SDB_CONNECTION_OK, 0, "Successfully stored host attribute h1.aA", }, { - SDB_METRIC, "h1", "m1", "age < 0s", /* never matches */ + SDB_CONNECTION_QUERY, "STORE host attribute 'x1'.'aA' 'vA'", -1, -1, UINT32_MAX, 0, NULL, }, { - SDB_METRIC, "h1", "m1", "name = 'h1'", /* only matches host */ + SDB_CONNECTION_STORE, "\0\0\0\x11""\0\0\0\0\xd6\x93\xa4\0""x1\0aA\0"VALUE, 18+VALUE_LEN, -1, UINT32_MAX, 0, NULL, }, { - SDB_METRIC, "h1", "x1", NULL, /* does not exist */ + SDB_CONNECTION_QUERY, "STORE service 'h1'.'sA'", -1, + 0, SDB_CONNECTION_OK, 0, "Successfully stored service h1.sA", + }, + { + SDB_CONNECTION_STORE, "\0\0\0\2""\0\0\0\0\xd6\x93\xa4\0""h1\0sA", 18, + 0, SDB_CONNECTION_OK, 0, "Successfully stored service h1.sA", + }, + { + SDB_CONNECTION_QUERY, "STORE service 'x1'.'sA'", -1, -1, UINT32_MAX, 0, NULL, }, { - SDB_METRIC, "x1", "m1", NULL, /* does not exist */ + SDB_CONNECTION_STORE, "\0\0\0\x12""\0\0\0\0\xd6\x93\xa4\0""x1\0sA", 18, -1, UINT32_MAX, 0, NULL, }, { - SDB_METRIC, "x1", NULL, NULL, /* invalid args */ + SDB_CONNECTION_QUERY, "STORE service attribute 'h2'.'s1'.'aA' 'vA'", -1, + 0, SDB_CONNECTION_OK, 0, "Successfully stored service attribute h2.s1.aA", + }, + { + SDB_CONNECTION_STORE, "\0\0\0\x12""\0\0\0\0\xd6\x93\xa4\0""h2\0s1\0aA\0"VALUE,27+VALUE_LEN, + 0, SDB_CONNECTION_OK, 0, "Successfully stored service attribute h2.s1.aA", + }, + { + SDB_CONNECTION_QUERY, "STORE service attribute 'h2'.'x1'.'aA' 'vA'", -1, + -1, UINT32_MAX, 0, NULL, + }, + { + SDB_CONNECTION_STORE, "\0\0\0\x12""\0\0\0\0\xd6\x93\xa4\0""h2\0x1\0aA\0"VALUE,27+VALUE_LEN, + -1, UINT32_MAX, 0, NULL, + }, + { + SDB_CONNECTION_QUERY, "STORE metric 'h1'.'mA'", -1, + 0, SDB_CONNECTION_OK, 0, "Successfully stored metric h1.mA", + }, + { + SDB_CONNECTION_STORE, "\0\0\0\3""\0\0\0\0\xd6\x93\xa4\0""h1\0mA", 18, + 0, SDB_CONNECTION_OK, 0, "Successfully stored metric h1.mA", + }, + { + SDB_CONNECTION_QUERY, "STORE metric 'x1'.'mA'", -1, + -1, UINT32_MAX, 0, NULL, + }, + { + SDB_CONNECTION_STORE, "\0\0\0\3""\0\0\0\0\xd6\x93\xa4\0""x1\0mA", 18, + -1, UINT32_MAX, 0, NULL, + }, + { + SDB_CONNECTION_QUERY, "STORE metric attribute 'h1'.'m1'.'aA' 'vA'", -1, + 0, SDB_CONNECTION_OK, 0, "Successfully stored metric attribute h1.m1.aA", + }, + { + SDB_CONNECTION_STORE, "\0\0\0\x13""\0\0\0\0\xd6\x93\xa4\0""h1\0m1\0aA\0"VALUE, 27+VALUE_LEN, + 0, SDB_CONNECTION_OK, 0, "Successfully stored metric attribute h1.m1.aA", + }, + { + SDB_CONNECTION_QUERY, "STORE metric attribute 'h1'.'x1'.'aA' 'vA'", -1, + -1, UINT32_MAX, 0, NULL, + }, + { + SDB_CONNECTION_STORE, "\0\0\0\x13""\0\0\0\0\xd6\x93\xa4\0""h1\0x1\0aA\0"VALUE, 27+VALUE_LEN, -1, UINT32_MAX, 0, NULL, }, }; -START_TEST(test_exec_fetch) +START_TEST(test_query) { sdb_conn_t *conn = mock_conn_create(); - sdb_store_matcher_t *filter = NULL; uint32_t code = UINT32_MAX, msg_len = UINT32_MAX; const char *data; ssize_t tmp; size_t len; - int check; - - if (exec_fetch_data[_i].filter) { - filter = sdb_fe_parse_matcher(exec_fetch_data[_i].filter, -1, NULL); - ck_assert_msg(filter != NULL); + int check = -1; + + conn->cmd = query_data[_i].cmd; + if (query_data[_i].query_len < 0) + conn->cmd_len = (uint32_t)strlen(query_data[_i].query); + else + conn->cmd_len = (uint32_t)query_data[_i].query_len; + sdb_strbuf_memcpy(conn->buf, query_data[_i].query, conn->cmd_len); + + switch (conn->cmd) { + case SDB_CONNECTION_QUERY: + check = sdb_conn_query(conn); + break; + case SDB_CONNECTION_FETCH: + check = sdb_conn_fetch(conn); + break; + case SDB_CONNECTION_LIST: + check = sdb_conn_list(conn); + break; + case SDB_CONNECTION_LOOKUP: + check = sdb_conn_lookup(conn); + break; + /* SDB_CONNECTION_TIMESERIES not supported yet */ + case SDB_CONNECTION_STORE: + check = sdb_conn_store(conn); + break; + default: + fail("Invalid command %#x", conn->cmd); } - check = sdb_fe_exec_fetch(conn, exec_fetch_data[_i].type, - exec_fetch_data[_i].hostname, exec_fetch_data[_i].name, filter); - fail_unless(check == exec_fetch_data[_i].expected, - "sdb_fe_exec_fetch(%s, %s, %s, %s) = %d; expected: %d", - SDB_STORE_TYPE_TO_NAME(exec_fetch_data[_i].type), - exec_fetch_data[_i].hostname, exec_fetch_data[_i].name, - exec_fetch_data[_i].filter, check, exec_fetch_data[_i].expected); + fail_unless(check == query_data[_i].expected, + "sdb_conn_query(%s) = %d; expected: %d (err: %s)", + query_data[_i].query, check, query_data[_i].expected, + sdb_strbuf_string(conn->errbuf)); + data = sdb_strbuf_string(MOCK_CONN(conn)->write_buf); len = sdb_strbuf_len(MOCK_CONN(conn)->write_buf); - if (exec_fetch_data[_i].code == UINT32_MAX) { + if (query_data[_i].code == UINT32_MAX) { fail_unless(len == 0, - "sdb_fe_exec_fetch(%s, %s, %s, %s) returned data on error", - SDB_STORE_TYPE_TO_NAME(exec_fetch_data[_i].type), - exec_fetch_data[_i].hostname, exec_fetch_data[_i].name, - exec_fetch_data[_i].filter); - sdb_object_deref(SDB_OBJ(filter)); + "sdb_conn_query(%s) returned data on error: '%s'", + query_data[_i].query, data); mock_conn_destroy(conn); return; } - data = sdb_strbuf_string(MOCK_CONN(conn)->write_buf); tmp = sdb_proto_unmarshal_header(data, len, &code, &msg_len); ck_assert_msg(tmp == (ssize_t)(2 * sizeof(uint32_t))); data += tmp; len -= tmp; - fail_unless((code == exec_fetch_data[_i].code) - && ((size_t)msg_len == exec_fetch_data[_i].len), - "sdb_fe_exec_fetch(%s, %s, %s, %s) returned %u, %u; expected: %u, %zu", - SDB_STORE_TYPE_TO_NAME(exec_fetch_data[_i].type), - exec_fetch_data[_i].hostname, exec_fetch_data[_i].name, - exec_fetch_data[_i].filter, code, msg_len, - exec_fetch_data[_i].code, exec_fetch_data[_i].len); - - tmp = sdb_proto_unmarshal_int32(data, len, &code); - fail_unless(code == SDB_CONNECTION_FETCH, - "sdb_fe_exec_fetch(%s, %s, %s, %s) returned %s object; expected: FETCH", - SDB_STORE_TYPE_TO_NAME(exec_fetch_data[_i].type), - exec_fetch_data[_i].hostname, exec_fetch_data[_i].name, - exec_fetch_data[_i].filter, SDB_CONN_MSGTYPE_TO_STRING((int)code)); - data += tmp; - len -= tmp; + fail_unless(code == query_data[_i].code, + "sdb_conn_query(%s) returned <%u>; expected: <%u>", + query_data[_i].query, code, query_data[_i].code); + + if (code == SDB_CONNECTION_DATA) { + tmp = sdb_proto_unmarshal_int32(data, len, &code); + fail_unless(code == query_data[_i].type, + "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; + len -= tmp; + } - fail_if_strneq(data, exec_fetch_data[_i].data, (size_t)msg_len, - "sdb_fe_exec_fetch(%s, %s, %s, %s) returned '%s'; expected: '%s'", - SDB_STORE_TYPE_TO_NAME(exec_fetch_data[_i].type), - exec_fetch_data[_i].hostname, exec_fetch_data[_i].name, - exec_fetch_data[_i].filter, data, exec_fetch_data[_i].data); + fail_if_strneq(data, query_data[_i].data, (size_t)msg_len, + "sdb_conn_query(%s) returned unexpected data", + query_data[_i].query, data, query_data[_i].data); - sdb_object_deref(SDB_OBJ(filter)); mock_conn_destroy(conn); } END_TEST @@ -405,8 +839,8 @@ END_TEST TEST_MAIN("frontend::query") { TCase *tc = tcase_create("core"); - tcase_add_checked_fixture(tc, populate, sdb_store_clear); - tcase_add_loop_test(tc, test_exec_fetch, 0, SDB_STATIC_ARRAY_LEN(exec_fetch_data)); + tcase_add_checked_fixture(tc, populate, turndown); + TC_ADD_LOOP_TEST(tc, query); ADD_TCASE(tc); } TEST_MAIN_END