/*
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 .
*/
#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 \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;
}