X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=testing%2Flib%2FServer.hpp;h=fb1b8af184c04e443b60eae06404eb264dbde8a7;hb=c0b779f4045f4858701b3741af805414bc066717;hp=b411f4e34851e20f6f85aba8fd677da574e8cdf7;hpb=5e54d17fc535a901f384fcbf2cfd420f3a2e7a81;p=awesomized%2Flibmemcached diff --git a/testing/lib/Server.hpp b/testing/lib/Server.hpp index b411f4e3..fb1b8af1 100644 --- a/testing/lib/Server.hpp +++ b/testing/lib/Server.hpp @@ -1,86 +1,94 @@ #pragma once -#include "WaitForConn.hpp" +#include "common.hpp" #include -#include -#include -#include -#include -#include - -using namespace std; - class Server { - friend class Cluster; - public: - using str_args_t = vector; - using dyn_args_t = unordered_map>; - using socket_or_port_t = variant; -private: - string binary; - str_args_t str_args; - dyn_args_t dyn_args; - pid_t pid = 0; + friend class Cluster; - int status = 0; - unordered_map signalled; - socket_or_port_t socket_or_port{11211}; + using arg_func_t = function; + using arg_t = variant; + using arg_pair_t = pair; + using argv_t = vector>; -public: explicit - Server(string &&binary_, str_args_t &&str_args_ = {}, dyn_args_t &&dyn_args_ = {}) - : binary{binary_} - , str_args{str_args_} - , dyn_args{dyn_args_} - {} - - Server(string &&binary_, dyn_args_t &&dyn_args_) - : binary{binary_} - , str_args{} - , dyn_args{dyn_args_} - {} - - ~Server() { - stop(); - wait(); - } - - Server &operator = (const Server &s) = default; - Server(const Server &s) = default; - - Server &operator = (Server &&s) = default; - Server(Server &&s) = default; - - pid_t getPid() const { - return pid; - } - - const string &getBinary() const { - return binary; - } - - const socket_or_port_t &getSocketOrPort() const { - return socket_or_port; - } - - optional start(); + Server(string binary_ = "false", argv_t args_ = {}); + + ~Server(); + + Server(const Server &s); + Server &operator = (const Server &s); + + Server(Server &&s) { + *this = move(s); + }; + Server &operator = (Server &&s) { + binary = exchange(s.binary, "false"); + args = exchange(s.args, {}); + pid = exchange(s.pid, 0); + pipe = exchange(s.pipe, -1); + status = exchange(s.status, 0); + signalled = exchange(s.signalled, {}); + socket_or_port = exchange(s.socket_or_port, {}); + output = exchange(s.output, {}); + return *this; + }; + + pid_t getPid() const; + int getPipe() const; + const string &getBinary() const; + const argv_t &getArgs() const; + const socket_or_port_t &getSocketOrPort() const; + + struct ChildProc { + pid_t pid; + int pipe; + ChildProc(pid_t pid_, int pipe_) + : pid{pid_} + , pipe{pipe_} + { + } + }; + optional start(); bool stop(); bool signal(int signo = SIGTERM); bool check(); - bool isListening(int max_timeout = 1000); + bool isListening(); bool wait(int flags = 0); bool tryWait(); + string &drain(); + private: - [[nodiscard]] - auto createArgv(); + string binary; + argv_t args; + pid_t pid = 0; + int pipe = -1; + int status = 0; + unordered_map signalled; + socket_or_port_t socket_or_port = 11211; + string output; [[nodiscard]] - optional createSocket(); + vector createArgv(); + optional handleArg(vector &arr, const string &arg, const arg_func_t &next_arg); }; + +inline ostream &operator << (ostream &out, const socket_or_port_t sop) { + if (holds_alternative(sop)) { + out << get(sop); + } else { + out << ":" << get(sop); + } + return out; +} + +inline ostream &operator << (ostream &out, const Server &server) { + out << "Server{binary=" << server.getBinary() << ",pid=" << server.getPid() << ",conn=" << server.getSocketOrPort() << "}"; + return out; +}