Code

dbi_test: Fix tests for libdbi < 0.9.
[sysdb.git] / t / unit / utils / dbi_test.c
index 8a21acebe66f8bd2bcc3007918ecc8888388d386..6fb2938e75f1b64319d268cd1a904ae7a902bc80 100644 (file)
@@ -29,7 +29,7 @@
 #      include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-#include "libsysdb_test.h"
+#include "testutils.h"
 #include "utils/dbi.h"
 
 #include <check.h>
@@ -146,34 +146,91 @@ static mock_query_t *current_query = NULL;
 
 /* dbi_driver, dbi_conn, dbi_result are void pointers */
 
+#if LIBDBI_VERSION < 900
+typedef void *dbi_inst;
+
 int
-dbi_initialize_r(const char __attribute__((unused)) *driverdir,
-               dbi_inst __attribute__((unused)) *pInst)
+dbi_initialize_r(const char *driverdir, dbi_inst *pInst);
+void
+dbi_shutdown_r(dbi_inst inst);
+dbi_driver
+dbi_driver_open_r(const char *name, dbi_inst inst);
+dbi_driver
+dbi_driver_list_r(dbi_driver curr, dbi_inst inst);
+#endif
+
+const dbi_inst INST = (void *)0x4711;
+
+int
+dbi_initialize_r(const char __attribute__((unused)) *driverdir, dbi_inst *pInst)
 {
+       if (pInst)
+               *pInst = INST;
        return 0;
 } /* dbi_initialize_r */
 
 void
-dbi_shutdown_r(dbi_inst __attribute__((unused)) inst)
+dbi_shutdown_r(dbi_inst inst)
 {
+       fail_unless(inst == INST,
+                       "dbi_shutdown_r() called with unexpected inst=%p; expected %p",
+                       inst, INST);
 } /* dbi_shutdown_r */
 
 dbi_driver
-dbi_driver_open_r(const char *name, dbi_inst __attribute__((unused)) inst)
+dbi_driver_open_r(const char *name, dbi_inst inst)
 {
+       fail_unless(inst == INST,
+                       "dbi_driver_open_r() called with unexpected inst=%p; expected %p",
+                       inst, INST);
+
        if (strcmp(name, "mockdriver"))
                return NULL;
-       return (dbi_driver)strdup(name);
+       return (dbi_driver)"mockdriver";
 } /* dbi_driver_open */
 
 dbi_driver
-dbi_driver_list_r(dbi_driver curr, dbi_inst __attribute__((unused)) inst)
+dbi_driver_list_r(dbi_driver curr, dbi_inst inst)
 {
+       fail_unless(inst == INST,
+                       "dbi_driver_list_r() called with unexpected inst=%p; expected %p",
+                       inst, INST);
+
        if (!curr)
                return "mockdriver";
        return NULL;
 } /* dbi_driver_list */
 
+#if LIBDBI_VERSION < 900
+int
+dbi_initialize(const char *driverdir)
+{
+       return dbi_initialize_r(driverdir, NULL);
+} /* dbi_initialize */
+
+/* for some weird reason, gcc and clang complain about a missing prototype for
+ * dbi_shutdown; however, the function is declared in dbi/dbi.h */
+void
+dbi_shutdown(void);
+void
+dbi_shutdown(void)
+{
+       dbi_shutdown_r(INST);
+} /* dbi_shutdown */
+
+dbi_driver
+dbi_driver_open(const char *name)
+{
+       return dbi_driver_open_r(name, INST);
+} /* dbi_driver_open */
+
+dbi_driver
+dbi_driver_list(dbi_driver curr)
+{
+       return dbi_driver_list_r(curr, INST);
+} /* dbi_driver_list */
+#endif
+
 const char *
 dbi_driver_get_name(dbi_driver driver)
 {
@@ -484,7 +541,7 @@ query_callback(sdb_dbi_client_t *c,
                        user_data, TEST_MAGIC);
 
        for (i = 0; i < n; ++i) {
-               int expected_type = DBI_TYPE_TO_SC(current_query->field_types[i]);
+               int expected_type = DBI_TYPE_TO_SDB(current_query->field_types[i]);
                mock_data_t expected_data;
 
                fail_unless((int)data[i].type == expected_type,
@@ -515,8 +572,8 @@ query_callback(sdb_dbi_client_t *c,
                        case SDB_TYPE_DATETIME:
                                fail_unless(data[i].data.datetime
                                                        == SECS_TO_SDB_TIME(expected_data.datetime),
-                                               "query callback received unexpected data "PRIscTIME
-                                               " for column %zu; expected: "PRIscTIME,
+                                               "query callback received unexpected data "PRIsdbTIME
+                                               " for column %zu; expected: "PRIsdbTIME,
                                                data[i].data.integer, i,
                                                SECS_TO_SDB_TIME(expected_data.integer));
                                break;
@@ -550,13 +607,47 @@ query_callback(sdb_dbi_client_t *c,
 
 START_TEST(test_sdb_dbi_client_connect)
 {
-       int check = sdb_dbi_client_connect(client);
+       sdb_dbi_options_t *opts;
+       int check;
+
+       check = sdb_dbi_client_connect(client);
        fail_unless(check == 0,
                        "sdb_dbi_client_connect() = %i; expected: 0", check);
-
        fail_unless(dbi_conn_connect_called == 1,
                        "sdb_dbi_client_create() called dbi_conn_connect %i times; "
                        "expected: 1", dbi_conn_connect_called);
+
+       /* calling it again shall reconnect */
+       check = sdb_dbi_client_connect(client);
+       fail_unless(check == 0,
+                       "repeated sdb_dbi_client_connect() = %i; expected: 0", check);
+       fail_unless(dbi_conn_connect_called == 2,
+                       "repeated sdb_dbi_client_create() called dbi_conn_connect %i times; "
+                       "expected: 2", dbi_conn_connect_called);
+
+       opts = sdb_dbi_options_create();
+       fail_unless(opts != NULL,
+                       "sdb_dbi_options_create() returned NULL; expected <opts>");
+       check = sdb_dbi_options_add(opts, "a", "1");
+       fail_unless(check == 0,
+                       "sdb_dbi_options_add('a', '1') = %d; expected: 0", check);
+       check = sdb_dbi_options_add(opts, "b", "2");
+       fail_unless(check == 0,
+                       "sdb_dbi_options_add('b', '2') = %d; expected: 0", check);
+
+       check = sdb_dbi_client_set_options(client, opts);
+       fail_unless(check == 0,
+                       "sdb_dbi_client_set_options() = %d; expected: 0", check);
+       /* reconnect with options */
+       check = sdb_dbi_client_connect(client);
+       fail_unless(check == 0,
+                       "repeated, with options sdb_dbi_client_connect() = %i; expected: 0",
+                       check);
+       fail_unless(dbi_conn_connect_called == 3,
+                       "repeated, with options sdb_dbi_client_create() called "
+                       "dbi_conn_connect %i times; expected: 3", dbi_conn_connect_called);
+
+       /* The client takes ownership of the options, so no need to destroy it. */
 }
 END_TEST
 
@@ -633,25 +724,16 @@ START_TEST(test_sdb_dbi_exec_query)
 }
 END_TEST
 
-/*
- * test API
- */
-
-Suite *
-util_dbi_suite(void)
+TEST_MAIN("utils::dbi")
 {
-       Suite *s = suite_create("utils::dbi");
-       TCase *tc;
-
-       tc = tcase_create("core");
+       TCase *tc = tcase_create("core");
        tcase_add_checked_fixture(tc, setup, teardown);
        tcase_add_test(tc, test_sdb_dbi_client_connect);
        tcase_add_test(tc, test_sdb_dbi_client_check_conn);
        tcase_add_test(tc, test_sdb_dbi_exec_query);
-       suite_add_tcase(s, tc);
-
-       return s;
-} /* util_llist_suite */
+       ADD_TCASE(tc);
+}
+TEST_MAIN_END
 
 /* vim: set tw=78 sw=4 ts=4 noexpandtab : */