141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Copyright 2010, Google Inc.
241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// All rights reserved.
341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Redistribution and use in source and binary forms, with or without
541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// modification, are permitted provided that the following conditions are
641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// met:
741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Redistributions of source code must retain the above copyright
941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// notice, this list of conditions and the following disclaimer.
1041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Redistributions in binary form must reproduce the above
1141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// copyright notice, this list of conditions and the following disclaimer
1241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// in the documentation and/or other materials provided with the
1341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// distribution.
1441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Neither the name of Google Inc. nor the names of its
1541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// contributors may be used to endorse or promote products derived from
1641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// this software without specific prior written permission.
1741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
1841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Author: vladl@google.com (Vlad Losev)
3141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Tests for Google Test itself. Tests in this file throw C++ or SEH
3341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// exceptions, and the output is verified by gtest_catch_exceptions_test.py.
3441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/gtest.h"
3641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <stdio.h>  // NOLINT
3841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <stdlib.h>  // For exit().
3941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_SEH
4141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <windows.h>
4241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif
4341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_EXCEPTIONS
4541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <exception>  // For set_terminate().
4641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <stdexcept>
4741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif
4841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing testing::Test;
5041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_SEH
5241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass SehExceptionInConstructorTest : public Test {
5441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
5541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); }
5641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
5741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {}
5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass SehExceptionInDestructorTest : public Test {
6141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
6241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); }
6341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
6441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass SehExceptionInSetUpTestCaseTest : public Test {
6841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
6941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); }
7041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
7141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {}
7341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass SehExceptionInTearDownTestCaseTest : public Test {
7541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
7641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); }
7741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
7841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
8041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
8141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass SehExceptionInSetUpTest : public Test {
8241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
8341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void SetUp() { RaiseException(42, 0, 0, NULL); }
8441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
8541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
8641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {}
8741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
8841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass SehExceptionInTearDownTest : public Test {
8941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
9041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() { RaiseException(42, 0, 0, NULL); }
9141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
9241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
9441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(SehExceptionTest, ThrowsSehException) {
9641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  RaiseException(42, 0, 0, NULL);
9741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
9841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_SEH
10041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_EXCEPTIONS
10241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass CxxExceptionInConstructorTest : public Test {
10441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
10541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  CxxExceptionInConstructorTest() {
10641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // Without this macro VC++ complains about unreachable code at the end of
10741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    // the constructor.
10841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
10941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        throw std::runtime_error("Standard C++ exception"));
11041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
11141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() {
11341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
11441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInConstructorTest::TearDownTestCase() "
11541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
11641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
11741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
11941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ~CxxExceptionInConstructorTest() {
12041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ADD_FAILURE() << "CxxExceptionInConstructorTest destructor "
12141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                  << "called unexpectedly.";
12241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
12341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void SetUp() {
12541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() "
12641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                  << "called unexpectedly.";
12741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
12841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() {
13041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() "
13141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                  << "called unexpectedly.";
13241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
13341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
13441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
13541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) {
13641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ADD_FAILURE() << "CxxExceptionInConstructorTest test body "
13741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                << "called unexpectedly.";
13841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
13941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass CxxExceptionInDestructorTest : public Test {
14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
14241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() {
14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInDestructorTest::TearDownTestCase() "
14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
14641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
14941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ~CxxExceptionInDestructorTest() {
15041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
15141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        throw std::runtime_error("Standard C++ exception"));
15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
15441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass CxxExceptionInSetUpTestCaseTest : public Test {
15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  CxxExceptionInSetUpTestCaseTest() {
16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
16141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInSetUpTestCaseTest constructor "
16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void SetUpTestCase() {
16641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    throw std::runtime_error("Standard C++ exception");
16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() {
17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() "
17241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
17641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ~CxxExceptionInSetUpTestCaseTest() {
17741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
17841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInSetUpTestCaseTest destructor "
17941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
18041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
18141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
18241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void SetUp() {
18341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
18441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInSetUpTestCaseTest::SetUp() "
18541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
18741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
18841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() {
18941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInSetUpTestCaseTest::TearDown() "
19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {
19641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  printf("%s",
19741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot         "CxxExceptionInSetUpTestCaseTest test body "
19841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot         "called as expected.\n");
19941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
20041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass CxxExceptionInTearDownTestCaseTest : public Test {
20241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
20341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() {
20441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    throw std::runtime_error("Standard C++ exception");
20541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
20641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
20741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
20941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass CxxExceptionInSetUpTest : public Test {
21141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
21241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() {
21341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
21441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInSetUpTest::TearDownTestCase() "
21541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
21641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
21741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
21941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ~CxxExceptionInSetUpTest() {
22041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
22141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInSetUpTest destructor "
22241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
22341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
22441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
22541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); }
22641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
22741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() {
22841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
22941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInSetUpTest::TearDown() "
23041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
23141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
23241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
23341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
23441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) {
23541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ADD_FAILURE() << "CxxExceptionInSetUpTest test body "
23641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                << "called unexpectedly.";
23741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
23841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
23941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass CxxExceptionInTearDownTest : public Test {
24041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
24141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() {
24241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
24341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInTearDownTest::TearDownTestCase() "
24441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
24541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
24641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
24741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
24841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ~CxxExceptionInTearDownTest() {
24941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInTearDownTest destructor "
25141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
25241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
25341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
25441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() {
25541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    throw std::runtime_error("Standard C++ exception");
25641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
25741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
25841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
25941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
26041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
26141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass CxxExceptionInTestBodyTest : public Test {
26241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
26341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() {
26441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
26541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInTestBodyTest::TearDownTestCase() "
26641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
26741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
26841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
26941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
27041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ~CxxExceptionInTestBodyTest() {
27141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
27241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInTestBodyTest destructor "
27341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
27441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
27541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
27641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() {
27741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("%s",
27841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "CxxExceptionInTestBodyTest::TearDown() "
27941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot           "called as expected.\n");
28041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
28141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
28241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
28341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) {
28441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  throw std::runtime_error("Standard C++ exception");
28541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
28641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
28741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(CxxExceptionTest, ThrowsNonStdCxxException) {
28841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  throw "C-string";
28941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
29041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
29141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This terminate handler aborts the program using exit() rather than abort().
29241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
29341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// ones.
29441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid TerminateHandler() {
29541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
29641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  fflush(NULL);
29741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  exit(3);
29841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
29941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
30041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_EXCEPTIONS
30141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
30241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotint main(int argc, char** argv) {
30341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_EXCEPTIONS
30441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  std::set_terminate(&TerminateHandler);
30541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif
30641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  testing::InitGoogleTest(&argc, argv);
30741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return RUN_ALL_TESTS();
30841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
309