685cf6fbef22564c1ad4625bbb2fc6ed8a4169d2
[awesomized/libmemcached] / testing / lib / MemcachedCluster.hpp
1 #pragma once
2
3 #include "common.hpp"
4 #include "Cluster.hpp"
5
6 class ReturnMatcher : public Catch::MatcherBase<memcached_return_t> {
7 public:
8 explicit ReturnMatcher(const memcached_st *memc_, memcached_return_t expected_ = MEMCACHED_SUCCESS)
9 : memc{memc_}
10 , expected{expected_}
11 {}
12
13 ReturnMatcher(const ReturnMatcher &) = default;
14 ReturnMatcher &operator = (const ReturnMatcher &) = default;
15
16 ReturnMatcher(ReturnMatcher &&rm) {
17 *this = move(rm);
18 }
19 ReturnMatcher &operator = (ReturnMatcher &&rm) {
20 memc = exchange(rm.memc, nullptr);
21 expected = rm.expected;
22 return *this;
23 }
24
25 bool match(const memcached_return_t &arg) const override {
26 return arg == expected;
27 }
28
29 ReturnMatcher success() {
30 return ReturnMatcher{memc};
31 }
32
33 ReturnMatcher operator () (memcached_return_t expected_) {
34 return ReturnMatcher{memc, expected_};
35 }
36
37 protected:
38 string describe() const override {
39 return string{"is "}
40 + to_string(expected)
41 + " (" + memcached_strerror(memc, expected) + ") "
42 + "\n\tlast error: "
43 + memcached_last_error_message(memc);
44 }
45
46 private:
47 const memcached_st *memc;
48 memcached_return_t expected;
49 };
50
51 class MemcachedCluster {
52 public:
53 Cluster cluster;
54 memcached_st memc{empty_memc};
55 ReturnMatcher returns{&memc};
56
57 MemcachedCluster();
58 explicit
59 MemcachedCluster(Cluster &&cluster);
60 ~MemcachedCluster();
61
62 MemcachedCluster(const MemcachedCluster &) = delete;
63 MemcachedCluster &operator=(const MemcachedCluster &) = delete;
64
65 MemcachedCluster(MemcachedCluster &&mc)
66 : cluster{Server{}}
67 {
68 *this = move(mc);
69 };
70 MemcachedCluster &operator=(MemcachedCluster &&mc)
71 {
72 cluster = move(mc.cluster);
73 memcached_clone(&memc, &mc.memc);
74 returns = ReturnMatcher{&memc};
75 return *this;
76 }
77
78 void enableBinaryProto(bool enable = true);
79 void flush();
80
81 static MemcachedCluster mixed();
82 static MemcachedCluster network();
83 static MemcachedCluster socket();
84
85 private:
86 static const memcached_st empty_memc;
87
88 void init();
89 };