1 1.1 jmmv // 2 1.1 jmmv // Automated Testing Framework (atf) 3 1.1 jmmv // 4 1.1 jmmv // Copyright (c) 2007 The NetBSD Foundation, Inc. 5 1.1 jmmv // All rights reserved. 6 1.1 jmmv // 7 1.1 jmmv // Redistribution and use in source and binary forms, with or without 8 1.1 jmmv // modification, are permitted provided that the following conditions 9 1.1 jmmv // are met: 10 1.1 jmmv // 1. Redistributions of source code must retain the above copyright 11 1.1 jmmv // notice, this list of conditions and the following disclaimer. 12 1.1 jmmv // 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jmmv // notice, this list of conditions and the following disclaimer in the 14 1.1 jmmv // documentation and/or other materials provided with the distribution. 15 1.1 jmmv // 16 1.1 jmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17 1.1 jmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18 1.1 jmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 1.1 jmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 1.1 jmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21 1.1 jmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 1.1 jmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23 1.1 jmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 1.1 jmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25 1.1 jmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26 1.1 jmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 1.1 jmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 jmmv // 29 1.1 jmmv 30 1.1 jmmv #include <cstring> 31 1.1 jmmv #include <iostream> 32 1.1 jmmv 33 1.1 jmmv #include <atf-c++.hpp> 34 1.1 jmmv 35 1.1 jmmv #include "config.hpp" 36 1.1 jmmv #include "env.hpp" 37 1.1 jmmv #include "exceptions.hpp" 38 1.1 jmmv 39 1.1 jmmv static const char *test_value = "env-value"; 40 1.1 jmmv 41 1.1 jmmv static struct varnames { 42 1.1 jmmv const char *lc; 43 1.1 jmmv const char *uc; 44 1.1 jmmv bool can_be_empty; 45 1.1 jmmv } all_vars[] = { 46 1.1 jmmv { "atf_arch", "ATF_ARCH", false }, 47 1.1 jmmv { "atf_build_cc", "ATF_BUILD_CC", false }, 48 1.1 jmmv { "atf_build_cflags", "ATF_BUILD_CFLAGS", true }, 49 1.1 jmmv { "atf_build_cpp", "ATF_BUILD_CPP", false }, 50 1.1 jmmv { "atf_build_cppflags", "ATF_BUILD_CPPFLAGS", true }, 51 1.1 jmmv { "atf_build_cxx", "ATF_BUILD_CXX", false }, 52 1.1 jmmv { "atf_build_cxxflags", "ATF_BUILD_CXXFLAGS", true }, 53 1.1 jmmv { "atf_confdir", "ATF_CONFDIR", false }, 54 1.1 jmmv { "atf_includedir", "ATF_INCLUDEDIR", false }, 55 1.1 jmmv { "atf_libdir", "ATF_LIBDIR", false }, 56 1.1 jmmv { "atf_libexecdir", "ATF_LIBEXECDIR", false }, 57 1.1 jmmv { "atf_machine", "ATF_MACHINE", false }, 58 1.1 jmmv { "atf_pkgdatadir", "ATF_PKGDATADIR", false }, 59 1.1 jmmv { "atf_shell", "ATF_SHELL", false }, 60 1.1 jmmv { "atf_workdir", "ATF_WORKDIR", false }, 61 1.1 jmmv { NULL, NULL, false } 62 1.1 jmmv }; 63 1.1 jmmv 64 1.1 jmmv // ------------------------------------------------------------------------ 65 1.1 jmmv // Auxiliary functions. 66 1.1 jmmv // ------------------------------------------------------------------------ 67 1.1 jmmv 68 1.1 jmmv namespace tools { 69 1.1 jmmv namespace config { 70 1.1 jmmv void __reinit(void); 71 1.1 jmmv } 72 1.1 jmmv } 73 1.1 jmmv 74 1.1 jmmv static 75 1.1 jmmv void 76 1.1 jmmv set_env_var(const char* name, const char* val) 77 1.1 jmmv { 78 1.1 jmmv try { 79 1.1 jmmv tools::env::set(name, val); 80 1.1 jmmv } catch (const tools::system_error&) { 81 1.1 jmmv ATF_FAIL(std::string("set_env_var(") + name + ", " + val + 82 1.1 jmmv ") failed"); 83 1.1 jmmv } 84 1.1 jmmv } 85 1.1 jmmv 86 1.1 jmmv static 87 1.1 jmmv void 88 1.1 jmmv unset_env_var(const char* name) 89 1.1 jmmv { 90 1.1 jmmv try { 91 1.1 jmmv tools::env::unset(name); 92 1.1 jmmv } catch (const tools::system_error&) { 93 1.1 jmmv ATF_FAIL(std::string("unset_env_var(") + name + ") failed"); 94 1.1 jmmv } 95 1.1 jmmv } 96 1.1 jmmv 97 1.1 jmmv static 98 1.1 jmmv size_t 99 1.1 jmmv all_vars_count(void) 100 1.1 jmmv { 101 1.1 jmmv size_t count = 0; 102 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) 103 1.1 jmmv count++; 104 1.1 jmmv return count; 105 1.1 jmmv } 106 1.1 jmmv 107 1.1 jmmv static 108 1.1 jmmv void 109 1.1 jmmv unset_all(void) 110 1.1 jmmv { 111 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) 112 1.1 jmmv unset_env_var(v->uc); 113 1.1 jmmv } 114 1.1 jmmv 115 1.1 jmmv static 116 1.1 jmmv void 117 1.1 jmmv compare_one(const char* var, const char* expvalue) 118 1.1 jmmv { 119 1.1 jmmv std::cout << "Checking that " << var << " is set to " << expvalue << "\n"; 120 1.1 jmmv 121 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) { 122 1.1 jmmv if (std::strcmp(v->lc, var) == 0) 123 1.1 jmmv ATF_REQUIRE_EQ(tools::config::get(v->lc), test_value); 124 1.1 jmmv else 125 1.1 jmmv ATF_REQUIRE(tools::config::get(v->lc) != test_value); 126 1.1 jmmv } 127 1.1 jmmv } 128 1.1 jmmv 129 1.1 jmmv // ------------------------------------------------------------------------ 130 1.1 jmmv // Test cases for the free functions. 131 1.1 jmmv // ------------------------------------------------------------------------ 132 1.1 jmmv 133 1.1 jmmv ATF_TEST_CASE(get); 134 1.1 jmmv ATF_TEST_CASE_HEAD(get) 135 1.1 jmmv { 136 1.1 jmmv set_md_var("descr", "Tests the config::get function"); 137 1.1 jmmv } 138 1.1 jmmv ATF_TEST_CASE_BODY(get) 139 1.1 jmmv { 140 1.1 jmmv // Unset all known environment variables and make sure the built-in 141 1.1 jmmv // values do not match the bogus value we will use for testing. 142 1.1 jmmv unset_all(); 143 1.1 jmmv tools::config::__reinit(); 144 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) 145 1.1 jmmv ATF_REQUIRE(tools::config::get(v->lc) != test_value); 146 1.1 jmmv 147 1.1 jmmv // Test the behavior of empty values. 148 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) { 149 1.1 jmmv unset_all(); 150 1.1 jmmv if (!tools::config::get(v->lc).empty()) { 151 1.1 jmmv set_env_var(v->uc, ""); 152 1.1 jmmv tools::config::__reinit(); 153 1.1 jmmv if (v->can_be_empty) 154 1.1 jmmv ATF_REQUIRE(tools::config::get(v->lc).empty()); 155 1.1 jmmv else 156 1.1 jmmv ATF_REQUIRE(!tools::config::get(v->lc).empty()); 157 1.1 jmmv } 158 1.1 jmmv } 159 1.1 jmmv 160 1.1 jmmv // Check if the ATF_ARCH variable is recognized. 161 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) { 162 1.1 jmmv unset_all(); 163 1.1 jmmv set_env_var(v->uc, test_value); 164 1.1 jmmv tools::config::__reinit(); 165 1.1 jmmv compare_one(v->lc, test_value); 166 1.1 jmmv } 167 1.1 jmmv } 168 1.1 jmmv 169 1.1 jmmv ATF_TEST_CASE(get_all); 170 1.1 jmmv ATF_TEST_CASE_HEAD(get_all) 171 1.1 jmmv { 172 1.1 jmmv set_md_var("descr", "Tests the config::get_all function"); 173 1.1 jmmv } 174 1.1 jmmv ATF_TEST_CASE_BODY(get_all) 175 1.1 jmmv { 176 1.1 jmmv tools::config::__reinit(); 177 1.1 jmmv 178 1.1 jmmv // Check that the valid variables, and only those, are returned. 179 1.1 jmmv std::map< std::string, std::string > vars = tools::config::get_all(); 180 1.1 jmmv ATF_REQUIRE_EQ(vars.size(), all_vars_count()); 181 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) 182 1.1 jmmv ATF_REQUIRE(vars.find(v->lc) != vars.end()); 183 1.1 jmmv } 184 1.1 jmmv 185 1.1 jmmv ATF_TEST_CASE(has); 186 1.1 jmmv ATF_TEST_CASE_HEAD(has) 187 1.1 jmmv { 188 1.1 jmmv set_md_var("descr", "Tests the config::has function"); 189 1.1 jmmv } 190 1.1 jmmv ATF_TEST_CASE_BODY(has) 191 1.1 jmmv { 192 1.1 jmmv tools::config::__reinit(); 193 1.1 jmmv 194 1.1 jmmv // Check for all the variables that must exist. 195 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) 196 1.1 jmmv ATF_REQUIRE(tools::config::has(v->lc)); 197 1.1 jmmv 198 1.1 jmmv // Same as above, but using uppercase (which is incorrect). 199 1.1 jmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) 200 1.1 jmmv ATF_REQUIRE(!tools::config::has(v->uc)); 201 1.1 jmmv 202 1.1 jmmv // Check for some other variables that cannot exist. 203 1.1 jmmv ATF_REQUIRE(!tools::config::has("foo")); 204 1.1 jmmv ATF_REQUIRE(!tools::config::has("BAR")); 205 1.1 jmmv ATF_REQUIRE(!tools::config::has("atf_foo")); 206 1.1 jmmv ATF_REQUIRE(!tools::config::has("ATF_BAR")); 207 1.1 jmmv ATF_REQUIRE(!tools::config::has("atf_shel")); 208 1.1 jmmv ATF_REQUIRE(!tools::config::has("atf_shells")); 209 1.1 jmmv } 210 1.1 jmmv 211 1.1 jmmv // ------------------------------------------------------------------------ 212 1.1 jmmv // Main. 213 1.1 jmmv // ------------------------------------------------------------------------ 214 1.1 jmmv 215 1.1 jmmv ATF_INIT_TEST_CASES(tcs) 216 1.1 jmmv { 217 1.1 jmmv // Add the test cases for the free functions. 218 1.1 jmmv ATF_ADD_TEST_CASE(tcs, has); 219 1.1 jmmv ATF_ADD_TEST_CASE(tcs, get); 220 1.1 jmmv ATF_ADD_TEST_CASE(tcs, get_all); 221 1.1 jmmv } 222