17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2005, Google Inc. 27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All rights reserved. 37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without 57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are 67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met: 77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Redistributions of source code must retain the above copyright 97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer. 107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Redistributions in binary form must reproduce the above 117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer 127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the 137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution. 147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Neither the name of Google Inc. nor the names of its 157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from 167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission. 177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Author: wan@google.com (Zhanyong Wan) 317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The Google C++ Testing Framework (Google Test) 337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This header file defines the public API for death tests. It is 357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// #included by gtest.h so a user doesn't need to include this 367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// directly. 377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ 397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ 407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 41b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-death-test-internal.h" 427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing { 447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This flag controls the style of death tests. Valid values are "threadsafe", 467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// meaning that the death test child process will re-execute the test binary 477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// from the start, running only a single death test, or "fast", 487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// meaning that the child process will execute the test logic immediately 497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// after forking. 507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanGTEST_DECLARE_string_(death_test_style); 517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 52e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_DEATH_TEST 537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The following macros are useful for writing death tests. 557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is 577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// executed: 587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1. It generates a warning if there is more than one active 607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// thread. This is because it's safe to fork() or clone() only 617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// when there is a single thread. 627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 2. The parent process clone()s a sub-process and runs the death 647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// test in it; the sub-process exits with code 0 at the end of the 657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// death test, if it hasn't exited already. 667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 3. The parent process waits for the sub-process to terminate. 687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 4. The parent process checks the exit code and error message of 707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the sub-process. 717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Examples: 737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); 757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// for (int i = 0; i < 5; i++) { 767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_DEATH(server.ProcessRequest(i), 777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "Invalid request .* in ProcessRequest()") 787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// << "Failed to die on request " << i); 797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// } 807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); 827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// bool KilledBySIGHUP(int exit_code) { 847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; 857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// } 867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); 887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 89e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// On the regular expressions used in death tests: 90e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 91e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// On POSIX-compliant systems (*nix), we use the <regex.h> library, 92e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// which uses the POSIX extended regex syntax. 93e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 94e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// On other platforms (e.g. Windows), we only support a simple regex 95e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// syntax implemented as part of Google Test. This limited 96e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// implementation should be enough most of the time when writing 97e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// death tests; though it lacks many features you can find in PCRE 98e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// or POSIX extended regex syntax. For example, we don't support 99e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and 100e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// repetition count ("x{5,7}"), among others. 101e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 102e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Below is the syntax that we do support. We chose it to be a 103e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// subset of both PCRE and POSIX extended regex, so it's easy to 104e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// learn wherever you come from. In the following: 'A' denotes a 105e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// literal character, period (.), or a single \\ escape sequence; 106e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 'x' and 'y' denote regular expressions; 'm' and 'n' are for 107e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// natural numbers. 108e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 109e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// c matches any literal character c 110e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\d matches any decimal digit 111e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\D matches any character that's not a decimal digit 112e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\f matches \f 113e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\n matches \n 114e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\r matches \r 115e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\s matches any ASCII whitespace, including \n 116e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\S matches any character that's not a whitespace 117e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\t matches \t 118e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\v matches \v 119e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\w matches any letter, _, or decimal digit 120e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\W matches any character that \\w doesn't match 121e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// \\c matches any literal character c, which must be a punctuation 122e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// . matches any single character except \n 123e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// A? matches 0 or 1 occurrences of A 124e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// A* matches 0 or many occurrences of A 125e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// A+ matches 1 or many occurrences of A 126e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// ^ matches the beginning of a string (not that of each line) 127e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// $ matches the end of a string (not that of each line) 128e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// xy matches x followed by y 129e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 130e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// If you accidentally use PCRE or POSIX extended regex features 131e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// not implemented by us, you will get a run-time failure. In that 132e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// case, please try to rewrite your regular expression within the 133e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// above syntax. 134e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 135e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This implementation is *not* meant to be as highly tuned or robust 136e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// as a compiled regex library, but should perform well enough for a 137e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// death test, which already incurs significant overhead by launching 138e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// a child process. 139e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// 1407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Known caveats: 1417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A "threadsafe" style death test obtains the path to the test 1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// program from argv[0] and re-executes it in the sub-process. For 1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// simplicity, the current implementation doesn't search the PATH 1457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// when launching the sub-process. This means that the user must 1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// invoke the test program via a path that contains at least one 1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// path separator (e.g. path/to/foo_test and 1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// /absolute/path/to/bar_test are fine, but foo_test is not). This 1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is rarely a problem as people usually don't put the test binary 1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// directory in PATH. 1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TODO(wan@google.com): make thread-safe death tests search the PATH. 1537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Asserts that a given statement causes the program to exit, with an 1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// integer exit status that satisfies predicate, and emitting error output 1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// that matches regex. 157b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_EXIT(statement, predicate, regex) \ 158b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) 1597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Like ASSERT_EXIT, but continues on to successive tests in the 1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// test case, if any: 162b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define EXPECT_EXIT(statement, predicate, regex) \ 163b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) 1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Asserts that a given statement causes the program to exit, either by 1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// explicitly exiting with a nonzero exit code or being killed by a 1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// signal, and emitting error output that matches regex. 168b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_DEATH(statement, regex) \ 169b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) 1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Like ASSERT_DEATH, but continues on to successive tests in the 1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// test case, if any: 173b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define EXPECT_DEATH(statement, regex) \ 174b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) 1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: 1777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Tests that an exit code describes a normal exit with a given exit code. 17957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ ExitedWithCode { 1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman explicit ExitedWithCode(int exit_code); 1827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman bool operator()(int exit_status) const; 1837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private: 184190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // No implementation - assignment is unsupported. 185190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer void operator=(const ExitedWithCode& other); 186190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const int exit_code_; 1887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 1897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 190b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# if !GTEST_OS_WINDOWS 1917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Tests that an exit code describes an exit due to termination by a 1927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// given signal. 19357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ KilledBySignal { 1947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 1957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman explicit KilledBySignal(int signum); 1967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman bool operator()(int exit_status) const; 1977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private: 1987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const int signum_; 1997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 200b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# endif // !GTEST_OS_WINDOWS 2017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. 2037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The death testing framework causes this to have interesting semantics, 2047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// since the sideeffects of the call are only visible in opt mode, and not 2057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in debug mode. 2067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 2077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// In practice, this can be used to test functions that utilize the 2087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LOG(DFATAL) macro using the following style: 2097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 2107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// int DieInDebugOr12(int* sideeffect) { 2117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// if (sideeffect) { 2127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// *sideeffect = 12; 2137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// } 2147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LOG(DFATAL) << "death"; 2157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// return 12; 2167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// } 2177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 2187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) { 2197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// int sideeffect = 0; 2207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// // Only asserts in dbg. 2217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); 2227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 2237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// #ifdef NDEBUG 2247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// // opt-mode has sideeffect visible. 2257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_EQ(12, sideeffect); 2267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// #else 2277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// // dbg-mode no visible sideeffect. 2287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_EQ(0, sideeffect); 2297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// #endif 2307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// } 2317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 2327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This will assert that DieInDebugReturn12InOpt() crashes in debug 2337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// mode, usually due to a DCHECK or LOG(DFATAL), but returns the 2347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// appropriate fallback value (12 in this case) in opt mode. If you 2357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// need to test that a function has appropriate side-effects in opt 2367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// mode, include assertions against the side-effects. A general 2377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// pattern for this is: 2387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 2397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_DEBUG_DEATH({ 2407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// // Side-effects here will have an effect after this statement in 2417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// // opt mode, but none in debug mode. 2427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); 2437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }, "death"); 2447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 245b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# ifdef NDEBUG 2467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 247b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define EXPECT_DEBUG_DEATH(statement, regex) \ 248190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer do { statement; } while (::testing::internal::AlwaysFalse()) 2497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 250b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_DEBUG_DEATH(statement, regex) \ 251190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer do { statement; } while (::testing::internal::AlwaysFalse()) 2527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 253b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# else 2547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 255b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define EXPECT_DEBUG_DEATH(statement, regex) \ 2567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman EXPECT_DEATH(statement, regex) 2577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 258b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_DEBUG_DEATH(statement, regex) \ 2597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ASSERT_DEATH(statement, regex) 2607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 261b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# endif // NDEBUG for EXPECT_DEBUG_DEATH 2627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_HAS_DEATH_TEST 263190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 264190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and 265190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if 266190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// death tests are supported; otherwise they just issue a warning. This is 267190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// useful when you are combining death test assertions with normal test 268190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// assertions in one test. 269190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#if GTEST_HAS_DEATH_TEST 270b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ 271190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer EXPECT_DEATH(statement, regex) 272b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ 273190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer ASSERT_DEATH(statement, regex) 274190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#else 275b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ 276190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, ) 277b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ 278190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return) 279190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 280190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 2817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} // namespace testing 2827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ 284