testing: be less picky when testing test/lib/Connection
[awesomized/libmemcached] / test / tests / lib.cpp
index aac8f436705a9465bacfc43973b42518003e563a..7d6143bd210d0b2c3212f5b5dc8cf3295c022bfc 100644 (file)
@@ -2,18 +2,20 @@
 #include "test/lib/Cluster.hpp"
 #include "test/lib/Retry.hpp"
 #include "test/lib/Server.hpp"
+#include "test/lib/Connection.hpp"
 
 TEST_CASE("lib/Server") {
-  Server server{MEMCACHED_BINARY, {Server::arg_t{"-v"}}};
+  Server server{MEMCACHED_BINARY, {
+    Server::arg_t{"-v"},
+    Server::arg_pair_t{"-p", random_port_string}
+  }};
 
   SECTION("starts and listens") {
 
     REQUIRE(server.start().has_value());
-
-    Retry server_is_listening{[&server] {
-      return server.isListening();
-    }};
-    REQUIRE(server_is_listening());
+    REQUIRE(server.ensureListening());
+    REQUIRE(server.isListening());
+    REQUIRE(server.check());
 
     SECTION("stops") {
 
@@ -26,6 +28,7 @@ TEST_CASE("lib/Server") {
         SECTION("stopped") {
 
           REQUIRE_FALSE(server.check());
+          REQUIRE_FALSE(server.isListening());
         }
       }
     }
@@ -40,11 +43,8 @@ TEST_CASE("lib/Cluster") {
   SECTION("starts and listens") {
 
     REQUIRE(cluster.start());
-
-    Retry cluster_is_listening{[&cluster] {
-      return cluster.isListening();
-    }};
-    REQUIRE(cluster_is_listening());
+    REQUIRE(cluster.ensureListening());
+    REQUIRE(cluster.isListening());
 
     SECTION("stops") {
 
@@ -54,7 +54,46 @@ TEST_CASE("lib/Cluster") {
       SECTION("stopped") {
 
         REQUIRE(cluster.isStopped());
+        REQUIRE_FALSE(cluster.isListening());
+      }
+    }
+  }
+}
+
+TEST_CASE("lib/Connection") {
+  SECTION("sockaddr_un") {
+    auto f = []{
+      Connection conn{"/this/is/way/too/long/for/a/standard/unix/socket/path/living/on/this/system/at/least/i/hope/so/and/this/is/about/to/fail/for/the/sake/of/this/test.sock"};
+      return conn;
+    };
+    REQUIRE_THROWS(f());
+  }
+  SECTION("connect") {
+    Cluster cluster{Server{MEMCACHED_BINARY,
+                           {
+                               random_socket_or_port_arg(),
+                           }}};
+    REQUIRE(cluster.start());
+    Retry cluster_is_listening{[&cluster] { return cluster.isListening(); }};
+    REQUIRE(cluster_is_listening());
+
+    vector<Connection> conns;
+    conns.reserve(cluster.getServers().size());
+    for (const auto &server : cluster.getServers()) {
+      CHECK_NOFAIL(conns.emplace_back(Connection{server.getSocketOrPort()}).open());
+    }
+    while (!conns.empty()) {
+      vector<Connection> again;
+      again.reserve(conns.size());
+      for (auto &conn : conns) {
+        if (conn.isOpen()) {
+          REQUIRE(conn.isWritable());
+          REQUIRE_FALSE(conn.getError());
+        } else {
+          again.emplace_back(move(conn));
+        }
       }
+      conns.swap(again);
     }
   }
 }