This is a rewrite of some of the IO code to handle larger loads of set data
[awesomized/libmemcached] / tests / test.c
index e12df9fc28724075ea7e8bc2e75501df4a2c09df..714cd89120223fe01883746486f1f7ab51361263 100644 (file)
@@ -47,8 +47,6 @@ void set_test(memcached_st *memc)
   char *key= "foo";
   char *value= "when we sanitize";
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint16_t)0);
@@ -61,8 +59,6 @@ void add_test(memcached_st *memc)
   char *key= "foo";
   char *value= "when we sanitize";
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
   rc= memcached_add(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint16_t)0);
@@ -75,8 +71,6 @@ void replace_test(memcached_st *memc)
   char *key= "foo";
   char *value= "when we sanitize";
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
   rc= memcached_replace(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint16_t)0);
@@ -89,8 +83,6 @@ void delete_test(memcached_st *memc)
   char *key= "foo";
   char *value= "when we sanitize";
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint16_t)0);
@@ -104,8 +96,6 @@ void flush_test(memcached_st *memc)
 {
   memcached_return rc;
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
   rc= memcached_flush(memc, 0);
   assert(rc == MEMCACHED_SUCCESS);
 }
@@ -118,9 +108,6 @@ void get_test(memcached_st *memc)
   size_t string_length;
   uint16_t flags;
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-  
   string= memcached_get(memc, key, strlen(key),
                         &string_length, &flags, &rc);
 
@@ -138,9 +125,6 @@ void get_test2(memcached_st *memc)
   size_t string_length;
   uint16_t flags;
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint16_t)0);
@@ -165,9 +149,6 @@ void set_test2(memcached_st *memc)
   size_t value_length= strlen(value);
   unsigned int x;
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   for (x= 0; x < 10; x++)
   {
     rc= memcached_set(memc, key, strlen(key), 
@@ -191,9 +172,6 @@ void set_test3(memcached_st *memc)
   for (x= 0; x < value_length; x++)
     value[x] = (char) (x % 127);
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   for (x= 0; x < 1; x++)
   {
     rc= memcached_set(memc, key, strlen(key), 
@@ -222,9 +200,6 @@ void get_test3(memcached_st *memc)
   for (x= 0; x < value_length; x++)
     value[x] = (char) (x % 127);
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   rc= memcached_set(memc, key, strlen(key), 
                     value, value_length,
                     (time_t)0, (uint16_t)0);
@@ -259,9 +234,6 @@ void get_test4(memcached_st *memc)
   for (x= 0; x < value_length; x++)
     value[x] = (char) (x % 127);
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   rc= memcached_set(memc, key, strlen(key), 
                     value, value_length,
                     (time_t)0, (uint16_t)0);
@@ -298,9 +270,6 @@ void increment_test(memcached_st *memc)
   char *key= "number";
   char *value= "0";
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint16_t)0);
@@ -324,9 +293,6 @@ void decrement_test(memcached_st *memc)
   char *key= "number";
   char *value= "3";
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)0, (uint16_t)0);
@@ -349,9 +315,6 @@ void quit_test(memcached_st *memc)
   char *key= "fudge";
   char *value= "sanford and sun";
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   rc= memcached_set(memc, key, strlen(key), 
                     value, strlen(value),
                     (time_t)10, (uint16_t)3);
@@ -377,9 +340,6 @@ void mget_test(memcached_st *memc)
   char *return_value;
   size_t return_value_length;
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   /* We need to empty the server before continueing test */
   rc= memcached_flush(memc, 0);
   assert(rc == MEMCACHED_SUCCESS);
@@ -413,8 +373,8 @@ void mget_test(memcached_st *memc)
   {
     assert(return_value);
     assert(rc == MEMCACHED_SUCCESS);
-    assert(key_length[x] == return_value_length);
-    assert(!memcmp(return_value, keys[x], return_value_length));
+    assert(return_key_length == return_value_length);
+    assert(!memcmp(return_value, return_key, return_value_length));
     free(return_value);
     x++;
   }
@@ -431,6 +391,7 @@ void get_stats_keys(memcached_st *memc)
  assert(rc == MEMCACHED_SUCCESS);
  for (ptr= list; *ptr; ptr++)
    printf("Found key %s\n", *ptr);
+ fflush(stdout);
 
  free(list);
 }
@@ -443,41 +404,6 @@ void get_stats(memcached_st *memc)
  memcached_return rc;
  memcached_stat_st *stat;
 
- rc= memcached_server_add(memc, "localhost", 0);
- assert(rc == MEMCACHED_SUCCESS);
-
- stat= memcached_stat(memc, NULL, &rc);
- assert(rc == MEMCACHED_SUCCESS);
-
- assert(rc == MEMCACHED_SUCCESS);
- assert(stat);
-
- for (x= 0; x < memcached_server_count(memc); x++)
- {
-   list= memcached_stat_get_keys(memc, &stat[x], &rc);
-   assert(rc == MEMCACHED_SUCCESS);
-   for (ptr= list; *ptr; ptr++)
-     printf("Found key %s\n", *ptr);
-
-   free(list);
- }
-
- free(stat);
-}
-
-void get_stats_multiple(memcached_st *memc)
-{
- unsigned int x;
- char **list;
- char **ptr;
- memcached_return rc;
- memcached_stat_st *stat;
-
- rc= memcached_server_add(memc, "localhost", 0);
- assert(rc == MEMCACHED_SUCCESS);
- rc= memcached_server_add(memc, "localhost", 5555);
- assert(rc == MEMCACHED_SUCCESS);
-
  stat= memcached_stat(memc, NULL, &rc);
  assert(rc == MEMCACHED_SUCCESS);
 
@@ -504,9 +430,6 @@ void add_host_test(memcached_st *memc)
   memcached_return rc;
   char servername[]= "0.example.com";
 
-  rc= memcached_server_add(memc, "localhost", 0);
-  assert(rc == MEMCACHED_SUCCESS);
-
   servers= memcached_server_list_append(NULL, servername, 400, &rc);
   assert(servers);
   assert(1 == memcached_server_list_count(servers));
@@ -530,6 +453,81 @@ void add_host_test(memcached_st *memc)
   memcached_server_list_free(servers);
 }
 
+/* We don't test the behavior itself, we test the switches */
+void behavior_test(memcached_st *memc)
+{
+  unsigned long long value;
+  unsigned int set= 1;
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &set);
+  value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
+  assert(value == 1);
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &set);
+  value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
+  assert(value == 1);
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_MD5_HASHING, &set);
+  value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_MD5_HASHING);
+  assert(value == 1);
+
+  set= 0;
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &set);
+  value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
+  assert(value == 0);
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &set);
+  value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
+  assert(value == 0);
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_MD5_HASHING, &set);
+  value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_MD5_HASHING);
+  assert(value == 0);
+}
+
+/* Test case provided by Cal Haldenbrand */
+void user_supplied_bug1(memcached_st *memc)
+{
+  unsigned int setter= 1;
+  unsigned int x;
+
+  long total= 0;
+  int size= 0;
+  srand(time(NULL));
+  char key[10];
+  char *randomstuff = (char *)malloc(6 * 1024); 
+  memset(randomstuff, 0, 6 * 1024);
+
+  memcached_return rc;
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &setter);
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &setter);
+
+
+  /* add key */
+  for (x= 0 ; total < 20 * 1024576 ; x++ )
+  {
+    unsigned int j= 0;
+
+    size= (rand() % ( 5 * 1024 ) ) + 400;
+    memset(randomstuff, 0, 6 * 1024);
+    assert(size < 6 * 1024); /* Being safe here */
+
+    for (j= 0 ; j < size ;j++) 
+      randomstuff[j] = (char) (rand() % 26) + 97;
+
+    total += size;
+    sprintf(key, "%d", x);
+    rc = memcached_set(memc, key, strlen(key), 
+                       randomstuff, strlen(randomstuff), 10, 0);
+    /* If we fail, lets try again */
+    if (rc != MEMCACHED_SUCCESS)
+      rc = memcached_set(memc, key, strlen(key), 
+                         randomstuff, strlen(randomstuff), 10, 0);
+    assert(rc == MEMCACHED_SUCCESS);
+  }
+}
 void add_host_test1(memcached_st *memc)
 {
   unsigned int x;
@@ -571,6 +569,17 @@ struct test_st {
 int main(int argc, char *argv[])
 {
   unsigned int x;
+  char *server_list;
+  memcached_server_st *servers;
+
+  if (!(server_list= getenv("MEMCACHED_SERVERS")))
+    server_list= "localhost";
+
+  printf("servers %s\n", server_list);
+  srandom(time(NULL));
+
+  servers= memcached_servers_parse(server_list);
+  assert(servers);
 
   /* Clean the server before beginning testing */
   test_st tests[] ={
@@ -596,6 +605,12 @@ int main(int argc, char *argv[])
     {"get_stats", 0, get_stats },
     {"add_host_test", 0, add_host_test },
     {"get_stats_keys", 0, get_stats_keys },
+    {"behavior_test", 0, get_stats_keys },
+    {0, 0, 0}
+  };
+
+  test_st user_tests[] ={
+    {"user_supplied_bug1", 0, user_supplied_bug1 },
     {0, 0, 0}
   };
 
@@ -603,8 +618,13 @@ int main(int argc, char *argv[])
   for (x= 0; tests[x].function_name; x++)
   {
     memcached_st *memc;
+    memcached_return rc;
     memc= memcached_create(NULL);
     assert(memc);
+
+    rc= memcached_server_push(memc, servers);
+    assert(rc == MEMCACHED_SUCCESS);
+
     fprintf(stderr, "Testing %s", tests[x].function_name);
     tests[x].function(memc);
     fprintf(stderr, "\t\t\t\t\t[ ok ]\n");
@@ -616,8 +636,13 @@ int main(int argc, char *argv[])
   for (x= 0; tests[x].function_name; x++)
   {
     memcached_st *memc;
+    memcached_return rc;
     memc= memcached_create(NULL);
     assert(memc);
+
+    rc= memcached_server_push(memc, servers);
+    assert(rc == MEMCACHED_SUCCESS);
+
     fprintf(stderr, "Testing %s", tests[x].function_name);
     memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, NULL);
     tests[x].function(memc);
@@ -626,14 +651,60 @@ int main(int argc, char *argv[])
     memcached_free(memc);
   }
 
+  fprintf(stderr, "\nTCP Nodelay tests\n\n");
+  for (x= 0; tests[x].function_name; x++)
+  {
+    memcached_st *memc;
+    memcached_return rc;
+    memc= memcached_create(NULL);
+    assert(memc);
+
+    rc= memcached_server_push(memc, servers);
+    assert(rc == MEMCACHED_SUCCESS);
+
+    fprintf(stderr, "Testing %s", tests[x].function_name);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, NULL);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, NULL);
+    tests[x].function(memc);
+    fprintf(stderr, "\t\t\t\t\t[ ok ]\n");
+    assert(memc);
+    memcached_free(memc);
+  }
+
+  fprintf(stderr, "\nMD5 Hashing\n\n");
+  for (x= 0; tests[x].function_name; x++)
+  {
+    memcached_st *memc;
+    memcached_return rc;
+    memc= memcached_create(NULL);
+    assert(memc);
+
+    rc= memcached_server_push(memc, servers);
+    assert(rc == MEMCACHED_SUCCESS);
+
+    fprintf(stderr, "Testing %s", tests[x].function_name);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_MD5_HASHING, NULL);
+    tests[x].function(memc);
+    fprintf(stderr, "\t\t\t\t\t[ ok ]\n");
+    assert(memc);
+    memcached_free(memc);
+  }
 
-  /* The multiple tests */
-  if (argc == 2)
+  fprintf(stderr, "\nUser Supplied tests\n\n");
+  for (x= 0; user_tests[x].function_name; x++)
   {
     memcached_st *memc;
+    memcached_return rc;
     memc= memcached_create(NULL);
     assert(memc);
-    get_stats_multiple(memc);
+
+    rc= memcached_server_push(memc, servers);
+    assert(rc == MEMCACHED_SUCCESS);
+
+    fprintf(stderr, "Testing %s", user_tests[x].function_name);
+    user_tests[x].function(memc);
+    fprintf(stderr, "\t\t\t\t\t[ ok ]\n");
+    assert(memc);
     memcached_free(memc);
   }
 
@@ -645,5 +716,8 @@ int main(int argc, char *argv[])
     flush_test(memc);
     memcached_free(memc);
   }
+
+  fprintf(stderr, "All tests completed successfully\n\n");
+
   return 0;
 }