config_test.cpp revision 240116
11553Srgrimes// 21553Srgrimes// Automated Testing Framework (atf) 31553Srgrimes// 41553Srgrimes// Copyright (c) 2007 The NetBSD Foundation, Inc. 51553Srgrimes// All rights reserved. 61553Srgrimes// 71553Srgrimes// Redistribution and use in source and binary forms, with or without 81553Srgrimes// modification, are permitted provided that the following conditions 91553Srgrimes// are met: 101553Srgrimes// 1. Redistributions of source code must retain the above copyright 111553Srgrimes// notice, this list of conditions and the following disclaimer. 121553Srgrimes// 2. Redistributions in binary form must reproduce the above copyright 131553Srgrimes// notice, this list of conditions and the following disclaimer in the 141553Srgrimes// documentation and/or other materials provided with the distribution. 151553Srgrimes// 161553Srgrimes// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 171553Srgrimes// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 181553Srgrimes// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 191553Srgrimes// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 201553Srgrimes// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 211553Srgrimes// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221553Srgrimes// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 231553Srgrimes// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 241553Srgrimes// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 251553Srgrimes// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 261553Srgrimes// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 271553Srgrimes// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 281553Srgrimes// 291553Srgrimes 301553Srgrimes#include <cstring> 311553Srgrimes#include <iostream> 321553Srgrimes 331553Srgrimes#include "config.hpp" 341553Srgrimes#include "macros.hpp" 3530602Scharnier 361553Srgrimes#include "detail/env.hpp" 371553Srgrimes#include "detail/exceptions.hpp" 381553Srgrimes#include "detail/test_helpers.hpp" 391553Srgrimes 401553Srgrimesstatic const char *test_value = "env-value"; 4130602Scharnier 4230602Scharnierstatic struct varnames { 4330602Scharnier const char *lc; 446284Swollman const char *uc; 4541019Sphk bool can_be_empty; 461553Srgrimes} all_vars[] = { 471553Srgrimes { "atf_arch", "ATF_ARCH", false }, 4812946Sphk { "atf_build_cc", "ATF_BUILD_CC", false }, 491553Srgrimes { "atf_build_cflags", "ATF_BUILD_CFLAGS", true }, 501553Srgrimes { "atf_build_cpp", "ATF_BUILD_CPP", false }, 5112946Sphk { "atf_build_cppflags", "ATF_BUILD_CPPFLAGS", true }, 521553Srgrimes { "atf_build_cxx", "ATF_BUILD_CXX", false }, 5330602Scharnier { "atf_build_cxxflags", "ATF_BUILD_CXXFLAGS", true }, 5430602Scharnier { "atf_confdir", "ATF_CONFDIR", false }, 551553Srgrimes { "atf_includedir", "ATF_INCLUDEDIR", false }, 561553Srgrimes { "atf_libdir", "ATF_LIBDIR", false }, 571553Srgrimes { "atf_libexecdir", "ATF_LIBEXECDIR", false }, 581553Srgrimes { "atf_machine", "ATF_MACHINE", false }, 5930602Scharnier { "atf_pkgdatadir", "ATF_PKGDATADIR", false }, 601553Srgrimes { "atf_shell", "ATF_SHELL", false }, 6112946Sphk { "atf_workdir", "ATF_WORKDIR", false }, 621553Srgrimes { NULL, NULL, false } 6312946Sphk}; 6412946Sphk 6512946Sphk// ------------------------------------------------------------------------ 6612946Sphk// Auxiliary functions. 6712946Sphk// ------------------------------------------------------------------------ 681553Srgrimes 6912946Sphknamespace atf { 7012946Sphk namespace config { 7112946Sphk void __reinit(void); 721553Srgrimes } 7330602Scharnier} 7430602Scharnier 7530602Scharnierstatic 7630602Scharniervoid 7730602Scharnierset_env_var(const char* name, const char* val) 7812946Sphk{ 7912946Sphk try { 801553Srgrimes atf::env::set(name, val); 811553Srgrimes } catch (const atf::system_error&) { 8212946Sphk ATF_FAIL(std::string("set_env_var(") + name + ", " + val + 831553Srgrimes ") failed"); 8412946Sphk } 8512946Sphk} 8612946Sphk 871553Srgrimesstatic 8824428Simpvoid 891553Srgrimesunset_env_var(const char* name) 9012946Sphk{ 9112946Sphk try { 9212946Sphk atf::env::unset(name); 9312946Sphk } catch (const atf::system_error&) { 9412946Sphk ATF_FAIL(std::string("unset_env_var(") + name + ") failed"); 9512946Sphk } 9612946Sphk} 971553Srgrimes 981553Srgrimesstatic 991553Srgrimessize_t 1001553Srgrimesall_vars_count(void) 1011553Srgrimes{ 10212946Sphk size_t count = 0; 10312946Sphk for (const struct varnames* v = all_vars; v->lc != NULL; v++) 1041553Srgrimes count++; 1051553Srgrimes return count; 1061553Srgrimes} 10712946Sphk 1081553Srgrimesstatic 1091553Srgrimesvoid 1101553Srgrimesunset_all(void) 1111553Srgrimes{ 1121553Srgrimes for (const struct varnames* v = all_vars; v->lc != NULL; v++) 1131553Srgrimes unset_env_var(v->uc); 1141553Srgrimes} 1151553Srgrimes 11612946Sphkstatic 11712946Sphkvoid 1181553Srgrimescompare_one(const char* var, const char* expvalue) 11912946Sphk{ 1201553Srgrimes std::cout << "Checking that " << var << " is set to " << expvalue << "\n"; 1211553Srgrimes 1221553Srgrimes for (const struct varnames* v = all_vars; v->lc != NULL; v++) { 1231553Srgrimes if (std::strcmp(v->lc, var) == 0) 12412946Sphk ATF_REQUIRE_EQ(atf::config::get(v->lc), test_value); 12512946Sphk else 1261553Srgrimes ATF_REQUIRE(atf::config::get(v->lc) != test_value); 1271553Srgrimes } 1281553Srgrimes} 1291553Srgrimes 13030602Scharnier// ------------------------------------------------------------------------ 13130602Scharnier// Test cases for the free functions. 1321553Srgrimes// ------------------------------------------------------------------------ 1331553Srgrimes 1341553SrgrimesATF_TEST_CASE(get); 1351553SrgrimesATF_TEST_CASE_HEAD(get) 1361553Srgrimes{ 1371553Srgrimes set_md_var("descr", "Tests the config::get function"); 13815172Ssmpatel} 13915172SsmpatelATF_TEST_CASE_BODY(get) 14015172Ssmpatel{ 1411553Srgrimes // Unset all known environment variables and make sure the built-in 14212946Sphk // values do not match the bogus value we will use for testing. 1431553Srgrimes unset_all(); 14412946Sphk atf::config::__reinit(); 14530602Scharnier for (const struct varnames* v = all_vars; v->lc != NULL; v++) 1461553Srgrimes ATF_REQUIRE(atf::config::get(v->lc) != test_value); 14712946Sphk 14830602Scharnier // Test the behavior of empty values. 1491553Srgrimes for (const struct varnames* v = all_vars; v->lc != NULL; v++) { 15012946Sphk unset_all(); 15112946Sphk if (!atf::config::get(v->lc).empty()) { 15212946Sphk set_env_var(v->uc, ""); 15312946Sphk atf::config::__reinit(); 15412946Sphk if (v->can_be_empty) 15512946Sphk ATF_REQUIRE(atf::config::get(v->lc).empty()); 15612946Sphk else 1571553Srgrimes ATF_REQUIRE(!atf::config::get(v->lc).empty()); 15812946Sphk } 15912946Sphk } 16012946Sphk 1611553Srgrimes // Check if the ATF_ARCH variable is recognized. 16212946Sphk for (const struct varnames* v = all_vars; v->lc != NULL; v++) { 16312946Sphk unset_all(); 16412946Sphk set_env_var(v->uc, test_value); 16512946Sphk atf::config::__reinit(); 16612946Sphk compare_one(v->lc, test_value); 16712946Sphk } 16812946Sphk} 16912946Sphk 1701553SrgrimesATF_TEST_CASE(get_all); 17112946SphkATF_TEST_CASE_HEAD(get_all) 17212946Sphk{ 17312946Sphk set_md_var("descr", "Tests the config::get_all function"); 17412946Sphk} 17512946SphkATF_TEST_CASE_BODY(get_all) 17612946Sphk{ 17712946Sphk atf::config::__reinit(); 17812946Sphk 17912946Sphk // Check that the valid variables, and only those, are returned. 18012946Sphk std::map< std::string, std::string > vars = atf::config::get_all(); 18112946Sphk ATF_REQUIRE_EQ(vars.size(), all_vars_count()); 18231214Sjdp for (const struct varnames* v = all_vars; v->lc != NULL; v++) 18331214Sjdp ATF_REQUIRE(vars.find(v->lc) != vars.end()); 1841553Srgrimes} 1851553Srgrimes 18612946SphkATF_TEST_CASE(has); 18712946SphkATF_TEST_CASE_HEAD(has) 18812946Sphk{ 18912946Sphk set_md_var("descr", "Tests the config::has function"); 19012946Sphk} 19112946SphkATF_TEST_CASE_BODY(has) 19230602Scharnier{ 19312946Sphk atf::config::__reinit(); 19412946Sphk 19530602Scharnier // Check for all the variables that must exist. 19612946Sphk for (const struct varnames* v = all_vars; v->lc != NULL; v++) 19712946Sphk ATF_REQUIRE(atf::config::has(v->lc)); 19830602Scharnier 19912946Sphk // Same as above, but using uppercase (which is incorrect). 20012946Sphk for (const struct varnames* v = all_vars; v->lc != NULL; v++) 20130602Scharnier ATF_REQUIRE(!atf::config::has(v->uc)); 20212946Sphk 20312946Sphk // Check for some other variables that cannot exist. 20412946Sphk ATF_REQUIRE(!atf::config::has("foo")); 20512946Sphk ATF_REQUIRE(!atf::config::has("BAR")); 20612946Sphk ATF_REQUIRE(!atf::config::has("atf_foo")); 20712946Sphk ATF_REQUIRE(!atf::config::has("ATF_BAR")); 20812946Sphk ATF_REQUIRE(!atf::config::has("atf_shel")); 20912946Sphk ATF_REQUIRE(!atf::config::has("atf_shells")); 21012946Sphk} 21112946Sphk 21212946Sphk// ------------------------------------------------------------------------ 21312946Sphk// Tests cases for the header file. 21412946Sphk// ------------------------------------------------------------------------ 2151553Srgrimes 21612946SphkHEADER_TC(include, "atf-c++/config.hpp"); 2171553Srgrimes 21812946Sphk// ------------------------------------------------------------------------ 21912946Sphk// Main. 22012946Sphk// ------------------------------------------------------------------------ 22112946Sphk 22212946SphkATF_INIT_TEST_CASES(tcs) 22330602Scharnier{ 22426899Sjhay // Add the test cases for the free functions. 22526899Sjhay ATF_ADD_TEST_CASE(tcs, has); 22612946Sphk ATF_ADD_TEST_CASE(tcs, get); 22712946Sphk ATF_ADD_TEST_CASE(tcs, get_all); 2281553Srgrimes 22912946Sphk // Add the test cases for the header file. 23012946Sphk ATF_ADD_TEST_CASE(tcs, include); 23112946Sphk} 23212946Sphk