+/*
+ Look for zero length value problems
+ */
+static test_return user_supplied_bug15(memcached_st *memc)
+{
+ uint32_t x;
+ memcached_return rc;
+ char *key= "mykey";
+ char *value;
+ size_t length;
+ uint32_t flags;
+
+ for (x= 0; x < 2; x++)
+ {
+ rc= memcached_set(memc, key, strlen(key),
+ NULL, 0,
+ (time_t)0, (uint32_t)0);
+
+ assert(rc == MEMCACHED_SUCCESS);
+
+ value= memcached_get(memc, key, strlen(key),
+ &length, &flags, &rc);
+
+ assert(rc == MEMCACHED_SUCCESS);
+ assert(value == NULL);
+ assert(length == 0);
+ assert(flags == 0);
+
+ value= memcached_get(memc, key, strlen(key),
+ &length, &flags, &rc);
+
+ assert(rc == MEMCACHED_SUCCESS);
+ assert(value == NULL);
+ assert(length == 0);
+ assert(flags == 0);
+ }
+
+ return 0;
+}
+
+/* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
+static test_return user_supplied_bug16(memcached_st *memc)
+{
+ memcached_return rc;
+ char *key= "mykey";
+ char *value;
+ size_t length;
+ uint32_t flags;
+
+ rc= memcached_set(memc, key, strlen(key),
+ NULL, 0,
+ (time_t)0, UINT32_MAX);
+
+ assert(rc == MEMCACHED_SUCCESS);
+
+ value= memcached_get(memc, key, strlen(key),
+ &length, &flags, &rc);
+
+ assert(rc == MEMCACHED_SUCCESS);
+ assert(value == NULL);
+ assert(length == 0);
+ assert(flags == UINT32_MAX);
+
+ return 0;
+}
+
+/* Check the validity of chinese key*/
+static 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;
+}
+
+/*
+ From Andrei on IRC
+*/
+
+test_return user_supplied_bug19(memcached_st *memc)
+{
+ memcached_st *m;
+ memcached_server_st *s;
+ memcached_return res;
+
+ (void)memc;
+
+ m= memcached_create(NULL);
+ memcached_server_add_with_weight(m, "localhost", 11311, 100);
+ memcached_server_add_with_weight(m, "localhost", 11312, 100);
+
+ s= memcached_server_by_key(m, "a", 1, &res);
+ memcached_server_free(s);
+
+ memcached_free(m);
+
+ return 0;
+}
+
+#include "ketama_test_cases.h"
+test_return user_supplied_bug18(memcached_st *trash)
+{
+ memcached_return rc;
+ int value;
+ int i;
+ memcached_server_st *server_pool;
+ memcached_st *memc;
+
+ (void)trash;
+
+ memc= memcached_create(NULL);
+ assert(memc);
+
+ 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);
+
+ server_pool = memcached_servers_parse("10.0.1.1:11211 600,10.0.1.2:11211 300,10.0.1.3:11211 200,10.0.1.4:11211 350,10.0.1.5:11211 1000,10.0.1.6:11211 800,10.0.1.7:11211 950,10.0.1.8:11211 100");
+ memcached_server_push(memc, server_pool);
+
+ /* verify that the server list was parsed okay. */
+ assert(memc->number_of_hosts == 8);
+ assert(strcmp(server_pool[0].hostname, "10.0.1.1") == 0);
+ assert(server_pool[0].port == 11211);
+ assert(server_pool[0].weight == 600);
+ assert(strcmp(server_pool[2].hostname, "10.0.1.3") == 0);
+ assert(server_pool[2].port == 11211);
+ assert(server_pool[2].weight == 200);
+ assert(strcmp(server_pool[7].hostname, "10.0.1.8") == 0);
+ assert(server_pool[7].port == 11211);
+ assert(server_pool[7].weight == 100);
+
+ /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
+ * us test the boundary wraparound.
+ */
+ assert(memcached_generate_hash(memc, (char *)"VDEAAAAA", 8) == memc->continuum[0].index);
+
+ /* verify the standard ketama set. */
+ for (i= 0; i < 99; i++)
+ {
+ uint32_t server_idx = memcached_generate_hash(memc, test_cases[i].key, strlen(test_cases[i].key));
+ char *hostname = memc->hosts[server_idx].hostname;
+ assert(strcmp(hostname, test_cases[i].server) == 0);
+ }
+
+ memcached_server_list_free(server_pool);
+ memcached_free(memc);
+
+ return 0;
+}
+
+static test_return result_static(memcached_st *memc)