xref: /freebsd/contrib/atf/atf-c++/utils_test.cpp (revision a18eacbefdfa1085ca3db829e86ece78cd416493)
1c243e490SMarcel Moolenaar //
2c243e490SMarcel Moolenaar // Automated Testing Framework (atf)
3c243e490SMarcel Moolenaar //
4c243e490SMarcel Moolenaar // Copyright (c) 2007 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 
30*a18eacbeSJulio Merino extern "C" {
31*a18eacbeSJulio Merino #include <sys/stat.h>
32*a18eacbeSJulio Merino #include <sys/wait.h>
33c243e490SMarcel Moolenaar 
34*a18eacbeSJulio Merino #include <fcntl.h>
35*a18eacbeSJulio Merino #include <unistd.h>
36*a18eacbeSJulio Merino }
37*a18eacbeSJulio Merino 
38*a18eacbeSJulio Merino #include <cstdlib>
39*a18eacbeSJulio Merino #include <iostream>
40*a18eacbeSJulio Merino #include <set>
41*a18eacbeSJulio Merino #include <string>
42*a18eacbeSJulio Merino #include <vector>
43c243e490SMarcel Moolenaar 
44c243e490SMarcel Moolenaar #include "macros.hpp"
45c243e490SMarcel Moolenaar #include "utils.hpp"
46c243e490SMarcel Moolenaar 
47c243e490SMarcel Moolenaar #include "detail/test_helpers.hpp"
48c243e490SMarcel Moolenaar 
49*a18eacbeSJulio Merino static std::string
50*a18eacbeSJulio Merino read_file(const char *path)
51*a18eacbeSJulio Merino {
52*a18eacbeSJulio Merino     char buffer[1024];
53*a18eacbeSJulio Merino 
54*a18eacbeSJulio Merino     const int fd = open(path, O_RDONLY);
55*a18eacbeSJulio Merino     if (fd == -1)
56*a18eacbeSJulio Merino         ATF_FAIL("Cannot open " + std::string(path));
57*a18eacbeSJulio Merino     const ssize_t length = read(fd, buffer, sizeof(buffer) - 1);
58*a18eacbeSJulio Merino     close(fd);
59*a18eacbeSJulio Merino     ATF_REQUIRE(length != -1);
60*a18eacbeSJulio Merino     if (length == sizeof(buffer) - 1)
61*a18eacbeSJulio Merino         ATF_FAIL("Internal buffer not long enough to read temporary file");
62*a18eacbeSJulio Merino     ((char *)buffer)[length] = '\0';
63*a18eacbeSJulio Merino 
64*a18eacbeSJulio Merino     return buffer;
65*a18eacbeSJulio Merino }
66*a18eacbeSJulio Merino 
67c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
68*a18eacbeSJulio Merino // Tests cases for the free functions.
69c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
70c243e490SMarcel Moolenaar 
71*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(cat_file__empty);
72*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(cat_file__empty)
73c243e490SMarcel Moolenaar {
74*a18eacbeSJulio Merino     atf::utils::create_file("file.txt", "");
75*a18eacbeSJulio Merino     atf::utils::redirect(STDOUT_FILENO, "captured.txt");
76*a18eacbeSJulio Merino     atf::utils::cat_file("file.txt", "PREFIX");
77*a18eacbeSJulio Merino     std::cout.flush();
78*a18eacbeSJulio Merino     close(STDOUT_FILENO);
79*a18eacbeSJulio Merino 
80*a18eacbeSJulio Merino     ATF_REQUIRE_EQ("", read_file("captured.txt"));
81c243e490SMarcel Moolenaar }
82c243e490SMarcel Moolenaar 
83*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(cat_file__one_line);
84*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(cat_file__one_line)
85c243e490SMarcel Moolenaar {
86*a18eacbeSJulio Merino     atf::utils::create_file("file.txt", "This is a single line\n");
87*a18eacbeSJulio Merino     atf::utils::redirect(STDOUT_FILENO, "captured.txt");
88*a18eacbeSJulio Merino     atf::utils::cat_file("file.txt", "PREFIX");
89*a18eacbeSJulio Merino     std::cout.flush();
90*a18eacbeSJulio Merino     close(STDOUT_FILENO);
91*a18eacbeSJulio Merino 
92*a18eacbeSJulio Merino     ATF_REQUIRE_EQ("PREFIXThis is a single line\n", read_file("captured.txt"));
93c243e490SMarcel Moolenaar }
94c243e490SMarcel Moolenaar 
95*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(cat_file__several_lines);
96*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(cat_file__several_lines)
97c243e490SMarcel Moolenaar {
98*a18eacbeSJulio Merino     atf::utils::create_file("file.txt", "First\nSecond line\nAnd third\n");
99*a18eacbeSJulio Merino     atf::utils::redirect(STDOUT_FILENO, "captured.txt");
100*a18eacbeSJulio Merino     atf::utils::cat_file("file.txt", ">");
101*a18eacbeSJulio Merino     std::cout.flush();
102*a18eacbeSJulio Merino     close(STDOUT_FILENO);
103*a18eacbeSJulio Merino 
104*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(">First\n>Second line\n>And third\n",
105*a18eacbeSJulio Merino                    read_file("captured.txt"));
106c243e490SMarcel Moolenaar }
107c243e490SMarcel Moolenaar 
108*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(cat_file__no_newline_eof);
109*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(cat_file__no_newline_eof)
110c243e490SMarcel Moolenaar {
111*a18eacbeSJulio Merino     atf::utils::create_file("file.txt", "Foo\n bar baz");
112*a18eacbeSJulio Merino     atf::utils::redirect(STDOUT_FILENO, "captured.txt");
113*a18eacbeSJulio Merino     atf::utils::cat_file("file.txt", "PREFIX");
114*a18eacbeSJulio Merino     std::cout.flush();
115*a18eacbeSJulio Merino     close(STDOUT_FILENO);
116*a18eacbeSJulio Merino 
117*a18eacbeSJulio Merino     ATF_REQUIRE_EQ("PREFIXFoo\nPREFIX bar baz", read_file("captured.txt"));
118c243e490SMarcel Moolenaar }
119c243e490SMarcel Moolenaar 
120*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(compare_file__empty__match);
121*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(compare_file__empty__match)
122c243e490SMarcel Moolenaar {
123*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", "");
124*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::compare_file("test.txt", ""));
125c243e490SMarcel Moolenaar }
126c243e490SMarcel Moolenaar 
127*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(compare_file__empty__not_match);
128*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(compare_file__empty__not_match)
129c243e490SMarcel Moolenaar {
130*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", "");
131*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", "\n"));
132*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", "foo"));
133*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", " "));
134c243e490SMarcel Moolenaar }
135c243e490SMarcel Moolenaar 
136*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(compare_file__short__match);
137*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(compare_file__short__match)
138c243e490SMarcel Moolenaar {
139*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", "this is a short file");
140*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::compare_file("test.txt", "this is a short file"));
141c243e490SMarcel Moolenaar }
142c243e490SMarcel Moolenaar 
143*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(compare_file__short__not_match);
144*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(compare_file__short__not_match)
145c243e490SMarcel Moolenaar {
146*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", "this is a short file");
147*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", ""));
148*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", "\n"));
149*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", "this is a Short file"));
150*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", "this is a short fil"));
151*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", "this is a short file "));
152c243e490SMarcel Moolenaar }
153c243e490SMarcel Moolenaar 
154*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(compare_file__long__match);
155*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(compare_file__long__match)
156c243e490SMarcel Moolenaar {
157*a18eacbeSJulio Merino     char long_contents[3456];
158*a18eacbeSJulio Merino     size_t i = 0;
159*a18eacbeSJulio Merino     for (; i < sizeof(long_contents) - 1; i++)
160*a18eacbeSJulio Merino         long_contents[i] = '0' + (i % 10);
161*a18eacbeSJulio Merino     long_contents[i] = '\0';
162*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", long_contents);
163c243e490SMarcel Moolenaar 
164*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::compare_file("test.txt", long_contents));
165c243e490SMarcel Moolenaar }
166c243e490SMarcel Moolenaar 
167*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(compare_file__long__not_match);
168*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(compare_file__long__not_match)
169c243e490SMarcel Moolenaar {
170*a18eacbeSJulio Merino     char long_contents[3456];
171*a18eacbeSJulio Merino     size_t i = 0;
172*a18eacbeSJulio Merino     for (; i < sizeof(long_contents) - 1; i++)
173*a18eacbeSJulio Merino         long_contents[i] = '0' + (i % 10);
174*a18eacbeSJulio Merino     long_contents[i] = '\0';
175*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", long_contents);
176c243e490SMarcel Moolenaar 
177*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", ""));
178*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", "\n"));
179*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", "0123456789"));
180*a18eacbeSJulio Merino     long_contents[i - 1] = 'Z';
181*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::compare_file("test.txt", long_contents));
182c243e490SMarcel Moolenaar }
183c243e490SMarcel Moolenaar 
184*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(copy_file__empty);
185*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(copy_file__empty)
186c243e490SMarcel Moolenaar {
187*a18eacbeSJulio Merino     atf::utils::create_file("src.txt", "");
188*a18eacbeSJulio Merino     ATF_REQUIRE(chmod("src.txt", 0520) != -1);
189c243e490SMarcel Moolenaar 
190*a18eacbeSJulio Merino     atf::utils::copy_file("src.txt", "dest.txt");
191*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::compare_file("dest.txt", ""));
192*a18eacbeSJulio Merino     struct stat sb;
193*a18eacbeSJulio Merino     ATF_REQUIRE(stat("dest.txt", &sb) != -1);
194*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(0520, sb.st_mode & 0xfff);
195c243e490SMarcel Moolenaar }
196c243e490SMarcel Moolenaar 
197*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(copy_file__some_contents);
198*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(copy_file__some_contents)
199c243e490SMarcel Moolenaar {
200*a18eacbeSJulio Merino     atf::utils::create_file("src.txt", "This is a\ntest file\n");
201*a18eacbeSJulio Merino     atf::utils::copy_file("src.txt", "dest.txt");
202*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::compare_file("dest.txt", "This is a\ntest file\n"));
203c243e490SMarcel Moolenaar }
204c243e490SMarcel Moolenaar 
205*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(create_file);
206*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(create_file)
207c243e490SMarcel Moolenaar {
208*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", "This is a %d test");
209*a18eacbeSJulio Merino 
210*a18eacbeSJulio Merino     ATF_REQUIRE_EQ("This is a %d test", read_file("test.txt"));
211c243e490SMarcel Moolenaar }
212*a18eacbeSJulio Merino 
213*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(file_exists);
214*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(file_exists)
215c243e490SMarcel Moolenaar {
216*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", "foo");
217c243e490SMarcel Moolenaar 
218*a18eacbeSJulio Merino     ATF_REQUIRE( atf::utils::file_exists("test.txt"));
219*a18eacbeSJulio Merino     ATF_REQUIRE( atf::utils::file_exists("./test.txt"));
220*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::file_exists("./test.tx"));
221*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::file_exists("test.txt2"));
222*a18eacbeSJulio Merino }
223c243e490SMarcel Moolenaar 
224*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(fork);
225*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(fork)
226*a18eacbeSJulio Merino {
227*a18eacbeSJulio Merino     std::cout << "Should not get into child\n";
228*a18eacbeSJulio Merino     std::cerr << "Should not get into child\n";
229*a18eacbeSJulio Merino     pid_t pid = atf::utils::fork();
230*a18eacbeSJulio Merino     if (pid == 0) {
231*a18eacbeSJulio Merino         std::cout << "Child stdout\n";
232*a18eacbeSJulio Merino         std::cerr << "Child stderr\n";
233*a18eacbeSJulio Merino         exit(EXIT_SUCCESS);
234*a18eacbeSJulio Merino     }
235c243e490SMarcel Moolenaar 
236*a18eacbeSJulio Merino     int status;
237*a18eacbeSJulio Merino     ATF_REQUIRE(waitpid(pid, &status, 0) != -1);
238*a18eacbeSJulio Merino     ATF_REQUIRE(WIFEXITED(status));
239*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status));
240*a18eacbeSJulio Merino 
241*a18eacbeSJulio Merino     ATF_REQUIRE_EQ("Child stdout\n", read_file("atf_utils_fork_out.txt"));
242*a18eacbeSJulio Merino     ATF_REQUIRE_EQ("Child stderr\n", read_file("atf_utils_fork_err.txt"));
243*a18eacbeSJulio Merino }
244*a18eacbeSJulio Merino 
245*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(grep_collection__set);
246*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(grep_collection__set)
247*a18eacbeSJulio Merino {
248*a18eacbeSJulio Merino     std::set< std::string > strings;
249*a18eacbeSJulio Merino     strings.insert("First");
250*a18eacbeSJulio Merino     strings.insert("Second");
251*a18eacbeSJulio Merino 
252*a18eacbeSJulio Merino     ATF_REQUIRE( atf::utils::grep_collection("irs", strings));
253*a18eacbeSJulio Merino     ATF_REQUIRE( atf::utils::grep_collection("cond", strings));
254*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::grep_collection("Third", strings));
255*a18eacbeSJulio Merino }
256*a18eacbeSJulio Merino 
257*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(grep_collection__vector);
258*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(grep_collection__vector)
259*a18eacbeSJulio Merino {
260*a18eacbeSJulio Merino     std::vector< std::string > strings;
261*a18eacbeSJulio Merino     strings.push_back("First");
262*a18eacbeSJulio Merino     strings.push_back("Second");
263*a18eacbeSJulio Merino 
264*a18eacbeSJulio Merino     ATF_REQUIRE( atf::utils::grep_collection("irs", strings));
265*a18eacbeSJulio Merino     ATF_REQUIRE( atf::utils::grep_collection("cond", strings));
266*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::grep_collection("Third", strings));
267*a18eacbeSJulio Merino }
268*a18eacbeSJulio Merino 
269*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(grep_file);
270*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(grep_file)
271*a18eacbeSJulio Merino {
272*a18eacbeSJulio Merino     atf::utils::create_file("test.txt", "line1\nthe second line\naaaabbbb\n");
273*a18eacbeSJulio Merino 
274*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_file("line1", "test.txt"));
275*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_file("second line", "test.txt"));
276*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_file("aa.*bb", "test.txt"));
277*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::grep_file("foo", "test.txt"));
278*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::grep_file("bar", "test.txt"));
279*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::grep_file("aaaaa", "test.txt"));
280*a18eacbeSJulio Merino }
281*a18eacbeSJulio Merino 
282*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(grep_string);
283*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(grep_string)
284*a18eacbeSJulio Merino {
285*a18eacbeSJulio Merino     const char *str = "a string - aaaabbbb";
286*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_string("a string", str));
287*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_string("^a string", str));
288*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_string("aaaabbbb$", str));
289*a18eacbeSJulio Merino     ATF_REQUIRE(atf::utils::grep_string("aa.*bb", str));
290*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::grep_string("foo", str));
291*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::grep_string("bar", str));
292*a18eacbeSJulio Merino     ATF_REQUIRE(!atf::utils::grep_string("aaaaa", str));
293*a18eacbeSJulio Merino }
294*a18eacbeSJulio Merino 
295*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(redirect__stdout);
296*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(redirect__stdout)
297*a18eacbeSJulio Merino {
298*a18eacbeSJulio Merino     std::cout << "Buffer this";
299*a18eacbeSJulio Merino     atf::utils::redirect(STDOUT_FILENO, "captured.txt");
300*a18eacbeSJulio Merino     std::cout << "The printed message";
301*a18eacbeSJulio Merino     std::cout.flush();
302*a18eacbeSJulio Merino 
303*a18eacbeSJulio Merino     ATF_REQUIRE_EQ("The printed message", read_file("captured.txt"));
304*a18eacbeSJulio Merino }
305*a18eacbeSJulio Merino 
306*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(redirect__stderr);
307*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(redirect__stderr)
308*a18eacbeSJulio Merino {
309*a18eacbeSJulio Merino     std::cerr << "Buffer this";
310*a18eacbeSJulio Merino     atf::utils::redirect(STDERR_FILENO, "captured.txt");
311*a18eacbeSJulio Merino     std::cerr << "The printed message";
312*a18eacbeSJulio Merino     std::cerr.flush();
313*a18eacbeSJulio Merino 
314*a18eacbeSJulio Merino     ATF_REQUIRE_EQ("The printed message", read_file("captured.txt"));
315*a18eacbeSJulio Merino }
316*a18eacbeSJulio Merino 
317*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(redirect__other);
318*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(redirect__other)
319*a18eacbeSJulio Merino {
320*a18eacbeSJulio Merino     const std::string message = "Foo bar\nbaz\n";
321*a18eacbeSJulio Merino     atf::utils::redirect(15, "captured.txt");
322*a18eacbeSJulio Merino     ATF_REQUIRE(write(15, message.c_str(), message.length()) != -1);
323*a18eacbeSJulio Merino     close(15);
324*a18eacbeSJulio Merino 
325*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(message, read_file("captured.txt"));
326*a18eacbeSJulio Merino }
327*a18eacbeSJulio Merino 
328*a18eacbeSJulio Merino static void
329*a18eacbeSJulio Merino fork_and_wait(const int exitstatus, const char* expout, const char* experr)
330*a18eacbeSJulio Merino {
331*a18eacbeSJulio Merino     const pid_t pid = atf::utils::fork();
332*a18eacbeSJulio Merino     if (pid == 0) {
333*a18eacbeSJulio Merino         std::cout << "Some output\n";
334*a18eacbeSJulio Merino         std::cerr << "Some error\n";
335*a18eacbeSJulio Merino         exit(123);
336*a18eacbeSJulio Merino     }
337*a18eacbeSJulio Merino     atf::utils::wait(pid, exitstatus, expout, experr);
338*a18eacbeSJulio Merino     exit(EXIT_SUCCESS);
339*a18eacbeSJulio Merino }
340*a18eacbeSJulio Merino 
341*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(wait__ok);
342*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(wait__ok)
343*a18eacbeSJulio Merino {
344*a18eacbeSJulio Merino     const pid_t control = fork();
345*a18eacbeSJulio Merino     ATF_REQUIRE(control != -1);
346*a18eacbeSJulio Merino     if (control == 0)
347*a18eacbeSJulio Merino         fork_and_wait(123, "Some output\n", "Some error\n");
348*a18eacbeSJulio Merino     else {
349*a18eacbeSJulio Merino         int status;
350*a18eacbeSJulio Merino         ATF_REQUIRE(waitpid(control, &status, 0) != -1);
351*a18eacbeSJulio Merino         ATF_REQUIRE(WIFEXITED(status));
352*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status));
353*a18eacbeSJulio Merino     }
354*a18eacbeSJulio Merino }
355*a18eacbeSJulio Merino 
356*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(wait__invalid_exitstatus);
357*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(wait__invalid_exitstatus)
358*a18eacbeSJulio Merino {
359*a18eacbeSJulio Merino     const pid_t control = fork();
360*a18eacbeSJulio Merino     ATF_REQUIRE(control != -1);
361*a18eacbeSJulio Merino     if (control == 0)
362*a18eacbeSJulio Merino         fork_and_wait(120, "Some output\n", "Some error\n");
363*a18eacbeSJulio Merino     else {
364*a18eacbeSJulio Merino         int status;
365*a18eacbeSJulio Merino         ATF_REQUIRE(waitpid(control, &status, 0) != -1);
366*a18eacbeSJulio Merino         ATF_REQUIRE(WIFEXITED(status));
367*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status));
368*a18eacbeSJulio Merino     }
369*a18eacbeSJulio Merino }
370*a18eacbeSJulio Merino 
371*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(wait__invalid_stdout);
372*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(wait__invalid_stdout)
373*a18eacbeSJulio Merino {
374*a18eacbeSJulio Merino     const pid_t control = fork();
375*a18eacbeSJulio Merino     ATF_REQUIRE(control != -1);
376*a18eacbeSJulio Merino     if (control == 0)
377*a18eacbeSJulio Merino         fork_and_wait(123, "Some output foo\n", "Some error\n");
378*a18eacbeSJulio Merino     else {
379*a18eacbeSJulio Merino         int status;
380*a18eacbeSJulio Merino         ATF_REQUIRE(waitpid(control, &status, 0) != -1);
381*a18eacbeSJulio Merino         ATF_REQUIRE(WIFEXITED(status));
382*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status));
383*a18eacbeSJulio Merino     }
384*a18eacbeSJulio Merino }
385*a18eacbeSJulio Merino 
386*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(wait__invalid_stderr);
387*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(wait__invalid_stderr)
388*a18eacbeSJulio Merino {
389*a18eacbeSJulio Merino     const pid_t control = fork();
390*a18eacbeSJulio Merino     ATF_REQUIRE(control != -1);
391*a18eacbeSJulio Merino     if (control == 0)
392*a18eacbeSJulio Merino         fork_and_wait(123, "Some output\n", "Some error foo\n");
393*a18eacbeSJulio Merino     else {
394*a18eacbeSJulio Merino         int status;
395*a18eacbeSJulio Merino         ATF_REQUIRE(waitpid(control, &status, 0) != -1);
396*a18eacbeSJulio Merino         ATF_REQUIRE(WIFEXITED(status));
397*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status));
398*a18eacbeSJulio Merino     }
399*a18eacbeSJulio Merino }
400*a18eacbeSJulio Merino 
401*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(wait__save_stdout);
402*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(wait__save_stdout)
403*a18eacbeSJulio Merino {
404*a18eacbeSJulio Merino     const pid_t control = fork();
405*a18eacbeSJulio Merino     ATF_REQUIRE(control != -1);
406*a18eacbeSJulio Merino     if (control == 0)
407*a18eacbeSJulio Merino         fork_and_wait(123, "save:my-output.txt", "Some error\n");
408*a18eacbeSJulio Merino     else {
409*a18eacbeSJulio Merino         int status;
410*a18eacbeSJulio Merino         ATF_REQUIRE(waitpid(control, &status, 0) != -1);
411*a18eacbeSJulio Merino         ATF_REQUIRE(WIFEXITED(status));
412*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status));
413*a18eacbeSJulio Merino 
414*a18eacbeSJulio Merino         ATF_REQUIRE(atf::utils::compare_file("my-output.txt", "Some output\n"));
415*a18eacbeSJulio Merino     }
416*a18eacbeSJulio Merino }
417*a18eacbeSJulio Merino 
418*a18eacbeSJulio Merino ATF_TEST_CASE_WITHOUT_HEAD(wait__save_stderr);
419*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(wait__save_stderr)
420*a18eacbeSJulio Merino {
421*a18eacbeSJulio Merino     const pid_t control = fork();
422*a18eacbeSJulio Merino     ATF_REQUIRE(control != -1);
423*a18eacbeSJulio Merino     if (control == 0)
424*a18eacbeSJulio Merino         fork_and_wait(123, "Some output\n", "save:my-output.txt");
425*a18eacbeSJulio Merino     else {
426*a18eacbeSJulio Merino         int status;
427*a18eacbeSJulio Merino         ATF_REQUIRE(waitpid(control, &status, 0) != -1);
428*a18eacbeSJulio Merino         ATF_REQUIRE(WIFEXITED(status));
429*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status));
430*a18eacbeSJulio Merino 
431*a18eacbeSJulio Merino         ATF_REQUIRE(atf::utils::compare_file("my-output.txt", "Some error\n"));
432*a18eacbeSJulio Merino     }
433c243e490SMarcel Moolenaar }
434c243e490SMarcel Moolenaar 
435c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
436c243e490SMarcel Moolenaar // Tests cases for the header file.
437c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
438c243e490SMarcel Moolenaar 
439c243e490SMarcel Moolenaar HEADER_TC(include, "atf-c++/utils.hpp");
440c243e490SMarcel Moolenaar 
441c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
442c243e490SMarcel Moolenaar // Main.
443c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
444c243e490SMarcel Moolenaar 
445c243e490SMarcel Moolenaar ATF_INIT_TEST_CASES(tcs)
446c243e490SMarcel Moolenaar {
447*a18eacbeSJulio Merino     // Add the test for the free functions.
448*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, cat_file__empty);
449*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, cat_file__one_line);
450*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, cat_file__several_lines);
451*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, cat_file__no_newline_eof);
452*a18eacbeSJulio Merino 
453*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, compare_file__empty__match);
454*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, compare_file__empty__not_match);
455*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, compare_file__short__match);
456*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, compare_file__short__not_match);
457*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, compare_file__long__match);
458*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, compare_file__long__not_match);
459*a18eacbeSJulio Merino 
460*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, copy_file__empty);
461*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, copy_file__some_contents);
462*a18eacbeSJulio Merino 
463*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, create_file);
464*a18eacbeSJulio Merino 
465*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, file_exists);
466*a18eacbeSJulio Merino 
467*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, fork);
468*a18eacbeSJulio Merino 
469*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, grep_collection__set);
470*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, grep_collection__vector);
471*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, grep_file);
472*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, grep_string);
473*a18eacbeSJulio Merino 
474*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, redirect__stdout);
475*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, redirect__stderr);
476*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, redirect__other);
477*a18eacbeSJulio Merino 
478*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, wait__ok);
479*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, wait__invalid_exitstatus);
480*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, wait__invalid_stdout);
481*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, wait__invalid_stderr);
482*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, wait__save_stdout);
483*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, wait__save_stderr);
484c243e490SMarcel Moolenaar 
485c243e490SMarcel Moolenaar     // Add the test cases for the header file.
486c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, include);
487c243e490SMarcel Moolenaar }
488