summaryrefslogtreecommitdiffstats
path: root/test/test-platform/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/test-platform/main.cpp')
-rw-r--r--test/test-platform/main.cpp170
1 files changed, 155 insertions, 15 deletions
diff --git a/test/test-platform/main.cpp b/test/test-platform/main.cpp
index d97a449..6ed5a38 100644
--- a/test/test-platform/main.cpp
+++ b/test/test-platform/main.cpp
@@ -28,21 +28,16 @@
#include <iostream>
#include <cstdlib>
#include <semaphore.h>
+#include <string.h>
+#include <unistd.h>
using namespace std;
const int iDefaultPortNumber = 5001;
-int main(int argc, char *argv[])
+// Starts test-platform in blocking mode
+static bool startBlockingTestPlatform(const char *filePath, int portNumber, string &strError)
{
- if (argc < 2) {
-
- cerr << "Missing arguments: test-platform <file path> [port number, default " << iDefaultPortNumber << "]" << endl;
-
- return -1;
- }
-
- string strError;
// Init semaphore
sem_t sem;
@@ -50,24 +45,169 @@ int main(int argc, char *argv[])
sem_init(&sem, false, 0);
// Create param mgr
- CTestPlatform testPlatform(argv[1], argc > 2 ? atoi(argv[2]) : iDefaultPortNumber, sem);
+ CTestPlatform testPlatform(filePath, portNumber, sem);
// Start platformmgr
if (!testPlatform.load(strError)) {
- cerr << strError << endl;
-
sem_destroy(&sem);
- return -1;
+ return false;
}
- // Change criteria
-
// Block here
sem_wait(&sem);
sem_destroy(&sem);
+ return true;
+}
+
+// Starts test-platform in daemon mode
+static bool startDaemonTestPlatform(const char *filePath, int portNumber, string &strError)
+{
+ // Pipe used for communication between the child and the parent processes
+ int pipefd[2];
+
+ if (pipe(pipefd) == -1) {
+
+ strError = "pipe failed";
+ return false;
+ }
+
+ // Fork the current process:
+ // - Child process is used to start test-platform
+ // - Parent process is killed in order to turn its child into a daemon
+ pid_t pid = fork();
+
+ if (pid < 0) {
+
+ strError = "fork failed!";
+ return false;
+
+ } else if (pid == 0) {
+
+ // Child process : starts test-platform and notify the parent if it succeeds.
+
+ // Close read side of the pipe
+ close(pipefd[0]);
+
+ // Init semaphore
+ sem_t sem;
+
+ sem_init(&sem, false, 0);
+
+ // Create param mgr
+ CTestPlatform testPlatform(filePath, portNumber, sem);
+
+ // Message to send to parent process
+ bool msgToParent;
+
+ // Start platformmgr
+ if (!testPlatform.load(strError)) {
+
+ cerr << strError << endl;
+
+ // Notify parent of failure;
+ msgToParent = false;
+ write(pipefd[1], &msgToParent, sizeof(msgToParent));
+
+ sem_destroy(&sem);
+ } else {
+
+ // Notify parent of success
+ msgToParent = true;
+ write(pipefd[1], &msgToParent, sizeof(msgToParent));
+
+ // Block here
+ sem_wait(&sem);
+
+ sem_destroy(&sem);
+ }
+
+ return msgToParent;
+
+ } else {
+
+ // Parent process : need to kill it once the child notifies the successs/failure to start
+ // test-platform (this status is used as exit value of the program).
+
+ // Close write side of the pipe
+ close(pipefd[1]);
+
+ // Message received from the child process
+ bool msgFromChild = false;
+
+ if (read(pipefd[0], &msgFromChild, sizeof(msgFromChild)) <= 0) {
+
+ strError = "Read pipe failed";
+ }
+
+ // return success/failure in exit status
+ return msgFromChild;
+ }
+}
+
+static void usage()
+{
+ cerr << "Invalid arguments: test-platform [-d] <file path> [port number, default "
+ << iDefaultPortNumber << "]" << endl;
+}
+
+int main(int argc, char *argv[])
+{
+ // Option found by call to getopt()
+ int opt;
+
+ // Port number to be used by test-platform
+ int portNumber;
+
+ // Daemon flag
+ bool isDaemon = false;
+
+ // Index of the <file path> argument in the arguments list provided
+ int indexFilePath = 1;
+
+ // Handle the -d option
+ while ((opt = getopt(argc, argv, "d")) != -1) {
+ switch (opt) {
+ case 'd':
+ isDaemon = true;
+ indexFilePath = 2;
+ break;
+
+ default:
+ usage();
+ return -1;
+ }
+ }
+
+ // Check the number of arguments
+ if ((argc < indexFilePath + 1) || (argc > indexFilePath + 2)) {
+
+ usage();
+ return -1;
+ }
+
+ char *filePath = argv[indexFilePath];
+ portNumber = argc > indexFilePath + 1 ? atoi(argv[indexFilePath + 1]) : iDefaultPortNumber;
+
+ // Choose either blocking or daemon test-platform
+ bool startError;
+ string strError;
+
+ if (isDaemon) {
+
+ startError = startDaemonTestPlatform(filePath, portNumber, strError);
+ } else {
+
+ startError = startBlockingTestPlatform(filePath, portNumber, strError);
+ }
+
+ if (!startError) {
+
+ cerr << "Test-platform error:" << strError.c_str() << endl;
+ return -1;
+ }
return 0;
}