diff options
-rw-r--r-- | Source/kwsys/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Source/kwsys/testProcess.c | 176 |
2 files changed, 178 insertions, 0 deletions
diff --git a/Source/kwsys/CMakeLists.txt b/Source/kwsys/CMakeLists.txt index f542e3b..4afa4d8 100644 --- a/Source/kwsys/CMakeLists.txt +++ b/Source/kwsys/CMakeLists.txt @@ -125,7 +125,9 @@ ENDFOREACH(header) IF(KWSYS_DEFAULTS) INCLUDE_DIRECTORIES(${KWSYS_HEADER_DIR}/..) + ADD_EXECUTABLE(testProcess testProcess.c) ADD_EXECUTABLE(test1 test1.cxx) + TARGET_LINK_LIBRARIES(testProcess ${KWSYS_NAMESPACE}) TARGET_LINK_LIBRARIES(test1 ${KWSYS_NAMESPACE}) ENDIF(KWSYS_DEFAULTS) diff --git a/Source/kwsys/testProcess.c b/Source/kwsys/testProcess.c new file mode 100644 index 0000000..ae3410a --- /dev/null +++ b/Source/kwsys/testProcess.c @@ -0,0 +1,176 @@ +#include <kwsys/Process.h> +#include <stdio.h> +#include <stdlib.h> + +#if defined(_WIN32) +# include <windows.h> +#else +# include <unistd.h> +#endif + +int test1() +{ + fprintf(stdout, "Output on stdout from test returning 0.\n"); + fprintf(stderr, "Output on stderr from test returning 0.\n"); + return 0; +} + +int test2() +{ + fprintf(stdout, "Output on stdout from test returning 123.\n"); + fprintf(stderr, "Output on stderr from test returning 123.\n"); + return 123; +} + +int test3() +{ + fprintf(stdout, "Output before sleep on stdout from timeout test.\n"); + fprintf(stderr, "Output before sleep on stderr from timeout test.\n"); + fflush(stdout); + fflush(stderr); +#if defined(_WIN32) + Sleep(5000); +#else + sleep(5); +#endif + fprintf(stdout, "Output after sleep on stdout from timeout test.\n"); + fprintf(stderr, "Output after sleep on stderr from timeout test.\n"); + return 0; +} + +int test4() +{ + fprintf(stdout, "Output before crash on stdout from crash test.\n"); + fprintf(stderr, "Output before crash on stderr from crash test.\n"); + fflush(stdout); + fflush(stderr); + *(int*)0 = 0; + fprintf(stdout, "Output after crash on stdout from crash test.\n"); + fprintf(stderr, "Output after crash on stderr from crash test.\n"); + return 0; +} + +int runChild(const char* cmd[], int state, int exception, int value) +{ + int result = 0; + char* data = 0; + int length = 0; + kwsysProcess* kp = kwsysProcess_New(); + if(!kp) + { + fprintf(stderr, "kwsysProcess_New returned NULL!\n"); + return 1; + } + + kwsysProcess_SetCommand(kp, cmd); + kwsysProcess_SetTimeout(kp, 3); + kwsysProcess_Execute(kp); + + while(kwsysProcess_WaitForData(kp, (kwsysProcess_Pipe_STDOUT | + kwsysProcess_Pipe_STDERR), + &data, &length, 0)) + { + fwrite(data, 1, length, stdout); + fflush(stdout); + } + + kwsysProcess_WaitForExit(kp, 0); + + switch (kwsysProcess_GetState(kp)) + { + case kwsysProcess_State_Starting: + printf("No process has been executed.\n"); break; + case kwsysProcess_State_Executing: + printf("The process is still executing.\n"); break; + case kwsysProcess_State_Expired: + printf("Child was killed when timeout expired.\n"); break; + case kwsysProcess_State_Exited: + printf("Child exited with value = %d\n", + kwsysProcess_GetExitValue(kp)); + result = ((exception != kwsysProcess_GetExitException(kp)) || + (value != kwsysProcess_GetExitValue(kp))); break; + case kwsysProcess_State_Killed: + printf("Child was killed by parent.\n"); break; + case kwsysProcess_State_Exception: + printf("Child terminated abnormally.\n"); + result = ((exception != kwsysProcess_GetExitException(kp)) || + (value != kwsysProcess_GetExitValue(kp))); break; + case kwsysProcess_State_Error: + printf("Error in administrating child process: [%s]\n", + kwsysProcess_GetErrorString(kp)); break; + }; + + if(result) + { + if(exception != kwsysProcess_GetExitException(kp)) + { + fprintf(stderr, "Mismatch in exit exception. Should have been %d.\n", + exception); + } + if(value != kwsysProcess_GetExitValue(kp)) + { + fprintf(stderr, "Mismatch in exit value. Should have been %d.\n", + value); + } + } + + if(kwsysProcess_GetState(kp) != state) + { + fprintf(stderr, "Mismatch in state. Should have been %d.\n", state); + result = 1; + } + + kwsysProcess_Delete(kp); + return result; +} + +int main(int argc, const char* argv[]) +{ + int n = 0; + if(argc == 2) + { + n = atoi(argv[1]); + } + else if(argc == 3) + { + n = atoi(argv[2]); + } + /* Check arguments. */ + if(n < 1 || n > 5 || (argc == 3 && strcmp(argv[1], "run") != 0)) + { + fprintf(stdout, "Usage: %s <test number>\n", argv[0]); + return 1; + } + if(argc == 3) + { + switch (n) + { + case 1: return test1(); + case 2: return test2(); + case 3: return test3(); + case 4: return test4(); + } + fprintf(stderr, "Invalid test number %d.\n", n); + return 1; + } + + if(n <= 4) + { + int states[4] = + { + kwsysProcess_State_Exited, + kwsysProcess_State_Exited, + kwsysProcess_State_Expired, + kwsysProcess_State_Exception + }; + int exceptions[4] = {kwsysProcess_Exception_None, kwsysProcess_Exception_None, + kwsysProcess_Exception_None, kwsysProcess_Exception_Fault}; + int values[4] = {0, 123, 1, 1}; + const char* cmd[] = {argv[0], "run", argv[1], 0}; + return runChild(cmd, states[n-1], exceptions[n-1], values[n-1]); + } + else + { + return 0; + } +} |