X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=libtest%2Fserver.h;h=d987a0b7d3307e8e5ebde87b4014b022bc7d9104;hb=91e92172731fe8a37e562a165d25a312569aff44;hp=c209881e3de25c3cf2b23ab97b87b44012de5235;hpb=7abcaebdc4c3dd11b779eaef58a7371fb82ae888;p=m6w6%2Flibmemcached diff --git a/libtest/server.h b/libtest/server.h index c209881e..d987a0b7 100644 --- a/libtest/server.h +++ b/libtest/server.h @@ -9,38 +9,93 @@ #pragma once +#include +#include #include #include #include #include #include +#include -#define SERVERS_TO_CREATE 5 +namespace libtest { -struct server_st { +struct Server { private: - bool _used; + bool _is_socket; + std::string _socket; + std::string _pid_file; + std::string _log_file; + std::string _base_command; // executable command which include libtool, valgrind, gdb, etc + std::string _running; // Current string being used for system() pid_t _pid; + +protected: in_port_t _port; - char pid_file[FILENAME_MAX]; // Did we start it, or was it just sitting there? + std::string _hostname; + std::string _extra_args; + public: + Server(const std::string& hostname, const in_port_t port_arg, const bool is_socket_arg= false); + + virtual ~Server(); + + virtual const char *name()= 0; + virtual const char *executable()= 0; + virtual const char *port_option()= 0; + virtual const char *pid_file_option()= 0; + virtual const char *daemon_file_option()= 0; + virtual const char *log_file_option()= 0; + virtual bool is_libtool()= 0; + + virtual const char *socket_file_option() const + { + return NULL; + } - char hostname[NI_MAXHOST]; + virtual bool broken_pid_file() + { + return false; + } - server_st() : - _used(false), - _pid(-1), - _port(0) + const std::string& pid_file() const { - pid_file[0]= 0; - strncpy(hostname, "localhost", sizeof(hostname)); + return _pid_file; } - void set_port(in_port_t arg) + const std::string& base_command() const { - _port= arg; + return _base_command; } + const std::string& log_file() const + { + return _log_file; + } + + const std::string& hostname() const + { + return _hostname; + } + + const std::string& socket() const + { + return _socket; + } + + bool has_socket() const + { + return _is_socket; + } + + bool cycle(); + + virtual bool ping()= 0; + + virtual pid_t get_pid(bool error_is_ok= false)= 0; + + virtual bool build(int argc, const char *argv[])= 0; + in_port_t port() const { return _port; @@ -48,78 +103,119 @@ public: bool has_port() const { - return not _port == 0; + return (_port != 0); } - void set_used() + // Reset a server if another process has killed the server + void reset() { - _used= true; + _pid= -1; + _pid_file.clear(); + _log_file.clear(); } - void set_pid(pid_t arg) - { - _pid= arg; - } + void set_extra_args(const std::string &arg); + + bool args(std::string& options); + + pid_t pid(); pid_t pid() const { return _pid; } - bool is_used() const + bool has_pid() const { - return _used; + return (_pid > 1); } - ~server_st(); - - bool has_pid() + bool check_pid(pid_t pid_arg) const { - return _pid > 0; + return (pid_arg > 1); } bool is_socket() const { - return hostname[0] == '/'; + return _hostname[0] == '/'; } - void set_hostname(const char *arg) + const std::string running() const { - strncpy(hostname, arg, sizeof(hostname)); + return _running; } - bool kill(); + std::string log_and_pid(); + + bool kill(pid_t pid_arg); + bool start(); + bool command(std::string& command_arg); + +protected: + void nap(); private: + bool is_helgrind() const; + bool is_valgrind() const; + bool is_debug() const; + bool set_log_file(); + bool set_pid_file(); + bool set_socket_file(); + void rebuild_base_command(); void reset_pid(); }; -std::ostream& operator<<(std::ostream& output, const server_st &arg); +std::ostream& operator<<(std::ostream& output, const libtest::Server &arg); -struct server_startup_st +class server_startup_st { - uint8_t count; - uint8_t udp; +private: std::string server_list; - server_st server[SERVERS_TO_CREATE]; + bool _socket; + +public: + + uint8_t udp; + std::vector servers; server_startup_st() : - count(SERVERS_TO_CREATE), + _socket(false), udp(0) { } - ~server_startup_st() - { } + bool start_socket_server(const std::string& server_type, const in_port_t try_port, int argc, const char *argv[]); + + std::string option_string() const; + + size_t count() const + { + return servers.size(); + } + + bool is_debug() const; + bool is_helgrind() const; + bool is_valgrind() const; + + bool socket() + { + return _socket; + } + + void set_socket() + { + _socket= true; + } + + + void shutdown(bool remove= false); + void push_server(Server *); + Server *pop_server(); + + ~server_startup_st(); }; -#ifdef __cplusplus -extern "C" { -#endif +bool server_startup(server_startup_st&, const std::string&, in_port_t try_port, int argc, const char *argv[]); +} // namespace libtest -bool server_startup(server_startup_st *construct); -void server_shutdown(server_startup_st *construct); -#ifdef __cplusplus -} -#endif