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