Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
test case context concept implementation
authorcherierm <cherierm@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 19 Dec 2006 16:29:31 +0000 (16:29 +0000)
committercherierm <cherierm@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 19 Dec 2006 16:29:31 +0000 (16:29 +0000)
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 [new file with mode: 0644]

diff --git a/win32_test_app/src/TTestCaseContext.c b/win32_test_app/src/TTestCaseContext.c
new file mode 100644 (file)
index 0000000..f2ce0f7
--- /dev/null
@@ -0,0 +1,306 @@
+#include <TTestCaseContext.h>
+
+/*
+ * 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