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