Merge in code changes for all of the new parser.
authorBrian Aker <brian@tangent.org>
Fri, 25 Mar 2011 05:22:45 +0000 (22:22 -0700)
committerBrian Aker <brian@tangent.org>
Fri, 25 Mar 2011 05:22:45 +0000 (22:22 -0700)
1  2 
libmemcached/hash.c
libmemcached/hosts.c
libmemcached/stats.c
tests/mem_functions.c

diff --combined libmemcached/hash.c
index dda303952a5c86c2e6cc76de52c5a440474795eb,d1515f69b5da9224e50c91ae60c86943243fd30e..ce47a44833ff4e5b5deaf7f28111974df405d714
@@@ -70,18 -70,18 +70,18 @@@ static inline uint32_t _generate_hash_w
    WATCHPOINT_ASSERT(memcached_server_count(ptr));
  
    if (memcached_server_count(ptr) == 1)
 -    return EXIT_SUCCESS;
 +    return 0;
  
    if (ptr->flags.hash_with_prefix_key)
    {
-     size_t temp_length= ptr->prefix_key_length + key_length;
+     size_t temp_length= memcached_array_size(ptr->prefix_key) + key_length;
      char temp[temp_length];
  
      if (temp_length > MEMCACHED_MAX_KEY -1)
 -      return EXIT_SUCCESS;
 +      return 0;
  
-     strncpy(temp, ptr->prefix_key, ptr->prefix_key_length);
-     strncpy(temp + ptr->prefix_key_length, key, key_length);
+     strncpy(temp, memcached_array_string(ptr->prefix_key), memcached_array_size(ptr->prefix_key));
+     strncpy(temp + memcached_array_size(ptr->prefix_key), key, key_length);
  
      return generate_hash(ptr, temp, temp_length);
    }
@@@ -136,3 -136,23 +136,23 @@@ memcached_return_t memcached_set_hashki
  
    return MEMCACHED_SUCCESS;
  }
+ const char * libmemcached_string_hash(memcached_hash_t type)
+ {
+   switch (type)
+   {
+   case MEMCACHED_HASH_DEFAULT: return "MEMCACHED_HASH_DEFAULT";
+   case MEMCACHED_HASH_MD5: return "MEMCACHED_HASH_MD5";
+   case MEMCACHED_HASH_CRC: return "MEMCACHED_HASH_CRC";
+   case MEMCACHED_HASH_FNV1_64: return "MEMCACHED_HASH_FNV1_64";
+   case MEMCACHED_HASH_FNV1A_64: return "MEMCACHED_HASH_FNV1A_64";
+   case MEMCACHED_HASH_FNV1_32: return "MEMCACHED_HASH_FNV1_32";
+   case MEMCACHED_HASH_FNV1A_32: return "MEMCACHED_HASH_FNV1A_32";
+   case MEMCACHED_HASH_HSIEH: return "MEMCACHED_HASH_HSIEH";
+   case MEMCACHED_HASH_MURMUR: return "MEMCACHED_HASH_MURMUR";
+   case MEMCACHED_HASH_JENKINS: return "MEMCACHED_HASH_JENKINS";
+   case MEMCACHED_HASH_CUSTOM: return "MEMCACHED_HASH_CUSTOM";
+   default:
+   case MEMCACHED_HASH_MAX: return "INVALID memcached_hash_t";
+   }
+ }
diff --combined libmemcached/hosts.c
index 9723f8b628ad8c49b42d3d1d6c4388ce63e8a22d,c861a6d9361ede3ff48c7aa5bc3cfccaaa321f9c..992bd763d0b98e1afe59aa32f9d88740e840a897
@@@ -17,6 -17,7 +17,7 @@@ static memcached_return_t server_add(me
                                       in_port_t port,
                                       uint32_t weight,
                                       memcached_connection_t type);
  static memcached_return_t update_continuum(memcached_st *ptr);
  
  static int compare_servers(const void *p1, const void *p2)
@@@ -92,9 -93,9 +93,9 @@@ static int continuum_item_cmp(const voi
    /* Why 153? Hmmm... */
    WATCHPOINT_ASSERT(ct1->value != 153);
    if (ct1->value == ct2->value)
 -    return EXIT_SUCCESS;
 +    return 0;
    else if (ct1->value > ct2->value)
 -    return EXIT_FAILURE;
 +    return 1;
    else
      return -1;
  }
@@@ -449,3 -450,20 +450,20 @@@ static memcached_return_t server_add(me
  
    return run_distribution(ptr);
  }
+ memcached_return_t memcached_server_add_parsed(memcached_st *ptr,
+                                                const char *hostname,
+                                                size_t hostname_length,
+                                                in_port_t port,
+                                                uint32_t weight)
+ {
+   char buffer[NI_MAXHOST];
+   memcpy(buffer, hostname, hostname_length);
+   buffer[hostname_length]= 0;
+   return server_add(ptr, buffer,
+                     port,
+                     weight,
+                     MEMCACHED_CONNECTION_TCP);
+ }
diff --combined libmemcached/stats.c
index 5a37dfd9130fdd528e0481e6c404b9c730b90e04,8e24bc795069daafbbe74ba917eb6549d505485f..83d342a1f096559cc66d5a66be5e124415783d7c
@@@ -178,49 -178,49 +178,49 @@@ char *memcached_stat_get_value(const me
  
    *error= MEMCACHED_SUCCESS;
  
 -  if (!memcmp("pid", key, strlen("pid")))
 +  if (!memcmp("pid", key, sizeof("pid") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->pid);
 -  else if (!memcmp("uptime", key, strlen("uptime")))
 +  else if (!memcmp("uptime", key, sizeof("uptime") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->uptime);
 -  else if (!memcmp("time", key, strlen("time")))
 +  else if (!memcmp("time", key, sizeof("time") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->time);
 -  else if (!memcmp("version", key, strlen("version")))
 +  else if (!memcmp("version", key, sizeof("version") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%s", memc_stat->version);
 -  else if (!memcmp("pointer_size", key, strlen("pointer_size")))
 +  else if (!memcmp("pointer_size", key, sizeof("pointer_size") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->pointer_size);
 -  else if (!memcmp("rusage_user", key, strlen("rusage_user")))
 +  else if (!memcmp("rusage_user", key, sizeof("rusage_user") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u.%u", memc_stat->rusage_user_seconds, memc_stat->rusage_user_microseconds);
 -  else if (!memcmp("rusage_system", key, strlen("rusage_system")))
 +  else if (!memcmp("rusage_system", key, sizeof("rusage_system") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u.%u", memc_stat->rusage_system_seconds, memc_stat->rusage_system_microseconds);
 -  else if (!memcmp("curr_items", key, strlen("curr_items")))
 +  else if (!memcmp("curr_items", key, sizeof("curr_items") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->curr_items);
 -  else if (!memcmp("total_items", key, strlen("total_items")))
 +  else if (!memcmp("total_items", key, sizeof("total_items") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->total_items);
 -  else if (!memcmp("curr_connections", key, strlen("curr_connections")))
 +  else if (!memcmp("curr_connections", key, sizeof("curr_connections") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->curr_connections);
 -  else if (!memcmp("total_connections", key, strlen("total_connections")))
 +  else if (!memcmp("total_connections", key, sizeof("total_connections") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->total_connections);
 -  else if (!memcmp("connection_structures", key, strlen("connection_structures")))
 +  else if (!memcmp("connection_structures", key, sizeof("connection_structures") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->connection_structures);
 -  else if (!memcmp("cmd_get", key, strlen("cmd_get")))
 +  else if (!memcmp("cmd_get", key, sizeof("cmd_get") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->cmd_get);
 -  else if (!memcmp("cmd_set", key, strlen("cmd_set")))
 +  else if (!memcmp("cmd_set", key, sizeof("cmd_set") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->cmd_set);
 -  else if (!memcmp("get_hits", key, strlen("get_hits")))
 +  else if (!memcmp("get_hits", key, sizeof("get_hits") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->get_hits);
 -  else if (!memcmp("get_misses", key, strlen("get_misses")))
 +  else if (!memcmp("get_misses", key, sizeof("get_misses") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->get_misses);
 -  else if (!memcmp("evictions", key, strlen("evictions")))
 +  else if (!memcmp("evictions", key, sizeof("evictions") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->evictions);
 -  else if (!memcmp("bytes_read", key, strlen("bytes_read")))
 +  else if (!memcmp("bytes_read", key, sizeof("bytes_read") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->bytes_read);
 -  else if (!memcmp("bytes_written", key, strlen("bytes_written")))
 +  else if (!memcmp("bytes_written", key, sizeof("bytes_written") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->bytes_written);
 -  else if (!memcmp("bytes", key, strlen("bytes")))
 +  else if (!memcmp("bytes", key, sizeof("bytes") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->bytes);
 -  else if (!memcmp("limit_maxbytes", key, strlen("limit_maxbytes")))
 +  else if (!memcmp("limit_maxbytes", key, sizeof("limit_maxbytes") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%llu", (unsigned long long)memc_stat->limit_maxbytes);
 -  else if (!memcmp("threads", key, strlen("threads")))
 +  else if (! memcmp("threads", key, sizeof("threads") -1))
      length= snprintf(buffer, SMALL_STRING_LEN,"%u", memc_stat->threads);
    else
    {
@@@ -400,21 -400,21 +400,21 @@@ error
      return rc;
  }
  
- memcached_stat_st *memcached_stat(memcached_st *ptr, char *args, memcached_return_t *error)
+ memcached_stat_st *memcached_stat(memcached_st *self, char *args, memcached_return_t *error)
  {
    memcached_return_t rc;
    memcached_stat_st *stats;
  
-   if (! ptr)
+   if (! self)
    {
-     WATCHPOINT_ASSERT(memc_ptr);
+     WATCHPOINT_ASSERT(self);
      return NULL;
    }
  
    WATCHPOINT_ASSERT(error);
  
  
-   unlikely (ptr->flags.use_udp)
+   unlikely (self->flags.use_udp)
    {
      if (error)
        *error= MEMCACHED_NOT_SUPPORTED;
      return NULL;
    }
  
-   stats= libmemcached_calloc(ptr, memcached_server_count(ptr), sizeof(memcached_stat_st));
+   stats= libmemcached_calloc(self, memcached_server_count(self), sizeof(memcached_stat_st));
  
    if (! stats)
    {
    }
  
    rc= MEMCACHED_SUCCESS;
-   for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
+   for (uint32_t x= 0; x < memcached_server_count(self); x++)
    {
      memcached_return_t temp_return;
      memcached_server_write_instance_st instance;
  
      stat_instance= stats + x;
  
-     stat_instance->root= ptr;
+     stat_instance->root= self;
  
-     instance= memcached_server_instance_fetch(ptr, x);
+     instance= memcached_server_instance_fetch(self, x);
  
-     if (ptr->flags.binary_protocol)
+     if (self->flags.binary_protocol)
      {
        temp_return= binary_stats_fetch(stat_instance, args, instance, NULL);
      }
diff --combined tests/mem_functions.c
index c46ef51a1d449c3989eb7150f2658dc78915ba41,9b27a60ab415224b770b9134d0e08072bf964e64..a69d35acb6c45745ab8ef177e96ce3a9a2c59395
  #define SMALL_STRING_LEN 1024
  
  #include <libtest/test.h>
+ #include "tests/parser.h"
+ #include "tests/replication.h"
+ #include "tests/basic.h"
+ #include "tests/error_conditions.h"
+ #include "tests/print.h"
  
  
  #ifdef HAVE_LIBMEMCACHEDUTIL
@@@ -189,21 -194,6 +194,6 @@@ static test_return_t server_sort2_test(
    return TEST_SUCCESS;
  }
  
- static memcached_return_t server_print_callback(const memcached_st *ptr,
-                                                 const memcached_server_st *server,
-                                                 void *context)
- {
-   (void)server; // Just in case we aren't printing.
-   (void)ptr;
-   (void)context;
- #if 0
-   fprintf(stderr, "%s(%d)", memcached_server_name(server), memcached_server_port(server));
- #endif
-   return MEMCACHED_SUCCESS;
- }
  static test_return_t memcached_server_remove_test(memcached_st *ptr)
  {
    memcached_return_t rc;
@@@ -411,10 -401,10 +401,10 @@@ static test_return_t error_test(memcach
                          2300930706U, 2943759320U, 674306647U, 2400528935U,
                          54481931U, 4186304426U, 1741088401U, 2979625118U,
                          4159057246U, 3425930182U, 2593724503U,  1868899624U,
-                         1769812374U, 2302537950U, 1110330676U };
+                         1769812374U, 2302537950U, 1110330676U, 3365377466U, 
+                         1336171666U, 3365377466U };
  
    // You have updated the memcache_error messages but not updated docs/tests.
-   test_true(MEMCACHED_MAXIMUM_RETURN == 43);
    for (rc= MEMCACHED_SUCCESS; rc < MEMCACHED_MAXIMUM_RETURN; rc++)
    {
      uint32_t hash_val;
      }
      test_true(values[rc] == hash_val);
    }
+   test_true(MEMCACHED_MAXIMUM_RETURN == 45);
  
    return TEST_SUCCESS;
  }
@@@ -784,8 -775,8 +775,8 @@@ static memcached_return_t  server_funct
  
  static test_return_t memcached_server_cursor_test(memcached_st *memc)
  {
 -  char context[8];
 -  strcpy(context, "foo bad");
 +  char context[10];
 +  strncpy(context, "foo bad", sizeof(context));
    memcached_server_fn callbacks[1];
  
    callbacks[0]= server_function;
@@@ -3966,9 -3957,10 +3957,10 @@@ static test_return_t set_prefix(memcach
  
    /* Test a clean set */
    rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, (void *)key);
-   test_true(rc == MEMCACHED_SUCCESS);
+   test_true_got(rc == MEMCACHED_SUCCESS, memcached_last_error_message(memc));
  
    value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
+   test_true(value);
    test_true(memcmp(value, key, 4) == 0);
    test_true(rc == MEMCACHED_SUCCESS);
  
    test_true(rc == MEMCACHED_SUCCESS);
  
    value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
+   test_false(value);
    test_true(rc == MEMCACHED_FAILURE);
  
    /* Now setup for main test */
    test_true(rc == MEMCACHED_SUCCESS);
  
    value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
+   test_true(value);
    test_true(rc == MEMCACHED_SUCCESS);
    test_true(memcmp(value, key, 4) == 0);
  
      test_true(rc == MEMCACHED_SUCCESS);
  
      value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
+     test_false(value);
      test_true(rc == MEMCACHED_FAILURE);
      test_true(value == NULL);
  
      /* Test a long key for failure */
      /* TODO, extend test to determine based on setting, what result should be */
 -    strcpy(long_key, "Thisismorethentheallottednumberofcharacters");
 +    strncpy(long_key, "Thisismorethentheallottednumberofcharacters", sizeof(long_key));
      rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
      //test_true(rc == MEMCACHED_BAD_KEY_PROVIDED);
      test_true(rc == MEMCACHED_SUCCESS);
  
      /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
 -    strcpy(long_key, "This is more then the allotted number of characters");
 +    strncpy(long_key, "This is more then the allotted number of characters", sizeof(long_key));
      rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
      test_true(rc == MEMCACHED_BAD_KEY_PROVIDED);
  
      rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 1);
      test_true(rc == MEMCACHED_SUCCESS);
  
 -    strcpy(long_key, "dog cat");
 +    strncpy(long_key, "dog cat", sizeof(long_key));
      rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
      test_true(rc == MEMCACHED_BAD_KEY_PROVIDED);
    }
@@@ -4574,259 -4569,6 +4569,6 @@@ static test_return_t ping_test(memcache
  }
  #endif
  
- static test_return_t replication_set_test(memcached_st *memc)
- {
-   memcached_return_t rc;
-   memcached_st *memc_clone= memcached_clone(NULL, memc);
-   memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 0);
-   rc= memcached_set(memc, "bubba", 5, "0", 1, 0, 0);
-   test_true(rc == MEMCACHED_SUCCESS);
-   /*
-   ** We are using the quiet commands to store the replicas, so we need
-   ** to ensure that all of them are processed before we can continue.
-   ** In the test we go directly from storing the object to trying to
-   ** receive the object from all of the different servers, so we
-   ** could end up in a race condition (the memcached server hasn't yet
-   ** processed the quiet command from the replication set when it process
-   ** the request from the other client (created by the clone)). As a
-   ** workaround for that we call memcached_quit to send the quit command
-   ** to the server and wait for the response ;-) If you use the test code
-   ** as an example for your own code, please note that you shouldn't need
-   ** to do this ;-)
-   */
-   memcached_quit(memc);
-   /*
-   ** "bubba" should now be stored on all of our servers. We don't have an
-   ** easy to use API to address each individual server, so I'll just iterate
-   ** through a bunch of "master keys" and I should most likely hit all of the
-   ** servers...
-   */
-   for (int x= 'a'; x <= 'z'; ++x)
-   {
-     char key[2]= { [0]= (char)x };
-     size_t len;
-     uint32_t flags;
-     char *val= memcached_get_by_key(memc_clone, key, 1, "bubba", 5,
-                                     &len, &flags, &rc);
-     test_true(rc == MEMCACHED_SUCCESS);
-     test_true(val != NULL);
-     free(val);
-   }
-   memcached_free(memc_clone);
-   return TEST_SUCCESS;
- }
- static test_return_t replication_get_test(memcached_st *memc)
- {
-   memcached_return_t rc;
-   /*
-    * Don't do the following in your code. I am abusing the internal details
-    * within the library, and this is not a supported interface.
-    * This is to verify correct behavior in the library
-    */
-   for (uint32_t host= 0; host < memcached_server_count(memc); ++host)
-   {
-     memcached_st *memc_clone= memcached_clone(NULL, memc);
-     memcached_server_instance_st instance=
-       memcached_server_instance_by_position(memc_clone, host);
-     ((memcached_server_write_instance_st)instance)->port= 0;
-     for (int x= 'a'; x <= 'z'; ++x)
-     {
-       char key[2]= { [0]= (char)x };
-       size_t len;
-       uint32_t flags;
-       char *val= memcached_get_by_key(memc_clone, key, 1, "bubba", 5,
-                                       &len, &flags, &rc);
-       test_true(rc == MEMCACHED_SUCCESS);
-       test_true(val != NULL);
-       free(val);
-     }
-     memcached_free(memc_clone);
-   }
-   return TEST_SUCCESS;
- }
- static test_return_t replication_mget_test(memcached_st *memc)
- {
-   memcached_return_t rc;
-   memcached_st *memc_clone= memcached_clone(NULL, memc);
-   memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 0);
-   const char *keys[]= { "bubba", "key1", "key2", "key3" };
-   size_t len[]= { 5, 4, 4, 4 };
-   for (size_t x= 0; x< 4; ++x)
-   {
-     rc= memcached_set(memc, keys[x], len[x], "0", 1, 0, 0);
-     test_true(rc == MEMCACHED_SUCCESS);
-   }
-   /*
-   ** We are using the quiet commands to store the replicas, so we need
-   ** to ensure that all of them are processed before we can continue.
-   ** In the test we go directly from storing the object to trying to
-   ** receive the object from all of the different servers, so we
-   ** could end up in a race condition (the memcached server hasn't yet
-   ** processed the quiet command from the replication set when it process
-   ** the request from the other client (created by the clone)). As a
-   ** workaround for that we call memcached_quit to send the quit command
-   ** to the server and wait for the response ;-) If you use the test code
-   ** as an example for your own code, please note that you shouldn't need
-   ** to do this ;-)
-   */
-   memcached_quit(memc);
-   /*
-    * Don't do the following in your code. I am abusing the internal details
-    * within the library, and this is not a supported interface.
-    * This is to verify correct behavior in the library
-    */
-   memcached_result_st result_obj;
-   for (uint32_t host= 0; host < memc_clone->number_of_hosts; host++)
-   {
-     memcached_st *new_clone= memcached_clone(NULL, memc);
-     memcached_server_instance_st instance=
-       memcached_server_instance_by_position(new_clone, host);
-     ((memcached_server_write_instance_st)instance)->port= 0;
-     for (int x= 'a'; x <= 'z'; ++x)
-     {
-       char key[2]= { [0]= (char)x, [1]= 0 };
-       rc= memcached_mget_by_key(new_clone, key, 1, keys, len, 4);
-       test_true(rc == MEMCACHED_SUCCESS);
-       memcached_result_st *results= memcached_result_create(new_clone, &result_obj);
-       test_true(results);
-       int hits= 0;
-       while ((results= memcached_fetch_result(new_clone, &result_obj, &rc)) != NULL)
-       {
-         hits++;
-       }
-       test_true(hits == 4);
-       memcached_result_free(&result_obj);
-     }
-     memcached_free(new_clone);
-   }
-   memcached_free(memc_clone);
-   return TEST_SUCCESS;
- }
- static test_return_t replication_randomize_mget_test(memcached_st *memc)
- {
-   memcached_result_st result_obj;
-   memcached_return_t rc;
-   memcached_st *memc_clone= memcached_clone(NULL, memc);
-   memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 3);
-   memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ, 1);
-   const char *keys[]= { "key1", "key2", "key3", "key4", "key5", "key6", "key7" };
-   size_t len[]= { 4, 4, 4, 4, 4, 4, 4 };
-   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);
-   }
-   memcached_quit(memc);
-   for (size_t x= 0; x< 7; ++x)
-   {
-     const char key[2]= { [0]= (const char)x };
-     rc= memcached_mget_by_key(memc_clone, key, 1, keys, len, 7);
-     test_true(rc == MEMCACHED_SUCCESS);
-     memcached_result_st *results= memcached_result_create(memc_clone, &result_obj);
-     test_true(results);
-     int hits= 0;
-     while ((results= memcached_fetch_result(memc_clone, &result_obj, &rc)) != NULL)
-     {
-       ++hits;
-     }
-     test_true(hits == 7);
-     memcached_result_free(&result_obj);
-   }
-   memcached_free(memc_clone);
-   return TEST_SUCCESS;
- }
- static test_return_t replication_delete_test(memcached_st *memc)
- {
-   memcached_return_t rc;
-   memcached_st *memc_clone= memcached_clone(NULL, memc);
-   /* Delete the items from all of the servers except 1 */
-   uint64_t repl= memcached_behavior_get(memc,
-                                         MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS);
-   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, --repl);
-   const char *keys[]= { "bubba", "key1", "key2", "key3" };
-   size_t len[]= { 5, 4, 4, 4 };
-   for (size_t x= 0; x< 4; ++x)
-   {
-     rc= memcached_delete_by_key(memc, keys[0], len[0], keys[x], len[x], 0);
-     test_true(rc == MEMCACHED_SUCCESS);
-   }
-   /*
-    * Don't do the following in your code. I am abusing the internal details
-    * within the library, and this is not a supported interface.
-    * This is to verify correct behavior in the library
-    */
-   uint32_t hash= memcached_generate_hash(memc, keys[0], len[0]);
-   for (uint32_t x= 0; x < (repl + 1); ++x)
-   {
-     memcached_server_instance_st instance=
-       memcached_server_instance_by_position(memc_clone, x);
-     ((memcached_server_write_instance_st)instance)->port= 0;
-     if (++hash == memc_clone->number_of_hosts)
-       hash= 0;
-   }
-   memcached_result_st result_obj;
-   for (uint32_t host= 0; host < memc_clone->number_of_hosts; ++host)
-   {
-     for (size_t x= 'a'; x <= 'z'; ++x)
-     {
-       const char key[2]= { [0]= (const char)x };
-       rc= memcached_mget_by_key(memc_clone, key, 1, keys, len, 4);
-       test_true(rc == MEMCACHED_SUCCESS);
-       memcached_result_st *results= memcached_result_create(memc_clone, &result_obj);
-       test_true(results);
-       int hits= 0;
-       while ((results= memcached_fetch_result(memc_clone, &result_obj, &rc)) != NULL)
-       {
-         ++hits;
-       }
-       test_true(hits == 4);
-       memcached_result_free(&result_obj);
-     }
-   }
-   memcached_free(memc_clone);
-   return TEST_SUCCESS;
- }
  
  #if 0
  static test_return_t hash_sanity_test (memcached_st *memc)
  
  static test_return_t hsieh_avaibility_test (memcached_st *memc)
  {
-   memcached_return_t expected_rc= MEMCACHED_FAILURE;
+   memcached_return_t expected_rc= MEMCACHED_INVALID_ARGUMENTS;
  #ifdef HAVE_HSIEH_HASH
    expected_rc= MEMCACHED_SUCCESS;
  #endif
  
  static test_return_t murmur_avaibility_test (memcached_st *memc)
  {
-   memcached_return_t expected_rc= MEMCACHED_FAILURE;
+   memcached_return_t expected_rc= MEMCACHED_INVALID_ARGUMENTS;
  #ifdef HAVE_MURMUR_HASH
    expected_rc= MEMCACHED_SUCCESS;
  #endif
@@@ -5967,11 -5709,9 +5709,11 @@@ static test_return_t wrong_failure_coun
    /* put failure limit to 1 */
    rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, 1);
    assert(rc == MEMCACHED_SUCCESS);
 +
    /* Put a retry timeout to effectively activate failure_limit effect */
    rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 1);
    assert(rc == MEMCACHED_SUCCESS);
 +
    /* change behavior that triggers memcached_quit()*/
    rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1);
    assert(rc == MEMCACHED_SUCCESS);
@@@ -6368,6 -6108,16 +6110,16 @@@ test_st behavior_tests[] =
    {0, 0, 0}
  };
  
+ test_st basic_tests[] ={
+   {"init", 1, (test_callback_fn)basic_init_test},
+   {"clone", 1, (test_callback_fn)basic_clone_test},
+   {"reset", 1, (test_callback_fn)basic_reset_stack_test},
+   {"reset heap", 1, (test_callback_fn)basic_reset_heap_test},
+   {"reset stack clone", 1, (test_callback_fn)basic_reset_stack_clone_test},
+   {"reset heap clone", 1, (test_callback_fn)basic_reset_heap_clone_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},
@@@ -6556,10 -6306,30 +6308,30 @@@ test_st hash_tests[] =
  };
  
  test_st error_conditions[] ={
-   {"memcached_get_MEMCACHED_ERRNO", 0, (test_callback_fn)memcached_get_MEMCACHED_ERRNO },
-   {"memcached_get_MEMCACHED_NOTFOUND", 0, (test_callback_fn)memcached_get_MEMCACHED_NOTFOUND },
-   {"memcached_get_by_key_MEMCACHED_ERRNO", 0, (test_callback_fn)memcached_get_by_key_MEMCACHED_ERRNO },
-   {"memcached_get_by_key_MEMCACHED_NOTFOUND", 0, (test_callback_fn)memcached_get_by_key_MEMCACHED_NOTFOUND },
+   {"memcached_get(MEMCACHED_ERRNO)", 0, (test_callback_fn)memcached_get_MEMCACHED_ERRNO },
+   {"memcached_get(MEMCACHED_NOTFOUND)", 0, (test_callback_fn)memcached_get_MEMCACHED_NOTFOUND },
+   {"memcached_get_by_key(MEMCACHED_ERRNO)", 0, (test_callback_fn)memcached_get_by_key_MEMCACHED_ERRNO },
+   {"memcached_get_by_key(MEMCACHED_NOTFOUND)", 0, (test_callback_fn)memcached_get_by_key_MEMCACHED_NOTFOUND },
+   {"memcached_get_by_key(MEMCACHED_NOTFOUND)", 0, (test_callback_fn)memcached_get_by_key_MEMCACHED_NOTFOUND },
+   {"memcached_increment(MEMCACHED_NO_SERVERS)", 0, (test_callback_fn)memcached_increment_MEMCACHED_NO_SERVERS },
+   {0, 0, (test_callback_fn)0}
+ };
+ test_st parser_tests[] ={
+   {"behavior", 0, (test_callback_fn)behavior_parser_test },
+   {"boolean_options", 0, (test_callback_fn)parser_boolean_options_test },
+   {"configure_file", 0, (test_callback_fn)memcached_create_with_options_with_filename },
+   {"distribtions", 0, (test_callback_fn)parser_distribution_test },
+   {"hash", 0, (test_callback_fn)parser_hash_test },
+   {"libmemcached_check_configuration", 0, (test_callback_fn)libmemcached_check_configuration_test },
+   {"libmemcached_check_configuration_with_filename", 0, (test_callback_fn)libmemcached_check_configuration_with_filename_test },
+   {"memcached_parse_configure_file", 0, (test_callback_fn)memcached_parse_configure_file_test },
+   {"number_options", 0, (test_callback_fn)parser_number_options_test },
+   {"randomly generated options", 0, (test_callback_fn)random_statement_build_test },
+   {"prefix_key", 0, (test_callback_fn)parser_key_prefix_test },
+   {"server", 0, (test_callback_fn)server_test },
+   {"servers", 0, (test_callback_fn)servers_test },
    {0, 0, (test_callback_fn)0}
  };
  
@@@ -6567,6 -6337,7 +6339,7 @@@ collection_st collection[] =
  #if 0
    {"hash_sanity", 0, 0, hash_sanity},
  #endif
+   {"basic", 0, 0, basic_tests},
    {"hsieh_availability", 0, 0, hsieh_availability},
    {"murmur_availability", 0, 0, murmur_availability},
    {"block", 0, 0, tests},
    {"behaviors", 0, 0, behavior_tests},
    {"regression_binary_vs_block", (test_callback_fn)key_setup, (test_callback_fn)key_teardown, regression_binary_vs_block},
    {"error_conditions", 0, 0, error_conditions},
+   {"parser", 0, 0, parser_tests},
    {0, 0, 0, 0}
  };