Home | History | Annotate | Line # | Download | only in tools
      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