xref: /freebsd/contrib/atf/atf-c++/detail/process_test.cpp (revision c243e4902be8df1e643c76b5f18b68bb77cc5268)
1*c243e490SMarcel Moolenaar //
2*c243e490SMarcel Moolenaar // Automated Testing Framework (atf)
3*c243e490SMarcel Moolenaar //
4*c243e490SMarcel Moolenaar // Copyright (c) 2008 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 #include <cstdlib>
31*c243e490SMarcel Moolenaar #include <cstring>
32*c243e490SMarcel Moolenaar 
33*c243e490SMarcel Moolenaar #include "../macros.hpp"
34*c243e490SMarcel Moolenaar 
35*c243e490SMarcel Moolenaar #include "process.hpp"
36*c243e490SMarcel Moolenaar #include "test_helpers.hpp"
37*c243e490SMarcel Moolenaar 
38*c243e490SMarcel Moolenaar // TODO: Testing the fork function is a huge task and I'm afraid of
39*c243e490SMarcel Moolenaar // copy/pasting tons of stuff from the C version.  I'd rather not do that
40*c243e490SMarcel Moolenaar // until some code can be shared, which cannot happen until the C++ binding
41*c243e490SMarcel Moolenaar // is cleaned by a fair amount.  Instead... just rely (at the moment) on
42*c243e490SMarcel Moolenaar // the system tests for the tools using this module.
43*c243e490SMarcel Moolenaar 
44*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
45*c243e490SMarcel Moolenaar // Auxiliary functions.
46*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
47*c243e490SMarcel Moolenaar 
48*c243e490SMarcel Moolenaar static
49*c243e490SMarcel Moolenaar std::size_t
50*c243e490SMarcel Moolenaar array_size(const char* const* array)
51*c243e490SMarcel Moolenaar {
52*c243e490SMarcel Moolenaar     std::size_t size = 0;
53*c243e490SMarcel Moolenaar 
54*c243e490SMarcel Moolenaar     for (const char* const* ptr = array; *ptr != NULL; ptr++)
55*c243e490SMarcel Moolenaar         size++;
56*c243e490SMarcel Moolenaar 
57*c243e490SMarcel Moolenaar     return size;
58*c243e490SMarcel Moolenaar }
59*c243e490SMarcel Moolenaar 
60*c243e490SMarcel Moolenaar static
61*c243e490SMarcel Moolenaar atf::process::status
62*c243e490SMarcel Moolenaar exec_process_helpers(const atf::tests::tc& tc, const char* helper_name)
63*c243e490SMarcel Moolenaar {
64*c243e490SMarcel Moolenaar     using atf::process::exec;
65*c243e490SMarcel Moolenaar 
66*c243e490SMarcel Moolenaar     std::vector< std::string > argv;
67*c243e490SMarcel Moolenaar     argv.push_back(get_process_helpers_path(tc).leaf_name());
68*c243e490SMarcel Moolenaar     argv.push_back(helper_name);
69*c243e490SMarcel Moolenaar 
70*c243e490SMarcel Moolenaar     return exec(get_process_helpers_path(tc),
71*c243e490SMarcel Moolenaar                 atf::process::argv_array(argv),
72*c243e490SMarcel Moolenaar                 atf::process::stream_inherit(),
73*c243e490SMarcel Moolenaar                 atf::process::stream_inherit());
74*c243e490SMarcel Moolenaar }
75*c243e490SMarcel Moolenaar 
76*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
77*c243e490SMarcel Moolenaar // Tests for the "argv_array" type.
78*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
79*c243e490SMarcel Moolenaar 
80*c243e490SMarcel Moolenaar ATF_TEST_CASE(argv_array_init_carray);
81*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(argv_array_init_carray)
82*c243e490SMarcel Moolenaar {
83*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests that argv_array is correctly constructed "
84*c243e490SMarcel Moolenaar                "from a C-style array of strings");
85*c243e490SMarcel Moolenaar }
86*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(argv_array_init_carray)
87*c243e490SMarcel Moolenaar {
88*c243e490SMarcel Moolenaar     {
89*c243e490SMarcel Moolenaar         const char* const carray[] = { NULL };
90*c243e490SMarcel Moolenaar         atf::process::argv_array argv(carray);
91*c243e490SMarcel Moolenaar 
92*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv.size(), 0);
93*c243e490SMarcel Moolenaar     }
94*c243e490SMarcel Moolenaar 
95*c243e490SMarcel Moolenaar     {
96*c243e490SMarcel Moolenaar         const char* const carray[] = { "arg0", NULL };
97*c243e490SMarcel Moolenaar         atf::process::argv_array argv(carray);
98*c243e490SMarcel Moolenaar 
99*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv.size(), 1);
100*c243e490SMarcel Moolenaar         ATF_REQUIRE(std::strcmp(argv[0], carray[0]) == 0);
101*c243e490SMarcel Moolenaar     }
102*c243e490SMarcel Moolenaar 
103*c243e490SMarcel Moolenaar     {
104*c243e490SMarcel Moolenaar         const char* const carray[] = { "arg0", "arg1", "arg2", NULL };
105*c243e490SMarcel Moolenaar         atf::process::argv_array argv(carray);
106*c243e490SMarcel Moolenaar 
107*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv.size(), 3);
108*c243e490SMarcel Moolenaar         ATF_REQUIRE(std::strcmp(argv[0], carray[0]) == 0);
109*c243e490SMarcel Moolenaar         ATF_REQUIRE(std::strcmp(argv[1], carray[1]) == 0);
110*c243e490SMarcel Moolenaar         ATF_REQUIRE(std::strcmp(argv[2], carray[2]) == 0);
111*c243e490SMarcel Moolenaar     }
112*c243e490SMarcel Moolenaar }
113*c243e490SMarcel Moolenaar 
114*c243e490SMarcel Moolenaar ATF_TEST_CASE(argv_array_init_col);
115*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(argv_array_init_col)
116*c243e490SMarcel Moolenaar {
117*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests that argv_array is correctly constructed "
118*c243e490SMarcel Moolenaar                "from a string collection");
119*c243e490SMarcel Moolenaar }
120*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(argv_array_init_col)
121*c243e490SMarcel Moolenaar {
122*c243e490SMarcel Moolenaar     {
123*c243e490SMarcel Moolenaar         std::vector< std::string > col;
124*c243e490SMarcel Moolenaar         atf::process::argv_array argv(col);
125*c243e490SMarcel Moolenaar 
126*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv.size(), 0);
127*c243e490SMarcel Moolenaar     }
128*c243e490SMarcel Moolenaar 
129*c243e490SMarcel Moolenaar     {
130*c243e490SMarcel Moolenaar         std::vector< std::string > col;
131*c243e490SMarcel Moolenaar         col.push_back("arg0");
132*c243e490SMarcel Moolenaar         atf::process::argv_array argv(col);
133*c243e490SMarcel Moolenaar 
134*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv.size(), 1);
135*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv[0], col[0]);
136*c243e490SMarcel Moolenaar     }
137*c243e490SMarcel Moolenaar 
138*c243e490SMarcel Moolenaar     {
139*c243e490SMarcel Moolenaar         std::vector< std::string > col;
140*c243e490SMarcel Moolenaar         col.push_back("arg0");
141*c243e490SMarcel Moolenaar         col.push_back("arg1");
142*c243e490SMarcel Moolenaar         col.push_back("arg2");
143*c243e490SMarcel Moolenaar         atf::process::argv_array argv(col);
144*c243e490SMarcel Moolenaar 
145*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv.size(), 3);
146*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv[0], col[0]);
147*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv[1], col[1]);
148*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv[2], col[2]);
149*c243e490SMarcel Moolenaar     }
150*c243e490SMarcel Moolenaar }
151*c243e490SMarcel Moolenaar 
152*c243e490SMarcel Moolenaar ATF_TEST_CASE(argv_array_init_empty);
153*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(argv_array_init_empty)
154*c243e490SMarcel Moolenaar {
155*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests that argv_array is correctly constructed "
156*c243e490SMarcel Moolenaar                "by the default constructor");
157*c243e490SMarcel Moolenaar }
158*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(argv_array_init_empty)
159*c243e490SMarcel Moolenaar {
160*c243e490SMarcel Moolenaar     atf::process::argv_array argv;
161*c243e490SMarcel Moolenaar 
162*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(argv.size(), 0);
163*c243e490SMarcel Moolenaar }
164*c243e490SMarcel Moolenaar 
165*c243e490SMarcel Moolenaar ATF_TEST_CASE(argv_array_init_varargs);
166*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(argv_array_init_varargs)
167*c243e490SMarcel Moolenaar {
168*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests that argv_array is correctly constructed "
169*c243e490SMarcel Moolenaar                "from a variable list of arguments");
170*c243e490SMarcel Moolenaar }
171*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(argv_array_init_varargs)
172*c243e490SMarcel Moolenaar {
173*c243e490SMarcel Moolenaar     {
174*c243e490SMarcel Moolenaar         atf::process::argv_array argv("arg0", NULL);
175*c243e490SMarcel Moolenaar 
176*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv.size(), 1);
177*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv[0], std::string("arg0"));
178*c243e490SMarcel Moolenaar     }
179*c243e490SMarcel Moolenaar 
180*c243e490SMarcel Moolenaar     {
181*c243e490SMarcel Moolenaar         atf::process::argv_array argv("arg0", "arg1", "arg2", NULL);
182*c243e490SMarcel Moolenaar 
183*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv.size(), 3);
184*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv[0], std::string("arg0"));
185*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv[1], std::string("arg1"));
186*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(argv[2], std::string("arg2"));
187*c243e490SMarcel Moolenaar     }
188*c243e490SMarcel Moolenaar }
189*c243e490SMarcel Moolenaar 
190*c243e490SMarcel Moolenaar ATF_TEST_CASE(argv_array_assign);
191*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(argv_array_assign)
192*c243e490SMarcel Moolenaar {
193*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests that assigning an argv_array works");
194*c243e490SMarcel Moolenaar }
195*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(argv_array_assign)
196*c243e490SMarcel Moolenaar {
197*c243e490SMarcel Moolenaar     using atf::process::argv_array;
198*c243e490SMarcel Moolenaar 
199*c243e490SMarcel Moolenaar     const char* const carray1[] = { "arg1", NULL };
200*c243e490SMarcel Moolenaar     const char* const carray2[] = { "arg1", "arg2", NULL };
201*c243e490SMarcel Moolenaar 
202*c243e490SMarcel Moolenaar     std::auto_ptr< argv_array > argv1(new argv_array(carray1));
203*c243e490SMarcel Moolenaar     std::auto_ptr< argv_array > argv2(new argv_array(carray2));
204*c243e490SMarcel Moolenaar 
205*c243e490SMarcel Moolenaar     *argv2 = *argv1;
206*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(argv2->size(), argv1->size());
207*c243e490SMarcel Moolenaar     ATF_REQUIRE(std::strcmp((*argv2)[0], (*argv1)[0]) == 0);
208*c243e490SMarcel Moolenaar 
209*c243e490SMarcel Moolenaar     ATF_REQUIRE(argv2->exec_argv() != argv1->exec_argv());
210*c243e490SMarcel Moolenaar     argv1.release();
211*c243e490SMarcel Moolenaar     {
212*c243e490SMarcel Moolenaar         const char* const* eargv2 = argv2->exec_argv();
213*c243e490SMarcel Moolenaar         ATF_REQUIRE(std::strcmp(eargv2[0], carray1[0]) == 0);
214*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(eargv2[1], static_cast< const char* >(NULL));
215*c243e490SMarcel Moolenaar     }
216*c243e490SMarcel Moolenaar 
217*c243e490SMarcel Moolenaar     argv2.release();
218*c243e490SMarcel Moolenaar }
219*c243e490SMarcel Moolenaar 
220*c243e490SMarcel Moolenaar ATF_TEST_CASE(argv_array_copy);
221*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(argv_array_copy)
222*c243e490SMarcel Moolenaar {
223*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests that copying an argv_array constructed from "
224*c243e490SMarcel Moolenaar                "a C-style array of strings works");
225*c243e490SMarcel Moolenaar }
226*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(argv_array_copy)
227*c243e490SMarcel Moolenaar {
228*c243e490SMarcel Moolenaar     using atf::process::argv_array;
229*c243e490SMarcel Moolenaar 
230*c243e490SMarcel Moolenaar     const char* const carray[] = { "arg0", NULL };
231*c243e490SMarcel Moolenaar 
232*c243e490SMarcel Moolenaar     std::auto_ptr< argv_array > argv1(new argv_array(carray));
233*c243e490SMarcel Moolenaar     std::auto_ptr< argv_array > argv2(new argv_array(*argv1));
234*c243e490SMarcel Moolenaar 
235*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(argv2->size(), argv1->size());
236*c243e490SMarcel Moolenaar     ATF_REQUIRE(std::strcmp((*argv2)[0], (*argv1)[0]) == 0);
237*c243e490SMarcel Moolenaar 
238*c243e490SMarcel Moolenaar     ATF_REQUIRE(argv2->exec_argv() != argv1->exec_argv());
239*c243e490SMarcel Moolenaar     argv1.release();
240*c243e490SMarcel Moolenaar     {
241*c243e490SMarcel Moolenaar         const char* const* eargv2 = argv2->exec_argv();
242*c243e490SMarcel Moolenaar         ATF_REQUIRE(std::strcmp(eargv2[0], carray[0]) == 0);
243*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(eargv2[1], static_cast< const char* >(NULL));
244*c243e490SMarcel Moolenaar     }
245*c243e490SMarcel Moolenaar 
246*c243e490SMarcel Moolenaar     argv2.release();
247*c243e490SMarcel Moolenaar }
248*c243e490SMarcel Moolenaar 
249*c243e490SMarcel Moolenaar ATF_TEST_CASE(argv_array_exec_argv);
250*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(argv_array_exec_argv)
251*c243e490SMarcel Moolenaar {
252*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests that the exec argv provided by an argv_array "
253*c243e490SMarcel Moolenaar                "is correct");
254*c243e490SMarcel Moolenaar }
255*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(argv_array_exec_argv)
256*c243e490SMarcel Moolenaar {
257*c243e490SMarcel Moolenaar     using atf::process::argv_array;
258*c243e490SMarcel Moolenaar 
259*c243e490SMarcel Moolenaar     {
260*c243e490SMarcel Moolenaar         argv_array argv;
261*c243e490SMarcel Moolenaar         const char* const* eargv = argv.exec_argv();
262*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(array_size(eargv), 0);
263*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(eargv[0], static_cast< const char* >(NULL));
264*c243e490SMarcel Moolenaar     }
265*c243e490SMarcel Moolenaar 
266*c243e490SMarcel Moolenaar     {
267*c243e490SMarcel Moolenaar         const char* const carray[] = { "arg0", NULL };
268*c243e490SMarcel Moolenaar         argv_array argv(carray);
269*c243e490SMarcel Moolenaar         const char* const* eargv = argv.exec_argv();
270*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(array_size(eargv), 1);
271*c243e490SMarcel Moolenaar         ATF_REQUIRE(std::strcmp(eargv[0], "arg0") == 0);
272*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(eargv[1], static_cast< const char* >(NULL));
273*c243e490SMarcel Moolenaar     }
274*c243e490SMarcel Moolenaar 
275*c243e490SMarcel Moolenaar     {
276*c243e490SMarcel Moolenaar         std::vector< std::string > col;
277*c243e490SMarcel Moolenaar         col.push_back("arg0");
278*c243e490SMarcel Moolenaar         argv_array argv(col);
279*c243e490SMarcel Moolenaar         const char* const* eargv = argv.exec_argv();
280*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(array_size(eargv), 1);
281*c243e490SMarcel Moolenaar         ATF_REQUIRE(std::strcmp(eargv[0], "arg0") == 0);
282*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(eargv[1], static_cast< const char* >(NULL));
283*c243e490SMarcel Moolenaar     }
284*c243e490SMarcel Moolenaar }
285*c243e490SMarcel Moolenaar 
286*c243e490SMarcel Moolenaar ATF_TEST_CASE(argv_array_iter);
287*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(argv_array_iter)
288*c243e490SMarcel Moolenaar {
289*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests that an argv_array can be iterated");
290*c243e490SMarcel Moolenaar }
291*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(argv_array_iter)
292*c243e490SMarcel Moolenaar {
293*c243e490SMarcel Moolenaar     using atf::process::argv_array;
294*c243e490SMarcel Moolenaar 
295*c243e490SMarcel Moolenaar     std::vector< std::string > vector;
296*c243e490SMarcel Moolenaar     vector.push_back("arg0");
297*c243e490SMarcel Moolenaar     vector.push_back("arg1");
298*c243e490SMarcel Moolenaar     vector.push_back("arg2");
299*c243e490SMarcel Moolenaar 
300*c243e490SMarcel Moolenaar     argv_array argv(vector);
301*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(argv.size(), 3);
302*c243e490SMarcel Moolenaar     std::vector< std::string >::size_type pos = 0;
303*c243e490SMarcel Moolenaar     for (argv_array::const_iterator iter = argv.begin(); iter != argv.end();
304*c243e490SMarcel Moolenaar          iter++) {
305*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(*iter, vector[pos]);
306*c243e490SMarcel Moolenaar         pos++;
307*c243e490SMarcel Moolenaar     }
308*c243e490SMarcel Moolenaar }
309*c243e490SMarcel Moolenaar 
310*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
311*c243e490SMarcel Moolenaar // Tests cases for the free functions.
312*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
313*c243e490SMarcel Moolenaar 
314*c243e490SMarcel Moolenaar ATF_TEST_CASE(exec_failure);
315*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(exec_failure)
316*c243e490SMarcel Moolenaar {
317*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests execing a command that reports failure");
318*c243e490SMarcel Moolenaar }
319*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(exec_failure)
320*c243e490SMarcel Moolenaar {
321*c243e490SMarcel Moolenaar     const atf::process::status s = exec_process_helpers(*this, "exit-failure");
322*c243e490SMarcel Moolenaar     ATF_REQUIRE(s.exited());
323*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(s.exitstatus(), EXIT_FAILURE);
324*c243e490SMarcel Moolenaar }
325*c243e490SMarcel Moolenaar 
326*c243e490SMarcel Moolenaar ATF_TEST_CASE(exec_success);
327*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(exec_success)
328*c243e490SMarcel Moolenaar {
329*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests execing a command that reports success");
330*c243e490SMarcel Moolenaar }
331*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(exec_success)
332*c243e490SMarcel Moolenaar {
333*c243e490SMarcel Moolenaar     const atf::process::status s = exec_process_helpers(*this, "exit-success");
334*c243e490SMarcel Moolenaar     ATF_REQUIRE(s.exited());
335*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(s.exitstatus(), EXIT_SUCCESS);
336*c243e490SMarcel Moolenaar }
337*c243e490SMarcel Moolenaar 
338*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
339*c243e490SMarcel Moolenaar // Main.
340*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
341*c243e490SMarcel Moolenaar 
342*c243e490SMarcel Moolenaar ATF_INIT_TEST_CASES(tcs)
343*c243e490SMarcel Moolenaar {
344*c243e490SMarcel Moolenaar     // Add the test cases for the "argv_array" type.
345*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, argv_array_assign);
346*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, argv_array_copy);
347*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, argv_array_exec_argv);
348*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, argv_array_init_carray);
349*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, argv_array_init_col);
350*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, argv_array_init_empty);
351*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, argv_array_init_varargs);
352*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, argv_array_iter);
353*c243e490SMarcel Moolenaar 
354*c243e490SMarcel Moolenaar     // Add the test cases for the free functions.
355*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, exec_failure);
356*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, exec_success);
357*c243e490SMarcel Moolenaar }
358