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