1*c243e490SMarcel Moolenaar // 2*c243e490SMarcel Moolenaar // Automated Testing Framework (atf) 3*c243e490SMarcel Moolenaar // 4*c243e490SMarcel Moolenaar // Copyright (c) 2009 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 <cstring> 31*c243e490SMarcel Moolenaar #include <iostream> 32*c243e490SMarcel Moolenaar 33*c243e490SMarcel Moolenaar #include "../atf-c/h_build.h" 34*c243e490SMarcel Moolenaar 35*c243e490SMarcel Moolenaar #include "build.hpp" 36*c243e490SMarcel Moolenaar #include "config.hpp" 37*c243e490SMarcel Moolenaar #include "macros.hpp" 38*c243e490SMarcel Moolenaar 39*c243e490SMarcel Moolenaar #include "detail/env.hpp" 40*c243e490SMarcel Moolenaar #include "detail/process.hpp" 41*c243e490SMarcel Moolenaar #include "detail/test_helpers.hpp" 42*c243e490SMarcel Moolenaar 43*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 44*c243e490SMarcel Moolenaar // Auxiliary functions. 45*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 46*c243e490SMarcel Moolenaar 47*c243e490SMarcel Moolenaar namespace atf { 48*c243e490SMarcel Moolenaar namespace config { 49*c243e490SMarcel Moolenaar void __reinit(void); 50*c243e490SMarcel Moolenaar } 51*c243e490SMarcel Moolenaar } 52*c243e490SMarcel Moolenaar 53*c243e490SMarcel Moolenaar template< class C > 54*c243e490SMarcel Moolenaar void 55*c243e490SMarcel Moolenaar print_col(const char* prefix, const C& c) 56*c243e490SMarcel Moolenaar { 57*c243e490SMarcel Moolenaar std::cout << prefix << ":"; 58*c243e490SMarcel Moolenaar for (typename C::const_iterator iter = c.begin(); iter != c.end(); 59*c243e490SMarcel Moolenaar iter++) 60*c243e490SMarcel Moolenaar std::cout << " '" << *iter << "'"; 61*c243e490SMarcel Moolenaar std::cout << "\n"; 62*c243e490SMarcel Moolenaar } 63*c243e490SMarcel Moolenaar 64*c243e490SMarcel Moolenaar static 65*c243e490SMarcel Moolenaar void 66*c243e490SMarcel Moolenaar print_array(const char* prefix, const char* const* a) 67*c243e490SMarcel Moolenaar { 68*c243e490SMarcel Moolenaar std::cout << prefix << ":"; 69*c243e490SMarcel Moolenaar for (; *a != NULL; a++) 70*c243e490SMarcel Moolenaar std::cout << " '" << *a << "'"; 71*c243e490SMarcel Moolenaar std::cout << "\n"; 72*c243e490SMarcel Moolenaar } 73*c243e490SMarcel Moolenaar 74*c243e490SMarcel Moolenaar static 75*c243e490SMarcel Moolenaar void 76*c243e490SMarcel Moolenaar verbose_set_env(const char *var, const char *val) 77*c243e490SMarcel Moolenaar { 78*c243e490SMarcel Moolenaar std::cout << "Setting " << var << " to '" << val << "'\n"; 79*c243e490SMarcel Moolenaar atf::env::set(var, val); 80*c243e490SMarcel Moolenaar } 81*c243e490SMarcel Moolenaar 82*c243e490SMarcel Moolenaar static 83*c243e490SMarcel Moolenaar bool 84*c243e490SMarcel Moolenaar equal_argvs(const atf::process::argv_array& aa, const char* const* array) 85*c243e490SMarcel Moolenaar { 86*c243e490SMarcel Moolenaar bool equal = true; 87*c243e490SMarcel Moolenaar 88*c243e490SMarcel Moolenaar atf::process::argv_array::size_type i = 0; 89*c243e490SMarcel Moolenaar while (equal && (i < aa.size() && array[i] != NULL)) { 90*c243e490SMarcel Moolenaar if (std::strcmp(aa[i], array[i]) != 0) 91*c243e490SMarcel Moolenaar equal = false; 92*c243e490SMarcel Moolenaar else 93*c243e490SMarcel Moolenaar i++; 94*c243e490SMarcel Moolenaar } 95*c243e490SMarcel Moolenaar 96*c243e490SMarcel Moolenaar if (equal && (i < aa.size() || array[i] != NULL)) 97*c243e490SMarcel Moolenaar equal = false; 98*c243e490SMarcel Moolenaar 99*c243e490SMarcel Moolenaar return equal; 100*c243e490SMarcel Moolenaar } 101*c243e490SMarcel Moolenaar 102*c243e490SMarcel Moolenaar static 103*c243e490SMarcel Moolenaar void 104*c243e490SMarcel Moolenaar check_equal_argvs(const atf::process::argv_array& aa, const char* const* array) 105*c243e490SMarcel Moolenaar { 106*c243e490SMarcel Moolenaar print_array("Expected arguments", array); 107*c243e490SMarcel Moolenaar print_col("Arguments returned", aa); 108*c243e490SMarcel Moolenaar 109*c243e490SMarcel Moolenaar if (!equal_argvs(aa, array)) 110*c243e490SMarcel Moolenaar ATF_FAIL("The constructed argv differs from the expected values"); 111*c243e490SMarcel Moolenaar } 112*c243e490SMarcel Moolenaar 113*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 114*c243e490SMarcel Moolenaar // Internal test cases. 115*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 116*c243e490SMarcel Moolenaar 117*c243e490SMarcel Moolenaar ATF_TEST_CASE(equal_argvs); 118*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(equal_argvs) 119*c243e490SMarcel Moolenaar { 120*c243e490SMarcel Moolenaar set_md_var("descr", "Tests the test case internal equal_argvs function"); 121*c243e490SMarcel Moolenaar } 122*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(equal_argvs) 123*c243e490SMarcel Moolenaar { 124*c243e490SMarcel Moolenaar { 125*c243e490SMarcel Moolenaar const char* const array[] = { NULL }; 126*c243e490SMarcel Moolenaar const char* const argv[] = { NULL }; 127*c243e490SMarcel Moolenaar 128*c243e490SMarcel Moolenaar ATF_REQUIRE(equal_argvs(atf::process::argv_array(argv), array)); 129*c243e490SMarcel Moolenaar } 130*c243e490SMarcel Moolenaar 131*c243e490SMarcel Moolenaar { 132*c243e490SMarcel Moolenaar const char* const array[] = { NULL }; 133*c243e490SMarcel Moolenaar const char* const argv[] = { "foo", NULL }; 134*c243e490SMarcel Moolenaar 135*c243e490SMarcel Moolenaar ATF_REQUIRE(!equal_argvs(atf::process::argv_array(argv), array)); 136*c243e490SMarcel Moolenaar } 137*c243e490SMarcel Moolenaar 138*c243e490SMarcel Moolenaar { 139*c243e490SMarcel Moolenaar const char* const array[] = { "foo", NULL }; 140*c243e490SMarcel Moolenaar const char* const argv[] = { NULL }; 141*c243e490SMarcel Moolenaar 142*c243e490SMarcel Moolenaar ATF_REQUIRE(!equal_argvs(atf::process::argv_array(argv), array)); 143*c243e490SMarcel Moolenaar } 144*c243e490SMarcel Moolenaar 145*c243e490SMarcel Moolenaar { 146*c243e490SMarcel Moolenaar const char* const array[] = { "foo", NULL }; 147*c243e490SMarcel Moolenaar const char* const argv[] = { "foo", NULL }; 148*c243e490SMarcel Moolenaar 149*c243e490SMarcel Moolenaar ATF_REQUIRE(equal_argvs(atf::process::argv_array(argv), array)); 150*c243e490SMarcel Moolenaar } 151*c243e490SMarcel Moolenaar } 152*c243e490SMarcel Moolenaar 153*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 154*c243e490SMarcel Moolenaar // Test cases for the free functions. 155*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 156*c243e490SMarcel Moolenaar 157*c243e490SMarcel Moolenaar ATF_TEST_CASE(c_o); 158*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(c_o) 159*c243e490SMarcel Moolenaar { 160*c243e490SMarcel Moolenaar set_md_var("descr", "Tests the c_o function"); 161*c243e490SMarcel Moolenaar } 162*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(c_o) 163*c243e490SMarcel Moolenaar { 164*c243e490SMarcel Moolenaar for (struct c_o_test* test = c_o_tests; test->expargv[0] != NULL; 165*c243e490SMarcel Moolenaar test++) { 166*c243e490SMarcel Moolenaar std::cout << "> Test: " << test->msg << "\n"; 167*c243e490SMarcel Moolenaar 168*c243e490SMarcel Moolenaar verbose_set_env("ATF_BUILD_CC", test->cc); 169*c243e490SMarcel Moolenaar verbose_set_env("ATF_BUILD_CFLAGS", test->cflags); 170*c243e490SMarcel Moolenaar verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); 171*c243e490SMarcel Moolenaar atf::config::__reinit(); 172*c243e490SMarcel Moolenaar 173*c243e490SMarcel Moolenaar atf::process::argv_array argv = 174*c243e490SMarcel Moolenaar atf::build::c_o(test->sfile, test->ofile, 175*c243e490SMarcel Moolenaar atf::process::argv_array(test->optargs)); 176*c243e490SMarcel Moolenaar check_equal_argvs(argv, test->expargv); 177*c243e490SMarcel Moolenaar } 178*c243e490SMarcel Moolenaar } 179*c243e490SMarcel Moolenaar 180*c243e490SMarcel Moolenaar ATF_TEST_CASE(cpp); 181*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(cpp) 182*c243e490SMarcel Moolenaar { 183*c243e490SMarcel Moolenaar set_md_var("descr", "Tests the cpp function"); 184*c243e490SMarcel Moolenaar } 185*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(cpp) 186*c243e490SMarcel Moolenaar { 187*c243e490SMarcel Moolenaar for (struct cpp_test* test = cpp_tests; test->expargv[0] != NULL; 188*c243e490SMarcel Moolenaar test++) { 189*c243e490SMarcel Moolenaar std::cout << "> Test: " << test->msg << "\n"; 190*c243e490SMarcel Moolenaar 191*c243e490SMarcel Moolenaar verbose_set_env("ATF_BUILD_CPP", test->cpp); 192*c243e490SMarcel Moolenaar verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); 193*c243e490SMarcel Moolenaar atf::config::__reinit(); 194*c243e490SMarcel Moolenaar 195*c243e490SMarcel Moolenaar atf::process::argv_array argv = 196*c243e490SMarcel Moolenaar atf::build::cpp(test->sfile, test->ofile, 197*c243e490SMarcel Moolenaar atf::process::argv_array(test->optargs)); 198*c243e490SMarcel Moolenaar check_equal_argvs(argv, test->expargv); 199*c243e490SMarcel Moolenaar } 200*c243e490SMarcel Moolenaar } 201*c243e490SMarcel Moolenaar 202*c243e490SMarcel Moolenaar ATF_TEST_CASE(cxx_o); 203*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(cxx_o) 204*c243e490SMarcel Moolenaar { 205*c243e490SMarcel Moolenaar set_md_var("descr", "Tests the cxx_o function"); 206*c243e490SMarcel Moolenaar } 207*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(cxx_o) 208*c243e490SMarcel Moolenaar { 209*c243e490SMarcel Moolenaar for (struct cxx_o_test* test = cxx_o_tests; test->expargv[0] != NULL; 210*c243e490SMarcel Moolenaar test++) { 211*c243e490SMarcel Moolenaar std::cout << "> Test: " << test->msg << "\n"; 212*c243e490SMarcel Moolenaar 213*c243e490SMarcel Moolenaar verbose_set_env("ATF_BUILD_CXX", test->cxx); 214*c243e490SMarcel Moolenaar verbose_set_env("ATF_BUILD_CXXFLAGS", test->cxxflags); 215*c243e490SMarcel Moolenaar verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); 216*c243e490SMarcel Moolenaar atf::config::__reinit(); 217*c243e490SMarcel Moolenaar 218*c243e490SMarcel Moolenaar atf::process::argv_array argv = 219*c243e490SMarcel Moolenaar atf::build::cxx_o(test->sfile, test->ofile, 220*c243e490SMarcel Moolenaar atf::process::argv_array(test->optargs)); 221*c243e490SMarcel Moolenaar check_equal_argvs(argv, test->expargv); 222*c243e490SMarcel Moolenaar } 223*c243e490SMarcel Moolenaar } 224*c243e490SMarcel Moolenaar 225*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 226*c243e490SMarcel Moolenaar // Tests cases for the header file. 227*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 228*c243e490SMarcel Moolenaar 229*c243e490SMarcel Moolenaar HEADER_TC(include, "atf-c++/build.hpp"); 230*c243e490SMarcel Moolenaar 231*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 232*c243e490SMarcel Moolenaar // Main. 233*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 234*c243e490SMarcel Moolenaar 235*c243e490SMarcel Moolenaar ATF_INIT_TEST_CASES(tcs) 236*c243e490SMarcel Moolenaar { 237*c243e490SMarcel Moolenaar // Add the internal test cases. 238*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, equal_argvs); 239*c243e490SMarcel Moolenaar 240*c243e490SMarcel Moolenaar // Add the test cases for the free functions. 241*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, c_o); 242*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, cpp); 243*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, cxx_o); 244*c243e490SMarcel Moolenaar 245*c243e490SMarcel Moolenaar // Add the test cases for the header file. 246*c243e490SMarcel Moolenaar ATF_ADD_TEST_CASE(tcs, include); 247*c243e490SMarcel Moolenaar } 248