Path: blob/main/contrib/atf/atf-c++/detail/process_test.cpp
39563 views
// Copyright (c) 2008 The NetBSD Foundation, Inc.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions5// are met:6// 1. Redistributions of source code must retain the above copyright7// notice, this list of conditions and the following disclaimer.8// 2. Redistributions in binary form must reproduce the above copyright9// notice, this list of conditions and the following disclaimer in the10// documentation and/or other materials provided with the distribution.11//12// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND13// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,14// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF15// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.16// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY17// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE19// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS20// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER21// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR22// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN23// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2425#include "atf-c++/detail/process.hpp"2627#include <cstdlib>28#include <cstring>2930#include <atf-c++.hpp>3132#include "atf-c++/detail/test_helpers.hpp"3334// TODO: Testing the fork function is a huge task and I'm afraid of35// copy/pasting tons of stuff from the C version. I'd rather not do that36// until some code can be shared, which cannot happen until the C++ binding37// is cleaned by a fair amount. Instead... just rely (at the moment) on38// the system tests for the tools using this module.3940// ------------------------------------------------------------------------41// Auxiliary functions.42// ------------------------------------------------------------------------4344static45std::size_t46array_size(const char* const* array)47{48std::size_t size = 0;4950for (const char* const* ptr = array; *ptr != NULL; ptr++)51size++;5253return size;54}5556static57atf::process::status58exec_process_helpers(const atf::tests::tc& tc, const char* helper_name)59{60using atf::process::exec;6162std::vector< std::string > argv;63argv.push_back(get_process_helpers_path(tc, true).leaf_name());64argv.push_back(helper_name);6566return exec(get_process_helpers_path(tc, true),67atf::process::argv_array(argv),68atf::process::stream_inherit(),69atf::process::stream_inherit());70}7172// ------------------------------------------------------------------------73// Tests for the "argv_array" type.74// ------------------------------------------------------------------------7576ATF_TEST_CASE(argv_array_init_carray);77ATF_TEST_CASE_HEAD(argv_array_init_carray)78{79set_md_var("descr", "Tests that argv_array is correctly constructed "80"from a C-style array of strings");81}82ATF_TEST_CASE_BODY(argv_array_init_carray)83{84{85const char* const carray[] = { NULL };86atf::process::argv_array argv(carray);8788ATF_REQUIRE_EQ(argv.size(), 0);89}9091{92const char* const carray[] = { "arg0", NULL };93atf::process::argv_array argv(carray);9495ATF_REQUIRE_EQ(argv.size(), 1);96ATF_REQUIRE(std::strcmp(argv[0], carray[0]) == 0);97}9899{100const char* const carray[] = { "arg0", "arg1", "arg2", NULL };101atf::process::argv_array argv(carray);102103ATF_REQUIRE_EQ(argv.size(), 3);104ATF_REQUIRE(std::strcmp(argv[0], carray[0]) == 0);105ATF_REQUIRE(std::strcmp(argv[1], carray[1]) == 0);106ATF_REQUIRE(std::strcmp(argv[2], carray[2]) == 0);107}108}109110ATF_TEST_CASE(argv_array_init_col);111ATF_TEST_CASE_HEAD(argv_array_init_col)112{113set_md_var("descr", "Tests that argv_array is correctly constructed "114"from a string collection");115}116ATF_TEST_CASE_BODY(argv_array_init_col)117{118{119std::vector< std::string > col;120atf::process::argv_array argv(col);121122ATF_REQUIRE_EQ(argv.size(), 0);123}124125{126std::vector< std::string > col;127col.push_back("arg0");128atf::process::argv_array argv(col);129130ATF_REQUIRE_EQ(argv.size(), 1);131ATF_REQUIRE_EQ(argv[0], col[0]);132}133134{135std::vector< std::string > col;136col.push_back("arg0");137col.push_back("arg1");138col.push_back("arg2");139atf::process::argv_array argv(col);140141ATF_REQUIRE_EQ(argv.size(), 3);142ATF_REQUIRE_EQ(argv[0], col[0]);143ATF_REQUIRE_EQ(argv[1], col[1]);144ATF_REQUIRE_EQ(argv[2], col[2]);145}146}147148ATF_TEST_CASE(argv_array_init_empty);149ATF_TEST_CASE_HEAD(argv_array_init_empty)150{151set_md_var("descr", "Tests that argv_array is correctly constructed "152"by the default constructor");153}154ATF_TEST_CASE_BODY(argv_array_init_empty)155{156atf::process::argv_array argv;157158ATF_REQUIRE_EQ(argv.size(), 0);159}160161ATF_TEST_CASE(argv_array_init_varargs);162ATF_TEST_CASE_HEAD(argv_array_init_varargs)163{164set_md_var("descr", "Tests that argv_array is correctly constructed "165"from a variable list of arguments");166}167ATF_TEST_CASE_BODY(argv_array_init_varargs)168{169{170atf::process::argv_array argv("arg0", NULL);171172ATF_REQUIRE_EQ(argv.size(), 1);173ATF_REQUIRE_EQ(argv[0], std::string("arg0"));174}175176{177atf::process::argv_array argv("arg0", "arg1", "arg2", NULL);178179ATF_REQUIRE_EQ(argv.size(), 3);180ATF_REQUIRE_EQ(argv[0], std::string("arg0"));181ATF_REQUIRE_EQ(argv[1], std::string("arg1"));182ATF_REQUIRE_EQ(argv[2], std::string("arg2"));183}184}185186ATF_TEST_CASE(argv_array_assign);187ATF_TEST_CASE_HEAD(argv_array_assign)188{189set_md_var("descr", "Tests that assigning an argv_array works");190}191ATF_TEST_CASE_BODY(argv_array_assign)192{193using atf::process::argv_array;194195const char* const carray1[] = { "arg1", NULL };196const char* const carray2[] = { "arg1", "arg2", NULL };197198std::unique_ptr< argv_array > argv1(new argv_array(carray1));199std::unique_ptr< argv_array > argv2(new argv_array(carray2));200201*argv2 = *argv1;202ATF_REQUIRE_EQ(argv2->size(), argv1->size());203ATF_REQUIRE(std::strcmp((*argv2)[0], (*argv1)[0]) == 0);204205ATF_REQUIRE(argv2->exec_argv() != argv1->exec_argv());206argv1.release();207{208const char* const* eargv2 = argv2->exec_argv();209ATF_REQUIRE(std::strcmp(eargv2[0], carray1[0]) == 0);210ATF_REQUIRE_EQ(eargv2[1], static_cast< const char* >(NULL));211}212213argv2.release();214}215216ATF_TEST_CASE(argv_array_copy);217ATF_TEST_CASE_HEAD(argv_array_copy)218{219set_md_var("descr", "Tests that copying an argv_array constructed from "220"a C-style array of strings works");221}222ATF_TEST_CASE_BODY(argv_array_copy)223{224using atf::process::argv_array;225226const char* const carray[] = { "arg0", NULL };227228std::unique_ptr< argv_array > argv1(new argv_array(carray));229std::unique_ptr< argv_array > argv2(new argv_array(*argv1));230231ATF_REQUIRE_EQ(argv2->size(), argv1->size());232ATF_REQUIRE(std::strcmp((*argv2)[0], (*argv1)[0]) == 0);233234ATF_REQUIRE(argv2->exec_argv() != argv1->exec_argv());235argv1.release();236{237const char* const* eargv2 = argv2->exec_argv();238ATF_REQUIRE(std::strcmp(eargv2[0], carray[0]) == 0);239ATF_REQUIRE_EQ(eargv2[1], static_cast< const char* >(NULL));240}241242argv2.release();243}244245ATF_TEST_CASE(argv_array_exec_argv);246ATF_TEST_CASE_HEAD(argv_array_exec_argv)247{248set_md_var("descr", "Tests that the exec argv provided by an argv_array "249"is correct");250}251ATF_TEST_CASE_BODY(argv_array_exec_argv)252{253using atf::process::argv_array;254255{256argv_array argv;257const char* const* eargv = argv.exec_argv();258ATF_REQUIRE_EQ(array_size(eargv), 0);259ATF_REQUIRE_EQ(eargv[0], static_cast< const char* >(NULL));260}261262{263const char* const carray[] = { "arg0", NULL };264argv_array argv(carray);265const char* const* eargv = argv.exec_argv();266ATF_REQUIRE_EQ(array_size(eargv), 1);267ATF_REQUIRE(std::strcmp(eargv[0], "arg0") == 0);268ATF_REQUIRE_EQ(eargv[1], static_cast< const char* >(NULL));269}270271{272std::vector< std::string > col;273col.push_back("arg0");274argv_array argv(col);275const char* const* eargv = argv.exec_argv();276ATF_REQUIRE_EQ(array_size(eargv), 1);277ATF_REQUIRE(std::strcmp(eargv[0], "arg0") == 0);278ATF_REQUIRE_EQ(eargv[1], static_cast< const char* >(NULL));279}280}281282ATF_TEST_CASE(argv_array_iter);283ATF_TEST_CASE_HEAD(argv_array_iter)284{285set_md_var("descr", "Tests that an argv_array can be iterated");286}287ATF_TEST_CASE_BODY(argv_array_iter)288{289using atf::process::argv_array;290291std::vector< std::string > vector;292vector.push_back("arg0");293vector.push_back("arg1");294vector.push_back("arg2");295296argv_array argv(vector);297ATF_REQUIRE_EQ(argv.size(), 3);298std::vector< std::string >::size_type pos = 0;299for (argv_array::const_iterator iter = argv.begin(); iter != argv.end();300iter++) {301ATF_REQUIRE_EQ(*iter, vector[pos]);302pos++;303}304}305306// ------------------------------------------------------------------------307// Tests cases for the free functions.308// ------------------------------------------------------------------------309310ATF_TEST_CASE(exec_failure);311ATF_TEST_CASE_HEAD(exec_failure)312{313set_md_var("descr", "Tests execing a command that reports failure");314}315ATF_TEST_CASE_BODY(exec_failure)316{317const atf::process::status s = exec_process_helpers(*this, "exit-failure");318ATF_REQUIRE(s.exited());319ATF_REQUIRE_EQ(s.exitstatus(), EXIT_FAILURE);320}321322ATF_TEST_CASE(exec_success);323ATF_TEST_CASE_HEAD(exec_success)324{325set_md_var("descr", "Tests execing a command that reports success");326}327ATF_TEST_CASE_BODY(exec_success)328{329const atf::process::status s = exec_process_helpers(*this, "exit-success");330ATF_REQUIRE(s.exited());331ATF_REQUIRE_EQ(s.exitstatus(), EXIT_SUCCESS);332}333334// ------------------------------------------------------------------------335// Main.336// ------------------------------------------------------------------------337338ATF_INIT_TEST_CASES(tcs)339{340// Add the test cases for the "argv_array" type.341ATF_ADD_TEST_CASE(tcs, argv_array_assign);342ATF_ADD_TEST_CASE(tcs, argv_array_copy);343ATF_ADD_TEST_CASE(tcs, argv_array_exec_argv);344ATF_ADD_TEST_CASE(tcs, argv_array_init_carray);345ATF_ADD_TEST_CASE(tcs, argv_array_init_col);346ATF_ADD_TEST_CASE(tcs, argv_array_init_empty);347ATF_ADD_TEST_CASE(tcs, argv_array_init_varargs);348ATF_ADD_TEST_CASE(tcs, argv_array_iter);349350// Add the test cases for the free functions.351ATF_ADD_TEST_CASE(tcs, exec_failure);352ATF_ADD_TEST_CASE(tcs, exec_success);353}354355356