int main(void) { char *root = getenv("srcdir"); DIR *dp; const char *host; char buffer[PATH_MAX]; char key[NKEY]; int idx, i, len; struct dirent *de; VBUCKET_CONFIG_HANDLE vb; unsigned char checksum[16]; unsigned char expected[16]; void *ctx; if (root != NULL) { sprintf(buffer, "%s/tests/config", root); dp = opendir(buffer); if (dp == NULL) { fprintf(stderr, "Skipping ketama check\nFailed to open %s: %s\n", buffer, strerror(errno)); return 0; } while ((de = readdir(dp)) != NULL) { if (strncmp(de->d_name, "ketama", 6) == 0 && strchr(de->d_name, '.') == NULL) { sprintf(buffer, "%s/tests/config/%s", root, de->d_name); fprintf(stderr, "Running ketama test for: %s\n", de->d_name); vb = vbucket_config_parse_file(buffer); assert(vb != NULL); /* check if it conforms to libketama results */ sprintf(buffer, "%s/tests/config/%s.md5sum", root, de->d_name); read_checksum(buffer, expected); memset(checksum, 0, 16); ctx = NULL; for (i = 0; i < 1000000; i++) { len = sprintf(key, "%d", i); vbucket_map(vb, key, len, NULL, &idx); host = vbucket_config_get_server(vb, idx); ctx = hash_md5_update(ctx, host, strlen(host)); } hash_md5_final(ctx, checksum); for (i = 0; i < 16; i++) { assert(checksum[i] == expected[i]); } vbucket_config_destroy(vb); } } closedir(dp); } return 0; }
int main(void) { char *root = getenv("srcdir"); const char *host; char buffer[FILENAME_MAX]; char key[NKEY]; int idx, i, len, ff; VBUCKET_CONFIG_HANDLE vb; unsigned char checksum[16]; unsigned char expected[16]; void *ctx; if (root != NULL) { for (ff = 0; test_cases[ff] != NULL; ++ff) { snprintf(buffer, FILENAME_MAX, "%s/tests/config/%s", root, test_cases[ff]); fprintf(stderr, "Running ketama test for: %s\n", test_cases[ff]); vb = vbucket_config_create(); assert(vbucket_config_parse(vb, LIBVBUCKET_SOURCE_FILE, buffer) == 0); /* check if it conforms to libketama results */ snprintf(buffer, FILENAME_MAX,"%s/tests/config/%s.md5sum", root, test_cases[ff]); read_checksum(buffer, expected); memset(checksum, 0, 16); ctx = NULL; for (i = 0; i < 1000000; i++) { len = snprintf(key, NKEY, "%d", i); vbucket_map(vb, key, len, NULL, &idx); host = vbucket_config_get_server(vb, idx); ctx = hash_md5_update(ctx, host, strlen(host)); } hash_md5_final(ctx, checksum); for (i = 0; i < 16; i++) { assert(checksum[i] == expected[i]); } vbucket_config_destroy(vb); } } exit(EXIT_SUCCESS); }