From b3777ffecc7596c949c10f7b8ccc843ac9fe048e Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sat, 28 Feb 2015 21:12:25 +0000 Subject: [PATCH] [ROSAUTOTEST] - Continue the testing process in case a test fails to execute ONLINE-441 svn path=/trunk/; revision=66504 --- rostests/rosautotest/CProcess.cpp | 2 +- rostests/rosautotest/CSimpleException.cpp | 4 +- rostests/rosautotest/CSimpleException.h | 2 +- rostests/rosautotest/CTestException.h | 12 ++++ rostests/rosautotest/CWineTest.cpp | 83 ++++++++++++++--------- rostests/rosautotest/precomp.h | 8 ++- 6 files changed, 72 insertions(+), 39 deletions(-) create mode 100644 rostests/rosautotest/CTestException.h diff --git a/rostests/rosautotest/CProcess.cpp b/rostests/rosautotest/CProcess.cpp index 6697318f349..afdfd5b52de 100644 --- a/rostests/rosautotest/CProcess.cpp +++ b/rostests/rosautotest/CProcess.cpp @@ -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"); } /** diff --git a/rostests/rosautotest/CSimpleException.cpp b/rostests/rosautotest/CSimpleException.cpp index f7ae841dff0..169d70b0f64 100644 --- a/rostests/rosautotest/CSimpleException.cpp +++ b/rostests/rosautotest/CSimpleException.cpp @@ -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) { } diff --git a/rostests/rosautotest/CSimpleException.h b/rostests/rosautotest/CSimpleException.h index 08bd09cd809..650270c8a12 100644 --- a/rostests/rosautotest/CSimpleException.h +++ b/rostests/rosautotest/CSimpleException.h @@ -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 index 00000000000..a280060b5ba --- /dev/null +++ b/rostests/rosautotest/CTestException.h @@ -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 + */ + +class CTestException : public CSimpleException +{ +public: + CTestException(const string& Message) : CSimpleException(Message) { } +}; diff --git a/rostests/rosautotest/CWineTest.cpp b/rostests/rosautotest/CWineTest.cpp index ca5136f7b90..fd949db68bf 100644 --- a/rostests/rosautotest/CWineTest.cpp +++ b/rostests/rosautotest/CWineTest.cpp @@ -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 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); - - /* Store the Module name */ - UnderscorePosition = m_CurrentFile.find_last_of('_'); - - if(UnderscorePosition == m_CurrentFile.npos) { - stringstream ss; + auto_ptr TestInfo(new CTestInfo()); + size_t UnderscorePosition; - ss << "Invalid test file name: " << UnicodeToAscii(m_CurrentFile) << endl; - SSEXCEPTION; + /* Build the command line */ + TestInfo->CommandLine = m_TestPath; + TestInfo->CommandLine += m_CurrentFile; + TestInfo->CommandLine += ' '; + TestInfo->CommandLine += AsciiToUnicode(m_CurrentTest); + + /* Store the Module name */ + UnderscorePosition = m_CurrentFile.find_last_of('_'); + + 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)); + + /* Store the test */ + TestInfo->Test = m_CurrentTest; + + return TestInfo.release(); } - - TestInfo->Module = UnicodeToAscii(m_CurrentFile.substr(0, UnderscorePosition)); - - /* Store the test */ - TestInfo->Test = m_CurrentTest; - - 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(); } /** diff --git a/rostests/rosautotest/precomp.h b/rostests/rosautotest/precomp.h index b42fd4166e4..fa752b814e9 100644 --- a/rostests/rosautotest/precomp.h +++ b/rostests/rosautotest/precomp.h @@ -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 /* 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;