diff options
Diffstat (limited to 'test/test-platform/main.cpp')
-rw-r--r-- | test/test-platform/main.cpp | 170 |
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; } |