xref: /netbsd-src/external/bsd/atf/dist/atf-c++/macros_test.cpp (revision 32627f22bea0729289c25b95ba84f78ff0efb3ef)
1edebbb8eSjmmv //
2edebbb8eSjmmv // Automated Testing Framework (atf)
3edebbb8eSjmmv //
4a551a20fSjmmv // Copyright (c) 2008 The NetBSD Foundation, Inc.
5edebbb8eSjmmv // All rights reserved.
6edebbb8eSjmmv //
7edebbb8eSjmmv // Redistribution and use in source and binary forms, with or without
8edebbb8eSjmmv // modification, are permitted provided that the following conditions
9edebbb8eSjmmv // are met:
10edebbb8eSjmmv // 1. Redistributions of source code must retain the above copyright
11edebbb8eSjmmv //    notice, this list of conditions and the following disclaimer.
12edebbb8eSjmmv // 2. Redistributions in binary form must reproduce the above copyright
13edebbb8eSjmmv //    notice, this list of conditions and the following disclaimer in the
14edebbb8eSjmmv //    documentation and/or other materials provided with the distribution.
15edebbb8eSjmmv //
16edebbb8eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17edebbb8eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18edebbb8eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19edebbb8eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20edebbb8eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21edebbb8eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22edebbb8eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23edebbb8eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24edebbb8eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25edebbb8eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26edebbb8eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27edebbb8eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28edebbb8eSjmmv //
29edebbb8eSjmmv 
30edebbb8eSjmmv extern "C" {
31edebbb8eSjmmv #include <fcntl.h>
32edebbb8eSjmmv #include <unistd.h>
33edebbb8eSjmmv }
34edebbb8eSjmmv 
35edebbb8eSjmmv #include <cerrno>
36edebbb8eSjmmv #include <cstdlib>
37edebbb8eSjmmv #include <iostream>
38edebbb8eSjmmv #include <stdexcept>
39edebbb8eSjmmv 
40895f502bSjmmv #include "macros.hpp"
410659fc67Sjmmv #include "utils.hpp"
42edebbb8eSjmmv 
43895f502bSjmmv #include "detail/fs.hpp"
44895f502bSjmmv #include "detail/process.hpp"
45895f502bSjmmv #include "detail/sanity.hpp"
46895f502bSjmmv #include "detail/test_helpers.hpp"
47895f502bSjmmv #include "detail/text.hpp"
48edebbb8eSjmmv 
49edebbb8eSjmmv // ------------------------------------------------------------------------
50edebbb8eSjmmv // Auxiliary functions.
51edebbb8eSjmmv // ------------------------------------------------------------------------
52edebbb8eSjmmv 
53edebbb8eSjmmv static
54edebbb8eSjmmv void
create_ctl_file(const char * name)55a551a20fSjmmv create_ctl_file(const char *name)
56edebbb8eSjmmv {
57895f502bSjmmv     ATF_REQUIRE(open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644) != -1);
58edebbb8eSjmmv }
59edebbb8eSjmmv 
60edebbb8eSjmmv // ------------------------------------------------------------------------
61edebbb8eSjmmv // Auxiliary test cases.
62edebbb8eSjmmv // ------------------------------------------------------------------------
63edebbb8eSjmmv 
64edebbb8eSjmmv ATF_TEST_CASE(h_pass);
ATF_TEST_CASE_HEAD(h_pass)65edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_pass)
66edebbb8eSjmmv {
67edebbb8eSjmmv     set_md_var("descr", "Helper test case");
68edebbb8eSjmmv }
ATF_TEST_CASE_BODY(h_pass)69edebbb8eSjmmv ATF_TEST_CASE_BODY(h_pass)
70edebbb8eSjmmv {
71a551a20fSjmmv     create_ctl_file("before");
72edebbb8eSjmmv     ATF_PASS();
73a551a20fSjmmv     create_ctl_file("after");
74edebbb8eSjmmv }
75edebbb8eSjmmv 
76edebbb8eSjmmv ATF_TEST_CASE(h_fail);
ATF_TEST_CASE_HEAD(h_fail)77edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_fail)
78edebbb8eSjmmv {
79edebbb8eSjmmv     set_md_var("descr", "Helper test case");
80edebbb8eSjmmv }
ATF_TEST_CASE_BODY(h_fail)81edebbb8eSjmmv ATF_TEST_CASE_BODY(h_fail)
82edebbb8eSjmmv {
83a551a20fSjmmv     create_ctl_file("before");
84edebbb8eSjmmv     ATF_FAIL("Failed on purpose");
85a551a20fSjmmv     create_ctl_file("after");
86edebbb8eSjmmv }
87edebbb8eSjmmv 
88edebbb8eSjmmv ATF_TEST_CASE(h_skip);
ATF_TEST_CASE_HEAD(h_skip)89edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_skip)
90edebbb8eSjmmv {
91edebbb8eSjmmv     set_md_var("descr", "Helper test case");
92edebbb8eSjmmv }
ATF_TEST_CASE_BODY(h_skip)93edebbb8eSjmmv ATF_TEST_CASE_BODY(h_skip)
94edebbb8eSjmmv {
95a551a20fSjmmv     create_ctl_file("before");
96edebbb8eSjmmv     ATF_SKIP("Skipped on purpose");
97a551a20fSjmmv     create_ctl_file("after");
98edebbb8eSjmmv }
99edebbb8eSjmmv 
100895f502bSjmmv ATF_TEST_CASE(h_require);
ATF_TEST_CASE_HEAD(h_require)101895f502bSjmmv ATF_TEST_CASE_HEAD(h_require)
102edebbb8eSjmmv {
103edebbb8eSjmmv     set_md_var("descr", "Helper test case");
104edebbb8eSjmmv }
ATF_TEST_CASE_BODY(h_require)105895f502bSjmmv ATF_TEST_CASE_BODY(h_require)
106edebbb8eSjmmv {
107edebbb8eSjmmv     bool condition = atf::text::to_bool(get_config_var("condition"));
108edebbb8eSjmmv 
109a551a20fSjmmv     create_ctl_file("before");
110895f502bSjmmv     ATF_REQUIRE(condition);
111a551a20fSjmmv     create_ctl_file("after");
112edebbb8eSjmmv }
113edebbb8eSjmmv 
114895f502bSjmmv ATF_TEST_CASE(h_require_eq);
ATF_TEST_CASE_HEAD(h_require_eq)115895f502bSjmmv ATF_TEST_CASE_HEAD(h_require_eq)
116edebbb8eSjmmv {
117edebbb8eSjmmv     set_md_var("descr", "Helper test case");
118edebbb8eSjmmv }
ATF_TEST_CASE_BODY(h_require_eq)119895f502bSjmmv ATF_TEST_CASE_BODY(h_require_eq)
120edebbb8eSjmmv {
121edebbb8eSjmmv     long v1 = atf::text::to_type< long >(get_config_var("v1"));
122edebbb8eSjmmv     long v2 = atf::text::to_type< long >(get_config_var("v2"));
123edebbb8eSjmmv 
124a551a20fSjmmv     create_ctl_file("before");
125895f502bSjmmv     ATF_REQUIRE_EQ(v1, v2);
126a551a20fSjmmv     create_ctl_file("after");
127edebbb8eSjmmv }
128edebbb8eSjmmv 
129eb215e31Sjmmv ATF_TEST_CASE(h_require_in);
ATF_TEST_CASE_HEAD(h_require_in)130eb215e31Sjmmv ATF_TEST_CASE_HEAD(h_require_in)
131eb215e31Sjmmv {
132eb215e31Sjmmv     set_md_var("descr", "Helper test case");
133eb215e31Sjmmv }
ATF_TEST_CASE_BODY(h_require_in)134eb215e31Sjmmv ATF_TEST_CASE_BODY(h_require_in)
135eb215e31Sjmmv {
136eb215e31Sjmmv     const std::string element = get_config_var("value");
137eb215e31Sjmmv 
138eb215e31Sjmmv     std::set< std::string > collection;
139eb215e31Sjmmv     collection.insert("foo");
140eb215e31Sjmmv     collection.insert("bar");
141eb215e31Sjmmv     collection.insert("baz");
142eb215e31Sjmmv 
143a551a20fSjmmv     create_ctl_file("before");
144eb215e31Sjmmv     ATF_REQUIRE_IN(element, collection);
145a551a20fSjmmv     create_ctl_file("after");
146eb215e31Sjmmv }
147eb215e31Sjmmv 
1480ebb519dSjmmv ATF_TEST_CASE(h_require_match);
ATF_TEST_CASE_HEAD(h_require_match)1490ebb519dSjmmv ATF_TEST_CASE_HEAD(h_require_match)
1500ebb519dSjmmv {
1510ebb519dSjmmv     set_md_var("descr", "Helper test case");
1520ebb519dSjmmv }
ATF_TEST_CASE_BODY(h_require_match)1530ebb519dSjmmv ATF_TEST_CASE_BODY(h_require_match)
1540ebb519dSjmmv {
1550ebb519dSjmmv     const std::string regexp = get_config_var("regexp");
1560ebb519dSjmmv     const std::string string = get_config_var("string");
1570ebb519dSjmmv 
158a551a20fSjmmv     create_ctl_file("before");
1590ebb519dSjmmv     ATF_REQUIRE_MATCH(regexp, string);
160a551a20fSjmmv     create_ctl_file("after");
1610ebb519dSjmmv }
1620ebb519dSjmmv 
163eb215e31Sjmmv ATF_TEST_CASE(h_require_not_in);
ATF_TEST_CASE_HEAD(h_require_not_in)164eb215e31Sjmmv ATF_TEST_CASE_HEAD(h_require_not_in)
165eb215e31Sjmmv {
166eb215e31Sjmmv     set_md_var("descr", "Helper test case");
167eb215e31Sjmmv }
ATF_TEST_CASE_BODY(h_require_not_in)168eb215e31Sjmmv ATF_TEST_CASE_BODY(h_require_not_in)
169eb215e31Sjmmv {
170eb215e31Sjmmv     const std::string element = get_config_var("value");
171eb215e31Sjmmv 
172eb215e31Sjmmv     std::set< std::string > collection;
173eb215e31Sjmmv     collection.insert("foo");
174eb215e31Sjmmv     collection.insert("bar");
175eb215e31Sjmmv     collection.insert("baz");
176eb215e31Sjmmv 
177a551a20fSjmmv     create_ctl_file("before");
178eb215e31Sjmmv     ATF_REQUIRE_NOT_IN(element, collection);
179a551a20fSjmmv     create_ctl_file("after");
180eb215e31Sjmmv }
181eb215e31Sjmmv 
182895f502bSjmmv ATF_TEST_CASE(h_require_throw);
ATF_TEST_CASE_HEAD(h_require_throw)183895f502bSjmmv ATF_TEST_CASE_HEAD(h_require_throw)
184edebbb8eSjmmv {
185edebbb8eSjmmv     set_md_var("descr", "Helper test case");
186edebbb8eSjmmv }
ATF_TEST_CASE_BODY(h_require_throw)187895f502bSjmmv ATF_TEST_CASE_BODY(h_require_throw)
188edebbb8eSjmmv {
189a551a20fSjmmv     create_ctl_file("before");
190edebbb8eSjmmv 
191edebbb8eSjmmv     if (get_config_var("what") == "throw_int")
192895f502bSjmmv         ATF_REQUIRE_THROW(std::runtime_error, if (1) throw int(5));
193edebbb8eSjmmv     else if (get_config_var("what") == "throw_rt")
194895f502bSjmmv         ATF_REQUIRE_THROW(std::runtime_error,
195edebbb8eSjmmv                         if (1) throw std::runtime_error("e"));
196edebbb8eSjmmv     else if (get_config_var("what") == "no_throw_rt")
197895f502bSjmmv         ATF_REQUIRE_THROW(std::runtime_error,
198edebbb8eSjmmv                         if (0) throw std::runtime_error("e"));
199edebbb8eSjmmv 
200a551a20fSjmmv     create_ctl_file("after");
201edebbb8eSjmmv }
202edebbb8eSjmmv 
2030ebb519dSjmmv ATF_TEST_CASE(h_require_throw_re);
ATF_TEST_CASE_HEAD(h_require_throw_re)2040ebb519dSjmmv ATF_TEST_CASE_HEAD(h_require_throw_re)
2050ebb519dSjmmv {
2060ebb519dSjmmv     set_md_var("descr", "Helper test case");
2070ebb519dSjmmv }
ATF_TEST_CASE_BODY(h_require_throw_re)2080ebb519dSjmmv ATF_TEST_CASE_BODY(h_require_throw_re)
2090ebb519dSjmmv {
210a551a20fSjmmv     create_ctl_file("before");
2110ebb519dSjmmv 
2120ebb519dSjmmv     if (get_config_var("what") == "throw_int")
2130ebb519dSjmmv         ATF_REQUIRE_THROW_RE(std::runtime_error, "5", if (1) throw int(5));
2140ebb519dSjmmv     else if (get_config_var("what") == "throw_rt_match")
2150ebb519dSjmmv         ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz",
2160ebb519dSjmmv                              if (1) throw std::runtime_error("a foo bar baz"));
2170ebb519dSjmmv     else if (get_config_var("what") == "throw_rt_no_match")
2180ebb519dSjmmv         ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz",
2190ebb519dSjmmv                              if (1) throw std::runtime_error("baz foo bar a"));
2200ebb519dSjmmv     else if (get_config_var("what") == "no_throw_rt")
2210ebb519dSjmmv         ATF_REQUIRE_THROW_RE(std::runtime_error, "e",
2220ebb519dSjmmv                              if (0) throw std::runtime_error("e"));
2230ebb519dSjmmv 
224a551a20fSjmmv     create_ctl_file("after");
2250ebb519dSjmmv }
2260ebb519dSjmmv 
227edebbb8eSjmmv static int
errno_fail_stub(const int raised_errno)228edebbb8eSjmmv errno_fail_stub(const int raised_errno)
229edebbb8eSjmmv {
230edebbb8eSjmmv     errno = raised_errno;
231edebbb8eSjmmv     return -1;
232edebbb8eSjmmv }
233edebbb8eSjmmv 
234edebbb8eSjmmv static int
errno_ok_stub(void)235edebbb8eSjmmv errno_ok_stub(void)
236edebbb8eSjmmv {
237edebbb8eSjmmv     return 0;
238edebbb8eSjmmv }
239edebbb8eSjmmv 
240edebbb8eSjmmv ATF_TEST_CASE(h_check_errno);
ATF_TEST_CASE_HEAD(h_check_errno)241edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_check_errno)
242edebbb8eSjmmv {
243edebbb8eSjmmv     set_md_var("descr", "Helper test case");
244edebbb8eSjmmv }
ATF_TEST_CASE_BODY(h_check_errno)245edebbb8eSjmmv ATF_TEST_CASE_BODY(h_check_errno)
246edebbb8eSjmmv {
247a551a20fSjmmv     create_ctl_file("before");
248edebbb8eSjmmv 
249edebbb8eSjmmv     if (get_config_var("what") == "no_error")
250edebbb8eSjmmv         ATF_CHECK_ERRNO(-1, errno_ok_stub() == -1);
251edebbb8eSjmmv     else if (get_config_var("what") == "errno_ok")
252edebbb8eSjmmv         ATF_CHECK_ERRNO(2, errno_fail_stub(2) == -1);
253edebbb8eSjmmv     else if (get_config_var("what") == "errno_fail")
254edebbb8eSjmmv         ATF_CHECK_ERRNO(3, errno_fail_stub(4) == -1);
255edebbb8eSjmmv     else
256edebbb8eSjmmv         UNREACHABLE;
257edebbb8eSjmmv 
258a551a20fSjmmv     create_ctl_file("after");
259edebbb8eSjmmv }
260edebbb8eSjmmv 
261edebbb8eSjmmv ATF_TEST_CASE(h_require_errno);
ATF_TEST_CASE_HEAD(h_require_errno)262edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_require_errno)
263edebbb8eSjmmv {
264edebbb8eSjmmv     set_md_var("descr", "Helper test case");
265edebbb8eSjmmv }
ATF_TEST_CASE_BODY(h_require_errno)266edebbb8eSjmmv ATF_TEST_CASE_BODY(h_require_errno)
267edebbb8eSjmmv {
268a551a20fSjmmv     create_ctl_file("before");
269edebbb8eSjmmv 
270edebbb8eSjmmv     if (get_config_var("what") == "no_error")
271edebbb8eSjmmv         ATF_REQUIRE_ERRNO(-1, errno_ok_stub() == -1);
272edebbb8eSjmmv     else if (get_config_var("what") == "errno_ok")
273edebbb8eSjmmv         ATF_REQUIRE_ERRNO(2, errno_fail_stub(2) == -1);
274edebbb8eSjmmv     else if (get_config_var("what") == "errno_fail")
275edebbb8eSjmmv         ATF_REQUIRE_ERRNO(3, errno_fail_stub(4) == -1);
276edebbb8eSjmmv     else
277edebbb8eSjmmv         UNREACHABLE;
278edebbb8eSjmmv 
279a551a20fSjmmv     create_ctl_file("after");
280edebbb8eSjmmv }
281edebbb8eSjmmv 
282edebbb8eSjmmv // ------------------------------------------------------------------------
283edebbb8eSjmmv // Test cases for the macros.
284edebbb8eSjmmv // ------------------------------------------------------------------------
285edebbb8eSjmmv 
286edebbb8eSjmmv ATF_TEST_CASE(pass);
ATF_TEST_CASE_HEAD(pass)287edebbb8eSjmmv ATF_TEST_CASE_HEAD(pass)
288edebbb8eSjmmv {
289edebbb8eSjmmv     set_md_var("descr", "Tests the ATF_PASS macro");
290edebbb8eSjmmv }
ATF_TEST_CASE_BODY(pass)291edebbb8eSjmmv ATF_TEST_CASE_BODY(pass)
292edebbb8eSjmmv {
2934e036686Sjmmv     ATF_TEST_CASE_USE(h_pass);
294edebbb8eSjmmv     run_h_tc< ATF_TEST_CASE_NAME(h_pass) >();
2950659fc67Sjmmv     ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
296895f502bSjmmv     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
297895f502bSjmmv     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
298edebbb8eSjmmv }
299edebbb8eSjmmv 
300edebbb8eSjmmv ATF_TEST_CASE(fail);
ATF_TEST_CASE_HEAD(fail)301edebbb8eSjmmv ATF_TEST_CASE_HEAD(fail)
302edebbb8eSjmmv {
303edebbb8eSjmmv     set_md_var("descr", "Tests the ATF_FAIL macro");
304edebbb8eSjmmv }
ATF_TEST_CASE_BODY(fail)305edebbb8eSjmmv ATF_TEST_CASE_BODY(fail)
306edebbb8eSjmmv {
3074e036686Sjmmv     ATF_TEST_CASE_USE(h_fail);
308edebbb8eSjmmv     run_h_tc< ATF_TEST_CASE_NAME(h_fail) >();
3090659fc67Sjmmv     ATF_REQUIRE(atf::utils::grep_file("^failed: Failed on purpose", "result"));
310895f502bSjmmv     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
311895f502bSjmmv     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
312edebbb8eSjmmv }
313edebbb8eSjmmv 
314edebbb8eSjmmv ATF_TEST_CASE(skip);
ATF_TEST_CASE_HEAD(skip)315edebbb8eSjmmv ATF_TEST_CASE_HEAD(skip)
316edebbb8eSjmmv {
317edebbb8eSjmmv     set_md_var("descr", "Tests the ATF_SKIP macro");
318edebbb8eSjmmv }
ATF_TEST_CASE_BODY(skip)319edebbb8eSjmmv ATF_TEST_CASE_BODY(skip)
320edebbb8eSjmmv {
3214e036686Sjmmv     ATF_TEST_CASE_USE(h_skip);
322edebbb8eSjmmv     run_h_tc< ATF_TEST_CASE_NAME(h_skip) >();
3230659fc67Sjmmv     ATF_REQUIRE(atf::utils::grep_file("^skipped: Skipped on purpose",
3240659fc67Sjmmv         "result"));
325895f502bSjmmv     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
326895f502bSjmmv     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
327edebbb8eSjmmv }
328edebbb8eSjmmv 
329895f502bSjmmv ATF_TEST_CASE(require);
ATF_TEST_CASE_HEAD(require)330895f502bSjmmv ATF_TEST_CASE_HEAD(require)
331edebbb8eSjmmv {
332895f502bSjmmv     set_md_var("descr", "Tests the ATF_REQUIRE macro");
333edebbb8eSjmmv }
ATF_TEST_CASE_BODY(require)334895f502bSjmmv ATF_TEST_CASE_BODY(require)
335edebbb8eSjmmv {
336edebbb8eSjmmv     struct test {
337edebbb8eSjmmv         const char *cond;
338edebbb8eSjmmv         bool ok;
339edebbb8eSjmmv     } *t, tests[] = {
340edebbb8eSjmmv         { "false", false },
341edebbb8eSjmmv         { "true", true },
342edebbb8eSjmmv         { NULL, false }
343edebbb8eSjmmv     };
344edebbb8eSjmmv 
345edebbb8eSjmmv     const atf::fs::path before("before");
346edebbb8eSjmmv     const atf::fs::path after("after");
347edebbb8eSjmmv 
348edebbb8eSjmmv     for (t = &tests[0]; t->cond != NULL; t++) {
349edebbb8eSjmmv         atf::tests::vars_map config;
350edebbb8eSjmmv         config["condition"] = t->cond;
351edebbb8eSjmmv 
352895f502bSjmmv         std::cout << "Checking with a " << t->cond << " value\n";
353edebbb8eSjmmv 
3544e036686Sjmmv         ATF_TEST_CASE_USE(h_require);
355895f502bSjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_require) >(config);
356edebbb8eSjmmv 
357895f502bSjmmv         ATF_REQUIRE(atf::fs::exists(before));
358edebbb8eSjmmv         if (t->ok) {
3590659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
360895f502bSjmmv             ATF_REQUIRE(atf::fs::exists(after));
361edebbb8eSjmmv         } else {
3620659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file(
3630659fc67Sjmmv                 "^failed: .*condition not met", "result"));
364895f502bSjmmv             ATF_REQUIRE(!atf::fs::exists(after));
365edebbb8eSjmmv         }
366edebbb8eSjmmv 
367edebbb8eSjmmv         atf::fs::remove(before);
368edebbb8eSjmmv         if (t->ok)
369edebbb8eSjmmv             atf::fs::remove(after);
370edebbb8eSjmmv     }
371edebbb8eSjmmv }
372edebbb8eSjmmv 
373895f502bSjmmv ATF_TEST_CASE(require_eq);
ATF_TEST_CASE_HEAD(require_eq)374895f502bSjmmv ATF_TEST_CASE_HEAD(require_eq)
375edebbb8eSjmmv {
376895f502bSjmmv     set_md_var("descr", "Tests the ATF_REQUIRE_EQ macro");
377edebbb8eSjmmv }
ATF_TEST_CASE_BODY(require_eq)378895f502bSjmmv ATF_TEST_CASE_BODY(require_eq)
379edebbb8eSjmmv {
380edebbb8eSjmmv     struct test {
381edebbb8eSjmmv         const char *v1;
382edebbb8eSjmmv         const char *v2;
383edebbb8eSjmmv         bool ok;
384edebbb8eSjmmv     } *t, tests[] = {
385edebbb8eSjmmv         { "1", "1", true },
386edebbb8eSjmmv         { "1", "2", false },
387edebbb8eSjmmv         { "2", "1", false },
388edebbb8eSjmmv         { "2", "2", true },
389edebbb8eSjmmv         { NULL, NULL, false }
390edebbb8eSjmmv     };
391edebbb8eSjmmv 
392edebbb8eSjmmv     const atf::fs::path before("before");
393edebbb8eSjmmv     const atf::fs::path after("after");
394edebbb8eSjmmv 
395edebbb8eSjmmv     for (t = &tests[0]; t->v1 != NULL; t++) {
396edebbb8eSjmmv         atf::tests::vars_map config;
397edebbb8eSjmmv         config["v1"] = t->v1;
398edebbb8eSjmmv         config["v2"] = t->v2;
399edebbb8eSjmmv 
400edebbb8eSjmmv         std::cout << "Checking with " << t->v1 << ", " << t->v2
401edebbb8eSjmmv                   << " and expecting " << (t->ok ? "true" : "false")
402895f502bSjmmv                   << "\n";
403edebbb8eSjmmv 
4044e036686Sjmmv         ATF_TEST_CASE_USE(h_require_eq);
405895f502bSjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_require_eq) >(config);
406edebbb8eSjmmv 
407895f502bSjmmv         ATF_REQUIRE(atf::fs::exists(before));
408edebbb8eSjmmv         if (t->ok) {
4090659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
410895f502bSjmmv             ATF_REQUIRE(atf::fs::exists(after));
411edebbb8eSjmmv         } else {
4120659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^failed: .*v1 != v2", "result"));
413895f502bSjmmv             ATF_REQUIRE(!atf::fs::exists(after));
414edebbb8eSjmmv         }
415edebbb8eSjmmv 
416edebbb8eSjmmv         atf::fs::remove(before);
417edebbb8eSjmmv         if (t->ok)
418edebbb8eSjmmv             atf::fs::remove(after);
419edebbb8eSjmmv     }
420edebbb8eSjmmv }
421edebbb8eSjmmv 
422eb215e31Sjmmv ATF_TEST_CASE(require_in);
ATF_TEST_CASE_HEAD(require_in)423eb215e31Sjmmv ATF_TEST_CASE_HEAD(require_in)
424eb215e31Sjmmv {
425eb215e31Sjmmv     set_md_var("descr", "Tests the ATF_REQUIRE_IN macro");
426eb215e31Sjmmv }
ATF_TEST_CASE_BODY(require_in)427eb215e31Sjmmv ATF_TEST_CASE_BODY(require_in)
428eb215e31Sjmmv {
429eb215e31Sjmmv     struct test {
430eb215e31Sjmmv         const char *value;
431eb215e31Sjmmv         bool ok;
432eb215e31Sjmmv     } *t, tests[] = {
433eb215e31Sjmmv         { "foo", true },
434eb215e31Sjmmv         { "bar", true },
435eb215e31Sjmmv         { "baz", true },
436eb215e31Sjmmv         { "xxx", false },
437eb215e31Sjmmv         { "fooa", false },
438eb215e31Sjmmv         { "foo ", false },
439eb215e31Sjmmv         { NULL, false }
440eb215e31Sjmmv     };
441eb215e31Sjmmv 
442eb215e31Sjmmv     const atf::fs::path before("before");
443eb215e31Sjmmv     const atf::fs::path after("after");
444eb215e31Sjmmv 
445eb215e31Sjmmv     for (t = &tests[0]; t->value != NULL; t++) {
446eb215e31Sjmmv         atf::tests::vars_map config;
447eb215e31Sjmmv         config["value"] = t->value;
448eb215e31Sjmmv 
4494e036686Sjmmv         ATF_TEST_CASE_USE(h_require_in);
450eb215e31Sjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_require_in) >(config);
451eb215e31Sjmmv 
452eb215e31Sjmmv         ATF_REQUIRE(atf::fs::exists(before));
453eb215e31Sjmmv         if (t->ok) {
4540659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
455eb215e31Sjmmv             ATF_REQUIRE(atf::fs::exists(after));
456eb215e31Sjmmv         } else {
4570659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
458eb215e31Sjmmv             ATF_REQUIRE(!atf::fs::exists(after));
459eb215e31Sjmmv         }
460eb215e31Sjmmv 
461eb215e31Sjmmv         atf::fs::remove(before);
462eb215e31Sjmmv         if (t->ok)
463eb215e31Sjmmv             atf::fs::remove(after);
464eb215e31Sjmmv     }
465eb215e31Sjmmv }
466eb215e31Sjmmv 
4670ebb519dSjmmv ATF_TEST_CASE(require_match);
ATF_TEST_CASE_HEAD(require_match)4680ebb519dSjmmv ATF_TEST_CASE_HEAD(require_match)
4690ebb519dSjmmv {
4700ebb519dSjmmv     set_md_var("descr", "Tests the ATF_REQUIRE_MATCH macro");
4710ebb519dSjmmv }
ATF_TEST_CASE_BODY(require_match)4720ebb519dSjmmv ATF_TEST_CASE_BODY(require_match)
4730ebb519dSjmmv {
4740ebb519dSjmmv     struct test {
4750ebb519dSjmmv         const char *regexp;
4760ebb519dSjmmv         const char *string;
4770ebb519dSjmmv         bool ok;
4780ebb519dSjmmv     } *t, tests[] = {
4790ebb519dSjmmv         { "foo.*bar", "this is a foo, bar, baz", true },
4800ebb519dSjmmv         { "bar.*baz", "this is a baz, bar, foo", false },
4810ebb519dSjmmv         { NULL, NULL, false }
4820ebb519dSjmmv     };
4830ebb519dSjmmv 
4840ebb519dSjmmv     const atf::fs::path before("before");
4850ebb519dSjmmv     const atf::fs::path after("after");
4860ebb519dSjmmv 
4870ebb519dSjmmv     for (t = &tests[0]; t->regexp != NULL; t++) {
4880ebb519dSjmmv         atf::tests::vars_map config;
4890ebb519dSjmmv         config["regexp"] = t->regexp;
4900ebb519dSjmmv         config["string"] = t->string;
4910ebb519dSjmmv 
4920ebb519dSjmmv         std::cout << "Checking with " << t->regexp << ", " << t->string
4930ebb519dSjmmv                   << " and expecting " << (t->ok ? "true" : "false")
4940ebb519dSjmmv                   << "\n";
4950ebb519dSjmmv 
4964e036686Sjmmv         ATF_TEST_CASE_USE(h_require_match);
4970ebb519dSjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_require_match) >(config);
4980ebb519dSjmmv 
4990ebb519dSjmmv         ATF_REQUIRE(atf::fs::exists(before));
5000ebb519dSjmmv         if (t->ok) {
5010659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
5020ebb519dSjmmv             ATF_REQUIRE(atf::fs::exists(after));
5030ebb519dSjmmv         } else {
5040659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
5050ebb519dSjmmv             ATF_REQUIRE(!atf::fs::exists(after));
5060ebb519dSjmmv         }
5070ebb519dSjmmv 
5080ebb519dSjmmv         atf::fs::remove(before);
5090ebb519dSjmmv         if (t->ok)
5100ebb519dSjmmv             atf::fs::remove(after);
5110ebb519dSjmmv     }
5120ebb519dSjmmv }
5130ebb519dSjmmv 
514eb215e31Sjmmv ATF_TEST_CASE(require_not_in);
ATF_TEST_CASE_HEAD(require_not_in)515eb215e31Sjmmv ATF_TEST_CASE_HEAD(require_not_in)
516eb215e31Sjmmv {
517eb215e31Sjmmv     set_md_var("descr", "Tests the ATF_REQUIRE_NOT_IN macro");
518eb215e31Sjmmv }
ATF_TEST_CASE_BODY(require_not_in)519eb215e31Sjmmv ATF_TEST_CASE_BODY(require_not_in)
520eb215e31Sjmmv {
521eb215e31Sjmmv     struct test {
522eb215e31Sjmmv         const char *value;
523eb215e31Sjmmv         bool ok;
524eb215e31Sjmmv     } *t, tests[] = {
525eb215e31Sjmmv         { "foo", false },
526eb215e31Sjmmv         { "bar", false },
527eb215e31Sjmmv         { "baz", false },
528eb215e31Sjmmv         { "xxx", true },
529eb215e31Sjmmv         { "fooa", true },
530eb215e31Sjmmv         { "foo ", true },
531eb215e31Sjmmv         { NULL, false }
532eb215e31Sjmmv     };
533eb215e31Sjmmv 
534eb215e31Sjmmv     const atf::fs::path before("before");
535eb215e31Sjmmv     const atf::fs::path after("after");
536eb215e31Sjmmv 
537eb215e31Sjmmv     for (t = &tests[0]; t->value != NULL; t++) {
538eb215e31Sjmmv         atf::tests::vars_map config;
539eb215e31Sjmmv         config["value"] = t->value;
540eb215e31Sjmmv 
5414e036686Sjmmv         ATF_TEST_CASE_USE(h_require_not_in);
542eb215e31Sjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_require_not_in) >(config);
543eb215e31Sjmmv 
544eb215e31Sjmmv         ATF_REQUIRE(atf::fs::exists(before));
545eb215e31Sjmmv         if (t->ok) {
5460659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
547eb215e31Sjmmv             ATF_REQUIRE(atf::fs::exists(after));
548eb215e31Sjmmv         } else {
5490659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
550eb215e31Sjmmv             ATF_REQUIRE(!atf::fs::exists(after));
551eb215e31Sjmmv         }
552eb215e31Sjmmv 
553eb215e31Sjmmv         atf::fs::remove(before);
554eb215e31Sjmmv         if (t->ok)
555eb215e31Sjmmv             atf::fs::remove(after);
556eb215e31Sjmmv     }
557eb215e31Sjmmv }
558eb215e31Sjmmv 
559895f502bSjmmv ATF_TEST_CASE(require_throw);
ATF_TEST_CASE_HEAD(require_throw)560895f502bSjmmv ATF_TEST_CASE_HEAD(require_throw)
561edebbb8eSjmmv {
562895f502bSjmmv     set_md_var("descr", "Tests the ATF_REQUIRE_THROW macro");
563edebbb8eSjmmv }
ATF_TEST_CASE_BODY(require_throw)564895f502bSjmmv ATF_TEST_CASE_BODY(require_throw)
565edebbb8eSjmmv {
566edebbb8eSjmmv     struct test {
567edebbb8eSjmmv         const char *what;
568edebbb8eSjmmv         bool ok;
569edebbb8eSjmmv         const char *msg;
570edebbb8eSjmmv     } *t, tests[] = {
571edebbb8eSjmmv         { "throw_int", false, "unexpected error" },
572edebbb8eSjmmv         { "throw_rt", true, NULL },
573edebbb8eSjmmv         { "no_throw_rt", false, "did not throw" },
574edebbb8eSjmmv         { NULL, false, NULL }
575edebbb8eSjmmv     };
576edebbb8eSjmmv 
577edebbb8eSjmmv     const atf::fs::path before("before");
578edebbb8eSjmmv     const atf::fs::path after("after");
579edebbb8eSjmmv 
580edebbb8eSjmmv     for (t = &tests[0]; t->what != NULL; t++) {
581edebbb8eSjmmv         atf::tests::vars_map config;
582edebbb8eSjmmv         config["what"] = t->what;
583edebbb8eSjmmv 
584edebbb8eSjmmv         std::cout << "Checking with " << t->what << " and expecting "
585895f502bSjmmv                   << (t->ok ? "true" : "false") << "\n";
586edebbb8eSjmmv 
5874e036686Sjmmv         ATF_TEST_CASE_USE(h_require_throw);
588895f502bSjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_require_throw) >(config);
589edebbb8eSjmmv 
590895f502bSjmmv         ATF_REQUIRE(atf::fs::exists(before));
591edebbb8eSjmmv         if (t->ok) {
5920659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
593895f502bSjmmv             ATF_REQUIRE(atf::fs::exists(after));
594edebbb8eSjmmv         } else {
595edebbb8eSjmmv             std::cout << "Checking that message contains '" << t->msg
596895f502bSjmmv                       << "'\n";
597edebbb8eSjmmv             std::string exp_result = std::string("^failed: .*") + t->msg;
5980659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
599895f502bSjmmv             ATF_REQUIRE(!atf::fs::exists(after));
600edebbb8eSjmmv         }
601edebbb8eSjmmv 
602edebbb8eSjmmv         atf::fs::remove(before);
603edebbb8eSjmmv         if (t->ok)
604edebbb8eSjmmv             atf::fs::remove(after);
605edebbb8eSjmmv     }
606edebbb8eSjmmv }
607edebbb8eSjmmv 
6080ebb519dSjmmv ATF_TEST_CASE(require_throw_re);
ATF_TEST_CASE_HEAD(require_throw_re)6090ebb519dSjmmv ATF_TEST_CASE_HEAD(require_throw_re)
6100ebb519dSjmmv {
6110ebb519dSjmmv     set_md_var("descr", "Tests the ATF_REQUIRE_THROW_RE macro");
6120ebb519dSjmmv }
ATF_TEST_CASE_BODY(require_throw_re)6130ebb519dSjmmv ATF_TEST_CASE_BODY(require_throw_re)
6140ebb519dSjmmv {
6150ebb519dSjmmv     struct test {
6160ebb519dSjmmv         const char *what;
6170ebb519dSjmmv         bool ok;
6180ebb519dSjmmv         const char *msg;
6190ebb519dSjmmv     } *t, tests[] = {
6200ebb519dSjmmv         { "throw_int", false, "unexpected error" },
6210ebb519dSjmmv         { "throw_rt_match", true, NULL },
6224e036686Sjmmv         { "throw_rt_no_match", false,
6234e036686Sjmmv           "threw.*runtime_error\\(baz foo bar a\\).*"
6244e036686Sjmmv           "does not match 'foo\\.\\*baz'" },
6250ebb519dSjmmv         { "no_throw_rt", false, "did not throw" },
6260ebb519dSjmmv         { NULL, false, NULL }
6270ebb519dSjmmv     };
6280ebb519dSjmmv 
6290ebb519dSjmmv     const atf::fs::path before("before");
6300ebb519dSjmmv     const atf::fs::path after("after");
6310ebb519dSjmmv 
6320ebb519dSjmmv     for (t = &tests[0]; t->what != NULL; t++) {
6330ebb519dSjmmv         atf::tests::vars_map config;
6340ebb519dSjmmv         config["what"] = t->what;
6350ebb519dSjmmv 
6360ebb519dSjmmv         std::cout << "Checking with " << t->what << " and expecting "
6370ebb519dSjmmv                   << (t->ok ? "true" : "false") << "\n";
6380ebb519dSjmmv 
6394e036686Sjmmv         ATF_TEST_CASE_USE(h_require_throw_re);
6404e036686Sjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_require_throw_re) >(config);
6410ebb519dSjmmv 
6420ebb519dSjmmv         ATF_REQUIRE(atf::fs::exists(before));
6430ebb519dSjmmv         if (t->ok) {
6440659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
6450ebb519dSjmmv             ATF_REQUIRE(atf::fs::exists(after));
6460ebb519dSjmmv         } else {
6470ebb519dSjmmv             std::cout << "Checking that message contains '" << t->msg
6480ebb519dSjmmv                       << "'\n";
6490ebb519dSjmmv             std::string exp_result = std::string("^failed: .*") + t->msg;
6500659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
6510ebb519dSjmmv             ATF_REQUIRE(!atf::fs::exists(after));
6520ebb519dSjmmv         }
6530ebb519dSjmmv 
6540ebb519dSjmmv         atf::fs::remove(before);
6550ebb519dSjmmv         if (t->ok)
6560ebb519dSjmmv             atf::fs::remove(after);
6570ebb519dSjmmv     }
6580ebb519dSjmmv }
6590ebb519dSjmmv 
660edebbb8eSjmmv ATF_TEST_CASE(check_errno);
ATF_TEST_CASE_HEAD(check_errno)661edebbb8eSjmmv ATF_TEST_CASE_HEAD(check_errno)
662edebbb8eSjmmv {
663edebbb8eSjmmv     set_md_var("descr", "Tests the ATF_CHECK_ERRNO macro");
664edebbb8eSjmmv }
ATF_TEST_CASE_BODY(check_errno)665edebbb8eSjmmv ATF_TEST_CASE_BODY(check_errno)
666edebbb8eSjmmv {
667edebbb8eSjmmv     struct test {
668edebbb8eSjmmv         const char *what;
669edebbb8eSjmmv         bool ok;
670edebbb8eSjmmv         const char *msg;
671edebbb8eSjmmv     } *t, tests[] = {
672edebbb8eSjmmv         { "no_error", false,
673edebbb8eSjmmv           "Expected true value in errno_ok_stub\\(\\) == -1" },
674edebbb8eSjmmv         { "errno_ok", true, NULL },
675edebbb8eSjmmv         { "errno_fail", false,
676edebbb8eSjmmv           "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
677edebbb8eSjmmv         { NULL, false, NULL }
678edebbb8eSjmmv     };
679edebbb8eSjmmv 
680edebbb8eSjmmv     const atf::fs::path before("before");
681edebbb8eSjmmv     const atf::fs::path after("after");
682edebbb8eSjmmv 
683edebbb8eSjmmv     for (t = &tests[0]; t->what != NULL; t++) {
684edebbb8eSjmmv         atf::tests::vars_map config;
685edebbb8eSjmmv         config["what"] = t->what;
686edebbb8eSjmmv 
6874e036686Sjmmv         ATF_TEST_CASE_USE(h_check_errno);
688edebbb8eSjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_check_errno) >(config);
689edebbb8eSjmmv 
690895f502bSjmmv         ATF_REQUIRE(atf::fs::exists(before));
691895f502bSjmmv         ATF_REQUIRE(atf::fs::exists(after));
692edebbb8eSjmmv 
693edebbb8eSjmmv         if (t->ok) {
6940659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
695edebbb8eSjmmv         } else {
6960659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^failed", "result"));
697edebbb8eSjmmv 
698edebbb8eSjmmv             std::string exp_result = "macros_test.cpp:[0-9]+: " +
699edebbb8eSjmmv                 std::string(t->msg) + "$";
7000659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "stderr"));
701edebbb8eSjmmv         }
702edebbb8eSjmmv 
703edebbb8eSjmmv         atf::fs::remove(before);
704edebbb8eSjmmv         atf::fs::remove(after);
705edebbb8eSjmmv     }
706edebbb8eSjmmv }
707edebbb8eSjmmv 
708edebbb8eSjmmv ATF_TEST_CASE(require_errno);
ATF_TEST_CASE_HEAD(require_errno)709edebbb8eSjmmv ATF_TEST_CASE_HEAD(require_errno)
710edebbb8eSjmmv {
711edebbb8eSjmmv     set_md_var("descr", "Tests the ATF_REQUIRE_ERRNO macro");
712edebbb8eSjmmv }
ATF_TEST_CASE_BODY(require_errno)713edebbb8eSjmmv ATF_TEST_CASE_BODY(require_errno)
714edebbb8eSjmmv {
715edebbb8eSjmmv     struct test {
716edebbb8eSjmmv         const char *what;
717edebbb8eSjmmv         bool ok;
718edebbb8eSjmmv         const char *msg;
719edebbb8eSjmmv     } *t, tests[] = {
720edebbb8eSjmmv         { "no_error", false,
721edebbb8eSjmmv           "Expected true value in errno_ok_stub\\(\\) == -1" },
722edebbb8eSjmmv         { "errno_ok", true, NULL },
723edebbb8eSjmmv         { "errno_fail", false,
724edebbb8eSjmmv           "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
725edebbb8eSjmmv         { NULL, false, NULL }
726edebbb8eSjmmv     };
727edebbb8eSjmmv 
728edebbb8eSjmmv     const atf::fs::path before("before");
729edebbb8eSjmmv     const atf::fs::path after("after");
730edebbb8eSjmmv 
731edebbb8eSjmmv     for (t = &tests[0]; t->what != NULL; t++) {
732edebbb8eSjmmv         atf::tests::vars_map config;
733edebbb8eSjmmv         config["what"] = t->what;
734edebbb8eSjmmv 
7354e036686Sjmmv         ATF_TEST_CASE_USE(h_require_errno);
736edebbb8eSjmmv         run_h_tc< ATF_TEST_CASE_NAME(h_require_errno) >(config);
737edebbb8eSjmmv 
738895f502bSjmmv         ATF_REQUIRE(atf::fs::exists(before));
739edebbb8eSjmmv         if (t->ok) {
7400659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
741895f502bSjmmv             ATF_REQUIRE(atf::fs::exists(after));
742edebbb8eSjmmv         } else {
743edebbb8eSjmmv             std::string exp_result = "^failed: .*macros_test.cpp:[0-9]+: " +
744edebbb8eSjmmv                 std::string(t->msg) + "$";
7450659fc67Sjmmv             ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
746edebbb8eSjmmv 
747895f502bSjmmv             ATF_REQUIRE(!atf::fs::exists(after));
748edebbb8eSjmmv         }
749edebbb8eSjmmv 
750edebbb8eSjmmv         atf::fs::remove(before);
751edebbb8eSjmmv         if (t->ok)
752edebbb8eSjmmv             atf::fs::remove(after);
753edebbb8eSjmmv     }
754edebbb8eSjmmv }
755edebbb8eSjmmv 
756edebbb8eSjmmv // ------------------------------------------------------------------------
757edebbb8eSjmmv // Tests cases for the header file.
758edebbb8eSjmmv // ------------------------------------------------------------------------
759edebbb8eSjmmv 
760edebbb8eSjmmv HEADER_TC(include, "atf-c++/macros.hpp");
761edebbb8eSjmmv BUILD_TC(use, "macros_hpp_test.cpp",
762edebbb8eSjmmv          "Tests that the macros provided by the atf-c++/macros.hpp file "
763edebbb8eSjmmv          "do not cause syntax errors when used",
764edebbb8eSjmmv          "Build of macros_hpp_test.cpp failed; some macros in "
765edebbb8eSjmmv          "atf-c++/macros.hpp are broken");
766d780102eSjmmv 
767d780102eSjmmv ATF_TEST_CASE(detect_unused_tests);
ATF_TEST_CASE_HEAD(detect_unused_tests)768d780102eSjmmv ATF_TEST_CASE_HEAD(detect_unused_tests)
769d780102eSjmmv {
770d780102eSjmmv     set_md_var("descr",
771d780102eSjmmv                "Tests that defining an unused test case raises a warning (and "
772d780102eSjmmv                "thus an error)");
773d780102eSjmmv }
ATF_TEST_CASE_BODY(detect_unused_tests)774d780102eSjmmv ATF_TEST_CASE_BODY(detect_unused_tests)
775d780102eSjmmv {
776d780102eSjmmv     const char* validate_compiler =
777d780102eSjmmv         "class test_class { public: int dummy; };\n"
778d780102eSjmmv         "#define define_unused static test_class unused\n"
779d780102eSjmmv         "define_unused;\n";
780d780102eSjmmv 
781d780102eSjmmv     atf::utils::create_file("compiler_test.cpp", validate_compiler);
782d780102eSjmmv     if (build_check_cxx_o("compiler_test.cpp"))
783d780102eSjmmv         expect_fail("Compiler does not raise a warning on an unused "
784d780102eSjmmv                     "static global variable declared by a macro");
785d780102eSjmmv 
786*32627f22Sgson #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
787*32627f22Sgson         expect_fail("PR 49187");
788*32627f22Sgson #endif
789*32627f22Sgson 
790d780102eSjmmv     if (build_check_cxx_o_srcdir(*this, "unused_test.cpp"))
791d780102eSjmmv         ATF_FAIL("Build of unused_test.cpp passed; unused test cases are "
792d780102eSjmmv                  "not properly detected");
793d780102eSjmmv }
794edebbb8eSjmmv 
795edebbb8eSjmmv // ------------------------------------------------------------------------
796edebbb8eSjmmv // Main.
797edebbb8eSjmmv // ------------------------------------------------------------------------
798edebbb8eSjmmv 
ATF_INIT_TEST_CASES(tcs)799edebbb8eSjmmv ATF_INIT_TEST_CASES(tcs)
800edebbb8eSjmmv {
801edebbb8eSjmmv     // Add the test cases for the macros.
802edebbb8eSjmmv     ATF_ADD_TEST_CASE(tcs, pass);
803edebbb8eSjmmv     ATF_ADD_TEST_CASE(tcs, fail);
804edebbb8eSjmmv     ATF_ADD_TEST_CASE(tcs, skip);
805edebbb8eSjmmv     ATF_ADD_TEST_CASE(tcs, check_errno);
806895f502bSjmmv     ATF_ADD_TEST_CASE(tcs, require);
807895f502bSjmmv     ATF_ADD_TEST_CASE(tcs, require_eq);
808eb215e31Sjmmv     ATF_ADD_TEST_CASE(tcs, require_in);
8090ebb519dSjmmv     ATF_ADD_TEST_CASE(tcs, require_match);
810eb215e31Sjmmv     ATF_ADD_TEST_CASE(tcs, require_not_in);
811895f502bSjmmv     ATF_ADD_TEST_CASE(tcs, require_throw);
8120ebb519dSjmmv     ATF_ADD_TEST_CASE(tcs, require_throw_re);
813edebbb8eSjmmv     ATF_ADD_TEST_CASE(tcs, require_errno);
814edebbb8eSjmmv 
815edebbb8eSjmmv     // Add the test cases for the header file.
816edebbb8eSjmmv     ATF_ADD_TEST_CASE(tcs, include);
817edebbb8eSjmmv     ATF_ADD_TEST_CASE(tcs, use);
8184e036686Sjmmv     ATF_ADD_TEST_CASE(tcs, detect_unused_tests);
819edebbb8eSjmmv }
820