libmemcached: add MEMCACHED_BEHAVIOR_META_PROTOCOL
[awesomized/libmemcached] / test / lib / MemcachedCluster.cpp
index 06e2c7f1b97d3cfac6f49366d723b4fa12a05d6a..ce348d65b7387d96bef8d12c931119d653a2f7e3 100644 (file)
@@ -6,13 +6,8 @@ const memcached_st MemcachedCluster::empty_memc{};
 void MemcachedCluster::init() {
   REQUIRE(cluster.start());
 
-  Retry cluster_is_listening([this]() {
-    return cluster.isListening();
-  });
-  while (!cluster_is_listening()) {
-    cluster.stop();
-    cluster.wait();
-    cluster.start();
+  while (!cluster.ensureListening()) {
+    cluster.restart();
   }
 
   if (auto br = getenv_else("MEMCACHED_BREAK", "0")) {
@@ -46,7 +41,7 @@ void MemcachedCluster::init() {
 }
 
 MemcachedCluster::~MemcachedCluster() {
-  if (memcmp(&memc, &empty_memc, sizeof(memc))) {
+  if (!!memcmp(&memc, &empty_memc, sizeof(memc))) {
     memcached_free(&memc);
   }
 }
@@ -71,16 +66,16 @@ MemcachedCluster::MemcachedCluster(Cluster &&cluster_, behaviors_t to_set_)
   init();
 }
 
-MemcachedCluster::MemcachedCluster(MemcachedCluster &&mc)
+MemcachedCluster::MemcachedCluster(MemcachedCluster &&mc) noexcept
     : cluster{Server{}}
 {
   *this = move(mc);
 }
 
-MemcachedCluster &MemcachedCluster::operator=(MemcachedCluster &&mc) {
+MemcachedCluster &MemcachedCluster::operator=(MemcachedCluster &&mc) noexcept {
   cluster = move(mc.cluster);
   memcached_clone(&memc, &mc.memc);
-  returns = ReturnMatcher{&memc};
+  returns = &memc;
   return *this;
 }
 
@@ -136,6 +131,11 @@ void MemcachedCluster::enableBinaryProto(bool enable) {
       MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, enable));
 }
 
+void MemcachedCluster::enableMetaProto(bool enable) {
+  REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
+      MEMCACHED_BEHAVIOR_META_PROTOCOL, enable));
+}
+
 void MemcachedCluster::enableBuffering(bool enable) {
   REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
       MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, enable));
@@ -146,8 +146,20 @@ void MemcachedCluster::enableReplication() {
       MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, memcached_server_count(&memc) - 1));
 }
 
-void MemcachedCluster::killOneServer() {
+void MemcachedCluster::killOneServer() const {
   const auto &servers = cluster.getServers();
-  const auto &victim = servers[random_num(0UL, servers.size() - 1)];
+  const auto &victim = servers[random_num((size_t)0, servers.size() - 1)];
   ::kill(victim.getPid(), SIGKILL);
 }
+
+bool MemcachedCluster::isGEVersion(uint8_t major, uint8_t minor, uint8_t micro) {
+  REQUIRE(MEMCACHED_SUCCESS == memcached_version(&memc));
+  auto inst = memcached_server_instance_by_position(&memc, 0);
+  auto maj = memcached_server_major_version(inst);
+  auto min = memcached_server_minor_version(inst);
+  auto mic = memcached_server_micro_version(inst);
+
+  return (maj > major)
+      || (maj == major && min > minor)
+      || (maj == major && min == minor && mic >= micro);
+}