1*c243e490SMarcel Moolenaar // 2*c243e490SMarcel Moolenaar // Automated Testing Framework (atf) 3*c243e490SMarcel Moolenaar // 4*c243e490SMarcel Moolenaar // Copyright (c) 2007 The NetBSD Foundation, Inc. 5*c243e490SMarcel Moolenaar // All rights reserved. 6*c243e490SMarcel Moolenaar // 7*c243e490SMarcel Moolenaar // Redistribution and use in source and binary forms, with or without 8*c243e490SMarcel Moolenaar // modification, are permitted provided that the following conditions 9*c243e490SMarcel Moolenaar // are met: 10*c243e490SMarcel Moolenaar // 1. Redistributions of source code must retain the above copyright 11*c243e490SMarcel Moolenaar // notice, this list of conditions and the following disclaimer. 12*c243e490SMarcel Moolenaar // 2. Redistributions in binary form must reproduce the above copyright 13*c243e490SMarcel Moolenaar // notice, this list of conditions and the following disclaimer in the 14*c243e490SMarcel Moolenaar // documentation and/or other materials provided with the distribution. 15*c243e490SMarcel Moolenaar // 16*c243e490SMarcel Moolenaar // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17*c243e490SMarcel Moolenaar // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18*c243e490SMarcel Moolenaar // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*c243e490SMarcel Moolenaar // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*c243e490SMarcel Moolenaar // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21*c243e490SMarcel Moolenaar // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*c243e490SMarcel Moolenaar // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23*c243e490SMarcel Moolenaar // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*c243e490SMarcel Moolenaar // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25*c243e490SMarcel Moolenaar // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26*c243e490SMarcel Moolenaar // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27*c243e490SMarcel Moolenaar // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*c243e490SMarcel Moolenaar // 29*c243e490SMarcel Moolenaar 30*c243e490SMarcel Moolenaar extern "C" { 31*c243e490SMarcel Moolenaar #include <fcntl.h> 32*c243e490SMarcel Moolenaar #include <signal.h> 33*c243e490SMarcel Moolenaar #include <unistd.h> 34*c243e490SMarcel Moolenaar } 35*c243e490SMarcel Moolenaar 36*c243e490SMarcel Moolenaar #include <cstdlib> 37*c243e490SMarcel Moolenaar #include <cstring> 38*c243e490SMarcel Moolenaar #include <fstream> 39*c243e490SMarcel Moolenaar #include <iostream> 40*c243e490SMarcel Moolenaar #include <list> 41*c243e490SMarcel Moolenaar #include <memory> 42*c243e490SMarcel Moolenaar #include <vector> 43*c243e490SMarcel Moolenaar 44*c243e490SMarcel Moolenaar #include <atf-c++.hpp> 45*c243e490SMarcel Moolenaar 46*c243e490SMarcel Moolenaar #include "check.hpp" 47*c243e490SMarcel Moolenaar #include "config.hpp" 48*c243e490SMarcel Moolenaar #include "utils.hpp" 49*c243e490SMarcel Moolenaar 50*c243e490SMarcel Moolenaar #include "detail/fs.hpp" 51*c243e490SMarcel Moolenaar #include "detail/process.hpp" 52*c243e490SMarcel Moolenaar #include "detail/test_helpers.hpp" 53*c243e490SMarcel Moolenaar #include "detail/text.hpp" 54*c243e490SMarcel Moolenaar 55*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 56*c243e490SMarcel Moolenaar // Auxiliary functions. 57*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 58*c243e490SMarcel Moolenaar 59*c243e490SMarcel Moolenaar static 60*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > 61*c243e490SMarcel Moolenaar do_exec(const atf::tests::tc* tc, const char* helper_name) 62*c243e490SMarcel Moolenaar { 63*c243e490SMarcel Moolenaar std::vector< std::string > argv; 64*c243e490SMarcel Moolenaar argv.push_back(get_process_helpers_path(*tc).str()); 65*c243e490SMarcel Moolenaar argv.push_back(helper_name); 66*c243e490SMarcel Moolenaar std::cout << "Executing " << argv[0] << " " << argv[1] << "\n"; 67*c243e490SMarcel Moolenaar 68*c243e490SMarcel Moolenaar atf::process::argv_array argva(argv); 69*c243e490SMarcel Moolenaar return atf::check::exec(argva); 70*c243e490SMarcel Moolenaar } 71*c243e490SMarcel Moolenaar 72*c243e490SMarcel Moolenaar static 73*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > 74*c243e490SMarcel Moolenaar do_exec(const atf::tests::tc* tc, const char* helper_name, const char *carg2) 75*c243e490SMarcel Moolenaar { 76*c243e490SMarcel Moolenaar std::vector< std::string > argv; 77*c243e490SMarcel Moolenaar argv.push_back(get_process_helpers_path(*tc).str()); 78*c243e490SMarcel Moolenaar argv.push_back(helper_name); 79*c243e490SMarcel Moolenaar argv.push_back(carg2); 80*c243e490SMarcel Moolenaar std::cout << "Executing " << argv[0] << " " << argv[1] << " " 81*c243e490SMarcel Moolenaar << argv[2] << "\n"; 82*c243e490SMarcel Moolenaar 83*c243e490SMarcel Moolenaar atf::process::argv_array argva(argv); 84*c243e490SMarcel Moolenaar return atf::check::exec(argva); 85*c243e490SMarcel Moolenaar } 86*c243e490SMarcel Moolenaar 87*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 88*c243e490SMarcel Moolenaar // Helper test cases for the free functions. 89*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 90*c243e490SMarcel Moolenaar 91*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_build_c_o_ok); 92*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_build_c_o_ok) 93*c243e490SMarcel Moolenaar { 94*c243e490SMarcel Moolenaar set_md_var("descr", "Helper test case for build_c_o"); 95*c243e490SMarcel Moolenaar } 96*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_build_c_o_ok) 97*c243e490SMarcel Moolenaar { 98*c243e490SMarcel Moolenaar std::ofstream sfile("test.c"); 99*c243e490SMarcel Moolenaar sfile << "#include <stdio.h>\n"; 100*c243e490SMarcel Moolenaar sfile.close(); 101*c243e490SMarcel Moolenaar 102*c243e490SMarcel Moolenaar ATF_REQUIRE(atf::check::build_c_o("test.c", "test.o", 103*c243e490SMarcel Moolenaar atf::process::argv_array())); 104*c243e490SMarcel Moolenaar } 105*c243e490SMarcel Moolenaar 106*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_build_c_o_fail); 107*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_build_c_o_fail) 108*c243e490SMarcel Moolenaar { 109*c243e490SMarcel Moolenaar set_md_var("descr", "Helper test case for build_c_o"); 110*c243e490SMarcel Moolenaar } 111*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_build_c_o_fail) 112*c243e490SMarcel Moolenaar { 113*c243e490SMarcel Moolenaar std::ofstream sfile("test.c"); 114*c243e490SMarcel Moolenaar sfile << "void foo(void) { int a = UNDEFINED_SYMBOL; }\n"; 115*c243e490SMarcel Moolenaar sfile.close(); 116*c243e490SMarcel Moolenaar 117*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf::check::build_c_o("test.c", "test.o", 118*c243e490SMarcel Moolenaar atf::process::argv_array())); 119*c243e490SMarcel Moolenaar } 120*c243e490SMarcel Moolenaar 121*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_build_cpp_ok); 122*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_build_cpp_ok) 123*c243e490SMarcel Moolenaar { 124*c243e490SMarcel Moolenaar set_md_var("descr", "Helper test case for build_cpp"); 125*c243e490SMarcel Moolenaar } 126*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_build_cpp_ok) 127*c243e490SMarcel Moolenaar { 128*c243e490SMarcel Moolenaar std::ofstream sfile("test.c"); 129*c243e490SMarcel Moolenaar sfile << "#define A foo\n"; 130*c243e490SMarcel Moolenaar sfile << "#define B bar\n"; 131*c243e490SMarcel Moolenaar sfile << "A B\n"; 132*c243e490SMarcel Moolenaar sfile.close(); 133*c243e490SMarcel Moolenaar 134*c243e490SMarcel Moolenaar ATF_REQUIRE(atf::check::build_cpp("test.c", "test.p", 135*c243e490SMarcel Moolenaar atf::process::argv_array())); 136*c243e490SMarcel Moolenaar } 137*c243e490SMarcel Moolenaar 138*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_build_cpp_fail); 139*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_build_cpp_fail) 140*c243e490SMarcel Moolenaar { 141*c243e490SMarcel Moolenaar set_md_var("descr", "Helper test case for build_cpp"); 142*c243e490SMarcel Moolenaar } 143*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_build_cpp_fail) 144*c243e490SMarcel Moolenaar { 145*c243e490SMarcel Moolenaar std::ofstream sfile("test.c"); 146*c243e490SMarcel Moolenaar sfile << "#include \"./non-existent.h\"\n"; 147*c243e490SMarcel Moolenaar sfile.close(); 148*c243e490SMarcel Moolenaar 149*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf::check::build_cpp("test.c", "test.p", 150*c243e490SMarcel Moolenaar atf::process::argv_array())); 151*c243e490SMarcel Moolenaar } 152*c243e490SMarcel Moolenaar 153*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_build_cxx_o_ok); 154*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_build_cxx_o_ok) 155*c243e490SMarcel Moolenaar { 156*c243e490SMarcel Moolenaar set_md_var("descr", "Helper test case for build_cxx_o"); 157*c243e490SMarcel Moolenaar } 158*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_build_cxx_o_ok) 159*c243e490SMarcel Moolenaar { 160*c243e490SMarcel Moolenaar std::ofstream sfile("test.cpp"); 161*c243e490SMarcel Moolenaar sfile << "#include <iostream>\n"; 162*c243e490SMarcel Moolenaar sfile.close(); 163*c243e490SMarcel Moolenaar 164*c243e490SMarcel Moolenaar ATF_REQUIRE(atf::check::build_cxx_o("test.cpp", "test.o", 165*c243e490SMarcel Moolenaar atf::process::argv_array())); 166*c243e490SMarcel Moolenaar } 167*c243e490SMarcel Moolenaar 168*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_build_cxx_o_fail); 169*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_build_cxx_o_fail) 170*c243e490SMarcel Moolenaar { 171*c243e490SMarcel Moolenaar set_md_var("descr", "Helper test case for build_cxx_o"); 172*c243e490SMarcel Moolenaar } 173*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_build_cxx_o_fail) 174*c243e490SMarcel Moolenaar { 175*c243e490SMarcel Moolenaar std::ofstream sfile("test.cpp"); 176*c243e490SMarcel Moolenaar sfile << "void foo(void) { int a = UNDEFINED_SYMBOL; }\n"; 177*c243e490SMarcel Moolenaar sfile.close(); 178*c243e490SMarcel Moolenaar 179*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf::check::build_cxx_o("test.cpp", "test.o", 180*c243e490SMarcel Moolenaar atf::process::argv_array())); 181*c243e490SMarcel Moolenaar } 182*c243e490SMarcel Moolenaar 183*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 184*c243e490SMarcel Moolenaar // Test cases for the free functions. 185*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 186*c243e490SMarcel Moolenaar 187*c243e490SMarcel Moolenaar ATF_TEST_CASE(build_c_o); 188*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(build_c_o) 189*c243e490SMarcel Moolenaar { 190*c243e490SMarcel Moolenaar set_md_var("descr", "Tests the build_c_o function"); 191*c243e490SMarcel Moolenaar } 192*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(build_c_o) 193*c243e490SMarcel Moolenaar { 194*c243e490SMarcel Moolenaar ATF_TEST_CASE_USE(h_build_c_o_ok); 195*c243e490SMarcel Moolenaar run_h_tc< ATF_TEST_CASE_NAME(h_build_c_o_ok) >(); 196*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-o test.o")); 197*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-c test.c")); 198*c243e490SMarcel Moolenaar 199*c243e490SMarcel Moolenaar ATF_TEST_CASE_USE(h_build_c_o_fail); 200*c243e490SMarcel Moolenaar run_h_tc< ATF_TEST_CASE_NAME(h_build_c_o_fail) >(); 201*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-o test.o")); 202*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-c test.c")); 203*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stderr", "test.c")); 204*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stderr", "UNDEFINED_SYMBOL")); 205*c243e490SMarcel Moolenaar } 206*c243e490SMarcel Moolenaar 207*c243e490SMarcel Moolenaar ATF_TEST_CASE(build_cpp); 208*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(build_cpp) 209*c243e490SMarcel Moolenaar { 210*c243e490SMarcel Moolenaar set_md_var("descr", "Tests the build_cpp function"); 211*c243e490SMarcel Moolenaar } 212*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(build_cpp) 213*c243e490SMarcel Moolenaar { 214*c243e490SMarcel Moolenaar ATF_TEST_CASE_USE(h_build_cpp_ok); 215*c243e490SMarcel Moolenaar run_h_tc< ATF_TEST_CASE_NAME(h_build_cpp_ok) >(); 216*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-o.*test.p")); 217*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "test.c")); 218*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("test.p", "foo bar")); 219*c243e490SMarcel Moolenaar 220*c243e490SMarcel Moolenaar ATF_TEST_CASE_USE(h_build_cpp_fail); 221*c243e490SMarcel Moolenaar run_h_tc< ATF_TEST_CASE_NAME(h_build_cpp_fail) >(); 222*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-o test.p")); 223*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "test.c")); 224*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stderr", "test.c")); 225*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stderr", "non-existent.h")); 226*c243e490SMarcel Moolenaar } 227*c243e490SMarcel Moolenaar 228*c243e490SMarcel Moolenaar ATF_TEST_CASE(build_cxx_o); 229*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(build_cxx_o) 230*c243e490SMarcel Moolenaar { 231*c243e490SMarcel Moolenaar set_md_var("descr", "Tests the build_cxx_o function"); 232*c243e490SMarcel Moolenaar } 233*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(build_cxx_o) 234*c243e490SMarcel Moolenaar { 235*c243e490SMarcel Moolenaar ATF_TEST_CASE_USE(h_build_cxx_o_ok); 236*c243e490SMarcel Moolenaar run_h_tc< ATF_TEST_CASE_NAME(h_build_cxx_o_ok) >(); 237*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-o test.o")); 238*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-c test.cpp")); 239*c243e490SMarcel Moolenaar 240*c243e490SMarcel Moolenaar ATF_TEST_CASE_USE(h_build_cxx_o_fail); 241*c243e490SMarcel Moolenaar run_h_tc< ATF_TEST_CASE_NAME(h_build_cxx_o_fail) >(); 242*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-o test.o")); 243*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stdout", "-c test.cpp")); 244*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stderr", "test.cpp")); 245*c243e490SMarcel Moolenaar ATF_REQUIRE(grep_file("stderr", "UNDEFINED_SYMBOL")); 246*c243e490SMarcel Moolenaar } 247*c243e490SMarcel Moolenaar 248*c243e490SMarcel Moolenaar ATF_TEST_CASE(exec_cleanup); 249*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(exec_cleanup) 250*c243e490SMarcel Moolenaar { 251*c243e490SMarcel Moolenaar set_md_var("descr", "Tests that exec properly cleans up the temporary " 252*c243e490SMarcel Moolenaar "files it creates"); 253*c243e490SMarcel Moolenaar } 254*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(exec_cleanup) 255*c243e490SMarcel Moolenaar { 256*c243e490SMarcel Moolenaar std::auto_ptr< atf::fs::path > out; 257*c243e490SMarcel Moolenaar std::auto_ptr< atf::fs::path > err; 258*c243e490SMarcel Moolenaar 259*c243e490SMarcel Moolenaar { 260*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > r = 261*c243e490SMarcel Moolenaar do_exec(this, "exit-success"); 262*c243e490SMarcel Moolenaar out.reset(new atf::fs::path(r->stdout_path())); 263*c243e490SMarcel Moolenaar err.reset(new atf::fs::path(r->stderr_path())); 264*c243e490SMarcel Moolenaar ATF_REQUIRE(atf::fs::exists(*out.get())); 265*c243e490SMarcel Moolenaar ATF_REQUIRE(atf::fs::exists(*err.get())); 266*c243e490SMarcel Moolenaar } 267*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf::fs::exists(*out.get())); 268*c243e490SMarcel Moolenaar ATF_REQUIRE(!atf::fs::exists(*err.get())); 269*c243e490SMarcel Moolenaar } 270*c243e490SMarcel Moolenaar 271*c243e490SMarcel Moolenaar ATF_TEST_CASE(exec_exitstatus); 272*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(exec_exitstatus) 273*c243e490SMarcel Moolenaar { 274*c243e490SMarcel Moolenaar set_md_var("descr", "Tests that exec properly captures the exit " 275*c243e490SMarcel Moolenaar "status of the executed command"); 276*c243e490SMarcel Moolenaar } 277*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(exec_exitstatus) 278*c243e490SMarcel Moolenaar { 279*c243e490SMarcel Moolenaar { 280*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > r = 281*c243e490SMarcel Moolenaar do_exec(this, "exit-success"); 282*c243e490SMarcel Moolenaar ATF_REQUIRE(r->exited()); 283*c243e490SMarcel Moolenaar ATF_REQUIRE(!r->signaled()); 284*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(r->exitcode(), EXIT_SUCCESS); 285*c243e490SMarcel Moolenaar } 286*c243e490SMarcel Moolenaar 287*c243e490SMarcel Moolenaar { 288*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > r = 289*c243e490SMarcel Moolenaar do_exec(this, "exit-failure"); 290*c243e490SMarcel Moolenaar ATF_REQUIRE(r->exited()); 291*c243e490SMarcel Moolenaar ATF_REQUIRE(!r->signaled()); 292*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(r->exitcode(), EXIT_FAILURE); 293*c243e490SMarcel Moolenaar } 294*c243e490SMarcel Moolenaar 295*c243e490SMarcel Moolenaar { 296*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > r = 297*c243e490SMarcel Moolenaar do_exec(this, "exit-signal"); 298*c243e490SMarcel Moolenaar ATF_REQUIRE(!r->exited()); 299*c243e490SMarcel Moolenaar ATF_REQUIRE(r->signaled()); 300*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(r->termsig(), SIGKILL); 301*c243e490SMarcel Moolenaar } 302*c243e490SMarcel Moolenaar } 303*c243e490SMarcel Moolenaar 304*c243e490SMarcel Moolenaar static 305*c243e490SMarcel Moolenaar void 306*c243e490SMarcel Moolenaar check_lines(const std::string& path, const char* outname, 307*c243e490SMarcel Moolenaar const char* resname) 308*c243e490SMarcel Moolenaar { 309*c243e490SMarcel Moolenaar std::ifstream f(path.c_str()); 310*c243e490SMarcel Moolenaar ATF_REQUIRE(f); 311*c243e490SMarcel Moolenaar 312*c243e490SMarcel Moolenaar std::string line; 313*c243e490SMarcel Moolenaar std::getline(f, line); 314*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(line, std::string("Line 1 to ") + outname + " for " + 315*c243e490SMarcel Moolenaar resname); 316*c243e490SMarcel Moolenaar std::getline(f, line); 317*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(line, std::string("Line 2 to ") + outname + " for " + 318*c243e490SMarcel Moolenaar resname); 319*c243e490SMarcel Moolenaar } 320*c243e490SMarcel Moolenaar 321*c243e490SMarcel Moolenaar ATF_TEST_CASE(exec_stdout_stderr); 322*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(exec_stdout_stderr) 323*c243e490SMarcel Moolenaar { 324*c243e490SMarcel Moolenaar set_md_var("descr", "Tests that exec properly captures the stdout " 325*c243e490SMarcel Moolenaar "and stderr streams of the child process"); 326*c243e490SMarcel Moolenaar } 327*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(exec_stdout_stderr) 328*c243e490SMarcel Moolenaar { 329*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > r1 = 330*c243e490SMarcel Moolenaar do_exec(this, "stdout-stderr", "result1"); 331*c243e490SMarcel Moolenaar ATF_REQUIRE(r1->exited()); 332*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(r1->exitcode(), EXIT_SUCCESS); 333*c243e490SMarcel Moolenaar 334*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > r2 = 335*c243e490SMarcel Moolenaar do_exec(this, "stdout-stderr", "result2"); 336*c243e490SMarcel Moolenaar ATF_REQUIRE(r2->exited()); 337*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(r2->exitcode(), EXIT_SUCCESS); 338*c243e490SMarcel Moolenaar 339*c243e490SMarcel Moolenaar const std::string out1 = r1->stdout_path(); 340*c243e490SMarcel Moolenaar const std::string out2 = r2->stdout_path(); 341*c243e490SMarcel Moolenaar const std::string err1 = r1->stderr_path(); 342*c243e490SMarcel Moolenaar const std::string err2 = r2->stderr_path(); 343*c243e490SMarcel Moolenaar 344*c243e490SMarcel Moolenaar ATF_REQUIRE(out1.find("check.XXXXXX") == std::string::npos); 345*c243e490SMarcel Moolenaar ATF_REQUIRE(out2.find("check.XXXXXX") == std::string::npos); 346*c243e490SMarcel Moolenaar ATF_REQUIRE(err1.find("check.XXXXXX") == std::string::npos); 347*c243e490SMarcel Moolenaar ATF_REQUIRE(err2.find("check.XXXXXX") == std::string::npos); 348*c243e490SMarcel Moolenaar 349*c243e490SMarcel Moolenaar ATF_REQUIRE(out1.find("/check") != std::string::npos); 350*c243e490SMarcel Moolenaar ATF_REQUIRE(out2.find("/check") != std::string::npos); 351*c243e490SMarcel Moolenaar ATF_REQUIRE(err1.find("/check") != std::string::npos); 352*c243e490SMarcel Moolenaar ATF_REQUIRE(err2.find("/check") != std::string::npos); 353*c243e490SMarcel Moolenaar 354*c243e490SMarcel Moolenaar ATF_REQUIRE(out1.find("/stdout") != std::string::npos); 355*c243e490SMarcel Moolenaar ATF_REQUIRE(out2.find("/stdout") != std::string::npos); 356*c243e490SMarcel Moolenaar ATF_REQUIRE(err1.find("/stderr") != std::string::npos); 357*c243e490SMarcel Moolenaar ATF_REQUIRE(err2.find("/stderr") != std::string::npos); 358*c243e490SMarcel Moolenaar 359*c243e490SMarcel Moolenaar ATF_REQUIRE(out1 != out2); 360*c243e490SMarcel Moolenaar ATF_REQUIRE(err1 != err2); 361*c243e490SMarcel Moolenaar 362*c243e490SMarcel Moolenaar check_lines(out1, "stdout", "result1"); 363*c243e490SMarcel Moolenaar check_lines(out2, "stdout", "result2"); 364*c243e490SMarcel Moolenaar check_lines(err1, "stderr", "result1"); 365*c243e490SMarcel Moolenaar check_lines(err2, "stderr", "result2"); 366*c243e490SMarcel Moolenaar } 367*c243e490SMarcel Moolenaar 368*c243e490SMarcel Moolenaar ATF_TEST_CASE(exec_unknown); 369*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(exec_unknown) 370*c243e490SMarcel Moolenaar { 371*c243e490SMarcel Moolenaar set_md_var("descr", "Tests that running a non-existing binary " 372*c243e490SMarcel Moolenaar "is handled correctly"); 373*c243e490SMarcel Moolenaar } 374*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(exec_unknown) 375*c243e490SMarcel Moolenaar { 376*c243e490SMarcel Moolenaar std::vector< std::string > argv; 377*c243e490SMarcel Moolenaar argv.push_back(atf::config::get("atf_workdir") + "/non-existent"); 378*c243e490SMarcel Moolenaar 379*c243e490SMarcel Moolenaar atf::process::argv_array argva(argv); 380*c243e490SMarcel Moolenaar std::auto_ptr< atf::check::check_result > r = atf::check::exec(argva); 381*c243e490SMarcel Moolenaar ATF_REQUIRE(r->exited()); 382*c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(r->exitcode(), 127); 383*c243e490SMarcel Moolenaar } 384*c243e490SMarcel Moolenaar 385*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 386*c243e490SMarcel Moolenaar // Tests cases for the header file. 387*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 388*c243e490SMarcel Moolenaar 389*c243e490SMarcel Moolenaar HEADER_TC(include, "atf-c++/check.hpp"); 390*c243e490SMarcel Moolenaar 391*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 392*c243e490SMarcel Moolenaar // Main. 393*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 394*c243e490SMarcel Moolenaar 395*c243e490SMarcel Moolenaar ATF_INIT_TEST_CASES(tcs) 396*c243e490SMarcel Moolenaar { 397*c243e490SMarcel Moolenaar // Add the test cases for the free functions. 398*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, build_c_o); 399*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, build_cpp); 400*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, build_cxx_o); 401*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, exec_cleanup); 402*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, exec_exitstatus); 403*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, exec_stdout_stderr); 404*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, exec_unknown); 405*c243e490SMarcel Moolenaar 406*c243e490SMarcel Moolenaar // Add the test cases for the header file. 407*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, include); 408*c243e490SMarcel Moolenaar } 409