xref: /freebsd-src/contrib/atf/atf-c++/check_test.cpp (revision c243e4902be8df1e643c76b5f18b68bb77cc5268)
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