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