Added signal handlers (and placeholder for SEH handlers)

- based on PR 232 (https://github.com/philsquared/Catch/pull/232 - thanks Lukasz Forynski)
- Writes to reporter, so gets all the usual context, but then exits directly (since the stack cannot be resumed) so no summary
- On Windows does nothing, as yet.
This commit is contained in:
Phil Nash 2014-08-22 08:07:39 +01:00
parent aa31d1c275
commit c1a8e1c5dd
10 changed files with 128 additions and 8 deletions

View file

@ -20,6 +20,7 @@
#include "catch_test_case_tracker.hpp"
#include "catch_timer.h"
#include "catch_result_builder.h"
#include "catch_fatal_condition.hpp"
#include <set>
#include <string>
@ -215,6 +216,13 @@ namespace Catch {
return m_totals.assertions.failed == static_cast<std::size_t>( m_config->abortAfter() );
}
virtual ResultBuilder makeUnexpectedResultBuilder() const {
return ResultBuilder( m_lastAssertionInfo.macroName.c_str(),
m_lastAssertionInfo.lineInfo,
m_lastAssertionInfo.capturedExpression.c_str(),
m_lastAssertionInfo.resultDisposition );
}
private:
void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) {
@ -232,10 +240,10 @@ namespace Catch {
if( m_reporter->getPreferences().shouldRedirectStdOut ) {
StreamRedirect coutRedir( std::cout, redirectedCout );
StreamRedirect cerrRedir( std::cerr, redirectedCerr );
m_activeTestCase->invoke();
invokeActiveTestCase();
}
else {
m_activeTestCase->invoke();
invokeActiveTestCase();
}
duration = timer.getElapsedSeconds();
}
@ -243,11 +251,7 @@ namespace Catch {
// This just means the test was aborted due to failure
}
catch(...) {
ResultBuilder exResult( m_lastAssertionInfo.macroName.c_str(),
m_lastAssertionInfo.lineInfo,
m_lastAssertionInfo.capturedExpression.c_str(),
m_lastAssertionInfo.resultDisposition );
exResult.useActiveException();
makeUnexpectedResultBuilder().useActiveException();
}
// If sections ended prematurely due to an exception we stored their
// infos here so we can tear them down outside the unwind process.
@ -272,6 +276,11 @@ namespace Catch {
m_reporter->sectionEnded( testCaseSectionStats );
}
void invokeActiveTestCase() {
FatalConditionHandler fatalConditionHandler; // Handle signals
m_activeTestCase->invoke();
}
private:
struct UnfinishedSections {
UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds )