Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

320 lines (266 sloc) 10.144 kb
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <strings.h>
#include <libvbucket/vbucket.h>
#include "macros.h"
struct key_st {
char *key;
int vbucket;
};
static const struct key_st keys[] =
{
{ "hello", 0 },
{ "doctor", 0 },
{ "name", 3 },
{ "continue", 3 },
{ "yesterday", 0 },
{ "tomorrow", 1 },
{ "another key", 2 },
{ NULL, -1 }
};
static const char *servers[] = { "server1:11211",
"server2:11210",
"server3:11211" };
struct vb_st {
int master;
int replicas[2];
};
static const struct vb_st vbuckets[] =
{
{ 0, { 1, 2 } },
{ 1, { 2, 0 } },
{ 2, { 1, -1 } },
{ 1, { 2, 0 } }
};
static char *configPath(const char *fname) {
static char buffer[FILENAME_MAX];
const char *root = getenv("CMAKE_CURRENT_SOURCE_DIR");
struct stat st;
if (root == NULL) {
root = ".";
}
snprintf(buffer, FILENAME_MAX, "%s/tests/config/testapp-%s",
root, fname);
if (stat(buffer, &st) == -1) {
snprintf(buffer, FILENAME_MAX, "%s/tests/config/%s", root, fname);
if (stat(buffer, &st) == -1) {
fprintf(stderr, "cannot find config %s\n", fname);
abort();
}
}
return buffer;
}
static void testConfig(const char *fname) {
int whoops = 0;
const struct key_st *k;
int i = 0;
VBUCKET_CONFIG_HANDLE vb = vbucket_config_parse_file(configPath(fname));
if (vb == NULL) {
fprintf(stderr, "vbucket_config_parse_file error: %s\n",
vbucket_get_error());
abort();
}
while ((k = &keys[i++])->key != NULL) {
int id = vbucket_get_vbucket_by_key(vb, k->key, strlen(k->key));
if (id != k->vbucket) {
fprintf(stderr, "Expected vbucket %d for key '%s' but got %d\n",
k->vbucket, k->key, id);
whoops = 1;
}
}
if (whoops) {
abort();
}
assert(vbucket_config_get_num_servers(vb) == 3 || vbucket_config_get_num_servers(vb) == 4);
assert(vbucket_config_get_num_replicas(vb) == 2);
for (i = 0; i < 3; ++i) {
assert(strcmp(vbucket_config_get_server(vb, i), servers[i]) == 0);
}
for (i = 0; i < 4; ++i) {
assert(vbucket_get_master(vb, i) == vbuckets[i].master);
assert(vbucket_get_replica(vb, i, 0) == vbuckets[i].replicas[0]);
assert(vbucket_get_replica(vb, i, 1) == vbuckets[i].replicas[1]);
}
assert(vbucket_config_get_user(vb) == NULL);
assert(vbucket_config_get_password(vb) == NULL);
vbucket_config_destroy(vb);
}
static void testWrongServer(const char *fname) {
VBUCKET_CONFIG_HANDLE vb = vbucket_config_parse_file(configPath(fname));
if (vb == NULL) {
fprintf(stderr, "vbucket_config_parse_file error: %s\n",
vbucket_get_error());
abort();
}
/* Starts at 0 */
assert(vbucket_get_master(vb, 0) == 0);
/* Does not change when I told it I found the wrong thing */
assert(vbucket_found_incorrect_master(vb, 0, 1) == 0);
assert(vbucket_get_master(vb, 0) == 0);
/* Does change if I tell it I got the right thing and it was wrong. */
assert(vbucket_found_incorrect_master(vb, 0, 0) == 1);
assert(vbucket_get_master(vb, 0) == 1);
/* ...and again */
assert(vbucket_found_incorrect_master(vb, 0, 1) == 2);
assert(vbucket_get_master(vb, 0) == 2);
/* ...and then wraps */
assert(vbucket_found_incorrect_master(vb, 0, 2) == 0);
assert(vbucket_get_master(vb, 0) == 0);
vbucket_config_destroy(vb);
}
static void testWrongNumVbuckets(const char *fname) {
VBUCKET_CONFIG_HANDLE vb = vbucket_config_create();
assert(vb != NULL);
assert(vbucket_config_parse(vb, LIBVBUCKET_SOURCE_FILE, configPath(fname)) != 0);
assert(strcmp(vbucket_get_error_message(vb),
"Number of vBuckets must be a power of two > 0 and <= 65536") == 0);
vbucket_config_destroy(vb);
}
static void testWrongServerFFT(const char *fname) {
VBUCKET_CONFIG_HANDLE vb = vbucket_config_parse_file(configPath(fname));
int rv = 0;
int nvb = 0;
int i = 0;
if (vb == NULL) {
fprintf(stderr, "vbucket_config_parse_file error: %s\n",
vbucket_get_error());
abort();
}
/* found incorrect master should not be the same as get master now */
nvb = vbucket_config_get_num_vbuckets(vb);
for (i = 0; i < nvb; i++) {
rv = vbucket_get_master(vb, i);
assert(rv != vbucket_found_incorrect_master(vb, i, rv));
}
/* the ideal test case should be that we check that the vbucket */
/* and the fvbucket map are identical at this point. TODO untill */
/* we have a vbucketlib function that diffs vbuckets and fvbuckets */
vbucket_config_destroy(vb);
}
static void testConfigDiff(void) {
VBUCKET_CONFIG_HANDLE vb1 = vbucket_config_parse_file(configPath("config-diff1"));
VBUCKET_CONFIG_HANDLE vb2 = vbucket_config_parse_file(configPath("config-diff2"));
VBUCKET_CONFIG_DIFF *diff;
assert(vb2);
diff = vbucket_compare(vb1, vb2);
assert(vb1);
assert(diff);
assert(diff->sequence_changed);
assert(diff->n_vb_changes == 1);
assert(strcmp(diff->servers_added[0], "server4:11211") == 0);
assert(diff->servers_added[1] == NULL);
assert(strcmp(diff->servers_removed[0], "server3:11211") == 0);
assert(diff->servers_removed[1] == NULL);
vbucket_free_diff(diff);
vbucket_config_destroy(vb2);
vb2 = vbucket_config_parse_file(configPath("config-diff3"));
assert(vb2);
diff = vbucket_compare(vb1, vb2);
assert(diff);
assert(diff->sequence_changed);
assert(diff->n_vb_changes == -1);
assert(diff->servers_added[0] == NULL);
assert(strcmp(diff->servers_removed[0], "server3:11211") == 0);
assert(diff->servers_removed[1] == NULL);
}
static void testConfigDiffSame(void) {
VBUCKET_CONFIG_HANDLE vb1 = vbucket_config_parse_file(configPath("config"));
VBUCKET_CONFIG_HANDLE vb2 = vbucket_config_parse_file(configPath("config"));
VBUCKET_CONFIG_DIFF *diff;
assert(vb1);
assert(vb2);
diff = vbucket_compare(vb1, vb2);
assert(diff);
assert(diff->sequence_changed == 0);
assert(diff->n_vb_changes == 0);
assert(diff->servers_added[0] == NULL);
assert(diff->servers_removed[0] == NULL);
vbucket_free_diff(diff);
vbucket_config_destroy(vb1);
vbucket_config_destroy(vb2);
}
static void testConfigDiffKetamaSame(void) {
VBUCKET_CONFIG_HANDLE vb1 = vbucket_config_parse_file(configPath("ketama-eight-nodes"));
VBUCKET_CONFIG_HANDLE vb2 = vbucket_config_parse_file(configPath("ketama-ordered-eight-nodes"));
VBUCKET_CONFIG_DIFF *diff;
assert(vb1);
assert(vb2);
diff = vbucket_compare(vb1, vb2);
assert(diff);
assert(diff->sequence_changed == 0);
assert(diff->n_vb_changes == 0);
assert(diff->servers_added[0] == NULL);
assert(diff->servers_removed[0] == NULL);
vbucket_free_diff(diff);
vbucket_config_destroy(vb1);
vbucket_config_destroy(vb2);
}
static void testConfigUserPassword(void) {
VBUCKET_CONFIG_HANDLE vb1;
VBUCKET_CONFIG_HANDLE vb2;
VBUCKET_CONFIG_DIFF *diff;
vb1 = vbucket_config_parse_file(configPath("config-user-password1"));
assert(vb1);
assert(strcmp(vbucket_config_get_user(vb1), "theUser") == 0);
assert(strcmp(vbucket_config_get_password(vb1), "thePassword") == 0);
vb2 = vbucket_config_parse_file(configPath("config-user-password2"));
assert(vb2);
assert(strcmp(vbucket_config_get_user(vb2), "theUserIsDifferent") == 0);
assert(strcmp(vbucket_config_get_password(vb2), "thePasswordIsDifferent") == 0);
diff = vbucket_compare(vb1, vb2);
assert(diff);
assert(diff->sequence_changed);
assert(diff->n_vb_changes == 0);
assert(diff->servers_added[0] == NULL);
assert(diff->servers_removed[0] == NULL);
vbucket_free_diff(diff);
diff = vbucket_compare(vb1, vb1);
assert(diff);
assert(diff->sequence_changed == 0);
assert(diff->n_vb_changes == 0);
assert(diff->servers_added[0] == NULL);
assert(diff->servers_removed[0] == NULL);
vbucket_free_diff(diff);
vbucket_config_destroy(vb1);
vbucket_config_destroy(vb2);
}
static void testConfigCouchApiBase(void)
{
VBUCKET_CONFIG_HANDLE vb = vbucket_config_parse_file(configPath("config-couch-api-base"));
assert(vb);
assert(strcmp(vbucket_config_get_couch_api_base(vb, 0), "http://192.168.2.123:9500/default") == 0);
assert(strcmp(vbucket_config_get_couch_api_base(vb, 1), "http://192.168.2.123:9501/default") == 0);
assert(strcmp(vbucket_config_get_couch_api_base(vb, 2), "http://192.168.2.123:9502/default") == 0);
assert(strcmp(vbucket_config_get_rest_api_server(vb, 0), "192.168.2.123:9000") == 0);
assert(strcmp(vbucket_config_get_rest_api_server(vb, 1), "192.168.2.123:9001") == 0);
assert(strcmp(vbucket_config_get_rest_api_server(vb, 2), "192.168.2.123:9002") == 0);
assert(strcmp(vbucket_config_get_server(vb, 0), "192.168.2.123:12000") == 0);
assert(strcmp(vbucket_config_get_server(vb, 1), "192.168.2.123:12002") == 0);
assert(strcmp(vbucket_config_get_server(vb, 2), "192.168.2.123:12004") == 0);
}
int main(int argc, char **argv)
{
char buffer[1024];
if (argc > 1 && getenv("CMAKE_CURRENT_SOURCE_DIR") == NULL) {
snprintf(buffer, sizeof(buffer), "CMAKE_CURRENT_SOURCE_DIR=%s",
argv[1]);
putenv(buffer);
}
testConfig("config");
testConfig("config-flat");
testConfig("config-in-envelope");
testConfig("config-in-envelope2");
testConfig("config-in-envelope-fft");
testWrongServer("config");
testWrongServerFFT("config-in-envelope-fft");
testWrongNumVbuckets("config-wrong-num-vbuckets");
testConfigDiff();
testConfigDiffSame();
testConfigUserPassword();
testConfigCouchApiBase();
testConfigDiffKetamaSame();
exit(EXIT_SUCCESS);
}
Jump to Line
Something went wrong with that request. Please try again.