static const char *global_keys[GLOBAL_COUNT];
static size_t global_keys_length[GLOBAL_COUNT];
+// Prototype
+static test_return_t pre_binary(memcached_st *memc);
+
+
static test_return_t init_test(memcached_st *not_used __attribute__((unused)))
{
memcached_st memc;
servers= memcached_servers_parse(server_string);
rc= memcached_server_push(memc, servers);
+ memcached_server_list_free(servers);
callbacks[0]= server_print_callback;
memcached_server_cursor(memc, callbacks, NULL, 1);
uint32_t number_of_hosts= memc->number_of_hosts;
memc->number_of_hosts= 1;
- size_t max_keys= binary ? 20480 : 1;
+ size_t max_keys= 20480;
char **keys= calloc(max_keys, sizeof(char*));
/* First add all of the items.. */
char blob[1024] = {0};
memcached_return_t rc;
+
for (size_t x= 0; x < max_keys; ++x)
{
char k[251];
rc= memcached_mget_execute(memc, (const char**)keys, key_length,
max_keys, callbacks, &counter, 1);
- if (binary)
+ if (rc == MEMCACHED_SUCCESS)
{
- test_true(rc == MEMCACHED_SUCCESS);
-
+ test_true(binary);
rc= memcached_fetch_execute(memc, callbacks, (void *)&counter, 1);
test_true(rc == MEMCACHED_END);
/* Verify that we got all of the items */
test_true(counter == max_keys);
}
- else
+ else if (rc == MEMCACHED_NOT_SUPPORTED)
{
- test_true(rc == MEMCACHED_NOT_SUPPORTED);
test_true(counter == 0);
}
+ else
+ {
+ test_fail("note: this test functions differently when in binary mode");
+ }
/* Release all allocated resources */
for (size_t x= 0; x < max_keys; ++x)
return TEST_SUCCESS;
}
+#define REGRESSION_BINARY_VS_BLOCK_COUNT 20480
+
+static test_return_t key_setup(memcached_st *memc)
+{
+ (void)memc;
+
+ if (pre_binary(memc) != TEST_SUCCESS)
+ return TEST_SKIPPED;
+
+ global_pairs= pairs_generate(REGRESSION_BINARY_VS_BLOCK_COUNT, 0);
+
+ return TEST_SUCCESS;
+}
+
+static test_return_t key_teardown(memcached_st *memc)
+{
+ (void)memc;
+ pairs_free(global_pairs);
+
+ return TEST_SUCCESS;
+}
+
+static test_return_t block_add_regression(memcached_st *memc)
+{
+ /* First add all of the items.. */
+ for (size_t x= 0; x < REGRESSION_BINARY_VS_BLOCK_COUNT; ++x)
+ {
+ memcached_return_t rc;
+ char blob[1024] = {0};
+
+ rc= memcached_add_by_key(memc, "bob", 3, global_pairs[x].key, global_pairs[x].key_length, blob, sizeof(blob), 0, 0);
+ test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
+ }
+
+ return TEST_SUCCESS;
+}
+
+static test_return_t binary_add_regression(memcached_st *memc)
+{
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
+ test_return_t rc= block_add_regression(memc);
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0);
+ return rc;
+}
+
static test_return_t get_stats_keys(memcached_st *memc)
{
char **stat_list;
return TEST_SUCCESS;
}
+
+static test_return_t MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test(memcached_st *memc)
+{
+ memcached_return_t rc;
+ bool set= true;
+ bool value;
+
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, set);
+ test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_NOT_SUPPORTED);
+
+ value= (bool)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE);
+
+ if (rc == MEMCACHED_SUCCESS)
+ {
+ test_true((bool)value == set);
+ }
+ else
+ {
+ test_false((bool)value == set);
+ }
+
+ return TEST_SUCCESS;
+}
+
+
+static test_return_t MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test(memcached_st *memc)
+{
+ memcached_return_t rc;
+ bool set= true;
+ bool value;
+
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE, set);
+ test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_NOT_SUPPORTED);
+
+ value= (bool)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE);
+
+ if (rc == MEMCACHED_SUCCESS)
+ {
+ test_true((bool)value == set);
+ }
+ else
+ {
+ test_false((bool)value == set);
+ }
+
+ return TEST_SUCCESS;
+}
+
static test_return_t fetch_all_results(memcached_st *memc)
{
memcached_return_t rc= MEMCACHED_SUCCESS;
server= memcached_server_by_key(memc, "a", 1, &res);
+ memcached_free(memc);
+
return TEST_SUCCESS;
}
return TEST_SUCCESS;
}
-static test_return_t pre_binary(memcached_st *memc);
-
static test_return_t user_supplied_bug21(memcached_st *memc)
{
test_return_t test_rc;
for (size_t x= 0; x < 99; x++)
{
memcached_autoeject(memc);
- uint32_t server_idx = memcached_generate_hash(memc, ketama_test_cases[x].key, strlen(ketama_test_cases[x].key));
+ uint32_t server_idx= memcached_generate_hash(memc, ketama_test_cases[x].key, strlen(ketama_test_cases[x].key));
test_true(server_idx != 2);
}
const char *keys[]= { "key1", "key2", "key3", "key4", "key5", "key6", "key7" };
size_t len[]= { 4, 4, 4, 4, 4, 4, 4 };
- for (int x=0; x< 7; ++x)
+ for (size_t x= 0; x< 7; ++x)
{
rc= memcached_set(memc, keys[x], len[x], "1", 1, 0, 0);
test_true(rc == MEMCACHED_SUCCESS);
static test_return_t murmur_run (memcached_st *memc __attribute__((unused)))
{
-#ifdef __sparc
+#ifdef WORDS_BIGENDIAN
return TEST_SKIPPED;
#else
uint32_t x;
const char *key= "marmotte";
const char *value= "milka";
+ memcached_reset_last_disconnected_server(memc);
rc= memcached_set(memc, key, strlen(key),
value, strlen(value),
(time_t)0, (uint32_t)0);
(time_t)0, (uint32_t)0);
test_true(rc != MEMCACHED_SUCCESS);
- disconnected_server = memcached_server_get_last_disconnect(mine);
+ disconnected_server= memcached_server_get_last_disconnect(mine);
+ if (disconnected_server == NULL)
+ {
+ fprintf(stderr, "RC %s\n", memcached_strerror(mine, rc));
+ abort();
+ }
test_true(disconnected_server != NULL);
test_true(memcached_server_port(disconnected_server)== 9);
test_true(strncmp(memcached_server_name(disconnected_server),"localhost",9) == 0);
return TEST_SUCCESS;
}
+static test_return_t test_verbosity(memcached_st *memc)
+{
+ memcached_verbosity(memc, 3);
+
+ return TEST_SUCCESS;
+}
+
+static test_return_t test_server_failure(memcached_st *memc)
+{
+ memcached_st *local_memc;
+ memcached_server_instance_st instance= memcached_server_instance_by_position(memc, 0);
+
+ local_memc= memcached_create(NULL);
+
+ memcached_server_add(local_memc, memcached_server_name(instance), memcached_server_port(instance));
+ memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, 2);
+
+ uint32_t server_count= memcached_server_count(local_memc);
+
+ test_true(server_count == 1);
+
+ // Disable the server
+ instance= memcached_server_instance_by_position(local_memc, 0);
+ ((memcached_server_write_instance_st)instance)->server_failure_counter= 2;
+
+ memcached_return_t rc;
+ rc= memcached_set(local_memc, "foo", strlen("foo"),
+ NULL, 0,
+ (time_t)0, (uint32_t)0);
+ test_true(rc == MEMCACHED_SERVER_MARKED_DEAD);
+
+ ((memcached_server_write_instance_st)instance)->server_failure_counter= 0;
+ rc= memcached_set(local_memc, "foo", strlen("foo"),
+ NULL, 0,
+ (time_t)0, (uint32_t)0);
+ test_true(rc == MEMCACHED_SUCCESS);
+
+
+ memcached_free(local_memc);
+
+ return TEST_SUCCESS;
+}
+
+static test_return_t test_cull_servers(memcached_st *memc)
+{
+ uint32_t count = memcached_server_count(memc);
+
+ // Do not do this in your code, it is not supported.
+ memc->servers[1].state.is_dead= true;
+ memc->state.is_time_for_rebuild= true;
+
+ uint32_t new_count= memcached_server_count(memc);
+ test_true(count == new_count);
+
+#if 0
+ test_true(count == new_count + 1 );
+#endif
+
+ return TEST_SUCCESS;
+}
+
/*
* This test ensures that the failure counter isn't incremented during
* normal termination of the memcached instance.
return TEST_SUCCESS;
}
+static void memcached_die(memcached_st* mc, memcached_return error, const char* what, uint32_t it)
+{
+ fprintf(stderr, "Iteration #%u: ", it);
+
+ if(error == MEMCACHED_ERRNO)
+ {
+ fprintf(stderr, "system error %d from %s: %s\n",
+ errno, what, strerror(errno));
+ }
+ else
+ {
+ fprintf(stderr, "error %d from %s: %s\n", error, what,
+ memcached_strerror(mc, error));
+ }
+}
+
+#define TEST_CONSTANT_CREATION 200
+
+static test_return_t regression_bug_(memcached_st *memc)
+{
+ const char *remote_server;
+ (void)memc;
+
+ if (! (remote_server= getenv("LIBMEMCACHED_REMOTE_SERVER")))
+ {
+ return TEST_SKIPPED;
+ }
+
+ for (uint32_t x= 0; x < TEST_CONSTANT_CREATION; x++)
+ {
+ memcached_st* mc= memcached_create(NULL);
+ memcached_return rc;
+
+ rc= memcached_behavior_set(mc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
+ if (rc != MEMCACHED_SUCCESS)
+ {
+ memcached_die(mc, rc, "memcached_behavior_set", x);
+ }
+
+ rc= memcached_behavior_set(mc, MEMCACHED_BEHAVIOR_CACHE_LOOKUPS, 1);
+ if (rc != MEMCACHED_SUCCESS)
+ {
+ memcached_die(mc, rc, "memcached_behavior_set", x);
+ }
+
+ rc= memcached_server_add(mc, remote_server, 0);
+ if (rc != MEMCACHED_SUCCESS)
+ {
+ memcached_die(mc, rc, "memcached_server_add", x);
+ }
+
+ const char *set_key= "akey";
+ const size_t set_key_len= strlen(set_key);
+ const char *set_value= "a value";
+ const size_t set_value_len= strlen(set_value);
+
+ if (rc == MEMCACHED_SUCCESS)
+ {
+ if (x > 0)
+ {
+ size_t get_value_len;
+ char *get_value;
+ uint32_t get_value_flags;
+
+ get_value= memcached_get(mc, set_key, set_key_len, &get_value_len,
+ &get_value_flags, &rc);
+ if (rc != MEMCACHED_SUCCESS)
+ {
+ memcached_die(mc, rc, "memcached_get", x);
+ }
+ else
+ {
+
+ if (x != 0 &&
+ (get_value_len != set_value_len
+ || 0!=strncmp(get_value, set_value, get_value_len)))
+ {
+ fprintf(stderr, "Values don't match?\n");
+ rc= MEMCACHED_FAILURE;
+ }
+ free(get_value);
+ }
+ }
+
+ rc= memcached_set(mc,
+ set_key, set_key_len,
+ set_value, set_value_len,
+ 0, /* time */
+ 0 /* flags */
+ );
+ if (rc != MEMCACHED_SUCCESS)
+ {
+ memcached_die(mc, rc, "memcached_set", x);
+ }
+ }
+
+ memcached_quit(mc);
+ memcached_free(mc);
+
+ if (rc != MEMCACHED_SUCCESS)
+ {
+ break;
+ }
+ }
+
+ return MEMCACHED_SUCCESS;
+}
+
/*
* Test that the sasl authentication works. We cannot use the default
* pool of servers, because that would require that all servers we want
{"connectionpool", 1, (test_callback_fn)connection_pool_test },
#endif
{"test_get_last_disconnect", 1, (test_callback_fn)test_get_last_disconnect},
+ {"verbosity", 1, (test_callback_fn)test_verbosity},
+ {"test_server_failure", 1, (test_callback_fn)test_server_failure},
+ {"cull_servers", 1, (test_callback_fn)test_cull_servers},
{0, 0, 0}
};
test_st behavior_tests[] ={
{"behavior_test", 0, (test_callback_fn)behavior_test},
{"MEMCACHED_BEHAVIOR_CORK", 0, (test_callback_fn)MEMCACHED_BEHAVIOR_CORK_test},
+ {"MEMCACHED_BEHAVIOR_TCP_KEEPALIVE", 0, (test_callback_fn)MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test},
+ {"MEMCACHED_BEHAVIOR_TCP_KEEPIDLE", 0, (test_callback_fn)MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test},
+ {0, 0, 0}
+};
+
+test_st regression_binary_vs_block[] ={
+ {"block add", 1, (test_callback_fn)block_add_regression},
+ {"binary add", 1, (test_callback_fn)binary_add_regression},
{0, 0, 0}
};
test_st regression_tests[]= {
{"lp:434484", 1, (test_callback_fn)regression_bug_434484 },
{"lp:434843", 1, (test_callback_fn)regression_bug_434843 },
- {"lp:434843 buffered", 1, (test_callback_fn)regression_bug_434843_buffered },
+ {"lp:434843-buffered", 1, (test_callback_fn)regression_bug_434843_buffered },
{"lp:421108", 1, (test_callback_fn)regression_bug_421108 },
{"lp:442914", 1, (test_callback_fn)regression_bug_442914 },
{"lp:447342", 1, (test_callback_fn)regression_bug_447342 },
{"lp:463297", 1, (test_callback_fn)regression_bug_463297 },
{"lp:490486", 1, (test_callback_fn)regression_bug_490486 },
+ {"lp:?", 1, (test_callback_fn)regression_bug_ },
{0, 0, (test_callback_fn)0}
};
{"replication_noblock", (test_callback_fn)pre_replication_noblock, 0, replication_tests},
{"regression", 0, 0, regression_tests},
{"behaviors", 0, 0, behavior_tests},
+ {"regression_binary_vs_block", (test_callback_fn)key_setup, (test_callback_fn)key_teardown, regression_binary_vs_block},
{0, 0, 0, 0}
};