1edebbb8eSjmmv // 2edebbb8eSjmmv // Automated Testing Framework (atf) 3edebbb8eSjmmv // 4*a551a20fSjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc. 5edebbb8eSjmmv // All rights reserved. 6edebbb8eSjmmv // 7edebbb8eSjmmv // Redistribution and use in source and binary forms, with or without 8edebbb8eSjmmv // modification, are permitted provided that the following conditions 9edebbb8eSjmmv // are met: 10edebbb8eSjmmv // 1. Redistributions of source code must retain the above copyright 11edebbb8eSjmmv // notice, this list of conditions and the following disclaimer. 12edebbb8eSjmmv // 2. Redistributions in binary form must reproduce the above copyright 13edebbb8eSjmmv // notice, this list of conditions and the following disclaimer in the 14edebbb8eSjmmv // documentation and/or other materials provided with the distribution. 15edebbb8eSjmmv // 16edebbb8eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17edebbb8eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18edebbb8eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19edebbb8eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20edebbb8eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21edebbb8eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22edebbb8eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23edebbb8eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24edebbb8eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25edebbb8eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26edebbb8eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27edebbb8eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28edebbb8eSjmmv // 29edebbb8eSjmmv 30edebbb8eSjmmv extern "C" { 31edebbb8eSjmmv #include <fcntl.h> 32edebbb8eSjmmv #include <signal.h> 33edebbb8eSjmmv #include <unistd.h> 34edebbb8eSjmmv } 35edebbb8eSjmmv 36edebbb8eSjmmv #include <cstdlib> 37edebbb8eSjmmv #include <cstring> 38edebbb8eSjmmv #include <fstream> 39edebbb8eSjmmv #include <iostream> 40edebbb8eSjmmv #include <list> 41edebbb8eSjmmv #include <memory> 42edebbb8eSjmmv #include <vector> 43edebbb8eSjmmv 44edebbb8eSjmmv #include <atf-c++.hpp> 45edebbb8eSjmmv 46895f502bSjmmv #include "check.hpp" 47895f502bSjmmv #include "config.hpp" 48895f502bSjmmv #include "utils.hpp" 49edebbb8eSjmmv 50895f502bSjmmv #include "detail/fs.hpp" 51895f502bSjmmv #include "detail/process.hpp" 52895f502bSjmmv #include "detail/test_helpers.hpp" 53895f502bSjmmv #include "detail/text.hpp" 54edebbb8eSjmmv 55edebbb8eSjmmv // ------------------------------------------------------------------------ 56edebbb8eSjmmv // Auxiliary functions. 57edebbb8eSjmmv // ------------------------------------------------------------------------ 58edebbb8eSjmmv 59edebbb8eSjmmv static 600ebb519dSjmmv std::auto_ptr< atf::check::check_result > 61edebbb8eSjmmv do_exec(const atf::tests::tc* tc, const char* helper_name) 62edebbb8eSjmmv { 63edebbb8eSjmmv std::vector< std::string > argv; 64895f502bSjmmv argv.push_back(get_process_helpers_path(*tc).str()); 65edebbb8eSjmmv argv.push_back(helper_name); 66edebbb8eSjmmv std::cout << "Executing " << argv[0] << " " << argv[1] << "\n"; 67edebbb8eSjmmv 68edebbb8eSjmmv atf::process::argv_array argva(argv); 69edebbb8eSjmmv return atf::check::exec(argva); 70edebbb8eSjmmv } 71edebbb8eSjmmv 72edebbb8eSjmmv static 730ebb519dSjmmv std::auto_ptr< atf::check::check_result > 74edebbb8eSjmmv do_exec(const atf::tests::tc* tc, const char* helper_name, const char *carg2) 75edebbb8eSjmmv { 76edebbb8eSjmmv std::vector< std::string > argv; 77895f502bSjmmv argv.push_back(get_process_helpers_path(*tc).str()); 78edebbb8eSjmmv argv.push_back(helper_name); 79edebbb8eSjmmv argv.push_back(carg2); 80edebbb8eSjmmv std::cout << "Executing " << argv[0] << " " << argv[1] << " " 81edebbb8eSjmmv << argv[2] << "\n"; 82edebbb8eSjmmv 83edebbb8eSjmmv atf::process::argv_array argva(argv); 84edebbb8eSjmmv return atf::check::exec(argva); 85edebbb8eSjmmv } 86edebbb8eSjmmv 87edebbb8eSjmmv // ------------------------------------------------------------------------ 88edebbb8eSjmmv // Helper test cases for the free functions. 89edebbb8eSjmmv // ------------------------------------------------------------------------ 90edebbb8eSjmmv 91edebbb8eSjmmv ATF_TEST_CASE(h_build_c_o_ok); 92edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_build_c_o_ok) 93edebbb8eSjmmv { 94edebbb8eSjmmv set_md_var("descr", "Helper test case for build_c_o"); 95edebbb8eSjmmv } 96edebbb8eSjmmv ATF_TEST_CASE_BODY(h_build_c_o_ok) 97edebbb8eSjmmv { 98edebbb8eSjmmv std::ofstream sfile("test.c"); 99edebbb8eSjmmv sfile << "#include <stdio.h>\n"; 100edebbb8eSjmmv sfile.close(); 101edebbb8eSjmmv 102895f502bSjmmv ATF_REQUIRE(atf::check::build_c_o("test.c", "test.o", 103edebbb8eSjmmv atf::process::argv_array())); 104edebbb8eSjmmv } 105edebbb8eSjmmv 106edebbb8eSjmmv ATF_TEST_CASE(h_build_c_o_fail); 107edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_build_c_o_fail) 108edebbb8eSjmmv { 109edebbb8eSjmmv set_md_var("descr", "Helper test case for build_c_o"); 110edebbb8eSjmmv } 111edebbb8eSjmmv ATF_TEST_CASE_BODY(h_build_c_o_fail) 112edebbb8eSjmmv { 113edebbb8eSjmmv std::ofstream sfile("test.c"); 114edebbb8eSjmmv sfile << "void foo(void) { int a = UNDEFINED_SYMBOL; }\n"; 115edebbb8eSjmmv sfile.close(); 116edebbb8eSjmmv 117895f502bSjmmv ATF_REQUIRE(!atf::check::build_c_o("test.c", "test.o", 118edebbb8eSjmmv atf::process::argv_array())); 119edebbb8eSjmmv } 120edebbb8eSjmmv 121edebbb8eSjmmv ATF_TEST_CASE(h_build_cpp_ok); 122edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_build_cpp_ok) 123edebbb8eSjmmv { 124edebbb8eSjmmv set_md_var("descr", "Helper test case for build_cpp"); 125edebbb8eSjmmv } 126edebbb8eSjmmv ATF_TEST_CASE_BODY(h_build_cpp_ok) 127edebbb8eSjmmv { 128edebbb8eSjmmv std::ofstream sfile("test.c"); 129edebbb8eSjmmv sfile << "#define A foo\n"; 130edebbb8eSjmmv sfile << "#define B bar\n"; 131edebbb8eSjmmv sfile << "A B\n"; 132edebbb8eSjmmv sfile.close(); 133edebbb8eSjmmv 134895f502bSjmmv ATF_REQUIRE(atf::check::build_cpp("test.c", "test.p", 135edebbb8eSjmmv atf::process::argv_array())); 136edebbb8eSjmmv } 137edebbb8eSjmmv 138edebbb8eSjmmv ATF_TEST_CASE(h_build_cpp_fail); 139edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_build_cpp_fail) 140edebbb8eSjmmv { 141edebbb8eSjmmv set_md_var("descr", "Helper test case for build_cpp"); 142edebbb8eSjmmv } 143edebbb8eSjmmv ATF_TEST_CASE_BODY(h_build_cpp_fail) 144edebbb8eSjmmv { 145edebbb8eSjmmv std::ofstream sfile("test.c"); 146edebbb8eSjmmv sfile << "#include \"./non-existent.h\"\n"; 147edebbb8eSjmmv sfile.close(); 148edebbb8eSjmmv 149895f502bSjmmv ATF_REQUIRE(!atf::check::build_cpp("test.c", "test.p", 150edebbb8eSjmmv atf::process::argv_array())); 151edebbb8eSjmmv } 152edebbb8eSjmmv 153edebbb8eSjmmv ATF_TEST_CASE(h_build_cxx_o_ok); 154edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_build_cxx_o_ok) 155edebbb8eSjmmv { 156edebbb8eSjmmv set_md_var("descr", "Helper test case for build_cxx_o"); 157edebbb8eSjmmv } 158edebbb8eSjmmv ATF_TEST_CASE_BODY(h_build_cxx_o_ok) 159edebbb8eSjmmv { 160edebbb8eSjmmv std::ofstream sfile("test.cpp"); 161edebbb8eSjmmv sfile << "#include <iostream>\n"; 162edebbb8eSjmmv sfile.close(); 163edebbb8eSjmmv 164895f502bSjmmv ATF_REQUIRE(atf::check::build_cxx_o("test.cpp", "test.o", 165edebbb8eSjmmv atf::process::argv_array())); 166edebbb8eSjmmv } 167edebbb8eSjmmv 168edebbb8eSjmmv ATF_TEST_CASE(h_build_cxx_o_fail); 169edebbb8eSjmmv ATF_TEST_CASE_HEAD(h_build_cxx_o_fail) 170edebbb8eSjmmv { 171edebbb8eSjmmv set_md_var("descr", "Helper test case for build_cxx_o"); 172edebbb8eSjmmv } 173edebbb8eSjmmv ATF_TEST_CASE_BODY(h_build_cxx_o_fail) 174edebbb8eSjmmv { 175edebbb8eSjmmv std::ofstream sfile("test.cpp"); 176edebbb8eSjmmv sfile << "void foo(void) { int a = UNDEFINED_SYMBOL; }\n"; 177edebbb8eSjmmv sfile.close(); 178edebbb8eSjmmv 179895f502bSjmmv ATF_REQUIRE(!atf::check::build_cxx_o("test.cpp", "test.o", 180edebbb8eSjmmv atf::process::argv_array())); 181edebbb8eSjmmv } 182edebbb8eSjmmv 183edebbb8eSjmmv // ------------------------------------------------------------------------ 184edebbb8eSjmmv // Test cases for the free functions. 185edebbb8eSjmmv // ------------------------------------------------------------------------ 186edebbb8eSjmmv 187edebbb8eSjmmv ATF_TEST_CASE(build_c_o); 188edebbb8eSjmmv ATF_TEST_CASE_HEAD(build_c_o) 189edebbb8eSjmmv { 190edebbb8eSjmmv set_md_var("descr", "Tests the build_c_o function"); 191edebbb8eSjmmv } 192edebbb8eSjmmv ATF_TEST_CASE_BODY(build_c_o) 193edebbb8eSjmmv { 194edebbb8eSjmmv run_h_tc< ATF_TEST_CASE_NAME(h_build_c_o_ok) >(); 195895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-o test.o")); 196895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-c test.c")); 197edebbb8eSjmmv 198edebbb8eSjmmv run_h_tc< ATF_TEST_CASE_NAME(h_build_c_o_fail) >(); 199895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-o test.o")); 200895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-c test.c")); 201895f502bSjmmv ATF_REQUIRE(grep_file("stderr", "test.c")); 202895f502bSjmmv ATF_REQUIRE(grep_file("stderr", "UNDEFINED_SYMBOL")); 203edebbb8eSjmmv } 204edebbb8eSjmmv 205edebbb8eSjmmv ATF_TEST_CASE(build_cpp); 206edebbb8eSjmmv ATF_TEST_CASE_HEAD(build_cpp) 207edebbb8eSjmmv { 208edebbb8eSjmmv set_md_var("descr", "Tests the build_cpp function"); 209edebbb8eSjmmv } 210edebbb8eSjmmv ATF_TEST_CASE_BODY(build_cpp) 211edebbb8eSjmmv { 212edebbb8eSjmmv run_h_tc< ATF_TEST_CASE_NAME(h_build_cpp_ok) >(); 213895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-o.*test.p")); 214895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "test.c")); 215895f502bSjmmv ATF_REQUIRE(grep_file("test.p", "foo bar")); 216edebbb8eSjmmv 217edebbb8eSjmmv run_h_tc< ATF_TEST_CASE_NAME(h_build_cpp_fail) >(); 218895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-o test.p")); 219895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "test.c")); 220895f502bSjmmv ATF_REQUIRE(grep_file("stderr", "test.c")); 221895f502bSjmmv ATF_REQUIRE(grep_file("stderr", "non-existent.h")); 222edebbb8eSjmmv } 223edebbb8eSjmmv 224edebbb8eSjmmv ATF_TEST_CASE(build_cxx_o); 225edebbb8eSjmmv ATF_TEST_CASE_HEAD(build_cxx_o) 226edebbb8eSjmmv { 227edebbb8eSjmmv set_md_var("descr", "Tests the build_cxx_o function"); 228edebbb8eSjmmv } 229edebbb8eSjmmv ATF_TEST_CASE_BODY(build_cxx_o) 230edebbb8eSjmmv { 231edebbb8eSjmmv run_h_tc< ATF_TEST_CASE_NAME(h_build_cxx_o_ok) >(); 232895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-o test.o")); 233895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-c test.cpp")); 234edebbb8eSjmmv 235edebbb8eSjmmv run_h_tc< ATF_TEST_CASE_NAME(h_build_cxx_o_fail) >(); 236895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-o test.o")); 237895f502bSjmmv ATF_REQUIRE(grep_file("stdout", "-c test.cpp")); 238895f502bSjmmv ATF_REQUIRE(grep_file("stderr", "test.cpp")); 239895f502bSjmmv ATF_REQUIRE(grep_file("stderr", "UNDEFINED_SYMBOL")); 240edebbb8eSjmmv } 241edebbb8eSjmmv 242edebbb8eSjmmv ATF_TEST_CASE(exec_cleanup); 243edebbb8eSjmmv ATF_TEST_CASE_HEAD(exec_cleanup) 244edebbb8eSjmmv { 245edebbb8eSjmmv set_md_var("descr", "Tests that exec properly cleans up the temporary " 246edebbb8eSjmmv "files it creates"); 247edebbb8eSjmmv } 248edebbb8eSjmmv ATF_TEST_CASE_BODY(exec_cleanup) 249edebbb8eSjmmv { 250edebbb8eSjmmv std::auto_ptr< atf::fs::path > out; 251edebbb8eSjmmv std::auto_ptr< atf::fs::path > err; 252edebbb8eSjmmv 253edebbb8eSjmmv { 2540ebb519dSjmmv std::auto_ptr< atf::check::check_result > r = 2550ebb519dSjmmv do_exec(this, "exit-success"); 2560ebb519dSjmmv out.reset(new atf::fs::path(r->stdout_path())); 2570ebb519dSjmmv err.reset(new atf::fs::path(r->stderr_path())); 258895f502bSjmmv ATF_REQUIRE(atf::fs::exists(*out.get())); 259895f502bSjmmv ATF_REQUIRE(atf::fs::exists(*err.get())); 260edebbb8eSjmmv } 261895f502bSjmmv ATF_REQUIRE(!atf::fs::exists(*out.get())); 262895f502bSjmmv ATF_REQUIRE(!atf::fs::exists(*err.get())); 263edebbb8eSjmmv } 264edebbb8eSjmmv 265edebbb8eSjmmv ATF_TEST_CASE(exec_exitstatus); 266edebbb8eSjmmv ATF_TEST_CASE_HEAD(exec_exitstatus) 267edebbb8eSjmmv { 268edebbb8eSjmmv set_md_var("descr", "Tests that exec properly captures the exit " 269edebbb8eSjmmv "status of the executed command"); 270edebbb8eSjmmv } 271edebbb8eSjmmv ATF_TEST_CASE_BODY(exec_exitstatus) 272edebbb8eSjmmv { 273edebbb8eSjmmv { 2740ebb519dSjmmv std::auto_ptr< atf::check::check_result > r = 2750ebb519dSjmmv do_exec(this, "exit-success"); 2760ebb519dSjmmv ATF_REQUIRE(r->exited()); 2770ebb519dSjmmv ATF_REQUIRE(!r->signaled()); 2780ebb519dSjmmv ATF_REQUIRE_EQ(r->exitcode(), EXIT_SUCCESS); 279edebbb8eSjmmv } 280edebbb8eSjmmv 281edebbb8eSjmmv { 2820ebb519dSjmmv std::auto_ptr< atf::check::check_result > r = 2830ebb519dSjmmv do_exec(this, "exit-failure"); 2840ebb519dSjmmv ATF_REQUIRE(r->exited()); 2850ebb519dSjmmv ATF_REQUIRE(!r->signaled()); 2860ebb519dSjmmv ATF_REQUIRE_EQ(r->exitcode(), EXIT_FAILURE); 287edebbb8eSjmmv } 288edebbb8eSjmmv 289edebbb8eSjmmv { 2900ebb519dSjmmv std::auto_ptr< atf::check::check_result > r = 2910ebb519dSjmmv do_exec(this, "exit-signal"); 2920ebb519dSjmmv ATF_REQUIRE(!r->exited()); 2930ebb519dSjmmv ATF_REQUIRE(r->signaled()); 2940ebb519dSjmmv ATF_REQUIRE_EQ(r->termsig(), SIGKILL); 295edebbb8eSjmmv } 296edebbb8eSjmmv } 297edebbb8eSjmmv 298edebbb8eSjmmv static 299edebbb8eSjmmv void 300895f502bSjmmv check_lines(const std::string& path, const char* outname, 301edebbb8eSjmmv const char* resname) 302edebbb8eSjmmv { 303edebbb8eSjmmv std::ifstream f(path.c_str()); 304895f502bSjmmv ATF_REQUIRE(f); 305edebbb8eSjmmv 306edebbb8eSjmmv std::string line; 307edebbb8eSjmmv std::getline(f, line); 308895f502bSjmmv ATF_REQUIRE_EQ(line, std::string("Line 1 to ") + outname + " for " + 309edebbb8eSjmmv resname); 310edebbb8eSjmmv std::getline(f, line); 311895f502bSjmmv ATF_REQUIRE_EQ(line, std::string("Line 2 to ") + outname + " for " + 312edebbb8eSjmmv resname); 313edebbb8eSjmmv } 314edebbb8eSjmmv 315edebbb8eSjmmv ATF_TEST_CASE(exec_stdout_stderr); 316edebbb8eSjmmv ATF_TEST_CASE_HEAD(exec_stdout_stderr) 317edebbb8eSjmmv { 318edebbb8eSjmmv set_md_var("descr", "Tests that exec properly captures the stdout " 319edebbb8eSjmmv "and stderr streams of the child process"); 320edebbb8eSjmmv } 321edebbb8eSjmmv ATF_TEST_CASE_BODY(exec_stdout_stderr) 322edebbb8eSjmmv { 3230ebb519dSjmmv std::auto_ptr< atf::check::check_result > r1 = 3240ebb519dSjmmv do_exec(this, "stdout-stderr", "result1"); 3250ebb519dSjmmv ATF_REQUIRE(r1->exited()); 3260ebb519dSjmmv ATF_REQUIRE_EQ(r1->exitcode(), EXIT_SUCCESS); 327edebbb8eSjmmv 3280ebb519dSjmmv std::auto_ptr< atf::check::check_result > r2 = 3290ebb519dSjmmv do_exec(this, "stdout-stderr", "result2"); 3300ebb519dSjmmv ATF_REQUIRE(r2->exited()); 3310ebb519dSjmmv ATF_REQUIRE_EQ(r2->exitcode(), EXIT_SUCCESS); 332edebbb8eSjmmv 3330ebb519dSjmmv const std::string out1 = r1->stdout_path(); 3340ebb519dSjmmv const std::string out2 = r2->stdout_path(); 3350ebb519dSjmmv const std::string err1 = r1->stderr_path(); 3360ebb519dSjmmv const std::string err2 = r2->stderr_path(); 337edebbb8eSjmmv 338895f502bSjmmv ATF_REQUIRE(out1.find("check.XXXXXX") == std::string::npos); 339895f502bSjmmv ATF_REQUIRE(out2.find("check.XXXXXX") == std::string::npos); 340895f502bSjmmv ATF_REQUIRE(err1.find("check.XXXXXX") == std::string::npos); 341895f502bSjmmv ATF_REQUIRE(err2.find("check.XXXXXX") == std::string::npos); 342edebbb8eSjmmv 343895f502bSjmmv ATF_REQUIRE(out1.find("/check") != std::string::npos); 344895f502bSjmmv ATF_REQUIRE(out2.find("/check") != std::string::npos); 345895f502bSjmmv ATF_REQUIRE(err1.find("/check") != std::string::npos); 346895f502bSjmmv ATF_REQUIRE(err2.find("/check") != std::string::npos); 347edebbb8eSjmmv 348895f502bSjmmv ATF_REQUIRE(out1.find("/stdout") != std::string::npos); 349895f502bSjmmv ATF_REQUIRE(out2.find("/stdout") != std::string::npos); 350895f502bSjmmv ATF_REQUIRE(err1.find("/stderr") != std::string::npos); 351895f502bSjmmv ATF_REQUIRE(err2.find("/stderr") != std::string::npos); 352edebbb8eSjmmv 353895f502bSjmmv ATF_REQUIRE(out1 != out2); 354895f502bSjmmv ATF_REQUIRE(err1 != err2); 355edebbb8eSjmmv 356edebbb8eSjmmv check_lines(out1, "stdout", "result1"); 357edebbb8eSjmmv check_lines(out2, "stdout", "result2"); 358edebbb8eSjmmv check_lines(err1, "stderr", "result1"); 359edebbb8eSjmmv check_lines(err2, "stderr", "result2"); 360edebbb8eSjmmv } 361edebbb8eSjmmv 362edebbb8eSjmmv ATF_TEST_CASE(exec_unknown); 363edebbb8eSjmmv ATF_TEST_CASE_HEAD(exec_unknown) 364edebbb8eSjmmv { 365edebbb8eSjmmv set_md_var("descr", "Tests that running a non-existing binary " 366edebbb8eSjmmv "is handled correctly"); 367edebbb8eSjmmv } 368edebbb8eSjmmv ATF_TEST_CASE_BODY(exec_unknown) 369edebbb8eSjmmv { 370edebbb8eSjmmv std::vector< std::string > argv; 371edebbb8eSjmmv argv.push_back(atf::config::get("atf_workdir") + "/non-existent"); 372edebbb8eSjmmv 373edebbb8eSjmmv atf::process::argv_array argva(argv); 3740ebb519dSjmmv std::auto_ptr< atf::check::check_result > r = atf::check::exec(argva); 3750ebb519dSjmmv ATF_REQUIRE(r->exited()); 3760ebb519dSjmmv ATF_REQUIRE_EQ(r->exitcode(), 127); 377edebbb8eSjmmv } 378edebbb8eSjmmv 379edebbb8eSjmmv // ------------------------------------------------------------------------ 380edebbb8eSjmmv // Tests cases for the header file. 381edebbb8eSjmmv // ------------------------------------------------------------------------ 382edebbb8eSjmmv 383edebbb8eSjmmv HEADER_TC(include, "atf-c++/check.hpp"); 384edebbb8eSjmmv 385edebbb8eSjmmv // ------------------------------------------------------------------------ 386edebbb8eSjmmv // Main. 387edebbb8eSjmmv // ------------------------------------------------------------------------ 388edebbb8eSjmmv 389edebbb8eSjmmv ATF_INIT_TEST_CASES(tcs) 390edebbb8eSjmmv { 391edebbb8eSjmmv // Add the test cases for the free functions. 392edebbb8eSjmmv ATF_ADD_TEST_CASE(tcs, build_c_o); 393edebbb8eSjmmv ATF_ADD_TEST_CASE(tcs, build_cpp); 394edebbb8eSjmmv ATF_ADD_TEST_CASE(tcs, build_cxx_o); 395edebbb8eSjmmv ATF_ADD_TEST_CASE(tcs, exec_cleanup); 396edebbb8eSjmmv ATF_ADD_TEST_CASE(tcs, exec_exitstatus); 397edebbb8eSjmmv ATF_ADD_TEST_CASE(tcs, exec_stdout_stderr); 398edebbb8eSjmmv ATF_ADD_TEST_CASE(tcs, exec_unknown); 399edebbb8eSjmmv 400edebbb8eSjmmv // Add the test cases for the header file. 401edebbb8eSjmmv ATF_ADD_TEST_CASE(tcs, include); 402edebbb8eSjmmv } 403