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