76e6516eb5f8d00eb33cb9a18ec7b1975f828952
[m6w6/libmemcached] / test / tests / lib.cpp
1 #include "test/lib/common.hpp"
2 #include "test/lib/Cluster.hpp"
3 #include "test/lib/Retry.hpp"
4 #include "test/lib/Server.hpp"
5 #include "test/lib/Connection.hpp"
6
7 TEST_CASE("lib/Server") {
8 Server server{MEMCACHED_BINARY, {
9 Server::arg_t{"-v"},
10 Server::arg_pair_t{"-p", random_port_string}
11 }};
12
13 SECTION("starts and listens") {
14
15 REQUIRE(server.start().has_value());
16
17 Retry server_is_listening{[&server] {
18 return server.isListening();
19 }};
20 REQUIRE(server_is_listening());
21
22 SECTION("stops") {
23
24 REQUIRE(server.stop());
25
26 SECTION("is waitable") {
27
28 REQUIRE(server.wait());
29
30 SECTION("stopped") {
31
32 REQUIRE_FALSE(server.check());
33 }
34 }
35 }
36 }
37 }
38
39 TEST_CASE("lib/Cluster") {
40 Cluster cluster{Server{MEMCACHED_BINARY, {
41 random_socket_or_port_arg(),
42 }}};
43
44 SECTION("starts and listens") {
45
46 REQUIRE(cluster.start());
47
48 Retry cluster_is_listening{[&cluster] {
49 return cluster.isListening();
50 }};
51 REQUIRE(cluster_is_listening());
52
53 SECTION("stops") {
54
55 cluster.stop();
56 cluster.wait();
57
58 SECTION("stopped") {
59
60 REQUIRE(cluster.isStopped());
61 }
62 }
63 }
64 }
65
66 TEST_CASE("lib/Connection") {
67 SECTION("sockaddr_un") {
68 auto f = []{
69 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"};
70 return conn;
71 };
72 REQUIRE_THROWS(f());
73 }
74 SECTION("connect") {
75 Cluster cluster{Server{MEMCACHED_BINARY,
76 {
77 random_socket_or_port_arg(),
78 }}};
79 REQUIRE(cluster.start());
80 Retry cluster_is_listening{[&cluster] { return cluster.isListening(); }};
81 REQUIRE(cluster_is_listening());
82
83 vector<Connection> conns;
84 conns.reserve(cluster.getServers().size());
85 for (const auto &server : cluster.getServers()) {
86 REQUIRE(conns.emplace_back(Connection{server.getSocketOrPort()}).open());
87 }
88 while (!conns.empty()) {
89 vector<Connection> again;
90 again.reserve(conns.size());
91 for (auto &conn : conns) {
92 if (conn.isOpen()) {
93 REQUIRE(conn.isWritable());
94 REQUIRE_FALSE(conn.getError());
95 } else {
96 again.emplace_back(move(conn));
97 }
98 }
99 conns.swap(again);
100 }
101 }
102 }