Import new purge work from trond
[awesomized/libmemcached] / tests / function.c
index 0b2c15d480035539fedb8bb3a2deadf9cb76552e..7ec22d4cdb38bdb97e0f68ad3e01564816c1e2d4 100644 (file)
@@ -33,7 +33,7 @@ static pairs_st *global_pairs;
 static char *global_keys[GLOBAL_COUNT];
 static size_t global_keys_length[GLOBAL_COUNT];
 
-test_return init_test(memcached_st *not_used)
+static test_return  init_test(memcached_st *not_used __attribute__((unused)))
 {
   memcached_st memc;
 
@@ -43,18 +43,18 @@ test_return init_test(memcached_st *not_used)
   return 0;
 }
 
-test_return server_list_null_test(memcached_st *ptr)
+static test_return  server_list_null_test(memcached_st *ptr __attribute__((unused)))
 {
   memcached_server_st *server_list;
   memcached_return rc;
 
-  server_list= memcached_server_list_append(NULL, NULL, 0, NULL);
+  server_list= memcached_server_list_append_with_weight(NULL, NULL, 0, 0, NULL);
   assert(server_list == NULL);
 
-  server_list= memcached_server_list_append(NULL, "localhost", 0, NULL);
+  server_list= memcached_server_list_append_with_weight(NULL, "localhost", 0, 0, NULL);
   assert(server_list == NULL);
 
-  server_list= memcached_server_list_append(NULL, NULL, 0, &rc);
+  server_list= memcached_server_list_append_with_weight(NULL, NULL, 0, 0, &rc);
   assert(server_list == NULL);
 
   return 0;
@@ -63,7 +63,7 @@ test_return server_list_null_test(memcached_st *ptr)
 #define TEST_PORT_COUNT 7
 uint32_t test_ports[TEST_PORT_COUNT];
 
-memcached_return server_display_function(memcached_st *ptr, memcached_server_st *server, void *context)
+static memcached_return  server_display_function(memcached_st *ptr __attribute__((unused)), memcached_server_st *server, void *context)
 {
   /* Do Nothing */
   uint32_t bigger= *((uint32_t *)(context));
@@ -73,9 +73,9 @@ memcached_return server_display_function(memcached_st *ptr, memcached_server_st
   return MEMCACHED_SUCCESS;
 }
 
-test_return server_sort_test(memcached_st *ptr)
+static test_return  server_sort_test(memcached_st *ptr __attribute__((unused)))
 {
-  uint8_t x;
+  uint32_t x;
   uint32_t bigger= 0; /* Prime the value for the assert in server_display_function */
   memcached_return rc;
   memcached_server_function callbacks[1];
@@ -88,8 +88,8 @@ test_return server_sort_test(memcached_st *ptr)
   for (x= 0; x < TEST_PORT_COUNT; x++)
   {
     test_ports[x]= random() % 64000;
-    rc= memcached_server_add(local_memc, "localhost", test_ports[x]);
-    assert(local_memc->number_of_hosts == x+1);
+    rc= memcached_server_add_with_weight(local_memc, "localhost", test_ports[x], 0);
+    assert(local_memc->number_of_hosts == x + 1);
     assert(local_memc->hosts[0].count == x+1);
     assert(rc == MEMCACHED_SUCCESS);
   }
@@ -103,7 +103,7 @@ test_return server_sort_test(memcached_st *ptr)
   return 0;
 }
 
-test_return server_sort2_test(memcached_st *ptr)
+static test_return  server_sort2_test(memcached_st *ptr __attribute__((unused)))
 {
   uint32_t bigger= 0; /* Prime the value for the assert in server_display_function */
   memcached_return rc;
@@ -115,11 +115,11 @@ test_return server_sort2_test(memcached_st *ptr)
   rc= memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_SORT_HOSTS, 1);
   assert(rc == MEMCACHED_SUCCESS);
 
-  rc= memcached_server_add(local_memc, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43043);
+  rc= memcached_server_add_with_weight(local_memc, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43043, 0);
   assert(rc == MEMCACHED_SUCCESS);
   assert(local_memc->hosts[0].port == 43043);
 
-  rc= memcached_server_add(local_memc, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43042);
+  rc= memcached_server_add_with_weight(local_memc, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43042, 0);
   assert(rc == MEMCACHED_SUCCESS);
   assert(local_memc->hosts[0].port == 43042);
   assert(local_memc->hosts[1].port == 43043);
@@ -133,7 +133,7 @@ test_return server_sort2_test(memcached_st *ptr)
   return 0;
 }
 
-memcached_return server_display_unsort_function(memcached_st *ptr, memcached_server_st *server, void *context)
+static memcached_return  server_display_unsort_function(memcached_st *ptr __attribute__((unused)), memcached_server_st *server, void *context)
 {
   /* Do Nothing */
   uint32_t x= *((uint32_t *)(context));
@@ -144,9 +144,9 @@ memcached_return server_display_unsort_function(memcached_st *ptr, memcached_ser
   return MEMCACHED_SUCCESS;
 }
 
-test_return server_unsort_test(memcached_st *ptr)
+static test_return  server_unsort_test(memcached_st *ptr __attribute__((unused)))
 {
-  uint8_t x;
+  uint32_t x;
   uint32_t counter= 0; /* Prime the value for the assert in server_display_function */
   uint32_t bigger= 0; /* Prime the value for the assert in server_display_function */
   memcached_return rc;
@@ -159,7 +159,7 @@ test_return server_unsort_test(memcached_st *ptr)
   for (x= 0; x < TEST_PORT_COUNT; x++)
   {
     test_ports[x]= random() % 64000;
-    rc= memcached_server_add(local_memc, "localhost", test_ports[x]);
+    rc= memcached_server_add_with_weight(local_memc, "localhost", test_ports[x], 0);
     assert(local_memc->number_of_hosts == x+1);
     assert(local_memc->hosts[0].count == x+1);
     assert(rc == MEMCACHED_SUCCESS);
@@ -179,7 +179,7 @@ test_return server_unsort_test(memcached_st *ptr)
   return 0;
 }
 
-test_return allocation_test(memcached_st *not_used)
+static test_return  allocation_test(memcached_st *not_used __attribute__((unused)))
 {
   memcached_st *memc;
   memc= memcached_create(NULL);
@@ -189,7 +189,7 @@ test_return allocation_test(memcached_st *not_used)
   return 0;
 }
 
-test_return clone_test(memcached_st *memc)
+static test_return  clone_test(memcached_st *memc)
 {
   /* All null? */
   {
@@ -211,6 +211,7 @@ test_return clone_test(memcached_st *memc)
   {
     memcached_st declared_clone;
     memcached_st *clone;
+    memset(&declared_clone, 0 , sizeof(memcached_st));
     clone= memcached_clone(&declared_clone, NULL);
     assert(clone);
     memcached_free(clone);
@@ -220,6 +221,7 @@ test_return clone_test(memcached_st *memc)
   {
     memcached_st declared_clone;
     memcached_st *clone;
+    memset(&declared_clone, 0 , sizeof(memcached_st));
     clone= memcached_clone(&declared_clone, memc);
     assert(clone);
     memcached_free(clone);
@@ -228,17 +230,17 @@ test_return clone_test(memcached_st *memc)
   return 0;
 }
 
-test_return connection_test(memcached_st *memc)
+static test_return  connection_test(memcached_st *memc)
 {
   memcached_return rc;
 
-  rc= memcached_server_add(memc, "localhost", 0);
+  rc= memcached_server_add_with_weight(memc, "localhost", 0, 0);
   assert(rc == MEMCACHED_SUCCESS);
 
   return 0;
 }
 
-test_return error_test(memcached_st *memc)
+static test_return  error_test(memcached_st *memc)
 {
   memcached_return rc;
 
@@ -250,7 +252,7 @@ test_return error_test(memcached_st *memc)
   return 0;
 }
 
-test_return set_test(memcached_st *memc)
+static test_return  set_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -264,7 +266,7 @@ test_return set_test(memcached_st *memc)
   return 0;
 }
 
-test_return append_test(memcached_st *memc)
+static test_return  append_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "fig";
@@ -300,7 +302,7 @@ test_return append_test(memcached_st *memc)
   return 0;
 }
 
-test_return append_binary_test(memcached_st *memc)
+static test_return  append_binary_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "numbers";
@@ -346,7 +348,7 @@ test_return append_binary_test(memcached_st *memc)
   return 0;
 }
 
-test_return cas2_test(memcached_st *memc)
+static test_return  cas2_test(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"fudge", "son", "food"};
@@ -390,13 +392,16 @@ test_return cas2_test(memcached_st *memc)
   return 0;
 }
 
-test_return cas_test(memcached_st *memc)
+static test_return  cas_test(memcached_st *memc)
 {
   memcached_return rc;
-  char *key= "fun";
-  size_t key_length= strlen("fun");
-  char *value= "we the people";
-  size_t value_length= strlen("we the people");
+  const char *key= "fun";
+  size_t key_length= strlen(key);
+  const char *value= "we the people";
+  size_t value_length= strlen(value);
+  const char *value2= "change the value";
+  size_t value2_length= strlen(value2);
+
   memcached_result_st results_obj;
   memcached_result_st *results;
   unsigned int set= 1;
@@ -419,30 +424,33 @@ test_return cas_test(memcached_st *memc)
   assert(results);
   assert(rc == MEMCACHED_SUCCESS);
   WATCHPOINT_ASSERT(memcached_result_cas(results));
-
-  assert(!memcmp(value, "we the people", strlen("we the people")));
-  assert(strlen("we the people") == value_length);
+  assert(!memcmp(value, memcached_result_value(results), value_length));
+  assert(strlen(memcached_result_value(results)) == value_length);
   assert(rc == MEMCACHED_SUCCESS);
+  uint64_t cas = memcached_result_cas(results);
 
-  rc= memcached_cas(memc, key, key_length,
-                    "change the value", strlen("change the value"), 
-                    0, 0, memcached_result_cas(results));
-
+  #if 0
+  results= memcached_fetch_result(memc, &results_obj, &rc);
+  assert(rc == MEMCACHED_END);
+  assert(results == NULL);
+#endif
+  
+  rc= memcached_cas(memc, key, key_length, value2, value2_length, 0, 0, cas);
   assert(rc == MEMCACHED_SUCCESS);
 
-  rc= memcached_cas(memc, key, key_length,
-                    "change the value", strlen("change the value"), 
-                    0, 0, 23);
-
+  /*
+   * The item will have a new cas value, so try to set it again with the old
+   * value. This should fail!
+   */
+  rc= memcached_cas(memc, key, key_length, value2, value2_length, 0, 0, cas);
   assert(rc == MEMCACHED_DATA_EXISTS);
 
-
   memcached_result_free(&results_obj);
 
   return 0;
 }
 
-test_return prepend_test(memcached_st *memc)
+static test_return  prepend_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "fig";
@@ -482,7 +490,7 @@ test_return prepend_test(memcached_st *memc)
   Set the value, then quit to make sure it is flushed.
   Come back in and test that add fails.
 */
-test_return add_test(memcached_st *memc)
+static test_return  add_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -504,12 +512,12 @@ test_return add_test(memcached_st *memc)
   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;
 }
 
-test_return add_wrapper(memcached_st *memc)
+static test_return  add_wrapper(memcached_st *memc)
 {
   unsigned int x;
 
@@ -519,7 +527,7 @@ test_return add_wrapper(memcached_st *memc)
   return 0;
 }
 
-test_return replace_test(memcached_st *memc)
+static test_return  replace_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -539,7 +547,7 @@ test_return replace_test(memcached_st *memc)
   return 0;
 }
 
-test_return delete_test(memcached_st *memc)
+static test_return  delete_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -556,7 +564,7 @@ test_return delete_test(memcached_st *memc)
   return 0;
 }
 
-test_return flush_test(memcached_st *memc)
+static test_return  flush_test(memcached_st *memc)
 {
   memcached_return rc;
 
@@ -566,14 +574,16 @@ test_return flush_test(memcached_st *memc)
   return 0;
 }
 
-memcached_return server_function(memcached_st *ptr, memcached_server_st *server, void *context)
+static memcached_return  server_function(memcached_st *ptr __attribute__((unused)), 
+                                         memcached_server_st *server __attribute__((unused)), 
+                                         void *context __attribute__((unused)))
 {
   /* Do Nothing */
 
   return MEMCACHED_SUCCESS;
 }
 
-test_return memcached_server_cursor_test(memcached_st *memc)
+static test_return  memcached_server_cursor_test(memcached_st *memc)
 {
   char *context= "foo bad";
   memcached_server_function callbacks[1];
@@ -584,7 +594,7 @@ test_return memcached_server_cursor_test(memcached_st *memc)
   return 0;
 }
 
-test_return bad_key_test(memcached_st *memc)
+static test_return  bad_key_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo bad";
@@ -646,15 +656,16 @@ test_return bad_key_test(memcached_st *memc)
 }
 
 #define READ_THROUGH_VALUE "set for me"
-memcached_return read_through_trigger(memcached_st *memc,  
-                                      char *key, size_t key_length, 
+static memcached_return  read_through_trigger(memcached_st *memc __attribute__((unused)),
+                                      char *key __attribute__((unused)), 
+                                      size_t key_length __attribute__((unused)), 
                                       memcached_result_st *result)
 {
   
   return memcached_result_set_value(result, READ_THROUGH_VALUE, strlen(READ_THROUGH_VALUE));
 }
 
-test_return read_through(memcached_st *memc)
+static test_return  read_through(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -669,7 +680,7 @@ test_return read_through(memcached_st *memc)
   assert(string_length ==  0);
   assert(!string);
 
-  rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_GET_FAILURE, read_through_trigger);
+  rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_GET_FAILURE, (void *)read_through_trigger);
   assert(rc == MEMCACHED_SUCCESS);
 
   string= memcached_get(memc, key, strlen(key),
@@ -691,14 +702,16 @@ test_return read_through(memcached_st *memc)
   return 0;
 }
 
-memcached_return delete_trigger(memcached_st *ptr,  const char *key, size_t key_length)
+static memcached_return  delete_trigger(memcached_st *ptr __attribute__((unused)),  
+                                        const char *key, 
+                                        size_t key_length __attribute__((unused)))
 {
   assert(key);
 
   return MEMCACHED_SUCCESS;
 }
 
-test_return delete_through(memcached_st *memc)
+static test_return  delete_through(memcached_st *memc)
 {
   memcached_trigger_delete_key callback;
   memcached_return rc;
@@ -711,7 +724,7 @@ test_return delete_through(memcached_st *memc)
   return 0;
 }
 
-test_return get_test(memcached_st *memc)
+static test_return  get_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -732,7 +745,7 @@ test_return get_test(memcached_st *memc)
   return 0;
 }
 
-test_return get_test2(memcached_st *memc)
+static test_return  get_test2(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -759,7 +772,7 @@ test_return get_test2(memcached_st *memc)
   return 0;
 }
 
-test_return set_test2(memcached_st *memc)
+static test_return  set_test2(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -778,7 +791,7 @@ test_return set_test2(memcached_st *memc)
   return 0;
 }
 
-test_return set_test3(memcached_st *memc)
+static test_return  set_test3(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -805,7 +818,7 @@ test_return set_test3(memcached_st *memc)
   return 0;
 }
 
-test_return get_test3(memcached_st *memc)
+static test_return  get_test3(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -814,7 +827,7 @@ test_return get_test3(memcached_st *memc)
   char *string;
   size_t string_length;
   uint32_t flags;
-  int x;
+  uint32_t x;
 
   value = (char*)malloc(value_length);
   assert(value);
@@ -841,7 +854,7 @@ test_return get_test3(memcached_st *memc)
   return 0;
 }
 
-test_return get_test4(memcached_st *memc)
+static test_return  get_test4(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "foo";
@@ -850,7 +863,7 @@ test_return get_test4(memcached_st *memc)
   char *string;
   size_t string_length;
   uint32_t flags;
-  int x;
+  uint32_t x;
 
   value = (char*)malloc(value_length);
   assert(value);
@@ -881,7 +894,7 @@ test_return get_test4(memcached_st *memc)
 }
 
 /* Do not copy the style of this code, I just access hosts to testthis function */
-test_return stats_servername_test(memcached_st *memc)
+static test_return  stats_servername_test(memcached_st *memc)
 {
   memcached_return rc;
   memcached_stat_st stat;
@@ -892,7 +905,7 @@ test_return stats_servername_test(memcached_st *memc)
   return 0;
 }
 
-test_return increment_test(memcached_st *memc)
+static test_return  increment_test(memcached_st *memc)
 {
   uint64_t new_number;
   memcached_return rc;
@@ -917,7 +930,7 @@ test_return increment_test(memcached_st *memc)
   return 0;
 }
 
-test_return decrement_test(memcached_st *memc)
+static test_return  decrement_test(memcached_st *memc)
 {
   uint64_t new_number;
   memcached_return rc;
@@ -942,7 +955,7 @@ test_return decrement_test(memcached_st *memc)
   return 0;
 }
 
-test_return quit_test(memcached_st *memc)
+static test_return  quit_test(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "fudge";
@@ -962,7 +975,7 @@ test_return quit_test(memcached_st *memc)
   return 0;
 }
 
-test_return mget_result_test(memcached_st *memc)
+static test_return  mget_result_test(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"fudge", "son", "food"};
@@ -1019,7 +1032,7 @@ test_return mget_result_test(memcached_st *memc)
   return 0;
 }
 
-test_return mget_result_alloc_test(memcached_st *memc)
+static test_return  mget_result_alloc_test(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"fudge", "son", "food"};
@@ -1070,16 +1083,18 @@ test_return mget_result_alloc_test(memcached_st *memc)
 }
 
 /* Count the results */
-unsigned int callback_counter(memcached_st *ptr, memcached_result_st *result, void *context)
+static memcached_return callback_counter(memcached_st *ptr __attribute__((unused)), 
+                                     memcached_result_st *result __attribute__((unused)), 
+                                     void *context)
 {
   unsigned int *counter= (unsigned int *)context;
 
   *counter= *counter + 1;
 
-  return 0;
+  return MEMCACHED_SUCCESS;
 }
 
-test_return mget_result_function(memcached_st *memc)
+static test_return  mget_result_function(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"fudge", "son", "food"};
@@ -1110,7 +1125,7 @@ test_return mget_result_function(memcached_st *memc)
   return 0;
 }
 
-test_return mget_test(memcached_st *memc)
+static test_return  mget_test(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"fudge", "son", "food"};
@@ -1165,7 +1180,7 @@ test_return mget_test(memcached_st *memc)
   return 0;
 }
 
-test_return get_stats_keys(memcached_st *memc)
+static test_return  get_stats_keys(memcached_st *memc)
 {
  char **list;
  char **ptr;
@@ -1183,7 +1198,7 @@ test_return get_stats_keys(memcached_st *memc)
  return 0;
 }
 
-test_return version_string_test(memcached_st *memc)
+static test_return  version_string_test(memcached_st *memc __attribute__((unused)))
 {
   const char *version_string;
 
@@ -1194,7 +1209,7 @@ test_return version_string_test(memcached_st *memc)
   return 0;
 }
 
-test_return get_stats(memcached_st *memc)
+static test_return  get_stats(memcached_st *memc)
 {
  unsigned int x;
  char **list;
@@ -1222,14 +1237,14 @@ test_return get_stats(memcached_st *memc)
   return 0;
 }
 
-test_return add_host_test(memcached_st *memc)
+static test_return  add_host_test(memcached_st *memc)
 {
   unsigned int x;
   memcached_server_st *servers;
   memcached_return rc;
   char servername[]= "0.example.com";
 
-  servers= memcached_server_list_append(NULL, servername, 400, &rc);
+  servers= memcached_server_list_append_with_weight(NULL, servername, 400, 0, &rc);
   assert(servers);
   assert(1 == memcached_server_list_count(servers));
 
@@ -1238,7 +1253,7 @@ test_return add_host_test(memcached_st *memc)
     char buffer[SMALL_STRING_LEN];
 
     snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x);
-    servers= memcached_server_list_append(servers, buffer, 401
+    servers= memcached_server_list_append_with_weight(servers, buffer, 401, 0
                                      &rc);
     assert(rc == MEMCACHED_SUCCESS);
     assert(x == memcached_server_list_count(servers));
@@ -1254,17 +1269,17 @@ test_return add_host_test(memcached_st *memc)
   return 0;
 }
 
-memcached_return clone_test_callback(memcached_st *parent, memcached_st *clone)
+static memcached_return  clone_test_callback(memcached_st *parent __attribute__((unused)), memcached_st *clone __attribute__((unused)))
 {
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return cleanup_test_callback(memcached_st *ptr)
+static memcached_return  cleanup_test_callback(memcached_st *ptr __attribute__((unused)))
 {
   return MEMCACHED_SUCCESS;
 }
 
-test_return callback_test(memcached_st *memc)
+static test_return  callback_test(memcached_st *memc)
 {
   /* Test User Data */
   {
@@ -1304,10 +1319,10 @@ test_return callback_test(memcached_st *memc)
 }
 
 /* We don't test the behavior itself, we test the switches */
-test_return behavior_test(memcached_st *memc)
+static 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);
@@ -1352,13 +1367,13 @@ test_return behavior_test(memcached_st *memc)
 }
 
 /* Test case provided by Cal Haldenbrand */
-test_return user_supplied_bug1(memcached_st *memc)
+static test_return  user_supplied_bug1(memcached_st *memc)
 {
   unsigned int setter= 1;
   unsigned int x;
 
   unsigned long long total= 0;
-  int size= 0;
+  uint32_t size= 0;
   char key[10];
   char randomstuff[6 * 1024]; 
   memcached_return rc;
@@ -1388,6 +1403,7 @@ test_return user_supplied_bug1(memcached_st *memc)
     sprintf(key, "%d", x);
     rc = memcached_set(memc, key, strlen(key), 
                        randomstuff, strlen(randomstuff), 10, 0);
+    assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
     /* If we fail, lets try again */
     if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_BUFFERED)
       rc = memcached_set(memc, key, strlen(key), 
@@ -1399,7 +1415,7 @@ test_return user_supplied_bug1(memcached_st *memc)
 }
 
 /* Test case provided by Cal Haldenbrand */
-test_return user_supplied_bug2(memcached_st *memc)
+static test_return  user_supplied_bug2(memcached_st *memc)
 {
   int errors;
   unsigned int setter;
@@ -1455,7 +1471,7 @@ test_return user_supplied_bug2(memcached_st *memc)
 
 /* Do a large mget() over all the keys we think exist */
 #define KEY_COUNT 3000 // * 1024576
-test_return user_supplied_bug3(memcached_st *memc)
+static test_return  user_supplied_bug3(memcached_st *memc)
 {
   memcached_return rc;
   unsigned int setter;
@@ -1515,7 +1531,7 @@ test_return user_supplied_bug3(memcached_st *memc)
 }
 
 /* Make sure we behave properly if server list has no values */
-test_return user_supplied_bug4(memcached_st *memc)
+static test_return  user_supplied_bug4(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"fudge", "son", "food"};
@@ -1578,7 +1594,7 @@ test_return user_supplied_bug4(memcached_st *memc)
 }
 
 #define VALUE_SIZE_BUG5 1048064
-test_return user_supplied_bug5(memcached_st *memc)
+static test_return  user_supplied_bug5(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
@@ -1636,7 +1652,7 @@ test_return user_supplied_bug5(memcached_st *memc)
   return 0;
 }
 
-test_return user_supplied_bug6(memcached_st *memc)
+static test_return  user_supplied_bug6(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
@@ -1701,7 +1717,7 @@ test_return user_supplied_bug6(memcached_st *memc)
   return 0;
 }
 
-test_return user_supplied_bug8(memcached_st *memc)
+static test_return  user_supplied_bug8(memcached_st *memc __attribute__((unused)))
 {
   memcached_return rc;
   memcached_st *mine;
@@ -1732,7 +1748,7 @@ test_return user_supplied_bug8(memcached_st *memc)
 }
 
 /* Test flag store/retrieve */
-test_return user_supplied_bug7(memcached_st *memc)
+static test_return  user_supplied_bug7(memcached_st *memc)
 {
   memcached_return rc;
   char *keys= "036790384900";
@@ -1776,7 +1792,7 @@ test_return user_supplied_bug7(memcached_st *memc)
   return 0;
 }
 
-test_return user_supplied_bug9(memcached_st *memc)
+static test_return  user_supplied_bug9(memcached_st *memc)
 {
   memcached_return rc;
   char *keys[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
@@ -1821,7 +1837,7 @@ test_return user_supplied_bug9(memcached_st *memc)
 }
 
 /* We are testing with aggressive timeout to get failures */
-test_return user_supplied_bug10(memcached_st *memc)
+static test_return  user_supplied_bug10(memcached_st *memc)
 {
   char *key= "foo";
   char *value;
@@ -1862,7 +1878,7 @@ test_return user_supplied_bug10(memcached_st *memc)
 /*
   We are looking failures in the async protocol
 */
-test_return user_supplied_bug11(memcached_st *memc)
+static test_return  user_supplied_bug11(memcached_st *memc)
 {
   char *key= "foo";
   char *value;
@@ -1902,7 +1918,7 @@ test_return user_supplied_bug11(memcached_st *memc)
 /*
   Bug found where incr was not returning MEMCACHED_NOTFOUND when object did not exist.
 */
-test_return user_supplied_bug12(memcached_st *memc)
+static test_return  user_supplied_bug12(memcached_st *memc)
 {
   memcached_return rc;
   uint32_t flags;
@@ -1919,7 +1935,11 @@ test_return user_supplied_bug12(memcached_st *memc)
                           1, &number_value);
 
   assert(value == NULL);
-  assert(rc == MEMCACHED_NOTFOUND);
+  /* The binary protocol will set the key if it doesn't exist */
+  if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1) 
+    assert(rc == MEMCACHED_SUCCESS);
+  else
+    assert(rc == MEMCACHED_NOTFOUND);
 
   rc= memcached_set(memc, "autoincrement", strlen("autoincrement"), "1", 1, 0, 0);
 
@@ -1941,7 +1961,7 @@ test_return user_supplied_bug12(memcached_st *memc)
   Bug found where command total one more than MEMCACHED_MAX_BUFFER
   set key34567890 0 0 8169 \r\n is sent followed by buffer of size 8169, followed by 8169
  */
-test_return user_supplied_bug13(memcached_st *memc)
+static test_return  user_supplied_bug13(memcached_st *memc)
 {
   char key[] = "key34567890";
   char *overflow;
@@ -1979,7 +1999,7 @@ test_return user_supplied_bug13(memcached_st *memc)
   set key34567890 0 0 8169 \r\n
   is sent followed by buffer of size 8169, followed by 8169
  */
-test_return user_supplied_bug14(memcached_st *memc)
+static test_return  user_supplied_bug14(memcached_st *memc)
 {
   int setter= 1;
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
@@ -2024,7 +2044,7 @@ test_return user_supplied_bug14(memcached_st *memc)
 /*
   Look for zero length value problems
   */
-test_return user_supplied_bug15(memcached_st *memc)
+static test_return  user_supplied_bug15(memcached_st *memc)
 {
   uint32_t x;
   memcached_return rc;
@@ -2062,7 +2082,7 @@ test_return user_supplied_bug15(memcached_st *memc)
 }
 
 /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
-test_return user_supplied_bug16(memcached_st *memc)
+static test_return  user_supplied_bug16(memcached_st *memc)
 {
   memcached_return rc;
   char *key= "mykey";
@@ -2088,7 +2108,7 @@ test_return user_supplied_bug16(memcached_st *memc)
 }
 
 /* Check the validity of chinese key*/
-test_return user_supplied_bug17(memcached_st *memc)
+static test_return  user_supplied_bug17(memcached_st *memc)
 {
     memcached_return rc;
     char *key= "豆瓣";
@@ -2109,25 +2129,136 @@ test_return user_supplied_bug17(memcached_st *memc)
     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;
+}
+
+/* CAS test from Andei */
+test_return user_supplied_bug20(memcached_st *memc)
+{
+  memcached_return status;
+  memcached_result_st *result, result_obj;
+  char *key = "abc";
+  size_t key_len = strlen("abc");
+  char *value = "foobar";
+  size_t value_len = strlen(value);
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
+
+  status = memcached_set(memc, key, key_len, value, value_len, (time_t)0, (uint32_t)0);
+  assert(status == MEMCACHED_SUCCESS);
+
+  status = memcached_mget(memc, &key, &key_len, 1);
+  assert(status == MEMCACHED_SUCCESS);
+
+  memcached_result_create(memc, &result_obj);
+  result= memcached_fetch_result(memc, &result_obj, &status);
+
+  assert(result);
+  assert(status == MEMCACHED_SUCCESS);
+
+  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);
 
-test_return result_static(memcached_st *memc)
+  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)
 {
   memcached_result_st result;
   memcached_result_st *result_ptr;
 
   result_ptr= memcached_result_create(memc, &result);
-  assert(result.is_allocated == MEMCACHED_NOT_ALLOCATED);
+  assert(result.is_allocated == false);
   assert(result_ptr);
   memcached_result_free(&result);
 
   return 0;
 }
 
-test_return result_alloc(memcached_st *memc)
+static test_return  result_alloc(memcached_st *memc)
 {
   memcached_result_st *result;
 
@@ -2138,20 +2269,20 @@ test_return result_alloc(memcached_st *memc)
   return 0;
 }
 
-test_return string_static_null(memcached_st *memc)
+static test_return  string_static_null(memcached_st *memc)
 {
   memcached_string_st string;
   memcached_string_st *string_ptr;
 
   string_ptr= memcached_string_create(memc, &string, 0);
-  assert(string.is_allocated == MEMCACHED_NOT_ALLOCATED);
+  assert(string.is_allocated == false);
   assert(string_ptr);
   memcached_string_free(&string);
 
   return 0;
 }
 
-test_return string_alloc_null(memcached_st *memc)
+static test_return  string_alloc_null(memcached_st *memc)
 {
   memcached_string_st *string;
 
@@ -2162,7 +2293,7 @@ test_return string_alloc_null(memcached_st *memc)
   return 0;
 }
 
-test_return string_alloc_with_size(memcached_st *memc)
+static test_return  string_alloc_with_size(memcached_st *memc)
 {
   memcached_string_st *string;
 
@@ -2173,7 +2304,7 @@ test_return string_alloc_with_size(memcached_st *memc)
   return 0;
 }
 
-test_return string_alloc_with_size_toobig(memcached_st *memc)
+static test_return  string_alloc_with_size_toobig(memcached_st *memc)
 {
   memcached_string_st *string;
 
@@ -2183,7 +2314,7 @@ test_return string_alloc_with_size_toobig(memcached_st *memc)
   return 0;
 }
 
-test_return string_alloc_append(memcached_st *memc)
+static test_return  string_alloc_append(memcached_st *memc)
 {
   unsigned int x;
   char buffer[SMALL_STRING_LEN];
@@ -2206,7 +2337,7 @@ test_return string_alloc_append(memcached_st *memc)
   return 0;
 }
 
-test_return string_alloc_append_toobig(memcached_st *memc)
+static test_return  string_alloc_append_toobig(memcached_st *memc)
 {
   memcached_return rc;
   unsigned int x;
@@ -2231,14 +2362,14 @@ test_return string_alloc_append_toobig(memcached_st *memc)
   return 0;
 }
 
-test_return cleanup_pairs(memcached_st *memc)
+static test_return  cleanup_pairs(memcached_st *memc __attribute__((unused)))
 {
   pairs_free(global_pairs);
 
   return 0;
 }
 
-test_return generate_pairs(memcached_st *memc)
+static test_return  generate_pairs(memcached_st *memc __attribute__((unused)))
 {
   unsigned long long x;
   global_pairs= pairs_generate(GLOBAL_COUNT, 400);
@@ -2253,7 +2384,7 @@ test_return generate_pairs(memcached_st *memc)
   return 0;
 }
 
-test_return generate_large_pairs(memcached_st *memc)
+static test_return  generate_large_pairs(memcached_st *memc __attribute__((unused)))
 {
   unsigned long long x;
   global_pairs= pairs_generate(GLOBAL2_COUNT, MEMCACHED_MAX_BUFFER+10);
@@ -2268,31 +2399,34 @@ test_return generate_large_pairs(memcached_st *memc)
   return 0;
 }
 
-test_return generate_data(memcached_st *memc)
+static test_return  generate_data(memcached_st *memc)
 {
   execute_set(memc, global_pairs, global_count);
 
   return 0;
 }
 
-test_return generate_data_with_stats(memcached_st *memc)
+static test_return  generate_data_with_stats(memcached_st *memc)
 {
-  memcached_stat_st *stat_p= NULL;
+  memcached_stat_st *stat_p;
   memcached_return rc;
-  int host_index= 0;
+  uint32_t host_index= 0;
   execute_set(memc, global_pairs, global_count);
 
   //TODO: hosts used size stats
-  stat_p = memcached_stat(memc, NULL, &rc);
-  for (host_index = 0; host_index < SERVERS_TO_CREATE; ++host_index)
+  stat_p= memcached_stat(memc, NULL, &rc);
+  assert(stat_p);
+
+  for (host_index= 0; host_index < SERVERS_TO_CREATE; host_index++)
   {
-      printf("\nserver %d|%s|%d bytes: %lld\n", host_index, (memc->hosts)[host_index].hostname, (memc->hosts)[host_index].port, (stat_p + host_index)->bytes);
+      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)
+static test_return  generate_buffer_data(memcached_st *memc)
 {
   int latch= 0;
 
@@ -2303,7 +2437,7 @@ test_return generate_buffer_data(memcached_st *memc)
   return 0;
 }
 
-test_return get_read_count(memcached_st *memc)
+static test_return  get_read_count(memcached_st *memc)
 {
   unsigned int x;
   memcached_return rc;
@@ -2312,7 +2446,7 @@ test_return get_read_count(memcached_st *memc)
   clone= memcached_clone(NULL, memc);
   assert(clone);
 
-  memcached_server_add(clone, "localhost", 6666);
+  memcached_server_add_with_weight(clone, "localhost", 6666, 0);
 
   {
     char *return_value;
@@ -2339,7 +2473,7 @@ test_return get_read_count(memcached_st *memc)
   return 0;
 }
 
-test_return get_read(memcached_st *memc)
+static test_return  get_read(memcached_st *memc)
 {
   unsigned int x;
   memcached_return rc;
@@ -2365,7 +2499,7 @@ test_return get_read(memcached_st *memc)
   return 0;
 }
 
-test_return mget_read(memcached_st *memc)
+static test_return  mget_read(memcached_st *memc)
 {
   memcached_return rc;
 
@@ -2391,7 +2525,7 @@ test_return mget_read(memcached_st *memc)
   return 0;
 }
 
-test_return mget_read_result(memcached_st *memc)
+static test_return  mget_read_result(memcached_st *memc)
 {
   memcached_return rc;
 
@@ -2416,7 +2550,7 @@ test_return mget_read_result(memcached_st *memc)
   return 0;
 }
 
-test_return mget_read_function(memcached_st *memc)
+static test_return  mget_read_function(memcached_st *memc)
 {
   memcached_return rc;
   unsigned int counter;
@@ -2432,7 +2566,7 @@ test_return mget_read_function(memcached_st *memc)
   return 0;
 }
 
-test_return delete_generate(memcached_st *memc)
+static test_return  delete_generate(memcached_st *memc)
 {
   unsigned int x;
 
@@ -2444,7 +2578,7 @@ test_return delete_generate(memcached_st *memc)
   return 0;
 }
 
-test_return delete_buffer_generate(memcached_st *memc)
+static test_return  delete_buffer_generate(memcached_st *memc)
 {
   int latch= 0;
   unsigned int x;
@@ -2460,21 +2594,21 @@ test_return delete_buffer_generate(memcached_st *memc)
   return 0;
 }
 
-test_return free_data(memcached_st *memc)
+static test_return  free_data(memcached_st *memc __attribute__((unused)))
 {
   pairs_free(global_pairs);
 
   return 0;
 }
 
-test_return add_host_test1(memcached_st *memc)
+static test_return  add_host_test1(memcached_st *memc)
 {
   unsigned int x;
   memcached_return rc;
   char servername[]= "0.example.com";
   memcached_server_st *servers;
 
-  servers= memcached_server_list_append(NULL, servername, 400, &rc);
+  servers= memcached_server_list_append_with_weight(NULL, servername, 400, 0, &rc);
   assert(servers);
   assert(1 == memcached_server_list_count(servers));
 
@@ -2483,7 +2617,7 @@ test_return add_host_test1(memcached_st *memc)
     char buffer[SMALL_STRING_LEN];
 
     snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x);
-    servers= memcached_server_list_append(servers, buffer, 401
+    servers= memcached_server_list_append_with_weight(servers, buffer, 401, 0
                                      &rc);
     assert(rc == MEMCACHED_SUCCESS);
     assert(x == memcached_server_list_count(servers));
@@ -2499,70 +2633,78 @@ test_return add_host_test1(memcached_st *memc)
   return 0;
 }
 
-memcached_return pre_nonblock(memcached_st *memc)
+static memcached_return  pre_nonblock(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_murmur(memcached_st *memc)
+static memcached_return  pre_murmur(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_md5(memcached_st *memc)
+static memcached_return pre_jenkins(memcached_st *memc)
+{
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_JENKINS);
+
+  return MEMCACHED_SUCCESS;
+}
+
+
+static memcached_return  pre_md5(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MD5);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_crc(memcached_st *memc)
+static memcached_return  pre_crc(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_CRC);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_hsieh(memcached_st *memc)
+static memcached_return  pre_hsieh(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_HSIEH);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_hash_fnv1_64(memcached_st *memc)
+static memcached_return  pre_hash_fnv1_64(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1_64);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_hash_fnv1a_64(memcached_st *memc)
+static memcached_return  pre_hash_fnv1a_64(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1A_64);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_hash_fnv1_32(memcached_st *memc)
+static memcached_return  pre_hash_fnv1_32(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1_32);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_hash_fnv1a_32(memcached_st *memc)
+static memcached_return  pre_hash_fnv1a_32(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1A_32);
 
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_behavior_ketama(memcached_st *memc)
+static memcached_return  pre_behavior_ketama(memcached_st *memc)
 {
   memcached_return rc;
   uint64_t value;
@@ -2576,7 +2718,7 @@ memcached_return pre_behavior_ketama(memcached_st *memc)
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_behavior_ketama_weighted(memcached_st *memc)
+static memcached_return  pre_behavior_ketama_weighted(memcached_st *memc)
 {
   memcached_return rc;
   uint64_t value;
@@ -2594,22 +2736,45 @@ memcached_return pre_behavior_ketama_weighted(memcached_st *memc)
   assert(value == MEMCACHED_HASH_MD5);
   return MEMCACHED_SUCCESS;
 }
-void my_free(memcached_st *ptr, void *mem)
+
+static 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;
+}
+
+static void my_free(memcached_st *ptr __attribute__((unused)), void *mem)
 {
   free(mem);
 }
 
-void *my_malloc(memcached_st *ptr, const size_t size)
+static void *my_malloc(memcached_st *ptr __attribute__((unused)), const size_t size)
 {
   return malloc(size);
 }
 
-void *my_realloc(memcached_st *ptr, void *mem, const size_t size)
+static void *my_realloc(memcached_st *ptr __attribute__((unused)), void *mem, const size_t size)
 {
   return realloc(mem, size);
 }
 
-memcached_return set_prefix(memcached_st *memc)
+static memcached_return set_prefix(memcached_st *memc)
 {
   memcached_return rc;
   const char *key= "mine";
@@ -2653,9 +2818,11 @@ memcached_return set_prefix(memcached_st *memc)
     assert(value == NULL);
 
     /* Test a long key for failure */
+    /* TODO, extend test to determine based on setting, what result should be */
     long_key= "Thisismorethentheallottednumberofcharacters";
     rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
-    assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
+    //assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
+    assert(rc == MEMCACHED_SUCCESS);
 
     /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
     long_key= "This is more then the allotted number of characters";
@@ -2674,7 +2841,7 @@ memcached_return set_prefix(memcached_st *memc)
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return set_memory_alloc(memcached_st *memc)
+static memcached_return  set_memory_alloc(memcached_st *memc)
 {
   {
     memcached_malloc_function test_ptr;
@@ -2712,7 +2879,7 @@ memcached_return set_memory_alloc(memcached_st *memc)
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return enable_consistent(memcached_st *memc)
+static memcached_return  enable_consistent(memcached_st *memc)
 {
   memcached_server_distribution value= MEMCACHED_DISTRIBUTION_CONSISTENT;
   memcached_hash hash;
@@ -2729,15 +2896,14 @@ memcached_return enable_consistent(memcached_st *memc)
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return enable_cas(memcached_st *memc)
+static memcached_return  enable_cas(memcached_st *memc)
 {
   unsigned int set= 1;
 
   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);
 
@@ -2747,19 +2913,18 @@ memcached_return enable_cas(memcached_st *memc)
   return MEMCACHED_FAILURE;
 }
 
-memcached_return check_for_1_2_3(memcached_st *memc)
+static memcached_return  check_for_1_2_3(memcached_st *memc)
 {
   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;
 }
 
-memcached_return pre_unix_socket(memcached_st *memc)
+static memcached_return  pre_unix_socket(memcached_st *memc)
 {
   memcached_return rc;
   struct stat buf;
@@ -2771,36 +2936,28 @@ memcached_return pre_unix_socket(memcached_st *memc)
   if (stat("/tmp/memcached.socket", &buf))
     return MEMCACHED_FAILURE;
 
-  rc= memcached_server_add_unix_socket(memc, "/tmp/memcached.socket");
+  rc= memcached_server_add_unix_socket_with_weight(memc, "/tmp/memcached.socket", 0);
 
   return rc;
 }
 
-memcached_return pre_udp(memcached_st *memc)
+static memcached_return  pre_nodelay(memcached_st *memc)
 {
-  memcached_return rc;
-
-  memcached_server_list_free(memc->hosts);
-  memc->hosts= NULL;
-  memc->number_of_hosts= 0;
-
-  if (0)
-    return MEMCACHED_FAILURE;
-
-  rc= memcached_server_add_udp(memc, "localhost", MEMCACHED_DEFAULT_PORT);
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 0);
 
-  return rc;
+  return MEMCACHED_SUCCESS;
 }
 
-memcached_return pre_nodelay(memcached_st *memc)
+static memcached_return  pre_settimer(memcached_st *memc)
 {
-  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
-  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 0);
+  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)
+static memcached_return  poll_timeout(memcached_st *memc)
 {
   int32_t timeout;
 
@@ -2847,6 +3004,7 @@ test_st tests[] ={
   {"mget_result_function", 1, mget_result_function },
   {"get_stats", 0, get_stats },
   {"add_host_test", 0, add_host_test },
+  {"add_host_test_1", 0, add_host_test1 },
   {"get_stats_keys", 0, get_stats_keys },
   {"behavior_test", 0, get_stats_keys },
   {"callback_test", 0, get_stats_keys },
@@ -2906,6 +3064,9 @@ test_st user_tests[] ={
   {"user_supplied_bug15", 1, user_supplied_bug15 },
   {"user_supplied_bug16", 1, user_supplied_bug16 },
   {"user_supplied_bug17", 1, user_supplied_bug17 },
+  {"user_supplied_bug18", 1, user_supplied_bug18 },
+  {"user_supplied_bug19", 1, user_supplied_bug19 },
+  {"user_supplied_bug20", 1, user_supplied_bug20 },
   {0, 0, 0}
 };
 
@@ -2946,11 +3107,14 @@ test_st consistent_weighted_tests[] ={
 
 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},
+  {"jenkins", pre_jenkins, 0, tests},
   {"fnv1_64", pre_hash_fnv1_64, 0, tests},
   {"fnv1a_64", pre_hash_fnv1a_64, 0, tests},
   {"fnv1_32", pre_hash_fnv1_32, 0, tests},
@@ -2963,7 +3127,6 @@ collection_st collection[] ={
   {"consistent", enable_consistent, 0, tests},
   {"memory_allocators", set_memory_alloc, 0, tests},
   {"prefix", set_prefix, 0, tests},
-//  {"udp", pre_udp, 0, tests},
   {"version_1_2_3", check_for_1_2_3, 0, version_1_2_3},
   {"string", 0, 0, string_tests},
   {"result", 0, 0, result_tests},
@@ -2975,6 +3138,7 @@ collection_st collection[] ={
   {"generate_hsieh_consistent", enable_consistent, 0, generate_tests},
   {"generate_md5", pre_md5, 0, generate_tests},
   {"generate_murmur", pre_murmur, 0, generate_tests},
+  {"generate_jenkins", pre_jenkins, 0, generate_tests},
   {"generate_nonblock", pre_nonblock, 0, generate_tests},
   {"consistent_not", 0, 0, consistent_tests},
   {"consistent_ketama", pre_behavior_ketama, 0, consistent_tests},
@@ -2984,6 +3148,10 @@ collection_st collection[] ={
 
 #define SERVERS_TO_CREATE 5
 
+/* Prototypes for functions we will pass to test framework */
+void *world_create(void);
+void world_destroy(void *p);
+
 void *world_create(void)
 {
   server_startup_st *construct;
@@ -2997,6 +3165,7 @@ void *world_create(void)
   return construct;
 }
 
+
 void world_destroy(void *p)
 {
   server_startup_st *construct= (server_startup_st *)p;