summaryrefslogtreecommitdiffstats
path: root/ctdb/tests/src/ctdb_functest.c
diff options
context:
space:
mode:
Diffstat (limited to 'ctdb/tests/src/ctdb_functest.c')
-rw-r--r--ctdb/tests/src/ctdb_functest.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/ctdb/tests/src/ctdb_functest.c b/ctdb/tests/src/ctdb_functest.c
new file mode 100644
index 00000000000..16ca4fddd64
--- /dev/null
+++ b/ctdb/tests/src/ctdb_functest.c
@@ -0,0 +1,189 @@
+/*
+ Tests for tools/ctdb.c and CTDB client stubs
+
+ Copyright (C) Martin Schwenke 2011
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define CTDB_TEST_OVERRIDE_MAIN
+#include "ctdb_test.c"
+
+static void test_read_nodemap(void)
+{
+ struct ctdb_context *ctdb = talloc_zero(NULL, struct ctdb_context);
+
+ ctdb_test_stubs_read_nodemap(ctdb);
+ ctdb_test_stubs_print_nodemap(ctdb);
+
+ talloc_free(ctdb);
+}
+
+static void test_read_ifaces(void)
+{
+ struct ctdb_context *ctdb = talloc_zero(NULL, struct ctdb_context);
+
+ ctdb_test_stubs_read_ifaces(ctdb);
+ ctdb_test_stubs_print_ifaces(ctdb);
+
+ talloc_free(ctdb);
+}
+
+static void test_read_vnnmap(void)
+{
+ struct ctdb_context *ctdb = talloc_zero(NULL, struct ctdb_context);
+
+ ctdb_test_stubs_read_vnnmap(ctdb);
+ ctdb_test_stubs_print_vnnmap(ctdb);
+
+ talloc_free(ctdb);
+}
+
+static void test_fake_setup(void)
+{
+ bool first = true;
+ struct ctdb_context *ctdb = talloc_zero(NULL, struct ctdb_context);
+
+ ctdb_test_stubs_fake_setup(ctdb);
+
+ if (ctdb->nodes != NULL) {
+ if (!first) {
+ printf("\n");
+ }
+ printf("NODEMAP\n");
+ ctdb_test_stubs_print_nodemap(ctdb);
+ first = false;
+ }
+
+ if (ctdb->ifaces != NULL) {
+ if (!first) {
+ printf("\n");
+ }
+ printf("IFACES\n");
+ ctdb_test_stubs_print_ifaces(ctdb);
+ first = false;
+ }
+
+ if (ctdb->vnn_map != NULL) {
+ if (!first) {
+ printf("\n");
+ }
+ printf("VNNMAP\n");
+ ctdb_test_stubs_print_vnnmap(ctdb);
+ first = false;
+ }
+
+ talloc_free(ctdb);
+}
+
+static const char * decode_pnn_mode(uint32_t pnn_mode)
+{
+ int i;
+ static const struct {
+ uint32_t mode;
+ const char *name;
+ } pnn_modes[] = {
+ { CTDB_CURRENT_NODE, "CURRENT_NODE" },
+ { CTDB_BROADCAST_ALL, "BROADCAST_ALL" },
+ { CTDB_BROADCAST_VNNMAP, "BROADCAST_VNNMAP" },
+ { CTDB_BROADCAST_CONNECTED, "BROADCAST_CONNECTED" },
+ { CTDB_MULTICAST, "MULTICAST" },
+ };
+
+ for (i = 0; i < ARRAY_SIZE(pnn_modes); i++) {
+ if (pnn_mode == pnn_modes[i].mode) {
+ return pnn_modes[i].name;
+ }
+ }
+
+ return "PNN";
+}
+
+static void print_nodes(uint32_t *nodes, uint32_t pnn_mode)
+{
+ int i;
+
+ printf("NODES:");
+ for (i = 0; i < talloc_array_length(nodes); i++) {
+ printf(" %lu", (unsigned long) nodes[i]);
+ }
+ printf("\n");
+
+ printf("PNN MODE: %s (%lu)\n",
+ decode_pnn_mode(pnn_mode), (unsigned long) pnn_mode);
+}
+
+static void test_parse_nodestring(const char *nodestring_s,
+ const char *dd_ok_s)
+{
+ const char *nodestring;
+ bool dd_ok;
+ struct ctdb_context *ctdb;
+ uint32_t *nodes;
+ uint32_t pnn_mode;
+
+ nodestring = strcmp("", nodestring_s) == 0 ? NULL : nodestring_s;
+
+ if (strcasecmp(dd_ok_s, "yes") == 0 ||
+ strcmp(dd_ok_s, "true") == 0) {
+ dd_ok = true;
+ } else {
+ dd_ok = false;
+ }
+
+ ctdb = talloc_zero(NULL, struct ctdb_context);
+
+ ctdb_test_stubs_read_nodemap(ctdb);
+
+ if (parse_nodestring(ctdb, NULL, nodestring, CTDB_CURRENT_NODE, dd_ok,
+ &nodes, &pnn_mode)) {
+ print_nodes(nodes, pnn_mode);
+ }
+
+ talloc_free(ctdb);
+}
+
+static void usage(void)
+{
+ fprintf(stderr, "usage: ctdb_tool_functest <op>\n");
+ exit(1);
+}
+
+int main(int argc, const char *argv[])
+{
+ LogLevel = DEBUG_DEBUG;
+ if (getenv("CTDB_TEST_LOGLEVEL")) {
+ LogLevel = atoi(getenv("CTDB_TEST_LOGLEVEL"));
+ }
+
+ if (argc < 2) {
+ usage();
+ }
+
+ if (argc == 2 && strcmp(argv[1], "read_nodemap") == 0) {
+ test_read_nodemap();
+ } else if (argc == 2 && strcmp(argv[1], "read_ifaces") == 0) {
+ test_read_ifaces();
+ } else if (argc == 2 && strcmp(argv[1], "read_vnnmap") == 0) {
+ test_read_vnnmap();
+ } else if (argc == 2 && strcmp(argv[1], "fake_setup") == 0) {
+ test_fake_setup();
+ } else if (argc == 4 && strcmp(argv[1], "parse_nodestring") == 0) {
+ test_parse_nodestring(argv[2], argv[3]);
+ } else {
+ usage();
+ }
+
+ return 0;
+}