[ROSAUTOTEST]

- Continue the testing process in case a test fails to execute
ONLINE-441

svn path=/trunk/; revision=66504
This commit is contained in:
Thomas Faber 2015-02-28 21:12:25 +00:00
parent 5dfd2fc11e
commit b3777ffecc
6 changed files with 72 additions and 39 deletions

View 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");
}
/**

View 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)
{
}

View 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; }
};

View file

@ -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) { }
};

View 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);
/* Store the Module name */
UnderscorePosition = m_CurrentFile.find_last_of('_');
if(UnderscorePosition == m_CurrentFile.npos)
{
stringstream ss;
auto_ptr<CTestInfo> 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();
}
/**

View 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;