+#pragma once
+
+#include <cassert>
+#include <cstdio>
+#include <cstring>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <string>
+#include <unistd.h>
+#include <vector>
+
+namespace libtest {
+
+struct Server {
+private:
+ bool _is_socket;
+ std::string _socket;
+ std::string _sasl;
+ 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;
+ 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 bool broken_socket_cleanup()
+ {
+ return false;
+ }
+
+ virtual const char *socket_file_option() const
+ {
+ return NULL;
+ }
+
+ virtual bool broken_pid_file()
+ {
+ return false;
+ }
+
+ const std::string& pid_file() const
+ {
+ return _pid_file;
+ }
+
+ const std::string& base_command() const
+ {
+ 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;
+ }