1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright 2010, Google Inc. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// All rights reserved. 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Redistribution and use in source and binary forms, with or without 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// modification, are permitted provided that the following conditions are 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// met: 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// * Redistributions of source code must retain the above copyright 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// notice, this list of conditions and the following disclaimer. 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// * Redistributions in binary form must reproduce the above 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// copyright notice, this list of conditions and the following disclaimer 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// in the documentation and/or other materials provided with the 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// distribution. 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// * Neither the name of Google Inc. nor the names of its 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// contributors may be used to endorse or promote products derived from 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// this software without specific prior written permission. 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Author: vladl@google.com (Vlad Losev) 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Tests for Google Test itself. Tests in this file throw C++ or SEH 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// exceptions, and the output is verified by gtest_catch_exceptions_test.py. 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/gtest.h" 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <stdio.h> // NOLINT 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <stdlib.h> // For exit(). 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_SEH 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <windows.h> 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_EXCEPTIONS 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <exception> // For set_terminate(). 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <stdexcept> 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing testing::Test; 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_SEH 52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInConstructorTest : public Test { 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); } 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 58731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {} 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInDestructorTest : public Test { 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); } 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 65731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {} 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInSetUpTestCaseTest : public Test { 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); } 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 72731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {} 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInTearDownTestCaseTest : public Test { 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); } 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 79731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {} 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInSetUpTest : public Test { 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void SetUp() { RaiseException(42, 0, 0, NULL); } 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 86731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {} 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInTearDownTest : public Test { 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void TearDown() { RaiseException(42, 0, 0, NULL); } 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 93731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {} 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 95731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(SehExceptionTest, ThrowsSehException) { 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RaiseException(42, 0, 0, NULL); 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif // GTEST_HAS_SEH 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_EXCEPTIONS 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInConstructorTest : public Test { 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CxxExceptionInConstructorTest() { 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Without this macro VC++ complains about unreachable code at the end of 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // the constructor. 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_( 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throw std::runtime_error("Standard C++ exception")); 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void TearDownTestCase() { 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInConstructorTest::TearDownTestCase() " 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~CxxExceptionInConstructorTest() { 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ADD_FAILURE() << "CxxExceptionInConstructorTest destructor " 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick << "called unexpectedly."; 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void SetUp() { 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() " 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick << "called unexpectedly."; 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void TearDown() { 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() " 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick << "called unexpectedly."; 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 135731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) { 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ADD_FAILURE() << "CxxExceptionInConstructorTest test body " 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick << "called unexpectedly."; 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInDestructorTest : public Test { 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void TearDownTestCase() { 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInDestructorTest::TearDownTestCase() " 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~CxxExceptionInDestructorTest() { 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_( 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throw std::runtime_error("Standard C++ exception")); 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 155731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {} 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInSetUpTestCaseTest : public Test { 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CxxExceptionInSetUpTestCaseTest() { 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTestCaseTest constructor " 162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void SetUpTestCase() { 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throw std::runtime_error("Standard C++ exception"); 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void TearDownTestCase() { 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() " 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~CxxExceptionInSetUpTestCaseTest() { 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTestCaseTest destructor " 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void SetUp() { 183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTestCaseTest::SetUp() " 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void TearDown() { 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTestCaseTest::TearDown() " 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 195731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) { 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTestCaseTest test body " 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInTearDownTestCaseTest : public Test { 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void TearDownTestCase() { 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throw std::runtime_error("Standard C++ exception"); 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 208731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {} 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInSetUpTest : public Test { 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void TearDownTestCase() { 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTest::TearDownTestCase() " 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~CxxExceptionInSetUpTest() { 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTest destructor " 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); } 226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void TearDown() { 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInSetUpTest::TearDown() " 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 234731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) { 235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ADD_FAILURE() << "CxxExceptionInSetUpTest test body " 236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick << "called unexpectedly."; 237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInTearDownTest : public Test { 240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void TearDownTestCase() { 242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInTearDownTest::TearDownTestCase() " 244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~CxxExceptionInTearDownTest() { 249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInTearDownTest destructor " 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void TearDown() { 255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throw std::runtime_error("Standard C++ exception"); 256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 259731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {} 260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInTestBodyTest : public Test { 262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void TearDownTestCase() { 264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInTestBodyTest::TearDownTestCase() " 266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~CxxExceptionInTestBodyTest() { 271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInTestBodyTest destructor " 273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void TearDown() { 277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick printf("%s", 278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "CxxExceptionInTestBodyTest::TearDown() " 279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "called as expected.\n"); 280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 283731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) { 284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throw std::runtime_error("Standard C++ exception"); 285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 287731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(CxxExceptionTest, ThrowsNonStdCxxException) { 288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throw "C-string"; 289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This terminate handler aborts the program using exit() rather than abort(). 292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This avoids showing pop-ups on Windows systems and core dumps on Unix-like 293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// ones. 294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TerminateHandler() { 295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program."); 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fflush(NULL); 297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick exit(3); 298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif // GTEST_HAS_EXCEPTIONS 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickint main(int argc, char** argv) { 303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_EXCEPTIONS 304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::set_terminate(&TerminateHandler); 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick testing::InitGoogleTest(&argc, argv); 307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return RUN_ALL_TESTS(); 308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 309