1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright 2010, Google Inc.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// All rights reserved.
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Redistribution and use in source and binary forms, with or without
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// modification, are permitted provided that the following conditions are
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// met:
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//     * Redistributions of source code must retain the above copyright
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// notice, this list of conditions and the following disclaimer.
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//     * Redistributions in binary form must reproduce the above
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// copyright notice, this list of conditions and the following disclaimer
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// in the documentation and/or other materials provided with the
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// distribution.
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//     * Neither the name of Google Inc. nor the names of its
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// contributors may be used to endorse or promote products derived from
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// this software without specific prior written permission.
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Author: vladl@google.com (Vlad Losev)
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Tests that verify interaction of exceptions and death tests.
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/gtest-death-test.h"
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/gtest.h"
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if GTEST_HAS_DEATH_TEST
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# if GTEST_HAS_SEH
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  include <windows.h>          // For RaiseException().
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include "gtest/gtest-spi.h"
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# if GTEST_HAS_EXCEPTIONS
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  include <exception>  // For std::exception.
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Tests that death tests report thrown exceptions as failures and that the
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// exceptions do not escape death test macros.
51dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(CxxExceptionDeathTest, ExceptionIsFailure) {
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  try {
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw 1, ""), "threw an exception");
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } catch (...) {  // NOLINT
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    FAIL() << "An exception escaped a death test macro invocation "
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen           << "with catch_exceptions "
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen           << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass TestException : public std::exception {
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const char* what() const throw() { return "exceptional message"; }
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
66dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(CxxExceptionDeathTest, PrintsMessageForStdExceptions) {
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Verifies that the exception message is quoted in the failure text.
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                          "exceptional message");
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Verifies that the location is mentioned in the failure text.
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                          "gtest-death-test_ex_test.cc");
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif  // GTEST_HAS_EXCEPTIONS
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# if GTEST_HAS_SEH
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Tests that enabling interception of SEH exceptions with the
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// catch_exceptions flag does not interfere with SEH exceptions being
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// treated as death by death tests.
80dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(SehExceptionDeasTest, CatchExceptionsDoesNotInterfere) {
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_DEATH(RaiseException(42, 0x0, 0, NULL), "")
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      << "with catch_exceptions "
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // GTEST_HAS_DEATH_TEST
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenint main(int argc, char** argv) {
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  testing::InitGoogleTest(&argc, argv);
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  testing::GTEST_FLAG(catch_exceptions) = GTEST_ENABLE_CATCH_EXCEPTIONS_ != 0;
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return RUN_ALL_TESTS();
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
94