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