| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- /*=========================================================================
- Program: KWSys - Kitware System Library
- Module: $RCSfile$
- Copyright (c) Kitware, Inc., Insight Consortium. All rights reserved.
- See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the above copyright notices for more information.
- =========================================================================*/
- #include <kwsys/Process.h>
- #include <stdio.h>
- #include <stdlib.h>
- #if defined(_WIN32)
- # include <windows.h>
- #else
- # include <unistd.h>
- #endif
- int runChild(const char* cmd[], int state, int exception, int value,
- int share, double timeout);
- int test1(int argc, const char* argv[])
- {
- (void)argc; (void)argv;
- fprintf(stdout, "Output on stdout from test returning 0.\n");
- fprintf(stderr, "Output on stderr from test returning 0.\n");
- return 0;
- }
- int test2(int argc, const char* argv[])
- {
- (void)argc; (void)argv;
- fprintf(stdout, "Output on stdout from test returning 123.\n");
- fprintf(stderr, "Output on stderr from test returning 123.\n");
- return 123;
- }
- int test3(int argc, const char* argv[])
- {
- (void)argc; (void)argv;
- 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(int argc, const char* argv[])
- {
- (void)argc; (void)argv;
- 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 test5(int argc, const char* argv[])
- {
- int r;
- const char* cmd[4];
- (void)argc;
- cmd[0] = argv[0];
- cmd[1] = "run";
- cmd[2] = "4";
- cmd[3] = 0;
- fprintf(stdout, "Output on stdout before recursive test.\n");
- fprintf(stderr, "Output on stderr before recursive test.\n");
- fflush(stdout);
- fflush(stderr);
- r = runChild(cmd, kwsysProcess_State_Exception,
- kwsysProcess_Exception_Fault, 1, 1, 2);
- fprintf(stdout, "Output on stdout after recursive test.\n");
- fprintf(stderr, "Output on stderr after recursive test.\n");
- fflush(stdout);
- fflush(stderr);
- return r;
- }
- int runChild(const char* cmd[], int state, int exception, int value,
- int share, double timeout)
- {
- 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, timeout);
- if(share)
- {
- kwsysProcess_SetPipeShared(kp, kwsysProcess_Pipe_STDOUT, 1);
- kwsysProcess_SetPipeShared(kp, kwsysProcess_Pipe_STDERR, 1);
- }
- kwsysProcess_Execute(kp);
- if(!share)
- {
- while(kwsysProcess_WaitForData(kp, &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 0
- {
- HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
- DuplicateHandle(GetCurrentProcess(), out,
- GetCurrentProcess(), &out, 0, FALSE,
- DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
- SetStdHandle(STD_OUTPUT_HANDLE, out);
- }
- {
- HANDLE out = GetStdHandle(STD_ERROR_HANDLE);
- DuplicateHandle(GetCurrentProcess(), out,
- GetCurrentProcess(), &out, 0, FALSE,
- DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
- SetStdHandle(STD_ERROR_HANDLE, out);
- }
- #endif
- 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(argc, argv);
- case 2: return test2(argc, argv);
- case 3: return test3(argc, argv);
- case 4: return test4(argc, argv);
- case 5: return test5(argc, argv);
- }
- fprintf(stderr, "Invalid test number %d.\n", n);
- return 1;
- }
-
- if(n >= 0 && n <= 5)
- {
- int states[5] =
- {
- kwsysProcess_State_Exited,
- kwsysProcess_State_Exited,
- kwsysProcess_State_Expired,
- kwsysProcess_State_Exception,
- kwsysProcess_State_Exited
- };
- int exceptions[5] =
- {
- kwsysProcess_Exception_None,
- kwsysProcess_Exception_None,
- kwsysProcess_Exception_None,
- kwsysProcess_Exception_Fault,
- kwsysProcess_Exception_None
- };
- int values[5] = {0, 123, 1, 1, 0};
- int r;
- const char* cmd[4];
- cmd[0] = argv[0];
- cmd[1] = "run";
- cmd[2] = argv[1];
- cmd[3] = 0;
- fprintf(stdout, "Output on stdout before test %d.\n", n);
- fprintf(stderr, "Output on stderr before test %d.\n", n);
- fflush(stdout);
- fflush(stderr);
- r = runChild(cmd, states[n-1], exceptions[n-1], values[n-1], 0, 3);
- fprintf(stdout, "Output on stdout after test %d.\n", n);
- fprintf(stderr, "Output on stderr after test %d.\n", n);
- fflush(stdout);
- fflush(stderr);
- return r;
- }
- else
- {
- fprintf(stderr, "Test number out of range\n");
- return 1;
- }
- }
|