travis: be nice
[awesomized/libmemcached] / test / lib / MemcachedCluster.cpp
1 #include "MemcachedCluster.hpp"
2 #include "Retry.hpp"
3
4 const memcached_st MemcachedCluster::empty_memc{};
5
6 void MemcachedCluster::init() {
7 REQUIRE(cluster.start());
8
9 Retry cluster_is_listening([this]() {
10 return cluster.isListening();
11 });
12 while (!cluster_is_listening()) {
13 cluster.stop();
14 cluster.wait();
15 cluster.start();
16 }
17
18 REQUIRE(memcached_create(&memc));
19 for (const auto &server : cluster.getServers()) {
20 auto target = server.getSocketOrPort();
21 if (holds_alternative<string>(target)) {
22 REQUIRE(MEMCACHED_SUCCESS == memcached_server_add_unix_socket(&memc, get<string>(target).c_str()));
23 } else {
24 REQUIRE(MEMCACHED_SUCCESS == memcached_server_add(&memc, "localhost", get<int>(target)));
25 }
26 }
27
28 }
29
30 MemcachedCluster::~MemcachedCluster() {
31 if (memcmp(&memc, &empty_memc, sizeof(memc))) {
32 memcached_free(&memc);
33 }
34 }
35
36 void MemcachedCluster::flush() {
37 REQUIRE(MEMCACHED_SUCCESS == memcached_flush(&memc, 0));
38 }
39
40 MemcachedCluster::MemcachedCluster()
41 : cluster{Server{
42 MEMCACHED_BINARY,
43 {random_socket_or_port_arg()}
44 }}
45 {
46 init();
47 }
48
49 MemcachedCluster::MemcachedCluster(Cluster &&cluster_)
50 : cluster{move(cluster_)}
51 {
52 init();
53 }
54
55 MemcachedCluster::MemcachedCluster(MemcachedCluster &&mc)
56 : cluster{Server{}}
57 {
58 *this = move(mc);
59 }
60
61 MemcachedCluster &MemcachedCluster::operator=(MemcachedCluster &&mc) {
62 cluster = move(mc.cluster);
63 memcached_clone(&memc, &mc.memc);
64 returns = ReturnMatcher{&memc};
65 return *this;
66 }
67
68 MemcachedCluster MemcachedCluster::mixed() {
69 return MemcachedCluster{};
70 }
71
72 MemcachedCluster MemcachedCluster::network() {
73 return MemcachedCluster{Cluster{Server{
74 MEMCACHED_BINARY,
75 {"-p", random_socket_or_port_string}
76 }}};
77 }
78
79 MemcachedCluster MemcachedCluster::socket() {
80 return MemcachedCluster{Cluster{Server{
81 MEMCACHED_BINARY,
82 {"-s", random_socket_or_port_string}
83 }}};
84 }
85
86 #if LIBMEMCACHED_WITH_SASL_SUPPORT
87 MemcachedCluster MemcachedCluster::sasl() {
88 auto mc = MemcachedCluster{Cluster{Server{
89 MEMCACHED_BINARY,
90 {
91 Server::arg_pair_t{"-p", random_socket_or_port_string},
92 Server::arg_t{"-S"}
93 }
94 }}};
95 mc.enableBinaryProto();
96 REQUIRE(MEMCACHED_SUCCESS == memcached_set_sasl_auth_data(&mc.memc,
97 "memcached", "memcached"));
98 return mc;
99 }
100 #endif
101
102 void MemcachedCluster::enableBinaryProto(bool enable) {
103 REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
104 MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, enable));
105 }
106
107 void MemcachedCluster::enableBuffering(bool enable) {
108 REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
109 MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, enable));
110 }
111
112 void MemcachedCluster::enableReplication() {
113 REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
114 MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, memcached_server_count(&memc)));
115 }
116