flush [ci skip]
[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 #define LITERAL(s) (s),strlen(s)
19 #define LOOPED_SECTION(tests) \
20 auto i_=0; \
21 for (auto &&test : tests) DYNAMIC_SECTION("test" << i_++)
22
23 using namespace std;
24
25 using socket_or_port_t = variant<string, int>;
26
27 const char *getenv_else(const char *var, const char *defval);
28 unsigned random_num(unsigned min, unsigned max);
29 unsigned random_port();
30 string random_socket();
31 string random_socket_or_port_string(const string &what);
32 string random_socket_or_port_flag(const string &binary);
33
34 inline auto random_socket_or_port_arg() {
35 return make_pair(&random_socket_or_port_flag, &random_socket_or_port_string);
36 }
37
38 class MemcachedPtr {
39 public:
40 memcached_st memc;
41
42 explicit
43 MemcachedPtr(memcached_st *memc_) {
44 memset(&memc, 0, sizeof(memc));
45 REQUIRE(memcached_clone(&memc, memc_));
46 }
47 MemcachedPtr()
48 : MemcachedPtr(nullptr)
49 {}
50 ~MemcachedPtr() {
51 memcached_free(&memc);
52 }
53 memcached_st *operator * () {
54 return &memc;
55 }
56 };
57
58 class Malloced {
59 void *ptr;
60 public:
61 Malloced(void *ptr_)
62 : ptr{ptr_}
63 {}
64 ~Malloced() {
65 free(ptr);
66 }
67 void *operator *() {
68 return ptr;
69 }
70 };