X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libtest%2Fserver.h;h=f13cad0781c302f12aca53fdab500b8136d189c4;hb=acf69ff8d9954846854b1a9dbd8b3e11a83bad4c;hp=f3bda21b99fa581b8b0e3ca2a5dc9ab8ae173177;hpb=9cd57ce737375540f6c3b5e2e3684160e5c4bfce;p=awesomized%2Flibmemcached diff --git a/libtest/server.h b/libtest/server.h index f3bda21b..f13cad07 100644 --- a/libtest/server.h +++ b/libtest/server.h @@ -9,6 +9,8 @@ #pragma once +#include +#include #include #include #include @@ -16,64 +18,84 @@ #include #include -#define SERVERS_TO_CREATE 5 +namespace libtest { -struct server_st; - -typedef pid_t (test_server_getpid)(server_st &); -typedef bool (test_server_ping)(server_st &); - -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() + +protected: pid_t _pid; in_port_t _port; - char pid_file[FILENAME_MAX]; // Did we start it, or was it just sitting there? - std::string _command; - test_server_getpid *__get_pid; - test_server_ping *__ping; std::string _hostname; + std::string _extra_args; public: - server_st(in_port_t port_arg, test_server_getpid *, test_server_ping *); + Server(const std::string& hostname, const in_port_t port_arg, const bool is_socket_arg= false); + + virtual ~Server(); - server_st(const std::string &socket_file, test_server_getpid *, test_server_ping *); + 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; - void set_methods(test_server_getpid *get_pid_arg, test_server_ping *ping_arg) + virtual const char *socket_file_option() const { - __get_pid= get_pid_arg; - __ping= ping_arg; + return NULL; } - const char *hostname() const + virtual bool broken_pid_file() { - if (_hostname.empty()) - return ""; + return false; + } - return _hostname.c_str(); + const std::string& pid_file() const + { + return _pid_file; } - bool ping() + const std::string& base_command() const { - if (__ping) - return __ping(*this); + return _base_command; + } - return false; + const std::string& log_file() const + { + return _log_file; } - pid_t get_pid() + const std::string& hostname() const { - if (__get_pid) - return _pid= __get_pid(*this); + return _hostname; + } - return -1; + const std::string& socket() const + { + return _socket; } - void set_port(in_port_t arg) + bool has_socket() const { - _port= arg; + return _is_socket; } + bool cycle(); + + virtual bool ping()= 0; + + virtual pid_t get_pid(bool error_is_ok= true)= 0; + + virtual bool build(int argc, const char *argv[])= 0; + in_port_t port() const { return _port; @@ -84,26 +106,26 @@ public: return (_port != 0); } - void set_command(const char *arg) + // Reset a server if another process has killed the server + void reset() { - _command= arg; + _pid= -1; + _pid_file.clear(); + _log_file.clear(); } - void set_used() - { - _used= true; - } + void set_extra_args(const std::string &arg); + + bool args(std::string& options); pid_t pid(); - bool is_used() const + pid_t pid() const { - return _used; + return _pid; } - ~server_st(); - - bool has_pid() + bool has_pid() const { return (_pid > 1); } @@ -113,41 +135,67 @@ public: return _hostname[0] == '/'; } + const std::string running() const + { + return _running; + } + + std::string log_and_pid(); + bool kill(); bool start(); + bool command(std::string& command_arg); + +protected: + void nap(); private: + 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; - std::vector servers; + +public: + + uint8_t udp; + std::vector servers; server_startup_st() : - count(SERVERS_TO_CREATE), udp(0) { } - void shutdown(); - void push_server(server_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_valgrind() const; + + 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