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