X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=test%2Flib%2FServer.cpp;h=cf520094029949cb94b0ac7d9d61087858370f04;hb=92d18858b417309f6bdee6bce464a4f3d6a375fd;hp=f31819e86ef8dfbc3fa99d9ded1335b34945d55c;hpb=fff90287ab3521c9cdc232ea53ec5bc73365c8e4;p=awesomized%2Flibmemcached diff --git a/test/lib/Server.cpp b/test/lib/Server.cpp index f31819e8..cf520094 100644 --- a/test/lib/Server.cpp +++ b/test/lib/Server.cpp @@ -1,9 +1,11 @@ #include "Server.hpp" -#include "Connection.hpp" +#include "Retry.hpp" #include "ForkAndExec.hpp" #include -#include +#if HAVE_UNISTD_H +# include +#endif Server::Server(string binary_, Server::argv_t args_) : binary{move(binary_)} @@ -39,11 +41,16 @@ static inline void pushArg(vector &arr, const string &arg) { optional Server::handleArg(vector &arr, const string &arg, const arg_func_t &next_arg) { pushArg(arr, arg); - if (arg == "-p" || arg == "--port") { + if (arg == "-U" || arg == "--udp-port") { + auto port = next_arg(arg); + pushArg(arr, port); + pushArg(arr, "-p"); + pushArg(arr, port); + socket_or_port = stoi(port); + return port; + } else if (arg == "-p" || arg == "--port") { auto port = next_arg(arg); pushArg(arr, port); -// pushArg(arr, "-U"); -// pushArg(arr, port); socket_or_port = stoi(port); return port; } else if (arg == "-s" || arg == "--unix-socket") { @@ -62,7 +69,8 @@ vector Server::createArgv() { vector arr; pushArg(arr, binary); - //pushArg(arr, "-v"); + pushArg(arr, "-u"); + pushArg(arr, "nobody"); for (auto it = args.cbegin(); it != args.cend(); ++it) { if (holds_alternative(*it)) { @@ -111,7 +119,7 @@ optional Server::start() { return ChildProc{pid, pipe}; } -bool Server::isListening() { +bool Server::isListening() const { MemcachedPtr memc; if (holds_alternative(socket_or_port)) { @@ -130,7 +138,7 @@ bool Server::isListening() { } Malloced stat(memcached_stat(*memc, nullptr, nullptr)); - if (!*stat || !stat->pid) { + if (!*stat || !stat->pid || stat->pid == -1) { return false; } if (stat->pid != pid) { @@ -142,6 +150,24 @@ bool Server::isListening() { return true; } +bool Server::ensureListening() { + if (!start()) { + return false; + } + return Retry{[this] { + again: + start(); + if (!isListening()) { + auto old = pid; + if (tryWait()) { + cerr << "Collected zombie " << *this << "(old pid=" << old << ")\n"; + goto again; + } + } + return isListening(); + }}(); +} + bool Server::stop() { if (!pid) { return true; @@ -167,8 +193,20 @@ bool Server::check() { bool Server::wait(int flags) { if (pid && pid == waitpid(pid, &status, flags)) { - if (drain().length()) { - cerr << "Ouput of " << *this << ":\n" << output << endl; + if (drain().length() && + output.rfind("Signal handled: Terminated", 0) != 0) { + cerr << "Output of " << *this << ":\n"; + + istringstream iss{output}; + string line; + + while (getline(iss, line)) { + cerr << " " << line << "\n"; + } + + if (output.back() != '\n') { + cerr << endl; + } output.clear(); } pid = 0;