xref: /freebsd-src/contrib/kyua/utils/sanity_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1*b0d29bc4SBrooks Davis // Copyright 2010 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis //   documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis //   may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis //   without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis 
29*b0d29bc4SBrooks Davis #include "utils/sanity.hpp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <signal.h>
33*b0d29bc4SBrooks Davis #include <unistd.h>
34*b0d29bc4SBrooks Davis }
35*b0d29bc4SBrooks Davis 
36*b0d29bc4SBrooks Davis #include <cstdlib>
37*b0d29bc4SBrooks Davis #include <iostream>
38*b0d29bc4SBrooks Davis 
39*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
40*b0d29bc4SBrooks Davis 
41*b0d29bc4SBrooks Davis #include "utils/format/macros.hpp"
42*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
43*b0d29bc4SBrooks Davis #include "utils/process/child.ipp"
44*b0d29bc4SBrooks Davis #include "utils/process/status.hpp"
45*b0d29bc4SBrooks Davis #include "utils/test_utils.ipp"
46*b0d29bc4SBrooks Davis 
47*b0d29bc4SBrooks Davis namespace fs = utils::fs;
48*b0d29bc4SBrooks Davis namespace process = utils::process;
49*b0d29bc4SBrooks Davis 
50*b0d29bc4SBrooks Davis 
51*b0d29bc4SBrooks Davis #define FILE_REGEXP __FILE__ ":[0-9]+: "
52*b0d29bc4SBrooks Davis 
53*b0d29bc4SBrooks Davis 
54*b0d29bc4SBrooks Davis static const fs::path Stdout_File("stdout.txt");
55*b0d29bc4SBrooks Davis static const fs::path Stderr_File("stderr.txt");
56*b0d29bc4SBrooks Davis 
57*b0d29bc4SBrooks Davis 
58*b0d29bc4SBrooks Davis #if NDEBUG
59*b0d29bc4SBrooks Davis static bool NDebug = true;
60*b0d29bc4SBrooks Davis #else
61*b0d29bc4SBrooks Davis static bool NDebug = false;
62*b0d29bc4SBrooks Davis #endif
63*b0d29bc4SBrooks Davis 
64*b0d29bc4SBrooks Davis 
65*b0d29bc4SBrooks Davis template< typename Function >
66*b0d29bc4SBrooks Davis static process::status
run_test(Function function)67*b0d29bc4SBrooks Davis run_test(Function function)
68*b0d29bc4SBrooks Davis {
69*b0d29bc4SBrooks Davis     utils::avoid_coredump_on_crash();
70*b0d29bc4SBrooks Davis 
71*b0d29bc4SBrooks Davis     const process::status status = process::child::fork_files(
72*b0d29bc4SBrooks Davis         function, Stdout_File, Stderr_File)->wait();
73*b0d29bc4SBrooks Davis     atf::utils::cat_file(Stdout_File.str(), "Helper stdout: ");
74*b0d29bc4SBrooks Davis     atf::utils::cat_file(Stderr_File.str(), "Helper stderr: ");
75*b0d29bc4SBrooks Davis     return status;
76*b0d29bc4SBrooks Davis }
77*b0d29bc4SBrooks Davis 
78*b0d29bc4SBrooks Davis 
79*b0d29bc4SBrooks Davis static void
verify_success(const process::status & status)80*b0d29bc4SBrooks Davis verify_success(const process::status& status)
81*b0d29bc4SBrooks Davis {
82*b0d29bc4SBrooks Davis     ATF_REQUIRE(status.exited());
83*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(EXIT_SUCCESS, status.exitstatus());
84*b0d29bc4SBrooks Davis     ATF_REQUIRE(atf::utils::grep_file("Before test", Stdout_File.str()));
85*b0d29bc4SBrooks Davis     ATF_REQUIRE(atf::utils::grep_file("After test", Stdout_File.str()));
86*b0d29bc4SBrooks Davis }
87*b0d29bc4SBrooks Davis 
88*b0d29bc4SBrooks Davis 
89*b0d29bc4SBrooks Davis static void
verify_failed(const process::status & status,const char * type,const char * exp_message,const bool check_ndebug)90*b0d29bc4SBrooks Davis verify_failed(const process::status& status, const char* type,
91*b0d29bc4SBrooks Davis               const char* exp_message, const bool check_ndebug)
92*b0d29bc4SBrooks Davis {
93*b0d29bc4SBrooks Davis     if (check_ndebug && NDebug) {
94*b0d29bc4SBrooks Davis         std::cout << "Built with NDEBUG; skipping verification\n";
95*b0d29bc4SBrooks Davis         verify_success(status);
96*b0d29bc4SBrooks Davis     } else {
97*b0d29bc4SBrooks Davis         ATF_REQUIRE(status.signaled());
98*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(SIGABRT, status.termsig());
99*b0d29bc4SBrooks Davis         ATF_REQUIRE(atf::utils::grep_file("Before test", Stdout_File.str()));
100*b0d29bc4SBrooks Davis         ATF_REQUIRE(!atf::utils::grep_file("After test", Stdout_File.str()));
101*b0d29bc4SBrooks Davis         if (exp_message != NULL)
102*b0d29bc4SBrooks Davis             ATF_REQUIRE(atf::utils::grep_file(F(FILE_REGEXP "%s: %s") %
103*b0d29bc4SBrooks Davis                                               type % exp_message,
104*b0d29bc4SBrooks Davis                                               Stderr_File.str()));
105*b0d29bc4SBrooks Davis         else
106*b0d29bc4SBrooks Davis             ATF_REQUIRE(atf::utils::grep_file(F(FILE_REGEXP "%s") % type,
107*b0d29bc4SBrooks Davis                                               Stderr_File.str()));
108*b0d29bc4SBrooks Davis     }
109*b0d29bc4SBrooks Davis }
110*b0d29bc4SBrooks Davis 
111*b0d29bc4SBrooks Davis 
112*b0d29bc4SBrooks Davis template< bool Expression, bool WithMessage >
113*b0d29bc4SBrooks Davis static void
do_inv_test(void)114*b0d29bc4SBrooks Davis do_inv_test(void)
115*b0d29bc4SBrooks Davis {
116*b0d29bc4SBrooks Davis     std::cout << "Before test\n";
117*b0d29bc4SBrooks Davis     if (WithMessage)
118*b0d29bc4SBrooks Davis         INV_MSG(Expression, "Custom message");
119*b0d29bc4SBrooks Davis     else
120*b0d29bc4SBrooks Davis         INV(Expression);
121*b0d29bc4SBrooks Davis     std::cout << "After test\n";
122*b0d29bc4SBrooks Davis     std::exit(EXIT_SUCCESS);
123*b0d29bc4SBrooks Davis }
124*b0d29bc4SBrooks Davis 
125*b0d29bc4SBrooks Davis 
126*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(inv__holds);
ATF_TEST_CASE_BODY(inv__holds)127*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(inv__holds)
128*b0d29bc4SBrooks Davis {
129*b0d29bc4SBrooks Davis     const process::status status = run_test(do_inv_test< true, false >);
130*b0d29bc4SBrooks Davis     verify_success(status);
131*b0d29bc4SBrooks Davis }
132*b0d29bc4SBrooks Davis 
133*b0d29bc4SBrooks Davis 
134*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(inv__triggers_default_message);
ATF_TEST_CASE_BODY(inv__triggers_default_message)135*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(inv__triggers_default_message)
136*b0d29bc4SBrooks Davis {
137*b0d29bc4SBrooks Davis     const process::status status = run_test(do_inv_test< false, false >);
138*b0d29bc4SBrooks Davis     verify_failed(status, "Invariant check failed", "Expression", true);
139*b0d29bc4SBrooks Davis }
140*b0d29bc4SBrooks Davis 
141*b0d29bc4SBrooks Davis 
142*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(inv__triggers_custom_message);
ATF_TEST_CASE_BODY(inv__triggers_custom_message)143*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(inv__triggers_custom_message)
144*b0d29bc4SBrooks Davis {
145*b0d29bc4SBrooks Davis     const process::status status = run_test(do_inv_test< false, true >);
146*b0d29bc4SBrooks Davis     verify_failed(status, "Invariant check failed", "Custom", true);
147*b0d29bc4SBrooks Davis }
148*b0d29bc4SBrooks Davis 
149*b0d29bc4SBrooks Davis 
150*b0d29bc4SBrooks Davis template< bool Expression, bool WithMessage >
151*b0d29bc4SBrooks Davis static void
do_pre_test(void)152*b0d29bc4SBrooks Davis do_pre_test(void)
153*b0d29bc4SBrooks Davis {
154*b0d29bc4SBrooks Davis     std::cout << "Before test\n";
155*b0d29bc4SBrooks Davis     if (WithMessage)
156*b0d29bc4SBrooks Davis         PRE_MSG(Expression, "Custom message");
157*b0d29bc4SBrooks Davis     else
158*b0d29bc4SBrooks Davis         PRE(Expression);
159*b0d29bc4SBrooks Davis     std::cout << "After test\n";
160*b0d29bc4SBrooks Davis     std::exit(EXIT_SUCCESS);
161*b0d29bc4SBrooks Davis }
162*b0d29bc4SBrooks Davis 
163*b0d29bc4SBrooks Davis 
164*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(pre__holds);
ATF_TEST_CASE_BODY(pre__holds)165*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(pre__holds)
166*b0d29bc4SBrooks Davis {
167*b0d29bc4SBrooks Davis     const process::status status = run_test(do_pre_test< true, false >);
168*b0d29bc4SBrooks Davis     verify_success(status);
169*b0d29bc4SBrooks Davis }
170*b0d29bc4SBrooks Davis 
171*b0d29bc4SBrooks Davis 
172*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(pre__triggers_default_message);
ATF_TEST_CASE_BODY(pre__triggers_default_message)173*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(pre__triggers_default_message)
174*b0d29bc4SBrooks Davis {
175*b0d29bc4SBrooks Davis     const process::status status = run_test(do_pre_test< false, false >);
176*b0d29bc4SBrooks Davis     verify_failed(status, "Precondition check failed", "Expression", true);
177*b0d29bc4SBrooks Davis }
178*b0d29bc4SBrooks Davis 
179*b0d29bc4SBrooks Davis 
180*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(pre__triggers_custom_message);
ATF_TEST_CASE_BODY(pre__triggers_custom_message)181*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(pre__triggers_custom_message)
182*b0d29bc4SBrooks Davis {
183*b0d29bc4SBrooks Davis     const process::status status = run_test(do_pre_test< false, true >);
184*b0d29bc4SBrooks Davis     verify_failed(status, "Precondition check failed", "Custom", true);
185*b0d29bc4SBrooks Davis }
186*b0d29bc4SBrooks Davis 
187*b0d29bc4SBrooks Davis 
188*b0d29bc4SBrooks Davis template< bool Expression, bool WithMessage >
189*b0d29bc4SBrooks Davis static void
do_post_test(void)190*b0d29bc4SBrooks Davis do_post_test(void)
191*b0d29bc4SBrooks Davis {
192*b0d29bc4SBrooks Davis     std::cout << "Before test\n";
193*b0d29bc4SBrooks Davis     if (WithMessage)
194*b0d29bc4SBrooks Davis         POST_MSG(Expression, "Custom message");
195*b0d29bc4SBrooks Davis     else
196*b0d29bc4SBrooks Davis         POST(Expression);
197*b0d29bc4SBrooks Davis     std::cout << "After test\n";
198*b0d29bc4SBrooks Davis     std::exit(EXIT_SUCCESS);
199*b0d29bc4SBrooks Davis }
200*b0d29bc4SBrooks Davis 
201*b0d29bc4SBrooks Davis 
202*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(post__holds);
ATF_TEST_CASE_BODY(post__holds)203*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(post__holds)
204*b0d29bc4SBrooks Davis {
205*b0d29bc4SBrooks Davis     const process::status status = run_test(do_post_test< true, false >);
206*b0d29bc4SBrooks Davis     verify_success(status);
207*b0d29bc4SBrooks Davis }
208*b0d29bc4SBrooks Davis 
209*b0d29bc4SBrooks Davis 
210*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(post__triggers_default_message);
ATF_TEST_CASE_BODY(post__triggers_default_message)211*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(post__triggers_default_message)
212*b0d29bc4SBrooks Davis {
213*b0d29bc4SBrooks Davis     const process::status status = run_test(do_post_test< false, false >);
214*b0d29bc4SBrooks Davis     verify_failed(status, "Postcondition check failed", "Expression", true);
215*b0d29bc4SBrooks Davis }
216*b0d29bc4SBrooks Davis 
217*b0d29bc4SBrooks Davis 
218*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(post__triggers_custom_message);
ATF_TEST_CASE_BODY(post__triggers_custom_message)219*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(post__triggers_custom_message)
220*b0d29bc4SBrooks Davis {
221*b0d29bc4SBrooks Davis     const process::status status = run_test(do_post_test< false, true >);
222*b0d29bc4SBrooks Davis     verify_failed(status, "Postcondition check failed", "Custom", true);
223*b0d29bc4SBrooks Davis }
224*b0d29bc4SBrooks Davis 
225*b0d29bc4SBrooks Davis 
226*b0d29bc4SBrooks Davis template< bool WithMessage >
227*b0d29bc4SBrooks Davis static void
do_unreachable_test(void)228*b0d29bc4SBrooks Davis do_unreachable_test(void)
229*b0d29bc4SBrooks Davis {
230*b0d29bc4SBrooks Davis     std::cout << "Before test\n";
231*b0d29bc4SBrooks Davis     if (WithMessage)
232*b0d29bc4SBrooks Davis         UNREACHABLE_MSG("Custom message");
233*b0d29bc4SBrooks Davis     else
234*b0d29bc4SBrooks Davis         UNREACHABLE;
235*b0d29bc4SBrooks Davis     std::cout << "After test\n";
236*b0d29bc4SBrooks Davis     std::exit(EXIT_SUCCESS);
237*b0d29bc4SBrooks Davis }
238*b0d29bc4SBrooks Davis 
239*b0d29bc4SBrooks Davis 
240*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(unreachable__default_message);
ATF_TEST_CASE_BODY(unreachable__default_message)241*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(unreachable__default_message)
242*b0d29bc4SBrooks Davis {
243*b0d29bc4SBrooks Davis     const process::status status = run_test(do_unreachable_test< false >);
244*b0d29bc4SBrooks Davis     verify_failed(status, "Unreachable point reached", NULL, false);
245*b0d29bc4SBrooks Davis }
246*b0d29bc4SBrooks Davis 
247*b0d29bc4SBrooks Davis 
248*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(unreachable__custom_message);
ATF_TEST_CASE_BODY(unreachable__custom_message)249*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(unreachable__custom_message)
250*b0d29bc4SBrooks Davis {
251*b0d29bc4SBrooks Davis     const process::status status = run_test(do_unreachable_test< true >);
252*b0d29bc4SBrooks Davis     verify_failed(status, "Unreachable point reached", "Custom", false);
253*b0d29bc4SBrooks Davis }
254*b0d29bc4SBrooks Davis 
255*b0d29bc4SBrooks Davis 
256*b0d29bc4SBrooks Davis template< int Signo >
257*b0d29bc4SBrooks Davis static void
do_crash_handler_test(void)258*b0d29bc4SBrooks Davis do_crash_handler_test(void)
259*b0d29bc4SBrooks Davis {
260*b0d29bc4SBrooks Davis     utils::install_crash_handlers("test-log.txt");
261*b0d29bc4SBrooks Davis     ::kill(::getpid(), Signo);
262*b0d29bc4SBrooks Davis     std::cout << "After signal\n";
263*b0d29bc4SBrooks Davis     std::exit(EXIT_FAILURE);
264*b0d29bc4SBrooks Davis }
265*b0d29bc4SBrooks Davis 
266*b0d29bc4SBrooks Davis 
267*b0d29bc4SBrooks Davis template< int Signo >
268*b0d29bc4SBrooks Davis static void
crash_handler_test(void)269*b0d29bc4SBrooks Davis crash_handler_test(void)
270*b0d29bc4SBrooks Davis {
271*b0d29bc4SBrooks Davis     utils::avoid_coredump_on_crash();
272*b0d29bc4SBrooks Davis 
273*b0d29bc4SBrooks Davis     const process::status status = run_test(do_crash_handler_test< Signo >);
274*b0d29bc4SBrooks Davis     ATF_REQUIRE(status.signaled());
275*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(Signo, status.termsig());
276*b0d29bc4SBrooks Davis     ATF_REQUIRE(atf::utils::grep_file(F("Fatal signal %s") % Signo,
277*b0d29bc4SBrooks Davis                                       Stderr_File.str()));
278*b0d29bc4SBrooks Davis     ATF_REQUIRE(atf::utils::grep_file("Log file is test-log.txt",
279*b0d29bc4SBrooks Davis                                       Stderr_File.str()));
280*b0d29bc4SBrooks Davis     ATF_REQUIRE(!atf::utils::grep_file("After signal", Stdout_File.str()));
281*b0d29bc4SBrooks Davis }
282*b0d29bc4SBrooks Davis 
283*b0d29bc4SBrooks Davis 
284*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(install_crash_handlers__sigabrt);
ATF_TEST_CASE_BODY(install_crash_handlers__sigabrt)285*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(install_crash_handlers__sigabrt)
286*b0d29bc4SBrooks Davis {
287*b0d29bc4SBrooks Davis     crash_handler_test< SIGABRT >();
288*b0d29bc4SBrooks Davis }
289*b0d29bc4SBrooks Davis 
290*b0d29bc4SBrooks Davis 
291*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(install_crash_handlers__sigbus);
ATF_TEST_CASE_BODY(install_crash_handlers__sigbus)292*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(install_crash_handlers__sigbus)
293*b0d29bc4SBrooks Davis {
294*b0d29bc4SBrooks Davis     crash_handler_test< SIGBUS >();
295*b0d29bc4SBrooks Davis }
296*b0d29bc4SBrooks Davis 
297*b0d29bc4SBrooks Davis 
298*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(install_crash_handlers__sigsegv);
ATF_TEST_CASE_BODY(install_crash_handlers__sigsegv)299*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(install_crash_handlers__sigsegv)
300*b0d29bc4SBrooks Davis {
301*b0d29bc4SBrooks Davis     crash_handler_test< SIGSEGV >();
302*b0d29bc4SBrooks Davis }
303*b0d29bc4SBrooks Davis 
304*b0d29bc4SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)305*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
306*b0d29bc4SBrooks Davis {
307*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, inv__holds);
308*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, inv__triggers_default_message);
309*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, inv__triggers_custom_message);
310*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, pre__holds);
311*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, pre__triggers_default_message);
312*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, pre__triggers_custom_message);
313*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, post__holds);
314*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, post__triggers_default_message);
315*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, post__triggers_custom_message);
316*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, unreachable__default_message);
317*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, unreachable__custom_message);
318*b0d29bc4SBrooks Davis 
319*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, install_crash_handlers__sigabrt);
320*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, install_crash_handlers__sigbus);
321*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, install_crash_handlers__sigsegv);
322*b0d29bc4SBrooks Davis }
323