diff options
Diffstat (limited to 'cpp/src/tests/ForkedBroker.h')
-rw-r--r-- | cpp/src/tests/ForkedBroker.h | 76 |
1 files changed, 23 insertions, 53 deletions
diff --git a/cpp/src/tests/ForkedBroker.h b/cpp/src/tests/ForkedBroker.h index a7869ff602..ddbad185d8 100644 --- a/cpp/src/tests/ForkedBroker.h +++ b/cpp/src/tests/ForkedBroker.h @@ -1,4 +1,5 @@ #ifndef TESTS_FORKEDBROKER_H +#define TESTS_FORKEDBROKER_H /* @@ -10,9 +11,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -30,9 +31,12 @@ #include <stdio.h> #include <sys/wait.h> +namespace qpid { +namespace tests { + /** * Class to fork a broker child process. - * + * * For most tests a BrokerFixture may be more convenient as it starts * a broker in the same process which allows you to easily debug into * the broker. @@ -41,68 +45,34 @@ * those brokers can't coexist in the same process (e.g. for cluster * tests where CPG doesn't allow multiple group members in a single * process.) - * + * */ class ForkedBroker { public: - ForkedBroker(std::vector<const char*> argv) { init(argv); } - - ForkedBroker(int argc, const char* const argv[]) { - std::vector<const char*> args(argv, argv+argc); - init(args); - } + typedef std::vector<std::string> Args; - ~ForkedBroker() { - try { stop(); } catch(const std::exception& e) { - QPID_LOG(error, QPID_MSG("Stopping forked broker: " << e.what())); - } - } - - void stop() { - using qpid::ErrnoException; - if (pid == 0) return; - if (::kill(pid, SIGINT) < 0) throw ErrnoException("kill failed"); - int status; - if (::waitpid(pid, &status, 0) < 0) throw ErrnoException("wait for forked process failed"); - if (WEXITSTATUS(status) != 0) - throw qpid::Exception(QPID_MSG("forked broker exited with: " << WEXITSTATUS(status))); - pid = 0; - } + // argv args are passed to broker. + // + // Special value "TMP_DATA_DIR" is substituted with a temporary + // data directory for the broker. + // + ForkedBroker(const Args& argv); + ~ForkedBroker(); + void kill(int sig=SIGINT); + int wait(); // Wait for exit, return exit status. uint16_t getPort() { return port; } + pid_t getPID() { return pid; } private: - void init(const std::vector<const char*>& args) { - using qpid::ErrnoException; - pid = 0; - port = 0; - int pipeFds[2]; - if(::pipe(pipeFds) < 0) throw ErrnoException("Can't create pipe"); - pid = ::fork(); - if (pid < 0) throw ErrnoException("Fork failed"); - if (pid) { // parent - ::close(pipeFds[1]); - FILE* f = ::fdopen(pipeFds[0], "r"); - if (!f) throw ErrnoException("fopen failed"); - if (::fscanf(f, "%d", &port) != 1) throw ErrnoException("ill-formatted port"); - } - else { // child - ::close(pipeFds[0]); - int fd = ::dup2(pipeFds[1], 1); - if (fd < 0) throw ErrnoException("dup2 failed"); - const char* prog = "../qpidd"; - std::vector<const char*> args2(args); - args2.push_back("--port=0"); - args2.push_back("--mgmt-enable=no"); // TODO aconway 2008-07-16: why does mgmt cause problems? - args2.push_back(0); - execv(prog, const_cast<char* const*>(&args2[0])); - throw ErrnoException("execv failed"); - } - } + void init(const Args& args); pid_t pid; int port; + std::string dataDir; }; +}} // namespace qpid::tests + #endif /*!TESTS_FORKEDBROKER_H*/ |