testing
[awesomized/libmemcached] / test / tests / memcached / noblock.cpp
diff --git a/test/tests/memcached/noblock.cpp b/test/tests/memcached/noblock.cpp
new file mode 100644 (file)
index 0000000..aa88b84
--- /dev/null
@@ -0,0 +1,43 @@
+#include "test/lib/common.hpp"
+#include "test/lib/MemcachedCluster.hpp"
+
+TEST_CASE("memcached_noblock") {
+  auto test = MemcachedCluster::network();
+  auto memc = &test.memc;
+  auto timeout = GENERATE(0, -1);
+
+  REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1));
+  REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1));
+  REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, timeout));
+
+  auto num = timeout ? 10'000 : 1'000'000;
+  auto hit = 0u;
+  auto rnd = random_ascii_string(512);
+  for (auto i = 0; i < num; ++i) {
+    auto key = to_string(i);
+    auto rc = memcached_set(memc, key.c_str(), key.length(), rnd.c_str(), rnd.length(), 1, 0);
+    switch (rc) {
+    case MEMCACHED_SUCCESS:
+    case MEMCACHED_BUFFERED:
+    case MEMCACHED_SERVER_TEMPORARILY_DISABLED:
+      break;
+    case MEMCACHED_TIMEOUT:
+    case MEMCACHED_WRITE_FAILURE:
+      if(!timeout) {
+        --i;
+      }
+      ++hit;
+      REQUIRE(true);
+      break;
+    default:
+      REQUIRE(false);
+    }
+  }
+  INFO("failures triggered: " << hit);
+  if (timeout) {
+    CHECK_FALSE(hit);
+  } else {
+    CHECK(hit > 0);
+    CHECK(hit <= test.cluster.getServers().size());
+  }
+}