flush
[awesomized/libmemcached] / testing / lib / common.hpp
1 #pragma once
2
3 #include <chrono>
4 #include <iostream>
5 #include <map>
6 #include <optional>
7 #include <string>
8 #include <sstream>
9 #include <stdexcept>
10 #include <thread>
11 #include <variant>
12 #include <vector>
13
14 #include "testing/lib/catch.hpp"
15 #include "testing/lib/random.hpp"
16
17 #include "libmemcached/memcached.h"
18
19 using namespace std;
20 using socket_or_port_t = variant<string, int>;
21
22 /**
23 * Useful macros for testing
24 */
25 #define S(s) (s),strlen(s)
26 #define DECLARE_STREQUAL static auto strequal = equal_to<string>();
27 #define LOOPED_SECTION(tests) \
28 for (auto &[name, test] : tests) DYNAMIC_SECTION("test " << name)
29 #define REQUIRE_SUCCESS(rc) do { \
30 INFO("expected: SUCCESS"); \
31 REQUIRE_THAT(rc, test.returns.success()); \
32 } while(0)
33 #define REQUIRE_RC(rc, call) do { \
34 INFO("expected: " << memcached_strerror(nullptr, rc)); \
35 REQUIRE_THAT(call, test.returns(rc)); \
36 } while(0)
37
38 const char *getenv_else(const char *var, const char *defval);
39
40 inline memcached_return_t fetch_all_results(memcached_st *memc, unsigned int &keys_returned, memcached_return_t &rc) {
41 keys_returned = 0;
42
43 memcached_result_st *result = nullptr;
44 while ((result = memcached_fetch_result(memc, result, &rc))) {
45 REQUIRE(MEMCACHED_SUCCESS == rc);
46 keys_returned += 1;
47 }
48 memcached_result_free(result);
49 return MEMCACHED_SUCCESS;
50 }
51
52 inline memcached_return_t fetch_all_results(memcached_st *memc, unsigned int &keys_returned) {
53 memcached_return_t rc;
54 fetch_all_results(memc, keys_returned, rc);
55 return rc;
56 }
57
58 class MemcachedPtr {
59 public:
60 memcached_st memc;
61
62 explicit
63 MemcachedPtr(memcached_st *memc_) {
64 memset(&memc, 0, sizeof(memc));
65 REQUIRE(memcached_clone(&memc, memc_));
66 }
67 MemcachedPtr()
68 : MemcachedPtr(nullptr)
69 {}
70 ~MemcachedPtr() {
71 memcached_free(&memc);
72 }
73 memcached_st *operator * () {
74 return &memc;
75 }
76 };
77
78 template<class T>
79 class Malloced {
80 T *ptr;
81 public:
82 Malloced(T *ptr_)
83 : ptr{ptr_}
84 {}
85 ~Malloced() {
86 if(ptr)
87 free(ptr);
88 }
89 auto operator *() {
90 return ptr;
91 }
92 };