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