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