X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=t%2Fcore%2Fstore_test.c;h=29c5b1b67d7a8eee65639078e65fc7800f6a0bcf;hp=8d484b671efb7b48e436a09907c7f0d6602d8a27;hb=3ba81224dac4d31ea5ad651db569543825ea5078;hpb=765d1094484e162c125788b936119808bdedd64d diff --git a/t/core/store_test.c b/t/core/store_test.c index 8d484b6..29c5b1b 100644 --- a/t/core/store_test.c +++ b/t/core/store_test.c @@ -26,11 +26,32 @@ */ #include "core/store.h" +#include "core/store-private.h" #include "libsysdb_test.h" #include #include +static void +populate(void) +{ + sdb_data_t datum; + + sdb_store_host("h1", 1); + sdb_store_host("h2", 1); + + datum.type = SDB_TYPE_STRING; + datum.data.string = "v1"; + sdb_store_attribute("h1", "k1", &datum, 1); + datum.data.string = "v2"; + sdb_store_attribute("h1", "k2", &datum, 1); + datum.data.string = "v3"; + sdb_store_attribute("h1", "k3", &datum, 1); + + sdb_store_service("h2", "s1", 1); + sdb_store_service("h2", "s2", 1); +} /* populate */ + START_TEST(test_store_host) { struct { @@ -249,7 +270,6 @@ verify_json_output(sdb_strbuf_t *buf, const char *expected, int flags) START_TEST(test_store_tojson) { sdb_strbuf_t *buf; - sdb_data_t datum; size_t i; struct { @@ -258,62 +278,78 @@ START_TEST(test_store_tojson) } golden_data[] = { { 0, "{\"hosts\":[" "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", " "\"attributes\": [" - "{\"name\": \"k1\", \"value\": \"v1\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}," - "{\"name\": \"k2\", \"value\": \"v2\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}," - "{\"name\": \"k3\", \"value\": \"v3\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}" + "{\"name\": \"k1\", \"value\": \"v1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}," + "{\"name\": \"k2\", \"value\": \"v2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}," + "{\"name\": \"k3\", \"value\": \"v3\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}" "], " "\"services\": []}," "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", " "\"attributes\": [], " "\"services\": [" - "{\"name\": \"s1\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}," - "{\"name\": \"s2\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}" + "{\"name\": \"s1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}," + "{\"name\": \"s2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}" "]}" "]}" }, { SDB_SKIP_SERVICES, "{\"hosts\":[" "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", " "\"attributes\": [" - "{\"name\": \"k1\", \"value\": \"v1\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}," - "{\"name\": \"k2\", \"value\": \"v2\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}," - "{\"name\": \"k3\", \"value\": \"v3\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}" + "{\"name\": \"k1\", \"value\": \"v1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}," + "{\"name\": \"k2\", \"value\": \"v2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}," + "{\"name\": \"k3\", \"value\": \"v3\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}" "]}," "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", " "\"attributes\": []}" "]}" }, { SDB_SKIP_ATTRIBUTES, "{\"hosts\":[" "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", " "\"services\": []}," "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", " "\"services\": [" - "{\"name\": \"s1\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}," - "{\"name\": \"s2\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}" + "{\"name\": \"s1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}," + "{\"name\": \"s2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}" "]}" "]}" }, { SDB_SKIP_SERVICES | SDB_SKIP_ATTRIBUTES, "{\"hosts\":[" - "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}," - "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\"}" + "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}," + "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\"}" "]}" }, }; - sdb_store_host("h1", 1); - sdb_store_host("h2", 1); - - datum.type = SDB_TYPE_STRING; - datum.data.string = "v1"; - sdb_store_attribute("h1", "k1", &datum, 1); - datum.data.string = "v2"; - sdb_store_attribute("h1", "k2", &datum, 1); - datum.data.string = "v3"; - sdb_store_attribute("h1", "k3", &datum, 1); - - sdb_store_service("h2", "s1", 1); - sdb_store_service("h2", "s2", 1); - buf = sdb_strbuf_create(0); + fail_unless(buf != NULL, "INTERNAL ERROR: failed to create string buffer"); + populate(); for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { int status; @@ -331,6 +367,124 @@ START_TEST(test_store_tojson) } END_TEST +START_TEST(test_interval) +{ + sdb_store_base_t *host; + + /* 10 us interval */ + sdb_store_host("host", 10); + sdb_store_host("host", 20); + sdb_store_host("host", 30); + sdb_store_host("host", 40); + + host = sdb_store_get_host("host"); + fail_unless(host != NULL, + "INTERNAL ERROR: store doesn't have host after adding it"); + + fail_unless(host->interval == 10, + "sdb_store_host() did not calculate interval correctly: " + "got: %"PRIscTIME"; expected: %"PRIscTIME, host->interval, 10); + + /* multiple updates for the same timestamp don't modify the interval */ + sdb_store_host("host", 40); + sdb_store_host("host", 40); + sdb_store_host("host", 40); + sdb_store_host("host", 40); + + fail_unless(host->interval == 10, + "sdb_store_host() changed interval when doing multiple updates " + "using the same timestamp; got: %"PRIscTIME"; " + "expected: %"PRIscTIME, host->interval, 10); + + /* multiple updates using an timestamp don't modify the interval */ + sdb_store_host("host", 20); + sdb_store_host("host", 20); + sdb_store_host("host", 20); + sdb_store_host("host", 20); + + fail_unless(host->interval == 10, + "sdb_store_host() changed interval when doing multiple updates " + "using an old timestamp; got: %"PRIscTIME"; expected: %"PRIscTIME, + host->interval, 10); + + /* new interval: 20 us */ + sdb_store_host("host", 60); + fail_unless(host->interval == 11, + "sdb_store_host() did not calculate interval correctly: " + "got: %"PRIscTIME"; expected: %"PRIscTIME, host->interval, 11); + + /* new interval: 40 us */ + sdb_store_host("host", 100); + fail_unless(host->interval == 13, + "sdb_store_host() did not calculate interval correctly: " + "got: %"PRIscTIME"; expected: %"PRIscTIME, host->interval, 11); + + sdb_object_deref(SDB_OBJ(host)); +} +END_TEST + +static int +iter_incr(sdb_store_base_t *obj, void *user_data) +{ + intptr_t *i = user_data; + + fail_unless(obj != NULL, + "sdb_store_iterate callback received NULL obj; expected: " + ""); + fail_unless(i != NULL, + "sdb_store_iterate callback received NULL user_data; " + "expected: "); + + ++(*i); + return 0; +} /* iter_incr */ + +static int +iter_error(sdb_store_base_t *obj, void *user_data) +{ + intptr_t *i = user_data; + + fail_unless(obj != NULL, + "sdb_store_iterate callback received NULL obj; expected: " + ""); + fail_unless(i != NULL, + "sdb_store_iterate callback received NULL user_data; " + "expected: "); + + ++(*i); + return -1; +} /* iter_error */ + +START_TEST(test_iterate) +{ + intptr_t i = 0; + int check; + + /* empty store */ + check = sdb_store_iterate(iter_incr, &i); + fail_unless(check == -1, + "sdb_store_iterate(), empty store = %d; expected: -1", check); + fail_unless(i == 0, + "sdb_store_iterate called callback %d times; expected: 0", (int)i); + + populate(); + + check = sdb_store_iterate(iter_incr, &i); + fail_unless(check == 0, + "sdb_store_iterate() = %d; expected: 0", check); + fail_unless(i == 2, + "sdb_store_iterate called callback %d times; expected: 1", (int)i); + + i = 0; + check = sdb_store_iterate(iter_error, &i); + fail_unless(check == -1, + "sdb_store_iterate(), error callback = %d; expected: -1", check); + fail_unless(i == 1, + "sdb_store_iterate called callback %d times " + "(callback returned error); expected: 1", (int)i); +} +END_TEST + Suite * core_store_suite(void) { @@ -343,6 +497,8 @@ core_store_suite(void) tcase_add_test(tc, test_store_get_host); tcase_add_test(tc, test_store_attr); tcase_add_test(tc, test_store_service); + tcase_add_test(tc, test_interval); + tcase_add_test(tc, test_iterate); tcase_add_unchecked_fixture(tc, NULL, sdb_store_clear); suite_add_tcase(s, tc);