1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2010, Google Inc. 2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// All rights reserved. 3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Redistribution and use in source and binary forms, with or without 5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// modification, are permitted provided that the following conditions are 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// met: 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * Redistributions of source code must retain the above copyright 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// notice, this list of conditions and the following disclaimer. 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * Redistributions in binary form must reproduce the above 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// copyright notice, this list of conditions and the following disclaimer 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// in the documentation and/or other materials provided with the 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// distribution. 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * Neither the name of Google Inc. nor the names of its 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// contributors may be used to endorse or promote products derived from 16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// this software without specific prior written permission. 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Author: vladl@google.com (Vlad Losev) 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests for Google Test itself. Tests in this file throw C++ or SEH 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// exceptions, and the output is verified by gtest_catch_exceptions_test.py. 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gtest/gtest.h" 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <stdio.h> // NOLINT 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <stdlib.h> // For exit(). 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_SEH 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch# include <windows.h> 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_EXCEPTIONS 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch# include <exception> // For set_terminate(). 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch# include <stdexcept> 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif 48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::Test; 50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_SEH 52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInConstructorTest : public Test { 54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); } 56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {} 59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInDestructorTest : public Test { 61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); } 63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {} 66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInSetUpTestCaseTest : public Test { 68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); } 70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {} 73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInTearDownTestCaseTest : public Test { 75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); } 77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {} 80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInSetUpTest : public Test { 82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void SetUp() { RaiseException(42, 0, 0, NULL); } 84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 85f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {} 87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInTearDownTest : public Test { 89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void TearDown() { RaiseException(42, 0, 0, NULL); } 91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 92f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 93f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {} 94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(SehExceptionTest, ThrowsSehException) { 96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RaiseException(42, 0, 0, NULL); 97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif // GTEST_HAS_SEH 100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_EXCEPTIONS 102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInConstructorTest : public Test { 104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CxxExceptionInConstructorTest() { 106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Without this macro VC++ complains about unreachable code at the end of 107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // the constructor. 108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_( 109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw std::runtime_error("Standard C++ exception")); 110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 111f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void TearDownTestCase() { 113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInConstructorTest::TearDownTestCase() " 115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~CxxExceptionInConstructorTest() { 120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ADD_FAILURE() << "CxxExceptionInConstructorTest destructor " 121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch << "called unexpectedly."; 122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void SetUp() { 125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() " 126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch << "called unexpectedly."; 127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void TearDown() { 130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() " 131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch << "called unexpectedly."; 132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) { 136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ADD_FAILURE() << "CxxExceptionInConstructorTest test body " 137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch << "called unexpectedly."; 138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Exceptions in destructors are not supported in C++11. 141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if !defined(__GXX_EXPERIMENTAL_CXX0X__) && __cplusplus < 201103L 142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInDestructorTest : public Test { 143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void TearDownTestCase() { 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInDestructorTest::TearDownTestCase() " 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~CxxExceptionInDestructorTest() { 152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_( 153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw std::runtime_error("Standard C++ exception")); 154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {} 158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif // C++11 mode 159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInSetUpTestCaseTest : public Test { 161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CxxExceptionInSetUpTestCaseTest() { 163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTestCaseTest constructor " 165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void SetUpTestCase() { 169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw std::runtime_error("Standard C++ exception"); 170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void TearDownTestCase() { 173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() " 175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 177f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~CxxExceptionInSetUpTestCaseTest() { 180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTestCaseTest destructor " 182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void SetUp() { 186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTestCaseTest::SetUp() " 188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void TearDown() { 192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTestCaseTest::TearDown() " 194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) { 199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTestCaseTest test body " 201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInTearDownTestCaseTest : public Test { 205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void TearDownTestCase() { 207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw std::runtime_error("Standard C++ exception"); 208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {} 212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInSetUpTest : public Test { 214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void TearDownTestCase() { 216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTest::TearDownTestCase() " 218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~CxxExceptionInSetUpTest() { 223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTest destructor " 225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); } 229f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 230f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void TearDown() { 231f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 232f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInSetUpTest::TearDown() " 233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) { 238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ADD_FAILURE() << "CxxExceptionInSetUpTest test body " 239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch << "called unexpectedly."; 240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInTearDownTest : public Test { 243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void TearDownTestCase() { 245f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 246f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInTearDownTest::TearDownTestCase() " 247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 248f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 249f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 250f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~CxxExceptionInTearDownTest() { 252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInTearDownTest destructor " 254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void TearDown() { 258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw std::runtime_error("Standard C++ exception"); 259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {} 263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInTestBodyTest : public Test { 265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void TearDownTestCase() { 267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInTestBodyTest::TearDownTestCase() " 269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 273f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~CxxExceptionInTestBodyTest() { 274f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 275f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInTestBodyTest destructor " 276f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void TearDown() { 280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch printf("%s", 281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "CxxExceptionInTestBodyTest::TearDown() " 282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "called as expected.\n"); 283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) { 287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw std::runtime_error("Standard C++ exception"); 288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(CxxExceptionTest, ThrowsNonStdCxxException) { 291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw "C-string"; 292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// This terminate handler aborts the program using exit() rather than abort(). 295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// This avoids showing pop-ups on Windows systems and core dumps on Unix-like 296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// ones. 297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid TerminateHandler() { 298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program."); 299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch fflush(NULL); 300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch exit(3); 301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif // GTEST_HAS_EXCEPTIONS 304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochint main(int argc, char** argv) { 306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_EXCEPTIONS 307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::set_terminate(&TerminateHandler); 308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif 309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch testing::InitGoogleTest(&argc, argv); 310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return RUN_ALL_TESTS(); 311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 312