6daa357beb07dbec1f2aa91478adb427d375db96
[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 "../lib/catch.hpp"
15
16 #include "libmemcached/memcached.h"
17
18 using namespace std;
19 using socket_or_port_t = variant<string, int>;
20
21 /**
22 * Useful macros for testing
23 */
24 #define S(s) (s),strlen(s)
25 #define LOOPED_SECTION(tests) \
26 for (auto &[name, test] : tests) DYNAMIC_SECTION("test " << name)
27 #define REQUIRE_SUCCESS(rc) REQUIRE_THAT(rc, test.returns.success())
28 #define REQUIRE_RC(rc, call) REQUIRE_THAT(call, test.returns(rc))
29
30
31 const char *getenv_else(const char *var, const char *defval);
32 unsigned random_num(unsigned min, unsigned max);
33 unsigned random_port();
34 string random_socket();
35 string random_socket_or_port_string(const string &what);
36 string random_socket_or_port_flag(const string &binary);
37
38 inline auto random_socket_or_port_arg() {
39 return make_pair(&random_socket_or_port_flag, &random_socket_or_port_string);
40 }
41
42 inline memcached_return_t fetch_all_results(memcached_st *memc, unsigned int &keys_returned, memcached_return_t &rc) {
43 keys_returned = 0;
44
45 memcached_result_st *result = nullptr;
46 while ((result = memcached_fetch_result(memc, result, &rc)))
47 {
48 REQUIRE(MEMCACHED_SUCCESS == rc);
49 keys_returned += 1;
50 }
51 memcached_result_free(result);
52 return MEMCACHED_SUCCESS;
53 }
54
55 inline memcached_return_t fetch_all_results(memcached_st *memc, unsigned int &keys_returned) {
56 memcached_return_t rc;
57 fetch_all_results(memc, keys_returned, rc);
58 return rc;
59 }
60
61 class MemcachedPtr {
62 public:
63 memcached_st memc;
64
65 explicit
66 MemcachedPtr(memcached_st *memc_) {
67 memset(&memc, 0, sizeof(memc));
68 REQUIRE(memcached_clone(&memc, memc_));
69 }
70 MemcachedPtr()
71 : MemcachedPtr(nullptr)
72 {}
73 ~MemcachedPtr() {
74 memcached_free(&memc);
75 }
76 memcached_st *operator * () {
77 return &memc;
78 }
79 };
80
81 class Malloced {
82 void *ptr;
83 public:
84 Malloced(void *ptr_)
85 : ptr{ptr_}
86 {}
87 ~Malloced() {
88 free(ptr);
89 }
90 void *operator *() {
91 return ptr;
92 }
93 };