{
}
+TestException::TestException (const char* message, const char* expr, const char* file, int line, qpTestResult result)
+ : Exception (formatError(message, expr, file, line))
+ , m_result (result)
+{
+}
+
+TestException::TestException (const std::string& message, qpTestResult result)
+ : Exception (message)
+ , m_result (result)
+{
+}
+
TestError::TestError (const char* message, const char* expr, const char* file, int line)
- : Exception(message, expr, file, line)
+ : TestException(message, expr, file, line, QP_TEST_RESULT_FAIL)
{
}
TestError::TestError (const std::string& message)
- : Exception(message)
+ : TestException(message, QP_TEST_RESULT_FAIL)
{
}
InternalError::InternalError (const char* message, const char* expr, const char* file, int line)
- : Exception(message, expr, file, line)
+ : TestException(message, expr, file, line, QP_TEST_RESULT_INTERNAL_ERROR)
{
}
InternalError::InternalError (const std::string& message)
- : Exception(message)
+ : TestException(message, QP_TEST_RESULT_INTERNAL_ERROR)
{
}
ResourceError::ResourceError (const char* message, const char* expr, const char* file, int line)
- : Exception(message, expr, file, line)
+ : TestException(message, expr, file, line, QP_TEST_RESULT_RESOURCE_ERROR)
{
}
ResourceError::ResourceError (const std::string& message)
- : Exception(message)
+ : TestException(message, QP_TEST_RESULT_RESOURCE_ERROR)
{
}
NotSupportedError::NotSupportedError (const char* message, const char* expr, const char* file, int line)
- : Exception(message, expr, file, line)
+ : TestException(message, expr, file, line, QP_TEST_RESULT_NOT_SUPPORTED)
{
}
NotSupportedError::NotSupportedError (const std::string& message)
- : Exception(message)
+ : TestException(message, QP_TEST_RESULT_NOT_SUPPORTED)
{
}
*//*--------------------------------------------------------------------*/
#include "deDefs.hpp"
+#include "qpTestLog.h"
#include <string>
#include <stdexcept>
class Exception : public std::runtime_error
{
public:
- Exception (const char* message, const char* expr, const char* file, int line);
- Exception (const std::string& message);
- virtual ~Exception (void) throw() {}
+ Exception (const char* message, const char* expr, const char* file, int line);
+ Exception (const std::string& message);
+ virtual ~Exception (void) throw() {}
- const char* getMessage (void) const { return m_message.c_str(); }
+ const char* getMessage (void) const { return m_message.c_str(); }
private:
- std::string m_message;
+ const std::string m_message;
+};
+
+//! Base exception class for test exceptions that affect test result
+class TestException : public Exception
+{
+public:
+ TestException (const char* message, const char* expr, const char* file, int line, qpTestResult result);
+ TestException (const std::string& message, qpTestResult result);
+ virtual ~TestException (void) throw() {}
+
+ qpTestResult getTestResult (void) const { return m_result; }
+ virtual bool isFatal (void) const { return false; }
+
+private:
+ const qpTestResult m_result;
};
//! Exception for test errors.
-class TestError : public Exception
+class TestError : public TestException
{
public:
TestError (const char* message, const char* expr, const char* file, int line);
};
//! Exception for internal errors.
-class InternalError : public Exception
+class InternalError : public TestException
{
public:
InternalError (const char* message, const char* expr, const char* file, int line);
};
//! Resource error. Tester will terminate if thrown out of test case.
-class ResourceError : public Exception
+class ResourceError : public TestException
{
public:
ResourceError (const char* message, const char* expr, const char* file, int line);
ResourceError (const std::string& message);
virtual ~ResourceError (void) throw() {}
+
+ virtual bool isFatal (void) const { return true; }
};
//! Not supported error.
-class NotSupportedError : public Exception
+class NotSupportedError : public TestException
{
public:
NotSupportedError (const char* message, const char* expr, const char* file, int line);
{
DE_ASSERT(!success);
m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Failed to allocate memory in test case init");
+ m_testCtx.setTerminateAfter(true);
}
- catch (const tcu::ResourceError& e)
+ catch (const tcu::TestException& e)
{
DE_ASSERT(!success);
- m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, e.getMessage());
- log << e;
- }
- catch (const tcu::NotSupportedError& e)
- {
- DE_ASSERT(!success);
- m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, e.getMessage());
- log << e;
- }
- catch (const tcu::InternalError& e)
- {
- DE_ASSERT(!success);
- m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, e.getMessage());
+ m_testCtx.setTestResult(e.getTestResult(), e.getMessage());
+ m_testCtx.setTerminateAfter(e.isFatal());
log << e;
}
catch (const tcu::Exception& e)
catch (const std::bad_alloc&)
{
m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Failed to allocate memory during test execution");
+ m_testCtx.setTerminateAfter(true);
}
- catch (const tcu::ResourceError& e)
- {
- log << e;
- m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, e.getMessage());
- }
- catch (const tcu::NotSupportedError& e)
- {
- log << e;
- m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, e.getMessage());
- }
- catch (const tcu::InternalError& e)
+ catch (const tcu::TestException& e)
{
log << e;
- m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, e.getMessage());
+ m_testCtx.setTestResult(e.getTestResult(), e.getMessage());
+ m_testCtx.setTerminateAfter(e.isFatal());
}
catch (const tcu::Exception& e)
{
, m_watchDog (watchDog)
, m_curArchive (DE_NULL)
, m_testResult (QP_TEST_RESULT_LAST)
+ , m_terminateAfter (false)
{
setCurrentArchive(m_rootArchive);
}
Archive& getRootArchive (void) const { return m_rootArchive; }
void setCurrentArchive (Archive& archive) { m_curArchive = &archive; }
+ void setTerminateAfter (bool terminate) { m_terminateAfter = terminate; }
+ bool getTerminateAfter (void) const { return m_terminateAfter; }
protected:
Platform& m_platform; //!< Platform port implementation.
Archive& m_rootArchive; //!< Root archive.
Archive* m_curArchive; //!< Current archive for test cases.
qpTestResult m_testResult; //!< Latest test result.
std::string m_testResultDesc; //!< Latest test result description.
+ bool m_terminateAfter; //!< Should tester terminate after execution of the current test
};
/*--------------------------------------------------------------------*//*!
const RunMode runMode = m_cmdLine.getRunMode();
if (runMode == RUNMODE_EXECUTE)
{
- // Update statistics.
- qpTestResult testResult = m_testCtx.getTestResult();
+ // De-init case.
+ const bool deinitOk = m_testCaseWrapper->deinitTestCase(testCase);
+ const qpTestResult testResult = m_testCtx.getTestResult();
+ const char* const testResultDesc = m_testCtx.getTestResultDesc();
+ const bool terminateAfter = m_testCtx.getTerminateAfter();
DE_ASSERT(testResult != QP_TEST_RESULT_LAST);
- print(" %s (%s)\n", qpGetTestResultName(testResult), m_testCtx.getTestResultDesc());
+ m_isInTestCase = false;
+ m_testCtx.getLog().endCase(testResult, testResultDesc);
+
+ // Update statistics.
+ print(" %s (%s)\n", qpGetTestResultName(testResult), testResultDesc);
m_result.numExecuted += 1;
switch (testResult)
default: m_result.numFailed += 1; break;
}
- // De-init case.
- bool deinitOk = m_testCaseWrapper->deinitTestCase(testCase);
-
- m_isInTestCase = false;
- m_testCtx.getLog().endCase(m_testCtx.getTestResult(), m_testCtx.getTestResultDesc());
-
- // Resource error or any error in deinit means that execution should end
- if (!deinitOk || testResult == QP_TEST_RESULT_RESOURCE_ERROR)
+ // terminateAfter, Resource error or any error in deinit means that execution should end
+ if (terminateAfter || !deinitOk || testResult == QP_TEST_RESULT_RESOURCE_ERROR)
m_abortSession = true;
// \todo [2011-02-09 pyry] Disable watchdog temporarily?
{
m_testCtx.getLog() << e;
m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error in context post-iteration routine");
+ m_testCtx.setTerminateAfter(true);
return tcu::TestNode::STOP;
}
catch (const std::exception& e)
{
m_testCtx.getLog() << e;
m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error in context post-iteration routine");
+ m_testCtx.setTerminateAfter(true);
return tcu::TestNode::STOP;
}
catch (const std::exception& e)
{
m_testCtx.getLog() << e;
m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error in context post-iteration routine");
+ m_testCtx.setTerminateAfter(true);
return tcu::TestNode::STOP;
}
catch (const std::exception& e)