testing: honor MEMCACHED_BINARY; use Catch.cmake
[m6w6/libmemcached] / testing / 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 REQUIRE(memcached_create(&memc));
10 for (const auto &server : cluster.getServers()) {
11 auto target = server.getSocketOrPort();
12 if (holds_alternative<string>(target)) {
13 REQUIRE(MEMCACHED_SUCCESS == memcached_server_add_unix_socket(&memc, get<string>(target).c_str()));
14 } else {
15 REQUIRE(MEMCACHED_SUCCESS == memcached_server_add(&memc, "localhost", get<int>(target)));
16 }
17 }
18
19 Retry cluster_is_listening([this]() {
20 return cluster.isListening();
21 });
22 REQUIRE(cluster_is_listening());
23 }
24
25 MemcachedCluster::~MemcachedCluster() {
26 if (memcmp(&memc, &empty_memc, sizeof(memc))) {
27 memcached_free(&memc);
28 }
29 }
30
31 void MemcachedCluster::flush() {
32 REQUIRE(MEMCACHED_SUCCESS == memcached_flush(&memc, 0));
33 }
34
35 MemcachedCluster::MemcachedCluster()
36 : cluster{Server{
37 MEMCACHED_BINARY,
38 {random_socket_or_port_arg()}
39 }}
40 {
41 init();
42 }
43
44 MemcachedCluster::MemcachedCluster(Cluster &&cluster_)
45 : cluster{move(cluster_)}
46 {
47 init();
48 }
49
50 MemcachedCluster MemcachedCluster::mixed() {
51 return MemcachedCluster{};
52 }
53
54 MemcachedCluster MemcachedCluster::network() {
55 return MemcachedCluster{Cluster{Server{
56 MEMCACHED_BINARY,
57 {"-p", random_socket_or_port_string}
58 }}};
59 }
60
61 MemcachedCluster MemcachedCluster::socket() {
62 return MemcachedCluster{Cluster{Server{
63 MEMCACHED_BINARY,
64 {"-s", random_socket_or_port_string}
65 }}};
66 }
67
68 void MemcachedCluster::enableBinaryProto(bool enable) {
69 REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
70 MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, enable));
71 }
72
73 MemcachedCluster::MemcachedCluster(MemcachedCluster &&mc)
74 : cluster{Server{}}
75 {
76 *this = move(mc);
77 }
78
79 MemcachedCluster &MemcachedCluster::operator=(MemcachedCluster &&mc) {
80 cluster = move(mc.cluster);
81 memcached_clone(&memc, &mc.memc);
82 returns = ReturnMatcher{&memc};
83 return *this;
84 }