summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <thiago@mapbox.com>2015-06-18 15:48:39 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2015-06-18 15:48:39 +0300
commitac4179e7de2b9ecd3696b8191fbdbde14e3f62cd (patch)
tree8b670aacc37004f0364ef9f7aa6c01e9b5659742 /test
parent22acc2f14c9a21a3c6f8dbfc2adc689d6cd921bb (diff)
downloadqtlocation-mapboxgl-ac4179e7de2b9ecd3696b8191fbdbde14e3f62cd.tar.gz
Use a pipe() to synchronize the server initialization
As the signals are intercepted by debuggers.
Diffstat (limited to 'test')
-rw-r--r--test/fixtures/util.cpp30
-rwxr-xr-xtest/headless/server.js2
-rwxr-xr-xtest/storage/server.js2
3 files changed, 29 insertions, 5 deletions
diff --git a/test/fixtures/util.cpp b/test/fixtures/util.cpp
index 7d9bbbfad7..068a3d849f 100644
--- a/test/fixtures/util.cpp
+++ b/test/fixtures/util.cpp
@@ -4,27 +4,51 @@
#include <csignal>
+#include <unistd.h>
+
namespace mbgl {
namespace test {
pid_t startServer(const char *executable) {
const std::string parent_pid = std::to_string(getpid());
+ int pipefd[2];
+
+ if (pipe(pipefd)) {
+ throw std::runtime_error("Cannot create server pipe");
+ }
+
pid_t pid = fork();
if (pid < 0) {
throw std::runtime_error("Cannot create server process");
} else if (pid == 0) {
+ close(STDIN_FILENO);
+
+ if (dup(pipefd[1])) {
+ Log::Error(Event::Setup, "Failed to start server: %s", strerror(errno));
+ }
+
+ close(pipefd[0]);
+ close(pipefd[1]);
+
char *args[] = { const_cast<char *>(executable),
const_cast<char *>(parent_pid.c_str()),
nullptr };
int ret = execv(executable, args);
// This call should not return. In case execve failed, we exit anyway.
if (ret < 0) {
- Log::Error(Event::Setup, "failed to start server: %s", strerror(errno));
+ Log::Error(Event::Setup, "Failed to start server: %s", strerror(errno));
}
exit(0);
} else {
- // Wait until the server process sends SIGCONT.
- raise(SIGSTOP);
+ char buffer[8];
+
+ // Wait until the server process sends something on the pipe.
+ if (!read(pipefd[0], buffer, sizeof(buffer))) {
+ throw std::runtime_error("Error reading a message from the server");
+ }
+
+ close(pipefd[0]);
+ close(pipefd[1]);
}
return pid;
}
diff --git a/test/headless/server.js b/test/headless/server.js
index bb2c451f84..ff349b050e 100755
--- a/test/headless/server.js
+++ b/test/headless/server.js
@@ -14,6 +14,6 @@ var server = app.listen(2900, function () {
if (process.argv[2]) {
// Allow the test to continue running.
- process.kill(+process.argv[2], 'SIGCONT');
+ process.stdin.write("Go!\n");
}
});
diff --git a/test/storage/server.js b/test/storage/server.js
index 1ee5363196..9f6def9c0b 100755
--- a/test/storage/server.js
+++ b/test/storage/server.js
@@ -103,6 +103,6 @@ var server = app.listen(3000, function () {
if (process.argv[2]) {
// Allow the test to continue running.
- process.kill(+process.argv[2], 'SIGCONT');
+ process.stdin.write("Go!\n");
}
});