Add small ketama test.
authorBrian Aker <brian@tangent.org>
Sun, 16 Dec 2012 07:14:08 +0000 (02:14 -0500)
committerBrian Aker <brian@tangent.org>
Sun, 16 Dec 2012 07:14:08 +0000 (02:14 -0500)
libmemcached/io.cc
tests/include.am
tests/libmemcached-1.0/all_tests.h
tests/libmemcached-1.0/mem_functions.cc
tests/libmemcached-1.0/mem_functions.h
tests/memc.h [deleted file]
tests/memc.hpp [new file with mode: 0644]
tests/runner.h

index 886476f6b353301f88f76725357486e38434a431..b1f1327c489b47da6111a2dec1763c97d380157b 100644 (file)
@@ -79,10 +79,10 @@ static bool repack_input_buffer(org::libmemcached::Instance* ptr)
     do {
       /* Just try a single read to grab what's available */
       ssize_t nr;
-      if ((nr= recv(ptr->fd,
+      if ((nr= ::recv(ptr->fd,
                     ptr->read_ptr + ptr->read_data_length,
                     MEMCACHED_MAX_BUFFER - ptr->read_data_length,
-                    MSG_DONTWAIT)) <= 0)
+                    MSG_DONTWAIT|MSG_NOSIGNAL)) <= 0)
       {
         if (nr == 0)
         {
@@ -419,7 +419,7 @@ static memcached_return_t _io_fill(org::libmemcached::Instance* ptr)
   ssize_t data_read;
   do
   {
-    data_read= ::recv(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER, MSG_DONTWAIT);
+    data_read= ::recv(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER, MSG_DONTWAIT|MSG_NOSIGNAL);
     if (data_read == SOCKET_ERROR)
     {
       switch (get_socket_errno())
@@ -557,7 +557,7 @@ memcached_return_t memcached_io_slurp(org::libmemcached::Instance* ptr)
   char buffer[MEMCACHED_MAX_BUFFER];
   do
   {
-    data_read= recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_DONTWAIT);
+    data_read= ::recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_DONTWAIT|MSG_NOSIGNAL);
     if (data_read == SOCKET_ERROR)
     {
       switch (get_socket_errno())
index 288e276bd808b3b581af8bab17216383c135c64d..7e924604831d00b9fac7f58dd3cf64459736b046 100644 (file)
@@ -21,7 +21,7 @@ noinst_HEADERS+= tests/keys.hpp
 noinst_HEADERS+= tests/libmemcached_test_container.h
 noinst_HEADERS+= tests/libmemcached_world.h
 noinst_HEADERS+= tests/libmemcached_world_socket.h
-noinst_HEADERS+= tests/memc.h
+noinst_HEADERS+= tests/memc.hpp
 noinst_HEADERS+= tests/runner.h
 
 # Cycle should always run first
index 2da9c7e314b0ad127bf633f0667e15fe7004f7a3..18a55f97cfff34eee9ca94a6b42f04aa33be5dfc 100644 (file)
@@ -346,6 +346,7 @@ test_st hash_sanity[] ={
 #endif
 
 test_st ketama_auto_eject_hosts[] ={
+  {"basic ketama test", true, (test_callback_fn*)ketama_TEST },
   {"auto_eject_hosts", true, (test_callback_fn*)auto_eject_hosts },
   {"output_ketama_weighted_keys", true, (test_callback_fn*)output_ketama_weighted_keys },
   {0, 0, (test_callback_fn*)0}
index 49be55da94aa8cee4e5f51d185d5d11482406456..81d635067ee60012cd1ae363f22ca3e51dd74d11 100644 (file)
@@ -86,6 +86,7 @@ using namespace libtest;
 #include "tests/libmemcached-1.0/setup_and_teardowns.h"
 #include "tests/print.h"
 #include "tests/debug.h"
+#include "tests/memc.hpp"
 
 #define UUID_STRING_MAXLENGTH 36
 
@@ -2764,6 +2765,25 @@ test_return_t user_supplied_bug21(memcached_st *memc)
   return TEST_SUCCESS;
 }
 
+test_return_t ketama_TEST(memcached_st *)
+{
+  test::Memc memc("--server=10.0.1.1:11211 --server=10.0.1.2:11211");
+
+  test_compare(MEMCACHED_SUCCESS,
+               memcached_behavior_set(&memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, true));
+
+  test_compare(memcached_behavior_get(&memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED), uint64_t(1));
+
+  test_compare(memcached_behavior_set(&memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5), MEMCACHED_SUCCESS);
+
+  test_compare(memcached_behavior_get(&memc, MEMCACHED_BEHAVIOR_KETAMA_HASH), MEMCACHED_HASH_MD5);
+
+  test_compare(memcached_behavior_set_distribution(&memc, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY), MEMCACHED_SUCCESS);
+
+
+  return TEST_SUCCESS;
+}
+
 test_return_t output_ketama_weighted_keys(memcached_st *)
 {
   memcached_st *memc= memcached_create(NULL);
index b3c0bf57221735fad73d7dd314c85095a981e5cf..374bc9c494acd5fdc332bfcea344e6405c063279 100644 (file)
@@ -117,6 +117,7 @@ test_return_t murmur_run (memcached_st *);
 test_return_t murmur3_TEST(hashkit_st *);
 test_return_t noreply_test(memcached_st *memc);
 test_return_t one_at_a_time_run (memcached_st *);
+test_return_t ketama_TEST(memcached_st *);
 test_return_t output_ketama_weighted_keys(memcached_st *);
 test_return_t libmemcached_util_ping_TEST(memcached_st*);
 test_return_t prepend_test(memcached_st *memc);
diff --git a/tests/memc.h b/tests/memc.h
deleted file mode 100644 (file)
index fbe42c5..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
- * 
- *  Gearmand client and server library.
- *
- *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are
- *  met:
- *
- *      * Redistributions of source code must retain the above copyright
- *  notice, this list of conditions and the following disclaimer.
- *
- *      * Redistributions in binary form must reproduce the above
- *  copyright notice, this list of conditions and the following disclaimer
- *  in the documentation and/or other materials provided with the
- *  distribution.
- *
- *      * The names of its contributors may not be used to endorse or
- *  promote products derived from this software without specific prior
- *  written permission.
- *
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#pragma once
-
-class Memc {
-public:
-  Memc()
-  {
-    _memc= memcached_create(NULL);
-
-    if (_memc == NULL)
-    {
-      throw "memcached_create() failed";
-    }
-  }
-
-  Memc(memcached_st* arg)
-  {
-    _memc= memcached_clone(NULL, arg);
-
-    if (_memc == NULL)
-    {
-      throw "memcached_clone() failed";
-    }
-  }
-
-  memcached_st* operator&() const
-  { 
-    return _memc;
-  }
-
-  memcached_st* operator->() const
-  { 
-    return _memc;
-  }
-
-  ~Memc()
-  {
-    memcached_free(_memc);
-  }
-
-private:
-  memcached_st *_memc;
-
-};
diff --git a/tests/memc.hpp b/tests/memc.hpp
new file mode 100644 (file)
index 0000000..5e7621b
--- /dev/null
@@ -0,0 +1,104 @@
+/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ * 
+ *  Libmemcached library
+ *
+ *  Copyright (C) 2012 Data Differential, http://datadifferential.com/
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ *
+ *      * Redistributions of source code must retain the above copyright
+ *  notice, this list of conditions and the following disclaimer.
+ *
+ *      * Redistributions in binary form must reproduce the above
+ *  copyright notice, this list of conditions and the following disclaimer
+ *  in the documentation and/or other materials provided with the
+ *  distribution.
+ *
+ *      * The names of its contributors may not be used to endorse or
+ *  promote products derived from this software without specific prior
+ *  written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#pragma once
+
+namespace test {
+
+class Memc {
+public:
+  Memc()
+  {
+    _memc= memcached_create(NULL);
+
+    if (_memc == NULL)
+    {
+      throw "memcached_create() failed";
+    }
+  }
+
+  Memc(const memcached_st* arg)
+  {
+    _memc= memcached_clone(NULL, arg);
+
+    if (_memc == NULL)
+    {
+      throw "memcached_clone() failed";
+    }
+  }
+
+  Memc(const std::string& arg)
+  {
+    _memc= memcached(arg.c_str(), arg.size());
+    if (_memc == NULL)
+    {
+      throw "memcached() failed";
+    }
+  }
+
+  Memc(in_port_t arg)
+  {
+    _memc= memcached_create(NULL);
+
+    if (_memc == NULL)
+    {
+      throw "memcached_create() failed";
+    }
+    memcached_server_add(_memc, "localhost", arg);
+  }
+
+  memcached_st* operator&() const
+  { 
+    return _memc;
+  }
+
+  memcached_st* operator->() const
+  { 
+    return _memc;
+  }
+
+  ~Memc()
+  {
+    memcached_free(_memc);
+  }
+
+private:
+  memcached_st *_memc;
+
+};
+
+} // namespace test
index 0d1a767dcfde56d44be320b67b4d4e024ccd7af7..9ec65c0635bfaf9cfcccac641e17834dcf30bcae 100644 (file)
@@ -39,7 +39,7 @@
 #pragma once
 
 #include "tests/libmemcached-1.0/generate.h"
-#include "tests/memc.h"
+#include "tests/memc.hpp"
 #include "tests/print.h"
 
 class LibmemcachedRunner : public libtest::Runner {
@@ -56,7 +56,7 @@ public:
 
   test_return_t flush(libmemcached_test_container_st *container)
   {
-    Memc memc(container->parent());
+    test::Memc memc(container->parent());
     memcached_flush(&memc, 0);
     memcached_quit(&memc);
 
@@ -78,7 +78,7 @@ private:
   {
     test_true(container);
     test_true(container->parent());
-    Memc memc(container->parent());
+    test::Memc memc(container->parent());
 
     test_compare(true, check());