xref: /freebsd-src/contrib/atf/atf-c++/macros_test.cpp (revision a18eacbefdfa1085ca3db829e86ece78cd416493)
1c243e490SMarcel Moolenaar //
2c243e490SMarcel Moolenaar // Automated Testing Framework (atf)
3c243e490SMarcel Moolenaar //
4c243e490SMarcel Moolenaar // Copyright (c) 2008 The NetBSD Foundation, Inc.
5c243e490SMarcel Moolenaar // All rights reserved.
6c243e490SMarcel Moolenaar //
7c243e490SMarcel Moolenaar // Redistribution and use in source and binary forms, with or without
8c243e490SMarcel Moolenaar // modification, are permitted provided that the following conditions
9c243e490SMarcel Moolenaar // are met:
10c243e490SMarcel Moolenaar // 1. Redistributions of source code must retain the above copyright
11c243e490SMarcel Moolenaar //    notice, this list of conditions and the following disclaimer.
12c243e490SMarcel Moolenaar // 2. Redistributions in binary form must reproduce the above copyright
13c243e490SMarcel Moolenaar //    notice, this list of conditions and the following disclaimer in the
14c243e490SMarcel Moolenaar //    documentation and/or other materials provided with the distribution.
15c243e490SMarcel Moolenaar //
16c243e490SMarcel Moolenaar // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17c243e490SMarcel Moolenaar // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18c243e490SMarcel Moolenaar // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19c243e490SMarcel Moolenaar // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20c243e490SMarcel Moolenaar // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21c243e490SMarcel Moolenaar // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22c243e490SMarcel Moolenaar // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23c243e490SMarcel Moolenaar // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24c243e490SMarcel Moolenaar // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25c243e490SMarcel Moolenaar // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26c243e490SMarcel Moolenaar // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27c243e490SMarcel Moolenaar // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28c243e490SMarcel Moolenaar //
29c243e490SMarcel Moolenaar 
30c243e490SMarcel Moolenaar extern "C" {
31c243e490SMarcel Moolenaar #include <fcntl.h>
32c243e490SMarcel Moolenaar #include <unistd.h>
33c243e490SMarcel Moolenaar }
34c243e490SMarcel Moolenaar 
35c243e490SMarcel Moolenaar #include <cerrno>
36c243e490SMarcel Moolenaar #include <cstdlib>
37c243e490SMarcel Moolenaar #include <iostream>
38c243e490SMarcel Moolenaar #include <stdexcept>
39c243e490SMarcel Moolenaar 
40c243e490SMarcel Moolenaar #include "macros.hpp"
41*a18eacbeSJulio Merino #include "utils.hpp"
42c243e490SMarcel Moolenaar 
43c243e490SMarcel Moolenaar #include "detail/fs.hpp"
44c243e490SMarcel Moolenaar #include "detail/process.hpp"
45c243e490SMarcel Moolenaar #include "detail/sanity.hpp"
46c243e490SMarcel Moolenaar #include "detail/test_helpers.hpp"
47c243e490SMarcel Moolenaar #include "detail/text.hpp"
48c243e490SMarcel Moolenaar 
49c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
50c243e490SMarcel Moolenaar // Auxiliary functions.
51c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
52c243e490SMarcel Moolenaar 
53c243e490SMarcel Moolenaar static
54c243e490SMarcel Moolenaar void
55c243e490SMarcel Moolenaar create_ctl_file(const char *name)
56c243e490SMarcel Moolenaar {
57c243e490SMarcel Moolenaar     ATF_REQUIRE(open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644) != -1);
58c243e490SMarcel Moolenaar }
59c243e490SMarcel Moolenaar 
60c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
61c243e490SMarcel Moolenaar // Auxiliary test cases.
62c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
63c243e490SMarcel Moolenaar 
64c243e490SMarcel Moolenaar ATF_TEST_CASE(h_pass);
65c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_pass)
66c243e490SMarcel Moolenaar {
67c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
68c243e490SMarcel Moolenaar }
69c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_pass)
70c243e490SMarcel Moolenaar {
71c243e490SMarcel Moolenaar     create_ctl_file("before");
72c243e490SMarcel Moolenaar     ATF_PASS();
73c243e490SMarcel Moolenaar     create_ctl_file("after");
74c243e490SMarcel Moolenaar }
75c243e490SMarcel Moolenaar 
76c243e490SMarcel Moolenaar ATF_TEST_CASE(h_fail);
77c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_fail)
78c243e490SMarcel Moolenaar {
79c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
80c243e490SMarcel Moolenaar }
81c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_fail)
82c243e490SMarcel Moolenaar {
83c243e490SMarcel Moolenaar     create_ctl_file("before");
84c243e490SMarcel Moolenaar     ATF_FAIL("Failed on purpose");
85c243e490SMarcel Moolenaar     create_ctl_file("after");
86c243e490SMarcel Moolenaar }
87c243e490SMarcel Moolenaar 
88c243e490SMarcel Moolenaar ATF_TEST_CASE(h_skip);
89c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_skip)
90c243e490SMarcel Moolenaar {
91c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
92c243e490SMarcel Moolenaar }
93c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_skip)
94c243e490SMarcel Moolenaar {
95c243e490SMarcel Moolenaar     create_ctl_file("before");
96c243e490SMarcel Moolenaar     ATF_SKIP("Skipped on purpose");
97c243e490SMarcel Moolenaar     create_ctl_file("after");
98c243e490SMarcel Moolenaar }
99c243e490SMarcel Moolenaar 
100c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require);
101c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require)
102c243e490SMarcel Moolenaar {
103c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
104c243e490SMarcel Moolenaar }
105c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require)
106c243e490SMarcel Moolenaar {
107c243e490SMarcel Moolenaar     bool condition = atf::text::to_bool(get_config_var("condition"));
108c243e490SMarcel Moolenaar 
109c243e490SMarcel Moolenaar     create_ctl_file("before");
110c243e490SMarcel Moolenaar     ATF_REQUIRE(condition);
111c243e490SMarcel Moolenaar     create_ctl_file("after");
112c243e490SMarcel Moolenaar }
113c243e490SMarcel Moolenaar 
114c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_eq);
115c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_eq)
116c243e490SMarcel Moolenaar {
117c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
118c243e490SMarcel Moolenaar }
119c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_eq)
120c243e490SMarcel Moolenaar {
121c243e490SMarcel Moolenaar     long v1 = atf::text::to_type< long >(get_config_var("v1"));
122c243e490SMarcel Moolenaar     long v2 = atf::text::to_type< long >(get_config_var("v2"));
123c243e490SMarcel Moolenaar 
124c243e490SMarcel Moolenaar     create_ctl_file("before");
125c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(v1, v2);
126c243e490SMarcel Moolenaar     create_ctl_file("after");
127c243e490SMarcel Moolenaar }
128c243e490SMarcel Moolenaar 
129c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_in);
130c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_in)
131c243e490SMarcel Moolenaar {
132c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
133c243e490SMarcel Moolenaar }
134c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_in)
135c243e490SMarcel Moolenaar {
136c243e490SMarcel Moolenaar     const std::string element = get_config_var("value");
137c243e490SMarcel Moolenaar 
138c243e490SMarcel Moolenaar     std::set< std::string > collection;
139c243e490SMarcel Moolenaar     collection.insert("foo");
140c243e490SMarcel Moolenaar     collection.insert("bar");
141c243e490SMarcel Moolenaar     collection.insert("baz");
142c243e490SMarcel Moolenaar 
143c243e490SMarcel Moolenaar     create_ctl_file("before");
144c243e490SMarcel Moolenaar     ATF_REQUIRE_IN(element, collection);
145c243e490SMarcel Moolenaar     create_ctl_file("after");
146c243e490SMarcel Moolenaar }
147c243e490SMarcel Moolenaar 
148c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_match);
149c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_match)
150c243e490SMarcel Moolenaar {
151c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
152c243e490SMarcel Moolenaar }
153c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_match)
154c243e490SMarcel Moolenaar {
155c243e490SMarcel Moolenaar     const std::string regexp = get_config_var("regexp");
156c243e490SMarcel Moolenaar     const std::string string = get_config_var("string");
157c243e490SMarcel Moolenaar 
158c243e490SMarcel Moolenaar     create_ctl_file("before");
159c243e490SMarcel Moolenaar     ATF_REQUIRE_MATCH(regexp, string);
160c243e490SMarcel Moolenaar     create_ctl_file("after");
161c243e490SMarcel Moolenaar }
162c243e490SMarcel Moolenaar 
163c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_not_in);
164c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_not_in)
165c243e490SMarcel Moolenaar {
166c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
167c243e490SMarcel Moolenaar }
168c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_not_in)
169c243e490SMarcel Moolenaar {
170c243e490SMarcel Moolenaar     const std::string element = get_config_var("value");
171c243e490SMarcel Moolenaar 
172c243e490SMarcel Moolenaar     std::set< std::string > collection;
173c243e490SMarcel Moolenaar     collection.insert("foo");
174c243e490SMarcel Moolenaar     collection.insert("bar");
175c243e490SMarcel Moolenaar     collection.insert("baz");
176c243e490SMarcel Moolenaar 
177c243e490SMarcel Moolenaar     create_ctl_file("before");
178c243e490SMarcel Moolenaar     ATF_REQUIRE_NOT_IN(element, collection);
179c243e490SMarcel Moolenaar     create_ctl_file("after");
180c243e490SMarcel Moolenaar }
181c243e490SMarcel Moolenaar 
182c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_throw);
183c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_throw)
184c243e490SMarcel Moolenaar {
185c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
186c243e490SMarcel Moolenaar }
187c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_throw)
188c243e490SMarcel Moolenaar {
189c243e490SMarcel Moolenaar     create_ctl_file("before");
190c243e490SMarcel Moolenaar 
191c243e490SMarcel Moolenaar     if (get_config_var("what") == "throw_int")
192c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW(std::runtime_error, if (1) throw int(5));
193c243e490SMarcel Moolenaar     else if (get_config_var("what") == "throw_rt")
194c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW(std::runtime_error,
195c243e490SMarcel Moolenaar                         if (1) throw std::runtime_error("e"));
196c243e490SMarcel Moolenaar     else if (get_config_var("what") == "no_throw_rt")
197c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW(std::runtime_error,
198c243e490SMarcel Moolenaar                         if (0) throw std::runtime_error("e"));
199c243e490SMarcel Moolenaar 
200c243e490SMarcel Moolenaar     create_ctl_file("after");
201c243e490SMarcel Moolenaar }
202c243e490SMarcel Moolenaar 
203c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_throw_re);
204c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_throw_re)
205c243e490SMarcel Moolenaar {
206c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
207c243e490SMarcel Moolenaar }
208c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_throw_re)
209c243e490SMarcel Moolenaar {
210c243e490SMarcel Moolenaar     create_ctl_file("before");
211c243e490SMarcel Moolenaar 
212c243e490SMarcel Moolenaar     if (get_config_var("what") == "throw_int")
213c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW_RE(std::runtime_error, "5", if (1) throw int(5));
214c243e490SMarcel Moolenaar     else if (get_config_var("what") == "throw_rt_match")
215c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz",
216c243e490SMarcel Moolenaar                              if (1) throw std::runtime_error("a foo bar baz"));
217c243e490SMarcel Moolenaar     else if (get_config_var("what") == "throw_rt_no_match")
218c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz",
219c243e490SMarcel Moolenaar                              if (1) throw std::runtime_error("baz foo bar a"));
220c243e490SMarcel Moolenaar     else if (get_config_var("what") == "no_throw_rt")
221c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW_RE(std::runtime_error, "e",
222c243e490SMarcel Moolenaar                              if (0) throw std::runtime_error("e"));
223c243e490SMarcel Moolenaar 
224c243e490SMarcel Moolenaar     create_ctl_file("after");
225c243e490SMarcel Moolenaar }
226c243e490SMarcel Moolenaar 
227c243e490SMarcel Moolenaar static int
228c243e490SMarcel Moolenaar errno_fail_stub(const int raised_errno)
229c243e490SMarcel Moolenaar {
230c243e490SMarcel Moolenaar     errno = raised_errno;
231c243e490SMarcel Moolenaar     return -1;
232c243e490SMarcel Moolenaar }
233c243e490SMarcel Moolenaar 
234c243e490SMarcel Moolenaar static int
235c243e490SMarcel Moolenaar errno_ok_stub(void)
236c243e490SMarcel Moolenaar {
237c243e490SMarcel Moolenaar     return 0;
238c243e490SMarcel Moolenaar }
239c243e490SMarcel Moolenaar 
240c243e490SMarcel Moolenaar ATF_TEST_CASE(h_check_errno);
241c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_check_errno)
242c243e490SMarcel Moolenaar {
243c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
244c243e490SMarcel Moolenaar }
245c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_check_errno)
246c243e490SMarcel Moolenaar {
247c243e490SMarcel Moolenaar     create_ctl_file("before");
248c243e490SMarcel Moolenaar 
249c243e490SMarcel Moolenaar     if (get_config_var("what") == "no_error")
250c243e490SMarcel Moolenaar         ATF_CHECK_ERRNO(-1, errno_ok_stub() == -1);
251c243e490SMarcel Moolenaar     else if (get_config_var("what") == "errno_ok")
252c243e490SMarcel Moolenaar         ATF_CHECK_ERRNO(2, errno_fail_stub(2) == -1);
253c243e490SMarcel Moolenaar     else if (get_config_var("what") == "errno_fail")
254c243e490SMarcel Moolenaar         ATF_CHECK_ERRNO(3, errno_fail_stub(4) == -1);
255c243e490SMarcel Moolenaar     else
256c243e490SMarcel Moolenaar         UNREACHABLE;
257c243e490SMarcel Moolenaar 
258c243e490SMarcel Moolenaar     create_ctl_file("after");
259c243e490SMarcel Moolenaar }
260c243e490SMarcel Moolenaar 
261c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_errno);
262c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_errno)
263c243e490SMarcel Moolenaar {
264c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
265c243e490SMarcel Moolenaar }
266c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_errno)
267c243e490SMarcel Moolenaar {
268c243e490SMarcel Moolenaar     create_ctl_file("before");
269c243e490SMarcel Moolenaar 
270c243e490SMarcel Moolenaar     if (get_config_var("what") == "no_error")
271c243e490SMarcel Moolenaar         ATF_REQUIRE_ERRNO(-1, errno_ok_stub() == -1);
272c243e490SMarcel Moolenaar     else if (get_config_var("what") == "errno_ok")
273c243e490SMarcel Moolenaar         ATF_REQUIRE_ERRNO(2, errno_fail_stub(2) == -1);
274c243e490SMarcel Moolenaar     else if (get_config_var("what") == "errno_fail")
275c243e490SMarcel Moolenaar         ATF_REQUIRE_ERRNO(3, errno_fail_stub(4) == -1);
276c243e490SMarcel Moolenaar     else
277c243e490SMarcel Moolenaar         UNREACHABLE;
278c243e490SMarcel Moolenaar 
279c243e490SMarcel Moolenaar     create_ctl_file("after");
280c243e490SMarcel Moolenaar }
281c243e490SMarcel Moolenaar 
282c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
283c243e490SMarcel Moolenaar // Test cases for the macros.
284c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
285c243e490SMarcel Moolenaar 
286c243e490SMarcel Moolenaar ATF_TEST_CASE(pass);
287c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(pass)
288c243e490SMarcel Moolenaar {
289c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_PASS macro");
290c243e490SMarcel Moolenaar }
291c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(pass)
292c243e490SMarcel Moolenaar {
293c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(h_pass);
294c243e490SMarcel Moolenaar     run_h_tc< ATF_TEST_CASE_NAME(h_pass) >();
295*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
296c243e490SMarcel Moolenaar     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
297c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
298c243e490SMarcel Moolenaar }
299c243e490SMarcel Moolenaar 
300c243e490SMarcel Moolenaar ATF_TEST_CASE(fail);
301c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(fail)
302c243e490SMarcel Moolenaar {
303c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_FAIL macro");
304c243e490SMarcel Moolenaar }
305c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(fail)
306c243e490SMarcel Moolenaar {
307c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(h_fail);
308c243e490SMarcel Moolenaar     run_h_tc< ATF_TEST_CASE_NAME(h_fail) >();
309*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_file("^failed: Failed on purpose", "result"));
310c243e490SMarcel Moolenaar     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
311c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
312c243e490SMarcel Moolenaar }
313c243e490SMarcel Moolenaar 
314c243e490SMarcel Moolenaar ATF_TEST_CASE(skip);
315c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(skip)
316c243e490SMarcel Moolenaar {
317c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_SKIP macro");
318c243e490SMarcel Moolenaar }
319c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(skip)
320c243e490SMarcel Moolenaar {
321c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(h_skip);
322c243e490SMarcel Moolenaar     run_h_tc< ATF_TEST_CASE_NAME(h_skip) >();
323*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_file("^skipped: Skipped on purpose",
324*a18eacbeSJulio Merino         "result"));
325c243e490SMarcel Moolenaar     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
326c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
327c243e490SMarcel Moolenaar }
328c243e490SMarcel Moolenaar 
329c243e490SMarcel Moolenaar ATF_TEST_CASE(require);
330c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require)
331c243e490SMarcel Moolenaar {
332c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE macro");
333c243e490SMarcel Moolenaar }
334c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require)
335c243e490SMarcel Moolenaar {
336c243e490SMarcel Moolenaar     struct test {
337c243e490SMarcel Moolenaar         const char *cond;
338c243e490SMarcel Moolenaar         bool ok;
339c243e490SMarcel Moolenaar     } *t, tests[] = {
340c243e490SMarcel Moolenaar         { "false", false },
341c243e490SMarcel Moolenaar         { "true", true },
342c243e490SMarcel Moolenaar         { NULL, false }
343c243e490SMarcel Moolenaar     };
344c243e490SMarcel Moolenaar 
345c243e490SMarcel Moolenaar     const atf::fs::path before("before");
346c243e490SMarcel Moolenaar     const atf::fs::path after("after");
347c243e490SMarcel Moolenaar 
348c243e490SMarcel Moolenaar     for (t = &tests[0]; t->cond != NULL; t++) {
349c243e490SMarcel Moolenaar         atf::tests::vars_map config;
350c243e490SMarcel Moolenaar         config["condition"] = t->cond;
351c243e490SMarcel Moolenaar 
352c243e490SMarcel Moolenaar         std::cout << "Checking with a " << t->cond << " value\n";
353c243e490SMarcel Moolenaar 
354c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require);
355c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require) >(config);
356c243e490SMarcel Moolenaar 
357c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
358c243e490SMarcel Moolenaar         if (t->ok) {
359*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
360c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
361c243e490SMarcel Moolenaar         } else {
362*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file(
363*a18eacbeSJulio Merino                 "^failed: .*condition not met", "result"));
364c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
365c243e490SMarcel Moolenaar         }
366c243e490SMarcel Moolenaar 
367c243e490SMarcel Moolenaar         atf::fs::remove(before);
368c243e490SMarcel Moolenaar         if (t->ok)
369c243e490SMarcel Moolenaar             atf::fs::remove(after);
370c243e490SMarcel Moolenaar     }
371c243e490SMarcel Moolenaar }
372c243e490SMarcel Moolenaar 
373c243e490SMarcel Moolenaar ATF_TEST_CASE(require_eq);
374c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_eq)
375c243e490SMarcel Moolenaar {
376c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_EQ macro");
377c243e490SMarcel Moolenaar }
378c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_eq)
379c243e490SMarcel Moolenaar {
380c243e490SMarcel Moolenaar     struct test {
381c243e490SMarcel Moolenaar         const char *v1;
382c243e490SMarcel Moolenaar         const char *v2;
383c243e490SMarcel Moolenaar         bool ok;
384c243e490SMarcel Moolenaar     } *t, tests[] = {
385c243e490SMarcel Moolenaar         { "1", "1", true },
386c243e490SMarcel Moolenaar         { "1", "2", false },
387c243e490SMarcel Moolenaar         { "2", "1", false },
388c243e490SMarcel Moolenaar         { "2", "2", true },
389c243e490SMarcel Moolenaar         { NULL, NULL, false }
390c243e490SMarcel Moolenaar     };
391c243e490SMarcel Moolenaar 
392c243e490SMarcel Moolenaar     const atf::fs::path before("before");
393c243e490SMarcel Moolenaar     const atf::fs::path after("after");
394c243e490SMarcel Moolenaar 
395c243e490SMarcel Moolenaar     for (t = &tests[0]; t->v1 != NULL; t++) {
396c243e490SMarcel Moolenaar         atf::tests::vars_map config;
397c243e490SMarcel Moolenaar         config["v1"] = t->v1;
398c243e490SMarcel Moolenaar         config["v2"] = t->v2;
399c243e490SMarcel Moolenaar 
400c243e490SMarcel Moolenaar         std::cout << "Checking with " << t->v1 << ", " << t->v2
401c243e490SMarcel Moolenaar                   << " and expecting " << (t->ok ? "true" : "false")
402c243e490SMarcel Moolenaar                   << "\n";
403c243e490SMarcel Moolenaar 
404c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_eq);
405c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_eq) >(config);
406c243e490SMarcel Moolenaar 
407c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
408c243e490SMarcel Moolenaar         if (t->ok) {
409*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
410c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
411c243e490SMarcel Moolenaar         } else {
412*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^failed: .*v1 != v2", "result"));
413c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
414c243e490SMarcel Moolenaar         }
415c243e490SMarcel Moolenaar 
416c243e490SMarcel Moolenaar         atf::fs::remove(before);
417c243e490SMarcel Moolenaar         if (t->ok)
418c243e490SMarcel Moolenaar             atf::fs::remove(after);
419c243e490SMarcel Moolenaar     }
420c243e490SMarcel Moolenaar }
421c243e490SMarcel Moolenaar 
422c243e490SMarcel Moolenaar ATF_TEST_CASE(require_in);
423c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_in)
424c243e490SMarcel Moolenaar {
425c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_IN macro");
426c243e490SMarcel Moolenaar }
427c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_in)
428c243e490SMarcel Moolenaar {
429c243e490SMarcel Moolenaar     struct test {
430c243e490SMarcel Moolenaar         const char *value;
431c243e490SMarcel Moolenaar         bool ok;
432c243e490SMarcel Moolenaar     } *t, tests[] = {
433c243e490SMarcel Moolenaar         { "foo", true },
434c243e490SMarcel Moolenaar         { "bar", true },
435c243e490SMarcel Moolenaar         { "baz", true },
436c243e490SMarcel Moolenaar         { "xxx", false },
437c243e490SMarcel Moolenaar         { "fooa", false },
438c243e490SMarcel Moolenaar         { "foo ", false },
439c243e490SMarcel Moolenaar         { NULL, false }
440c243e490SMarcel Moolenaar     };
441c243e490SMarcel Moolenaar 
442c243e490SMarcel Moolenaar     const atf::fs::path before("before");
443c243e490SMarcel Moolenaar     const atf::fs::path after("after");
444c243e490SMarcel Moolenaar 
445c243e490SMarcel Moolenaar     for (t = &tests[0]; t->value != NULL; t++) {
446c243e490SMarcel Moolenaar         atf::tests::vars_map config;
447c243e490SMarcel Moolenaar         config["value"] = t->value;
448c243e490SMarcel Moolenaar 
449c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_in);
450c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_in) >(config);
451c243e490SMarcel Moolenaar 
452c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
453c243e490SMarcel Moolenaar         if (t->ok) {
454*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
455c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
456c243e490SMarcel Moolenaar         } else {
457*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
458c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
459c243e490SMarcel Moolenaar         }
460c243e490SMarcel Moolenaar 
461c243e490SMarcel Moolenaar         atf::fs::remove(before);
462c243e490SMarcel Moolenaar         if (t->ok)
463c243e490SMarcel Moolenaar             atf::fs::remove(after);
464c243e490SMarcel Moolenaar     }
465c243e490SMarcel Moolenaar }
466c243e490SMarcel Moolenaar 
467c243e490SMarcel Moolenaar ATF_TEST_CASE(require_match);
468c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_match)
469c243e490SMarcel Moolenaar {
470c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_MATCH macro");
471c243e490SMarcel Moolenaar }
472c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_match)
473c243e490SMarcel Moolenaar {
474c243e490SMarcel Moolenaar     struct test {
475c243e490SMarcel Moolenaar         const char *regexp;
476c243e490SMarcel Moolenaar         const char *string;
477c243e490SMarcel Moolenaar         bool ok;
478c243e490SMarcel Moolenaar     } *t, tests[] = {
479c243e490SMarcel Moolenaar         { "foo.*bar", "this is a foo, bar, baz", true },
480c243e490SMarcel Moolenaar         { "bar.*baz", "this is a baz, bar, foo", false },
481c243e490SMarcel Moolenaar         { NULL, NULL, false }
482c243e490SMarcel Moolenaar     };
483c243e490SMarcel Moolenaar 
484c243e490SMarcel Moolenaar     const atf::fs::path before("before");
485c243e490SMarcel Moolenaar     const atf::fs::path after("after");
486c243e490SMarcel Moolenaar 
487c243e490SMarcel Moolenaar     for (t = &tests[0]; t->regexp != NULL; t++) {
488c243e490SMarcel Moolenaar         atf::tests::vars_map config;
489c243e490SMarcel Moolenaar         config["regexp"] = t->regexp;
490c243e490SMarcel Moolenaar         config["string"] = t->string;
491c243e490SMarcel Moolenaar 
492c243e490SMarcel Moolenaar         std::cout << "Checking with " << t->regexp << ", " << t->string
493c243e490SMarcel Moolenaar                   << " and expecting " << (t->ok ? "true" : "false")
494c243e490SMarcel Moolenaar                   << "\n";
495c243e490SMarcel Moolenaar 
496c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_match);
497c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_match) >(config);
498c243e490SMarcel Moolenaar 
499c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
500c243e490SMarcel Moolenaar         if (t->ok) {
501*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
502c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
503c243e490SMarcel Moolenaar         } else {
504*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
505c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
506c243e490SMarcel Moolenaar         }
507c243e490SMarcel Moolenaar 
508c243e490SMarcel Moolenaar         atf::fs::remove(before);
509c243e490SMarcel Moolenaar         if (t->ok)
510c243e490SMarcel Moolenaar             atf::fs::remove(after);
511c243e490SMarcel Moolenaar     }
512c243e490SMarcel Moolenaar }
513c243e490SMarcel Moolenaar 
514c243e490SMarcel Moolenaar ATF_TEST_CASE(require_not_in);
515c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_not_in)
516c243e490SMarcel Moolenaar {
517c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_NOT_IN macro");
518c243e490SMarcel Moolenaar }
519c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_not_in)
520c243e490SMarcel Moolenaar {
521c243e490SMarcel Moolenaar     struct test {
522c243e490SMarcel Moolenaar         const char *value;
523c243e490SMarcel Moolenaar         bool ok;
524c243e490SMarcel Moolenaar     } *t, tests[] = {
525c243e490SMarcel Moolenaar         { "foo", false },
526c243e490SMarcel Moolenaar         { "bar", false },
527c243e490SMarcel Moolenaar         { "baz", false },
528c243e490SMarcel Moolenaar         { "xxx", true },
529c243e490SMarcel Moolenaar         { "fooa", true },
530c243e490SMarcel Moolenaar         { "foo ", true },
531c243e490SMarcel Moolenaar         { NULL, false }
532c243e490SMarcel Moolenaar     };
533c243e490SMarcel Moolenaar 
534c243e490SMarcel Moolenaar     const atf::fs::path before("before");
535c243e490SMarcel Moolenaar     const atf::fs::path after("after");
536c243e490SMarcel Moolenaar 
537c243e490SMarcel Moolenaar     for (t = &tests[0]; t->value != NULL; t++) {
538c243e490SMarcel Moolenaar         atf::tests::vars_map config;
539c243e490SMarcel Moolenaar         config["value"] = t->value;
540c243e490SMarcel Moolenaar 
541c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_not_in);
542c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_not_in) >(config);
543c243e490SMarcel Moolenaar 
544c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
545c243e490SMarcel Moolenaar         if (t->ok) {
546*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
547c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
548c243e490SMarcel Moolenaar         } else {
549*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
550c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
551c243e490SMarcel Moolenaar         }
552c243e490SMarcel Moolenaar 
553c243e490SMarcel Moolenaar         atf::fs::remove(before);
554c243e490SMarcel Moolenaar         if (t->ok)
555c243e490SMarcel Moolenaar             atf::fs::remove(after);
556c243e490SMarcel Moolenaar     }
557c243e490SMarcel Moolenaar }
558c243e490SMarcel Moolenaar 
559c243e490SMarcel Moolenaar ATF_TEST_CASE(require_throw);
560c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_throw)
561c243e490SMarcel Moolenaar {
562c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_THROW macro");
563c243e490SMarcel Moolenaar }
564c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_throw)
565c243e490SMarcel Moolenaar {
566c243e490SMarcel Moolenaar     struct test {
567c243e490SMarcel Moolenaar         const char *what;
568c243e490SMarcel Moolenaar         bool ok;
569c243e490SMarcel Moolenaar         const char *msg;
570c243e490SMarcel Moolenaar     } *t, tests[] = {
571c243e490SMarcel Moolenaar         { "throw_int", false, "unexpected error" },
572c243e490SMarcel Moolenaar         { "throw_rt", true, NULL },
573c243e490SMarcel Moolenaar         { "no_throw_rt", false, "did not throw" },
574c243e490SMarcel Moolenaar         { NULL, false, NULL }
575c243e490SMarcel Moolenaar     };
576c243e490SMarcel Moolenaar 
577c243e490SMarcel Moolenaar     const atf::fs::path before("before");
578c243e490SMarcel Moolenaar     const atf::fs::path after("after");
579c243e490SMarcel Moolenaar 
580c243e490SMarcel Moolenaar     for (t = &tests[0]; t->what != NULL; t++) {
581c243e490SMarcel Moolenaar         atf::tests::vars_map config;
582c243e490SMarcel Moolenaar         config["what"] = t->what;
583c243e490SMarcel Moolenaar 
584c243e490SMarcel Moolenaar         std::cout << "Checking with " << t->what << " and expecting "
585c243e490SMarcel Moolenaar                   << (t->ok ? "true" : "false") << "\n";
586c243e490SMarcel Moolenaar 
587c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_throw);
588c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_throw) >(config);
589c243e490SMarcel Moolenaar 
590c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
591c243e490SMarcel Moolenaar         if (t->ok) {
592*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
593c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
594c243e490SMarcel Moolenaar         } else {
595c243e490SMarcel Moolenaar             std::cout << "Checking that message contains '" << t->msg
596c243e490SMarcel Moolenaar                       << "'\n";
597c243e490SMarcel Moolenaar             std::string exp_result = std::string("^failed: .*") + t->msg;
598*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
599c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
600c243e490SMarcel Moolenaar         }
601c243e490SMarcel Moolenaar 
602c243e490SMarcel Moolenaar         atf::fs::remove(before);
603c243e490SMarcel Moolenaar         if (t->ok)
604c243e490SMarcel Moolenaar             atf::fs::remove(after);
605c243e490SMarcel Moolenaar     }
606c243e490SMarcel Moolenaar }
607c243e490SMarcel Moolenaar 
608c243e490SMarcel Moolenaar ATF_TEST_CASE(require_throw_re);
609c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_throw_re)
610c243e490SMarcel Moolenaar {
611c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_THROW_RE macro");
612c243e490SMarcel Moolenaar }
613c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_throw_re)
614c243e490SMarcel Moolenaar {
615c243e490SMarcel Moolenaar     struct test {
616c243e490SMarcel Moolenaar         const char *what;
617c243e490SMarcel Moolenaar         bool ok;
618c243e490SMarcel Moolenaar         const char *msg;
619c243e490SMarcel Moolenaar     } *t, tests[] = {
620c243e490SMarcel Moolenaar         { "throw_int", false, "unexpected error" },
621c243e490SMarcel Moolenaar         { "throw_rt_match", true, NULL },
622c243e490SMarcel Moolenaar         { "throw_rt_no_match", false,
623c243e490SMarcel Moolenaar           "threw.*runtime_error\\(baz foo bar a\\).*"
624c243e490SMarcel Moolenaar           "does not match 'foo\\.\\*baz'" },
625c243e490SMarcel Moolenaar         { "no_throw_rt", false, "did not throw" },
626c243e490SMarcel Moolenaar         { NULL, false, NULL }
627c243e490SMarcel Moolenaar     };
628c243e490SMarcel Moolenaar 
629c243e490SMarcel Moolenaar     const atf::fs::path before("before");
630c243e490SMarcel Moolenaar     const atf::fs::path after("after");
631c243e490SMarcel Moolenaar 
632c243e490SMarcel Moolenaar     for (t = &tests[0]; t->what != NULL; t++) {
633c243e490SMarcel Moolenaar         atf::tests::vars_map config;
634c243e490SMarcel Moolenaar         config["what"] = t->what;
635c243e490SMarcel Moolenaar 
636c243e490SMarcel Moolenaar         std::cout << "Checking with " << t->what << " and expecting "
637c243e490SMarcel Moolenaar                   << (t->ok ? "true" : "false") << "\n";
638c243e490SMarcel Moolenaar 
639c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_throw_re);
640c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_throw_re) >(config);
641c243e490SMarcel Moolenaar 
642c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
643c243e490SMarcel Moolenaar         if (t->ok) {
644*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
645c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
646c243e490SMarcel Moolenaar         } else {
647c243e490SMarcel Moolenaar             std::cout << "Checking that message contains '" << t->msg
648c243e490SMarcel Moolenaar                       << "'\n";
649c243e490SMarcel Moolenaar             std::string exp_result = std::string("^failed: .*") + t->msg;
650*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
651c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
652c243e490SMarcel Moolenaar         }
653c243e490SMarcel Moolenaar 
654c243e490SMarcel Moolenaar         atf::fs::remove(before);
655c243e490SMarcel Moolenaar         if (t->ok)
656c243e490SMarcel Moolenaar             atf::fs::remove(after);
657c243e490SMarcel Moolenaar     }
658c243e490SMarcel Moolenaar }
659c243e490SMarcel Moolenaar 
660c243e490SMarcel Moolenaar ATF_TEST_CASE(check_errno);
661c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(check_errno)
662c243e490SMarcel Moolenaar {
663c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_CHECK_ERRNO macro");
664c243e490SMarcel Moolenaar }
665c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(check_errno)
666c243e490SMarcel Moolenaar {
667c243e490SMarcel Moolenaar     struct test {
668c243e490SMarcel Moolenaar         const char *what;
669c243e490SMarcel Moolenaar         bool ok;
670c243e490SMarcel Moolenaar         const char *msg;
671c243e490SMarcel Moolenaar     } *t, tests[] = {
672c243e490SMarcel Moolenaar         { "no_error", false,
673c243e490SMarcel Moolenaar           "Expected true value in errno_ok_stub\\(\\) == -1" },
674c243e490SMarcel Moolenaar         { "errno_ok", true, NULL },
675c243e490SMarcel Moolenaar         { "errno_fail", false,
676c243e490SMarcel Moolenaar           "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
677c243e490SMarcel Moolenaar         { NULL, false, NULL }
678c243e490SMarcel Moolenaar     };
679c243e490SMarcel Moolenaar 
680c243e490SMarcel Moolenaar     const atf::fs::path before("before");
681c243e490SMarcel Moolenaar     const atf::fs::path after("after");
682c243e490SMarcel Moolenaar 
683c243e490SMarcel Moolenaar     for (t = &tests[0]; t->what != NULL; t++) {
684c243e490SMarcel Moolenaar         atf::tests::vars_map config;
685c243e490SMarcel Moolenaar         config["what"] = t->what;
686c243e490SMarcel Moolenaar 
687c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_check_errno);
688c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_check_errno) >(config);
689c243e490SMarcel Moolenaar 
690c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
691c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(after));
692c243e490SMarcel Moolenaar 
693c243e490SMarcel Moolenaar         if (t->ok) {
694*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
695c243e490SMarcel Moolenaar         } else {
696*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^failed", "result"));
697c243e490SMarcel Moolenaar 
698c243e490SMarcel Moolenaar             std::string exp_result = "macros_test.cpp:[0-9]+: " +
699c243e490SMarcel Moolenaar                 std::string(t->msg) + "$";
700*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "stderr"));
701c243e490SMarcel Moolenaar         }
702c243e490SMarcel Moolenaar 
703c243e490SMarcel Moolenaar         atf::fs::remove(before);
704c243e490SMarcel Moolenaar         atf::fs::remove(after);
705c243e490SMarcel Moolenaar     }
706c243e490SMarcel Moolenaar }
707c243e490SMarcel Moolenaar 
708c243e490SMarcel Moolenaar ATF_TEST_CASE(require_errno);
709c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_errno)
710c243e490SMarcel Moolenaar {
711c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_ERRNO macro");
712c243e490SMarcel Moolenaar }
713c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_errno)
714c243e490SMarcel Moolenaar {
715c243e490SMarcel Moolenaar     struct test {
716c243e490SMarcel Moolenaar         const char *what;
717c243e490SMarcel Moolenaar         bool ok;
718c243e490SMarcel Moolenaar         const char *msg;
719c243e490SMarcel Moolenaar     } *t, tests[] = {
720c243e490SMarcel Moolenaar         { "no_error", false,
721c243e490SMarcel Moolenaar           "Expected true value in errno_ok_stub\\(\\) == -1" },
722c243e490SMarcel Moolenaar         { "errno_ok", true, NULL },
723c243e490SMarcel Moolenaar         { "errno_fail", false,
724c243e490SMarcel Moolenaar           "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
725c243e490SMarcel Moolenaar         { NULL, false, NULL }
726c243e490SMarcel Moolenaar     };
727c243e490SMarcel Moolenaar 
728c243e490SMarcel Moolenaar     const atf::fs::path before("before");
729c243e490SMarcel Moolenaar     const atf::fs::path after("after");
730c243e490SMarcel Moolenaar 
731c243e490SMarcel Moolenaar     for (t = &tests[0]; t->what != NULL; t++) {
732c243e490SMarcel Moolenaar         atf::tests::vars_map config;
733c243e490SMarcel Moolenaar         config["what"] = t->what;
734c243e490SMarcel Moolenaar 
735c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_errno);
736c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_errno) >(config);
737c243e490SMarcel Moolenaar 
738c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
739c243e490SMarcel Moolenaar         if (t->ok) {
740*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
741c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
742c243e490SMarcel Moolenaar         } else {
743c243e490SMarcel Moolenaar             std::string exp_result = "^failed: .*macros_test.cpp:[0-9]+: " +
744c243e490SMarcel Moolenaar                 std::string(t->msg) + "$";
745*a18eacbeSJulio Merino             ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
746c243e490SMarcel Moolenaar 
747c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
748c243e490SMarcel Moolenaar         }
749c243e490SMarcel Moolenaar 
750c243e490SMarcel Moolenaar         atf::fs::remove(before);
751c243e490SMarcel Moolenaar         if (t->ok)
752c243e490SMarcel Moolenaar             atf::fs::remove(after);
753c243e490SMarcel Moolenaar     }
754c243e490SMarcel Moolenaar }
755c243e490SMarcel Moolenaar 
756c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
757c243e490SMarcel Moolenaar // Tests cases for the header file.
758c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
759c243e490SMarcel Moolenaar 
760c243e490SMarcel Moolenaar HEADER_TC(include, "atf-c++/macros.hpp");
761c243e490SMarcel Moolenaar BUILD_TC(use, "macros_hpp_test.cpp",
762c243e490SMarcel Moolenaar          "Tests that the macros provided by the atf-c++/macros.hpp file "
763c243e490SMarcel Moolenaar          "do not cause syntax errors when used",
764c243e490SMarcel Moolenaar          "Build of macros_hpp_test.cpp failed; some macros in "
765c243e490SMarcel Moolenaar          "atf-c++/macros.hpp are broken");
766c243e490SMarcel Moolenaar BUILD_TC_FAIL(detect_unused_tests, "unused_test.cpp",
767c243e490SMarcel Moolenaar          "Tests that defining an unused test case raises a warning (and thus "
768c243e490SMarcel Moolenaar          "an error)",
769c243e490SMarcel Moolenaar          "Build of unused_test.cpp passed; unused test cases are not properly "
770c243e490SMarcel Moolenaar          "detected");
771c243e490SMarcel Moolenaar 
772c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
773c243e490SMarcel Moolenaar // Main.
774c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
775c243e490SMarcel Moolenaar 
776c243e490SMarcel Moolenaar ATF_INIT_TEST_CASES(tcs)
777c243e490SMarcel Moolenaar {
778c243e490SMarcel Moolenaar     // Add the test cases for the macros.
779c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, pass);
780c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, fail);
781c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, skip);
782c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, check_errno);
783c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require);
784c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_eq);
785c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_in);
786c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_match);
787c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_not_in);
788c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_throw);
789c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_throw_re);
790c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_errno);
791c243e490SMarcel Moolenaar 
792c243e490SMarcel Moolenaar     // Add the test cases for the header file.
793c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, include);
794c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, use);
795c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, detect_unused_tests);
796c243e490SMarcel Moolenaar }
797