| /* |
| * Created by Phil on 21/08/2014 |
| * Copyright 2014 Two Blue Cubes Ltd. All rights reserved. |
| * |
| * Distributed under the Boost Software License, Version 1.0. (See accompanying |
| * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| * |
| */ |
| #ifndef TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED |
| #define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED |
| |
| |
| namespace Catch { |
| |
| // Report the error condition then exit the process |
| inline void fatal( std::string const& message, int exitCode ) { |
| IContext& context = Catch::getCurrentContext(); |
| IResultCapture* resultCapture = context.getResultCapture(); |
| ResultBuilder resultBuilder = resultCapture->makeUnexpectedResultBuilder(); |
| resultBuilder.setResultType( ResultWas::FatalErrorCondition ); |
| resultBuilder << message; |
| resultBuilder.captureExpression(); |
| |
| if( Catch::alwaysTrue() ) // avoids "no return" warnings |
| exit( exitCode ); |
| } |
| |
| } // namespace Catch |
| |
| #if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// |
| |
| namespace Catch { |
| |
| struct FatalConditionHandler {}; |
| |
| } // namespace Catch |
| |
| #else // Not Windows - assumed to be POSIX compatible ////////////////////////// |
| |
| #include <signal.h> |
| |
| namespace Catch { |
| |
| struct SignalDefs { int id; const char* name; }; |
| extern SignalDefs signalDefs[]; |
| SignalDefs signalDefs[] = { |
| { SIGINT, "SIGINT - Terminal interrupt signal" }, |
| { SIGILL, "SIGILL - Illegal instruction signal" }, |
| { SIGFPE, "SIGFPE - Floating point error signal" }, |
| { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, |
| { SIGTERM, "SIGTERM - Termination request signal" }, |
| { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } |
| }; |
| |
| struct FatalConditionHandler { |
| |
| static void handleSignal( int sig ) { |
| for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) |
| if( sig == signalDefs[i].id ) |
| fatal( signalDefs[i].name, -sig ); |
| fatal( "<unknown signal>", -sig ); |
| } |
| |
| FatalConditionHandler() { |
| for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) |
| signal( signalDefs[i].id, handleSignal ); |
| } |
| ~FatalConditionHandler() { |
| for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) |
| signal( signalDefs[i].id, SIG_DFL ); |
| } |
| }; |
| |
| } // namespace Catch |
| |
| #endif // not Windows |
| |
| #endif // TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED |