Code

Merged branch 'master' of git://git.tokkee.org/sysdb.
[sysdb.git] / t / core / store_test.c
index 8d484b671efb7b48e436a09907c7f0d6602d8a27..29c5b1b67d7a8eee65639078e65fc7800f6a0bcf 100644 (file)
  */
 
 #include "core/store.h"
+#include "core/store-private.h"
 #include "libsysdb_test.h"
 
 #include <check.h>
 #include <string.h>
 
+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: "
+                       "<store base obj>");
+       fail_unless(i != NULL,
+                       "sdb_store_iterate callback received NULL user_data; "
+                       "expected: <pointer to data>");
+
+       ++(*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: "
+                       "<store base obj>");
+       fail_unless(i != NULL,
+                       "sdb_store_iterate callback received NULL user_data; "
+                       "expected: <pointer to data>");
+
+       ++(*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);