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