1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2005, Google Inc.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved.
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: wan@google.com (Zhanyong Wan)
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The Google C++ Testing Framework (Google Test)
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This header file defines the public API for death tests.  It is
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// #included by gtest.h so a user doesn't need to include this
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// directly.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/internal/gtest-death-test-internal.h"
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This flag controls the style of death tests.  Valid values are "threadsafe",
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// meaning that the death test child process will re-execute the test binary
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// from the start, running only a single death test, or "fast",
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// meaning that the child process will execute the test logic immediately
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// after forking.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGTEST_DECLARE_string_(death_test_style);
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_DEATH_TEST
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following macros are useful for writing death tests.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// executed:
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   1. It generates a warning if there is more than one active
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   thread.  This is because it's safe to fork() or clone() only
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   when there is a single thread.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   2. The parent process clone()s a sub-process and runs the death
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   test in it; the sub-process exits with code 0 at the end of the
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   death test, if it hasn't exited already.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   3. The parent process waits for the sub-process to terminate.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   4. The parent process checks the exit code and error message of
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   the sub-process.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Examples:
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   for (int i = 0; i < 5; i++) {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     EXPECT_DEATH(server.ProcessRequest(i),
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//                  "Invalid request .* in ProcessRequest()")
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//         << "Failed to die on request " << i);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   }
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   bool KilledBySIGHUP(int exit_code) {
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   }
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// On the regular expressions used in death tests:
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   which uses the POSIX extended regex syntax.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   On other platforms (e.g. Windows), we only support a simple regex
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   syntax implemented as part of Google Test.  This limited
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   implementation should be enough most of the time when writing
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   death tests; though it lacks many features you can find in PCRE
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   or POSIX extended regex syntax.  For example, we don't support
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   repetition count ("x{5,7}"), among others.
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   Below is the syntax that we do support.  We chose it to be a
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   subset of both PCRE and POSIX extended regex, so it's easy to
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   learn wherever you come from.  In the following: 'A' denotes a
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   literal character, period (.), or a single \\ escape sequence;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   natural numbers.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     c     matches any literal character c
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\d   matches any decimal digit
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\D   matches any character that's not a decimal digit
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\f   matches \f
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\n   matches \n
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\r   matches \r
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\s   matches any ASCII whitespace, including \n
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\S   matches any character that's not a whitespace
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\t   matches \t
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\v   matches \v
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\w   matches any letter, _, or decimal digit
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\W   matches any character that \\w doesn't match
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     \\c   matches any literal character c, which must be a punctuation
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     .     matches any single character except \n
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     A?    matches 0 or 1 occurrences of A
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     A*    matches 0 or many occurrences of A
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     A+    matches 1 or many occurrences of A
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     ^     matches the beginning of a string (not that of each line)
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     $     matches the end of a string (not that of each line)
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     xy    matches x followed by y
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   If you accidentally use PCRE or POSIX extended regex features
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   not implemented by us, you will get a run-time failure.  In that
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   case, please try to rewrite your regular expression within the
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   above syntax.
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   This implementation is *not* meant to be as highly tuned or robust
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   as a compiled regex library, but should perform well enough for a
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   death test, which already incurs significant overhead by launching
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   a child process.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Known caveats:
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   A "threadsafe" style death test obtains the path to the test
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   program from argv[0] and re-executes it in the sub-process.  For
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   simplicity, the current implementation doesn't search the PATH
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   when launching the sub-process.  This means that the user must
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   invoke the test program via a path that contains at least one
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   path separator (e.g. path/to/foo_test and
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   is rarely a problem as people usually don't put the test binary
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   directory in PATH.
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(wan@google.com): make thread-safe death tests search the PATH.
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Asserts that a given statement causes the program to exit, with an
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// integer exit status that satisfies predicate, and emitting error output
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that matches regex.
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define ASSERT_EXIT(statement, predicate, regex) \
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Like ASSERT_EXIT, but continues on to successive tests in the
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// test case, if any:
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define EXPECT_EXIT(statement, predicate, regex) \
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Asserts that a given statement causes the program to exit, either by
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// explicitly exiting with a nonzero exit code or being killed by a
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// signal, and emitting error output that matches regex.
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define ASSERT_DEATH(statement, regex) \
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Like ASSERT_DEATH, but continues on to successive tests in the
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// test case, if any:
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define EXPECT_DEATH(statement, regex) \
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an exit code describes a normal exit with a given exit code.
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GTEST_API_ ExitedWithCode {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit ExitedWithCode(int exit_code);
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool operator()(int exit_status) const;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // No implementation - assignment is unsupported.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void operator=(const ExitedWithCode& other);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int exit_code_;
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# if !GTEST_OS_WINDOWS
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an exit code describes an exit due to termination by a
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// given signal.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GTEST_API_ KilledBySignal {
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit KilledBySignal(int signum);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool operator()(int exit_status) const;
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int signum_;
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif  // !GTEST_OS_WINDOWS
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The death testing framework causes this to have interesting semantics,
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// since the sideeffects of the call are only visible in opt mode, and not
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in debug mode.
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// In practice, this can be used to test functions that utilize the
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LOG(DFATAL) macro using the following style:
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// int DieInDebugOr12(int* sideeffect) {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   if (sideeffect) {
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     *sideeffect = 12;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   }
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   LOG(DFATAL) << "death";
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   return 12;
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// }
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   int sideeffect = 0;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   // Only asserts in dbg.
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// #ifdef NDEBUG
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   // opt-mode has sideeffect visible.
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   EXPECT_EQ(12, sideeffect);
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// #else
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   // dbg-mode no visible sideeffect.
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   EXPECT_EQ(0, sideeffect);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// #endif
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// }
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This will assert that DieInDebugReturn12InOpt() crashes in debug
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// appropriate fallback value (12 in this case) in opt mode. If you
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// need to test that a function has appropriate side-effects in opt
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// mode, include assertions against the side-effects.  A general
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// pattern for this is:
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// EXPECT_DEBUG_DEATH({
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   // Side-effects here will have an effect after this statement in
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   // opt mode, but none in debug mode.
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// }, "death");
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# ifdef NDEBUG
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  define EXPECT_DEBUG_DEATH(statement, regex) \
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  do { statement; } while (::testing::internal::AlwaysFalse())
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  define ASSERT_DEBUG_DEATH(statement, regex) \
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  do { statement; } while (::testing::internal::AlwaysFalse())
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# else
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  define EXPECT_DEBUG_DEATH(statement, regex) \
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_DEATH(statement, regex)
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  define ASSERT_DEBUG_DEATH(statement, regex) \
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_DEATH(statement, regex)
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif  // NDEBUG for EXPECT_DEBUG_DEATH
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_HAS_DEATH_TEST
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// death tests are supported; otherwise they just issue a warning.  This is
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// useful when you are combining death test assertions with normal test
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// assertions in one test.
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_DEATH_TEST
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_DEATH(statement, regex)
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_DEATH(statement, regex)
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
284