tests: investigating catch2
[awesomized/libmemcached] / testing / lib / Server.hpp
1 #pragma once
2
3 #include "WaitForConn.hpp"
4
5 #include <csignal>
6
7 #include <functional>
8 #include <iostream>
9 #include <string>
10 #include <variant>
11 #include <vector>
12
13 using namespace std;
14
15 class Server {
16 friend class Cluster;
17
18 public:
19 using str_args_t = vector<string>;
20 using dyn_args_t = unordered_map<string, function<string(string)>>;
21 using socket_or_port_t = variant<string, int>;
22
23 private:
24 string binary;
25 str_args_t str_args;
26 dyn_args_t dyn_args;
27 pid_t pid = 0;
28
29 int status = 0;
30 unordered_map<int, unsigned> signalled;
31 socket_or_port_t socket_or_port{11211};
32
33 public:
34 explicit
35 Server(string &&binary_, str_args_t &&str_args_ = {}, dyn_args_t &&dyn_args_ = {})
36 : binary{binary_}
37 , str_args{str_args_}
38 , dyn_args{dyn_args_}
39 {}
40
41 Server(string &&binary_, dyn_args_t &&dyn_args_)
42 : binary{binary_}
43 , str_args{}
44 , dyn_args{dyn_args_}
45 {}
46
47 ~Server() {
48 stop();
49 wait();
50 }
51
52 Server &operator = (const Server &s) = default;
53 Server(const Server &s) = default;
54
55 Server &operator = (Server &&s) = default;
56 Server(Server &&s) = default;
57
58 pid_t getPid() const {
59 return pid;
60 }
61
62 const string &getBinary() const {
63 return binary;
64 }
65
66 const socket_or_port_t &getSocketOrPort() const {
67 return socket_or_port;
68 }
69
70 optional<pid_t> start();
71 bool stop();
72
73 bool signal(int signo = SIGTERM);
74 bool check();
75 bool isListening(int max_timeout = 1000);
76
77 bool wait(int flags = 0);
78 bool tryWait();
79
80 private:
81 [[nodiscard]]
82 auto createArgv();
83
84 [[nodiscard]]
85 optional<WaitForConn::conn_t> createSocket();
86 };