[ROSAUTOTEST]
authorThomas Faber <thomas.faber@reactos.org>
Sat, 28 Feb 2015 21:12:25 +0000 (21:12 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sat, 28 Feb 2015 21:12:25 +0000 (21:12 +0000)
- Continue the testing process in case a test fails to execute
ONLINE-441

svn path=/trunk/; revision=66504

rostests/rosautotest/CProcess.cpp
rostests/rosautotest/CSimpleException.cpp
rostests/rosautotest/CSimpleException.h
rostests/rosautotest/CTestException.h [new file with mode: 0644]
rostests/rosautotest/CWineTest.cpp
rostests/rosautotest/precomp.h

index 6697318..afdfd5b 100644 (file)
@@ -23,7 +23,7 @@ CProcess::CProcess(const wstring& CommandLine, LPSTARTUPINFOW StartupInfo)
     wcscpy(CommandLinePtr, CommandLine.c_str());
 
     if(!CreateProcessW(NULL, CommandLinePtr, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, StartupInfo, &m_ProcessInfo))
-        FATAL("CreateProcessW failed\n");
+        TESTEXCEPTION("CreateProcessW failed\n");
 }
 
 /**
index f7ae841..169d70b 100644 (file)
@@ -12,9 +12,9 @@
  * You should always use the EXCEPTION or SSEXCEPTION macro for throwing this exception.
  *
  * @param Message
- * Constant pointer to a char array containing a short message about the exception
+ * String containing a short message about the exception
  */
-CSimpleException::CSimpleException(const char* Message)
+CSimpleException::CSimpleException(const string& Message)
     : m_Message(Message)
 {
 }
index 08bd09c..650270c 100644 (file)
@@ -11,7 +11,7 @@ private:
     string m_Message;
 
 public:
-    CSimpleException(const char* Message);
+    CSimpleException(const string& Message);
 
     const string& GetMessage() const { return m_Message; }
 };
diff --git a/rostests/rosautotest/CTestException.h b/rostests/rosautotest/CTestException.h
new file mode 100644 (file)
index 0000000..a280060
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * PROJECT:     ReactOS Automatic Testing Utility
+ * LICENSE:     GNU GPLv2 or any later version as published by the Free Software Foundation
+ * PURPOSE:     Simple exception during test execution that can be skipped over
+ * COPYRIGHT:   Copyright 2015 Thomas Faber <thomas.faber@reactos.org>
+ */
+
+class CTestException : public CSimpleException
+{
+public:
+    CTestException(const string& Message) : CSimpleException(Message) { }
+};
index ca5136f..fd949db 100644 (file)
@@ -121,12 +121,12 @@ CWineTest::DoListCommand()
 
         /* Wait till this process ended */
         if(WaitForSingleObject(Process.GetProcessHandle(), ListTimeout) == WAIT_FAILED)
-            FATAL("WaitForSingleObject failed for the test list\n");
+            TESTEXCEPTION("WaitForSingleObject failed for the test list\n");
     }
 
     /* Read the output data into a buffer */
     if(!Pipe.Peek(NULL, 0, NULL, &BytesAvailable))
-        FATAL("CPipe::Peek failed for the test list\n");
+        TESTEXCEPTION("CPipe::Peek failed for the test list\n");
 
     /* Check if we got any */
     if(!BytesAvailable)
@@ -134,14 +134,14 @@ CWineTest::DoListCommand()
         stringstream ss;
 
         ss << "The --list command did not return any data for " << UnicodeToAscii(m_CurrentFile) << endl;
-        SSEXCEPTION;
+        TESTEXCEPTION(ss.str());
     }
 
     /* Read the data */
     m_ListBuffer = new char[BytesAvailable];
 
     if(!Pipe.Read(m_ListBuffer, BytesAvailable, &Temp))
-        FATAL("CPipe::Read failed\n");
+        TESTEXCEPTION("CPipe::Read failed\n");
 
     return BytesAvailable;
 }
@@ -208,41 +208,50 @@ CWineTest::GetNextTestInfo()
 {
     while(!m_CurrentFile.empty() || GetNextFile())
     {
-        while(GetNextTest())
+        try
         {
-            /* If the user specified a test through the command line, check this here */
-            if(!Configuration.GetTest().empty() && Configuration.GetTest() != m_CurrentTest)
-                continue;
-
+            while(GetNextTest())
             {
-                auto_ptr<CTestInfo> TestInfo(new CTestInfo());
-                size_t UnderscorePosition;
+                /* If the user specified a test through the command line, check this here */
+                if(!Configuration.GetTest().empty() && Configuration.GetTest() != m_CurrentTest)
+                    continue;
 
-                /* Build the command line */
-                TestInfo->CommandLine = m_TestPath;
-                TestInfo->CommandLine += m_CurrentFile;
-                TestInfo->CommandLine += ' ';
-                TestInfo->CommandLine += AsciiToUnicode(m_CurrentTest);
+                {
+                    auto_ptr<CTestInfo> TestInfo(new CTestInfo());
+                    size_t UnderscorePosition;
 
-                /* Store the Module name */
-                UnderscorePosition = m_CurrentFile.find_last_of('_');
+                    /* Build the command line */
+                    TestInfo->CommandLine = m_TestPath;
+                    TestInfo->CommandLine += m_CurrentFile;
+                    TestInfo->CommandLine += ' ';
+                    TestInfo->CommandLine += AsciiToUnicode(m_CurrentTest);
 
-                if(UnderscorePosition == m_CurrentFile.npos)
-                {
-                    stringstream ss;
+                    /* Store the Module name */
+                    UnderscorePosition = m_CurrentFile.find_last_of('_');
 
-                    ss << "Invalid test file name: " << UnicodeToAscii(m_CurrentFile) << endl;
-                    SSEXCEPTION;
-                }
+                    if(UnderscorePosition == m_CurrentFile.npos)
+                    {
+                        stringstream ss;
+
+                        ss << "Invalid test file name: " << UnicodeToAscii(m_CurrentFile) << endl;
+                        SSEXCEPTION;
+                    }
 
-                TestInfo->Module = UnicodeToAscii(m_CurrentFile.substr(0, UnderscorePosition));
+                    TestInfo->Module = UnicodeToAscii(m_CurrentFile.substr(0, UnderscorePosition));
 
-                /* Store the test */
-                TestInfo->Test = m_CurrentTest;
+                    /* Store the test */
+                    TestInfo->Test = m_CurrentTest;
 
-                return TestInfo.release();
+                    return TestInfo.release();
+                }
             }
         }
+        catch(CTestException& e)
+        {
+            delete[] m_ListBuffer;
+            StringOut(e.GetMessage());
+            m_CurrentFile.clear();
+        }
     }
 
     return NULL;
@@ -271,6 +280,7 @@ CWineTest::RunTest(CTestInfo* TestInfo)
 
     StartTime = GetTickCount();
 
+    try
     {
         /* Execute the test */
         CPipedProcess Process(TestInfo->CommandLine, Pipe);
@@ -286,7 +296,15 @@ CWineTest::RunTest(CTestInfo* TestInfo)
                 TestInfo->Log += Buffer;
         }
         if(GetLastError() != ERROR_BROKEN_PIPE)
-            FATAL("CPipe::Read failed for the test run\n");
+            TESTEXCEPTION("CPipe::Read failed for the test run\n");
+    }
+    catch(CTestException& e)
+    {
+        if(!tailString.empty())
+            StringOut(tailString);
+        tailString.clear();
+        StringOut(e.GetMessage());
+        TestInfo->Log += e.GetMessage();
     }
 
     /* Print what's left */
@@ -297,6 +315,7 @@ CWineTest::RunTest(CTestInfo* TestInfo)
     ssFinish << "Test " << TestInfo->Test << " completed in ";
     ssFinish << setprecision(2) << fixed << TotalTime << " seconds." << endl;
     StringOut(ssFinish.str());
+    TestInfo->Log += ssFinish.str();
 }
 
 /**
index b42fd41..fa752b8 100644 (file)
@@ -34,6 +34,7 @@ using namespace std;
 #include "CProcess.h"
 #include "CPipedProcess.h"
 #include "CSimpleException.h"
+#include "CTestException.h"
 #include "CTestInfo.h"
 #include "CTest.h"
 #include "CTestList.h"
@@ -45,9 +46,10 @@ using namespace std;
 #include <rosautotestmsg.h>
 
 /* Useful macros */
-#define EXCEPTION(Message)   throw CSimpleException(Message)
-#define FATAL(Message)       throw CFatalException(__FILE__, __LINE__, Message)
-#define SSEXCEPTION          throw CSimpleException(ss.str().c_str())
+#define EXCEPTION(Message)     throw CSimpleException(Message)
+#define FATAL(Message)         throw CFatalException(__FILE__, __LINE__, Message)
+#define SSEXCEPTION            throw CSimpleException(ss.str())
+#define TESTEXCEPTION(Message) throw CTestException(Message)
 
 /* main.c */
 extern CConfiguration Configuration;