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