#include "test.h"
-#define GLOBAL_COUNT 100000
-#define GLOBAL2_COUNT 1000
+#define GLOBAL_COUNT 10000
+#define GLOBAL2_COUNT 100
+#define SERVERS_TO_CREATE 5
static uint32_t global_count;
static pairs_st *global_pairs;
if (setting_value)
assert(rc == MEMCACHED_NOTSTORED || rc == MEMCACHED_STORED);
else
- assert(rc == MEMCACHED_NOTSTORED);
+ assert(rc == MEMCACHED_NOTSTORED || rc == MEMCACHED_DATA_EXISTS);
return 0;
}
assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
}
+ /* Make sure zero length keys are marked as bad */
+ set= 1;
+ rc= memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
+ assert(rc == MEMCACHED_SUCCESS);
+ string= memcached_get(clone, key, 0,
+ &string_length, &flags, &rc);
+ assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
+ assert(string_length == 0);
+ assert(!string);
+
memcached_free(clone);
return 0;
/* We don't test the behavior itself, we test the switches */
test_return behavior_test(memcached_st *memc)
{
- unsigned long long value;
- unsigned int set= 1;
+ uint64_t value;
+ uint32_t set= 1;
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
return 0;
}
+/* Check the validity of chinese key*/
+test_return user_supplied_bug17(memcached_st *memc)
+{
+ memcached_return rc;
+ char *key= "豆瓣";
+ char *value="我们在炎热抑郁的夏天无法停止豆瓣";
+ char *value2;
+ size_t length;
+ uint32_t flags;
+
+ rc= memcached_set(memc, key, strlen(key),
+ value, strlen(value),
+ (time_t)0, 0);
+
+ assert(rc == MEMCACHED_SUCCESS);
+
+ value2= memcached_get(memc, key, strlen(key),
+ &length, &flags, &rc);
+
+ assert(length==strlen(value));
+ assert(rc == MEMCACHED_SUCCESS);
+ assert(memcmp(value, value2, length)==0);
+ free(value2);
+
+ return 0;
+}
+
+
test_return result_static(memcached_st *memc)
{
memcached_result_st result;
return 0;
}
+test_return generate_data_with_stats(memcached_st *memc)
+{
+ memcached_stat_st *stat_p;
+ memcached_return rc;
+ uint32_t host_index= 0;
+ execute_set(memc, global_pairs, global_count);
+
+ //TODO: hosts used size stats
+ stat_p= memcached_stat(memc, NULL, &rc);
+ assert(stat_p);
+
+ for (host_index= 0; host_index < SERVERS_TO_CREATE; host_index++)
+ {
+ printf("\nserver %u|%s|%u bytes: %llu\n", host_index, (memc->hosts)[host_index].hostname, (memc->hosts)[host_index].port, (unsigned long long)(stat_p + host_index)->bytes);
+ }
+
+ memcached_stat_free(NULL, stat_p);
+
+
+ return 0;
+}
test_return generate_buffer_data(memcached_st *memc)
{
int latch= 0;
return MEMCACHED_SUCCESS;
}
+memcached_return pre_behavior_ketama_weighted(memcached_st *memc)
+{
+ memcached_return rc;
+ uint64_t value;
+
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, 1);
+ assert(rc == MEMCACHED_SUCCESS);
+
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED);
+ assert(value == 1);
+
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5);
+ assert(rc == MEMCACHED_SUCCESS);
+
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH);
+ assert(value == MEMCACHED_HASH_MD5);
+ return MEMCACHED_SUCCESS;
+}
+
+memcached_return pre_binary(memcached_st *memc)
+{
+ memcached_return rc= MEMCACHED_FAILURE;
+ memcached_st *clone;
+
+ clone= memcached_clone(NULL, memc);
+ assert(clone);
+ // The memcached_version needs to be done on a clone, because the server
+ // will not toggle protocol on an connection.
+ memcached_version(clone);
+
+ if (clone->hosts[0].major_version >= 1 && clone->hosts[0].minor_version > 2)
+ {
+ rc = memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
+ assert(rc == MEMCACHED_SUCCESS);
+ assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1);
+ }
+
+ memcached_free(clone);
+ return rc;
+}
+
void my_free(memcached_st *ptr, void *mem)
{
free(mem);
return MEMCACHED_SUCCESS;
}
-memcached_return enable_wheel(memcached_st *memc)
-{
- memcached_server_distribution value= MEMCACHED_DISTRIBUTION_CONSISTENT_WHEEL;
- memcached_hash hash;
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
- pre_hsieh(memc);
-
- value= (memcached_server_distribution)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
- assert(value == MEMCACHED_DISTRIBUTION_CONSISTENT_WHEEL);
-
- hash= (memcached_hash)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
- assert(hash == MEMCACHED_HASH_HSIEH);
-
-
- return MEMCACHED_SUCCESS;
-}
-
memcached_return enable_consistent(memcached_st *memc)
{
memcached_server_distribution value= MEMCACHED_DISTRIBUTION_CONSISTENT;
memcached_version(memc);
- if (memc->hosts[0].major_version >= 1 &&
- memc->hosts[0].minor_version >= 2 &&
- memc->hosts[0].micro_version >= 4)
+ if ((memc->hosts[0].major_version >= 1 && (memc->hosts[0].minor_version == 2 && memc->hosts[0].micro_version >= 4))
+ || memc->hosts[0].minor_version > 2)
{
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, set);
{
memcached_version(memc);
- if (memc->hosts[0].major_version >= 1 &&
- memc->hosts[0].minor_version >= 2 &&
- memc->hosts[0].micro_version >= 4)
+ if ((memc->hosts[0].major_version >= 1 && (memc->hosts[0].minor_version == 2 && memc->hosts[0].micro_version >= 4))
+ || memc->hosts[0].minor_version > 2)
return MEMCACHED_SUCCESS;
return MEMCACHED_FAILURE;
return MEMCACHED_SUCCESS;
}
+memcached_return pre_settimer(memcached_st *memc)
+{
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, 1000);
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, 1000);
+
+ return MEMCACHED_SUCCESS;
+}
+
memcached_return poll_timeout(memcached_st *memc)
{
int32_t timeout;
{"user_supplied_bug14", 1, user_supplied_bug14 },
{"user_supplied_bug15", 1, user_supplied_bug15 },
{"user_supplied_bug16", 1, user_supplied_bug16 },
+ {"user_supplied_bug17", 1, user_supplied_bug17 },
{0, 0, 0}
};
{0, 0, 0}
};
+test_st consistent_weighted_tests[] ={
+ {"generate_pairs", 1, generate_pairs },
+ {"generate_data", 1, generate_data_with_stats },
+ {"get_read", 0, get_read_count },
+ {"cleanup", 1, cleanup_pairs },
+ {0, 0, 0}
+};
+
collection_st collection[] ={
{"block", 0, 0, tests},
+ {"binary", pre_binary, 0, tests},
{"nonblock", pre_nonblock, 0, tests},
{"nodelay", pre_nodelay, 0, tests},
+ {"settimer", pre_settimer, 0, tests},
{"md5", pre_md5, 0, tests},
{"crc", pre_crc, 0, tests},
{"hsieh", pre_hsieh, 0, tests},
{"poll_timeout", poll_timeout, 0, tests},
{"gets", enable_cas, 0, tests},
{"consistent", enable_consistent, 0, tests},
- {"wheel", enable_wheel, 0, tests},
{"memory_allocators", set_memory_alloc, 0, tests},
{"prefix", set_prefix, 0, tests},
// {"udp", pre_udp, 0, tests},
{"generate_nonblock", pre_nonblock, 0, generate_tests},
{"consistent_not", 0, 0, consistent_tests},
{"consistent_ketama", pre_behavior_ketama, 0, consistent_tests},
- {"consistent_wheel", enable_wheel, 0, consistent_tests},
+ {"consistent_ketama_weighted", pre_behavior_ketama_weighted, 0, consistent_weighted_tests},
{0, 0, 0, 0}
};