testing: freebsd [travis skip]
[m6w6/libmemcached] / test / tests / memcached / callbacks.cpp
index 476842ff923b14579b4fe47fefa1fafc43e36e9c..625698b6bb7d38e279780946e24357fee7a3bbae 100644 (file)
@@ -1,21 +1,6 @@
 #include "test/lib/common.hpp"
 #include "test/lib/MemcachedCluster.hpp"
-
-static memcached_return_t delete_trigger(memcached_st *, const char *, size_t) {
-  return MEMCACHED_SUCCESS;
-}
-
-static memcached_return_t read_through_trigger(memcached_st *, char *, size_t, memcached_result_st *result) {
-  return memcached_result_set_value(result, S("updated by read through trigger"));
-}
-
-static memcached_return_t clone_callback(memcached_st *, memcached_st *) {
-  return MEMCACHED_SUCCESS;
-}
-
-static memcached_return_t cleanup_callback(memcached_st *) {
-  return MEMCACHED_SUCCESS;
-}
+#include "test/fixtures/callbacks.hpp"
 
 TEST_CASE("memcached_callbacks") {
   auto test{MemcachedCluster::mixed()};
@@ -45,74 +30,85 @@ TEST_CASE("memcached_callbacks") {
   }
 
   SECTION("get_failure callback") {
-    void *gptr = reinterpret_cast<void *>(reinterpret_cast<intptr_t>(&read_through_trigger));
+    void *gptr = reinterpret_cast<void *>(reinterpret_cast<intptr_t>(&get_failure));
     Malloced empty(memcached_get(memc, S(__func__), nullptr, nullptr, &rc));
     REQUIRE_FALSE(*empty);
     REQUIRE_RC(MEMCACHED_NOTFOUND, rc);
 
-    REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_GET_FAILURE, gptr));
-    REQUIRE(gptr == memcached_callback_get(memc, MEMCACHED_CALLBACK_GET_FAILURE, &rc));
-    REQUIRE_SUCCESS(rc);
-
-    for (int twice = 0; twice < 2; ++twice) {
-      uint32_t flags;
-      size_t len;
-      Malloced val(memcached_get(memc, S(__func__), &len, &flags, &rc));
+    uint64_t buffering = GENERATE(0, 1);
 
+    DYNAMIC_SECTION("buffering: " << buffering) {
+      REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, buffering));
+      REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_GET_FAILURE, gptr));
+      REQUIRE(gptr == memcached_callback_get(memc, MEMCACHED_CALLBACK_GET_FAILURE, &rc));
       REQUIRE_SUCCESS(rc);
-      REQUIRE(string("updated by read through trigger") == string(*val, len));
-      REQUIRE_FALSE((*val)[len]);
-    }
 
-    SECTION("clone callback") {
-      void *cptr = reinterpret_cast<void *>(reinterpret_cast<intptr_t>(&clone_callback));
+      for (int twice = 0; twice < 2; ++twice) {
+        uint32_t flags;
+        size_t len;
+        Malloced val(memcached_get(memc, S(__func__), &len, &flags, &rc));
 
-      REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, cptr));
-      REQUIRE(cptr == memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc));
+        REQUIRE_SUCCESS(rc);
+        REQUIRE(string("updated by read through trigger") == string(*val, len));
+        REQUIRE_FALSE((*val)[len]);
+      }
+
+      REQUIRE_SUCCESS(memcached_set(memc, S(__func__), S("changed"), 0, 0));
+      memcached_quit(memc);
+      Malloced val(memcached_get(memc, S(__func__), nullptr, nullptr, &rc));
       REQUIRE_SUCCESS(rc);
+      REQUIRE("changed"s == *val);
     }
+  }
 
-    SECTION("cleanup callback") {
-      void *cptr = reinterpret_cast<void *>(reinterpret_cast<intptr_t>(cleanup_callback));
+  SECTION("clone callback") {
+    void *cptr = reinterpret_cast<void *>(reinterpret_cast<intptr_t>(&clone_callback));
 
-      REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_CLEANUP_FUNCTION, cptr));
-      REQUIRE(cptr == memcached_callback_get(memc, MEMCACHED_CALLBACK_CLEANUP_FUNCTION, &rc));
-      REQUIRE_SUCCESS(rc);
-    }
+    REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, cptr));
+    REQUIRE(cptr == memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc));
+    REQUIRE_SUCCESS(rc);
+  }
 
-    SECTION("namespace") {
-      void *ns;
+  SECTION("cleanup callback") {
+    void *cptr = reinterpret_cast<void *>(reinterpret_cast<intptr_t>(cleanup_callback));
 
-      REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, "ns"));
-      ns = memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
-      REQUIRE_SUCCESS(rc);
-      REQUIRE("ns"s == static_cast<char *>(ns));
+    REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_CLEANUP_FUNCTION, cptr));
+    REQUIRE(cptr == memcached_callback_get(memc, MEMCACHED_CALLBACK_CLEANUP_FUNCTION, &rc));
+    REQUIRE_SUCCESS(rc);
+  }
 
-      REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, nullptr));
-      ns = memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
-      REQUIRE_SUCCESS(rc);
-      REQUIRE(nullptr == ns);
+  SECTION("namespace") {
+    void *ns;
 
+    REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, "ns"));
+    ns = memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
+    REQUIRE_SUCCESS(rc);
+    REQUIRE("ns"s == static_cast<char *>(ns));
 
-      uint64_t binary = GENERATE(0, 1);
-      REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, binary));
+    REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, nullptr));
+    ns = memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
+    REQUIRE_SUCCESS(rc);
+    REQUIRE(nullptr == ns);
 
-      DYNAMIC_SECTION("too long (binary=" << binary << ")") {
-        string blob;
 
-        blob = random_ascii_string(MEMCACHED_MAX_NAMESPACE-1, '@', 'Z');
-        REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, blob.c_str()));
+    uint64_t binary = GENERATE(0, 1);
+    REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, binary));
 
-        blob = random_ascii_string(MEMCACHED_MAX_NAMESPACE, '@', 'Z');
-        REQUIRE_RC(MEMCACHED_KEY_TOO_BIG,memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, blob.c_str()));
-      }
+    DYNAMIC_SECTION("too long (binary=" << binary << ")") {
+      string blob;
 
-      DYNAMIC_SECTION("verify key (binary=" << binary << ")") {
-        REQUIRE_RC(binary ? MEMCACHED_INVALID_ARGUMENTS : MEMCACHED_SUCCESS,
-            memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 1));
-        REQUIRE_RC(binary ? MEMCACHED_SUCCESS : MEMCACHED_BAD_KEY_PROVIDED,
-            memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, "with spaces"));
-      }
+      blob = random_ascii_string(MEMCACHED_MAX_NAMESPACE-1, '@', 'Z');
+      REQUIRE_SUCCESS(memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, blob.c_str()));
+
+      blob = random_ascii_string(MEMCACHED_MAX_NAMESPACE, '@', 'Z');
+      REQUIRE_RC(MEMCACHED_KEY_TOO_BIG,memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, blob.c_str()));
+    }
+
+    DYNAMIC_SECTION("verify key (binary=" << binary << ")") {
+      REQUIRE_RC(binary ? MEMCACHED_INVALID_ARGUMENTS : MEMCACHED_SUCCESS,
+          memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 1));
+      REQUIRE_RC(binary ? MEMCACHED_SUCCESS : MEMCACHED_BAD_KEY_PROVIDED,
+          memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, "with spaces"));
     }
   }
 }