From 9527ec827f4e433d2a54d8744d32a7df4e0e40f9 Mon Sep 17 00:00:00 2001 From: cherierm Date: Tue, 19 Dec 2006 16:29:31 +0000 Subject: [PATCH] test case context concept implementation git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3014 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- win32_test_app/src/TTestCaseContext.c | 306 ++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 win32_test_app/src/TTestCaseContext.c diff --git a/win32_test_app/src/TTestCaseContext.c b/win32_test_app/src/TTestCaseContext.c new file mode 100644 index 0000000000..f2ce0f7d4c --- /dev/null +++ b/win32_test_app/src/TTestCaseContext.c @@ -0,0 +1,306 @@ +#include + +/* + * Implementation of s_TestCaseContext connected functions. + */ + +/* + * Create a new s_TestCaseContext and returns a pointer to self. + */ +TestCaseContext_t TestCaseContext_new(void) +{ + TestCaseContext_t context = calloc(1,sizeof(s_TestCaseContext_t)); + + if(NULL == context) + { + setErrno(E_TEST_CASE_CONTEXT_ALLOCATION_FAILED); + return NULL; + } + + context->inputBuffer = Buffer_new(); + + if(NULL == context->inputBuffer) + { + TestCaseContext_free(context); + return NULL; + } + + context->outputBuffer = Buffer_new(); + + if(NULL == context->outputBuffer) + { + TestCaseContext_free(context); + return NULL; + } + + context->expectedOutputBuffer = Buffer_new(); + + if(NULL == context->expectedOutputBuffer) + { + TestCaseContext_free(context); + return NULL; + } + + context->commandLineBuffer = Buffer_new(); + + if(NULL == context->commandLineBuffer) + { + TestCaseContext_free(context); + return NULL; + } + + + context->isOutputCheckingEnabled = DEFAULT_OUTPUT_CHECKING_MODE; + context->isPostOutputCheckingEnabled = DEFAULT_POST_OUTPUT_CHECKING_MODE; + context->timeoutValue = DEFAULT_TIMEOUT_VALUE; + context->expectedExitCode = INVALID_EXIT_CODE; + context->exitCode = INVALID_EXIT_CODE; + context->name = NULL; + + context->runThread = true; + context->hThread = NULL; + context->hOutputRead = NULL; + context->hInputWrite = NULL; + context->hChildStdInRead = NULL; + context->hChildStdOutWrite = NULL; + context->hChildStderr = NULL; + context->hChildStdoutReadTmp = NULL; + context->hChildStdinWriteTmp = NULL; + context->hConsole = NULL; + + context->createConsole = false; + context->exitCodeCheckingEnabled = false; + + context->started = false; + + memset(&(context->pi),0,sizeof(PROCESS_INFORMATION)); + + return context; +} + +/* + * Destroy the s_TestCaseContext referenced by context. + */ +void TestCaseContext_free(TestCaseContext_t context) +{ + if(NULL == context) + return; + + if(NULL !=context->inputBuffer) + Buffer_free(context->inputBuffer); + + if(NULL !=context->outputBuffer) + Buffer_free(context->outputBuffer); + + if(NULL !=context->expectedOutputBuffer) + Buffer_free(context->expectedOutputBuffer); + + if(NULL !=context->commandLineBuffer) + Buffer_free(context->commandLineBuffer); + + if(NULL == context->name) + free(context->name); + + + /* Close all pipe handles. */ + if(context->hChildStdoutReadTmp) + CloseHandle(context->hChildStdoutReadTmp); + + if(context->hChildStdInRead) + CloseHandle(context->hChildStdInRead); + + if(context->hChildStdinWriteTmp) + CloseHandle(context->hChildStdinWriteTmp); + + if(context->hChildStdOutWrite) + CloseHandle(context->hChildStdOutWrite); + + if(context->hOutputRead) + CloseHandle(context->hOutputRead); + + if(context->pi.hThread) + CloseHandle(context->pi.hThread); + + /* Use some violence, no choice. */ + if(context->pi.hProcess) + { + /* Kill the child process. */ + TerminateProcess(context->pi.hProcess,0); + } + + if(context->hThread) + { + /* Terminate the thread */ + TerminateThread(context->hThread,0); + } + + if(context->hInputWrite) + CloseHandle(context->hInputWrite); + + if(context->hChildStderr) + CloseHandle(context->hChildStderr); + + free(context); + context = NULL; +} + +/* + * Set the timeout of the test case context. + */ +void TestCaseContext_setTimeout(TestCaseContext_t context,int timeout) +{ + context->timeoutValue = timeout; +} + +/* + * Enable the output checking of the test case context. + */ +void TestCaseContext_enableOutputChecking(TestCaseContext_t context) +{ + context->isOutputCheckingEnabled = true; +} + +/* + * Enable the output checking of the test case context. + */ +void TestCaseContext_disableOutputChecking(TestCaseContext_t context) +{ + /* If the post output checking mode is enable, disable it*/ + context->isPostOutputCheckingEnabled = false; + context->isOutputCheckingEnabled = false; +} + +/* + * Enable the post output checking of the test case context. + */ +void TestCaseContext_enable_post_output_checking(TestCaseContext_t context) +{ + /* enable the post output checking mode if the output checking mode is enabled*/ + if(context->isOutputCheckingEnabled) + context->isPostOutputCheckingEnabled = true; +} + +/* + * Disable the post output checking of the test case context. + */ +void TestCaseContext_disablePostOutputChecking(TestCaseContext_t context) +{ + context->isPostOutputCheckingEnabled = false; +} + +void TestCaseContext_createConsole(TestCaseContext_t context) +{ + context->createConsole = true; +} + +void TestCaseContext_createNoConsole(TestCaseContext_t context) +{ + context->createConsole = false; +} + +/* + * Set the expected exit code of the test case context. + */ +void TestCaseContext_setExpectedExitCode(TestCaseContext_t context,int expected_code) +{ + context->expectedExitCode = expected_code; +} + +/* + * Return true if the output checking mode is enabled for this + * test case context. Otherwise the functions returns false. + */ +bool TestCaseContext_isOutputCheckingEnabled(TestCaseContext_t context) +{ + return context->isOutputCheckingEnabled; +} + +void TestCaseContext_enableExitCodeChecking(TestCaseContext_t context) +{ + context->exitCodeCheckingEnabled = true; +} + +void TestCaseContext_disableExitCodeChecking(TestCaseContext_t context) +{ + context->exitCodeCheckingEnabled = false; +} + +void TestCaseContext_setCommandLine(TestCaseContext_t context,char* cmdLine) +{ + Buffer_append(context->commandLineBuffer,cmdLine); +} + + +/* + * Append a child output to check in the + * test case context. + */ +void TestCaseContext_appendExpectedOutput(TestCaseContext_t context,char* expected_output) +{ + Buffer_append(context->expectedOutputBuffer,expected_output); +} + +/* + * Append a child output to check in the + * test case context. + */ +void TestCaseContext_appendChildInput(TestCaseContext_t context,char* input) +{ + Buffer_append(context->inputBuffer,input); +} + +/* + * Set the name of the test case name. + */ +void TestCaseContext_setName(TestCaseContext_t context,char* name) +{ + size_t size; + + if(NULL != context->name) + { + free(context->name); + } + + context->name = strdup(name); + size = strlen(name); + + while ((context->name[size-1] == '\n') || (context->name[size-1] == '\r')) + { + context->name[size-1] = '\0'; + + if(size) + size--; + } + + /*context->name[strlen(context->name) - 1] ='\0';*/ +} + +/* + * Clear the s_TestCaseContext referenced by context. + */ +void TestCaseContext_clear(TestCaseContext_t context) +{ + if(!Buffer_empty(context->inputBuffer)) + Buffer_clear(context->inputBuffer); + + if(!Buffer_empty(context->outputBuffer)) + Buffer_clear(context->outputBuffer); + + if(!Buffer_empty(context->expectedOutputBuffer)) + Buffer_clear(context->expectedOutputBuffer); + + if(!Buffer_empty(context->commandLineBuffer)) + Buffer_clear(context->commandLineBuffer); + + if(NULL == context->name) + { + free(context->name); + context->name = NULL; + } + + context->isOutputCheckingEnabled = DEFAULT_OUTPUT_CHECKING_MODE; + context->isPostOutputCheckingEnabled = DEFAULT_POST_OUTPUT_CHECKING_MODE; + context->timeoutValue = DEFAULT_TIMEOUT_VALUE; + context->expectedExitCode = INVALID_EXIT_CODE; + context->exitCode = INVALID_EXIT_CODE; +} \ No newline at end of file -- 2.20.1