From f88074ffcc85229fbb8e524b885905573e6998bf Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Wed, 18 Jun 2003 17:27:36 -0400
Subject: [PATCH] ENH: Added test for Process implementation.

---
 CMakeLists.txt |   2 +
 testProcess.c  | 176 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 178 insertions(+)
 create mode 100644 testProcess.c

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f542e3b..4afa4d8 100644
--- a/CMakeLists.txt
+++ b/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/testProcess.c b/testProcess.c
new file mode 100644
index 0000000..ae3410a
--- /dev/null
+++ b/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;
+    }  
+}
-- 
GitLab