Path: blob/main/contrib/kyua/utils/config/nodes_test.cpp
48081 views
// Copyright 2012 The Kyua Authors.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions are5// met:6//7// * Redistributions of source code must retain the above copyright8// notice, this list of conditions and the following disclaimer.9// * Redistributions in binary form must reproduce the above copyright10// notice, this list of conditions and the following disclaimer in the11// documentation and/or other materials provided with the distribution.12// * Neither the name of Google Inc. nor the names of its contributors13// may be used to endorse or promote products derived from this software14// without specific prior written permission.15//16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2728#include "utils/config/nodes.ipp"2930#include <atf-c++.hpp>3132#include <lutok/state.ipp>3334#include "utils/config/exceptions.hpp"35#include "utils/config/keys.hpp"36#include "utils/defs.hpp"3738namespace config = utils::config;394041namespace {424344/// Typed leaf node that specializes the validate() method.45class validation_node : public config::int_node {46/// Checks a given value for validity against a fake value.47///48/// \param new_value The value to validate.49///50/// \throw value_error If the value is not valid.51void52validate(const value_type& new_value) const53{54if (new_value == 12345)55throw config::value_error("Custom validate method");56}57};585960/// Set node that specializes the validate() method.61class set_validation_node : public config::strings_set_node {62/// Checks a given value for validity against a fake value.63///64/// \param new_value The value to validate.65///66/// \throw value_error If the value is not valid.67void68validate(const value_type& new_value) const69{70for (value_type::const_iterator iter = new_value.begin();71iter != new_value.end(); ++iter)72if (*iter == "throw")73throw config::value_error("Custom validate method");74}75};767778} // anonymous namespace798081ATF_TEST_CASE_WITHOUT_HEAD(bool_node__deep_copy);82ATF_TEST_CASE_BODY(bool_node__deep_copy)83{84config::bool_node node;85node.set(true);86config::detail::base_node* raw_copy = node.deep_copy();87config::bool_node* copy = static_cast< config::bool_node* >(raw_copy);88ATF_REQUIRE(copy->value());89copy->set(false);90ATF_REQUIRE(node.value());91ATF_REQUIRE(!copy->value());92delete copy;93}949596ATF_TEST_CASE_WITHOUT_HEAD(bool_node__is_set_and_set);97ATF_TEST_CASE_BODY(bool_node__is_set_and_set)98{99config::bool_node node;100ATF_REQUIRE(!node.is_set());101node.set(false);102ATF_REQUIRE( node.is_set());103}104105106ATF_TEST_CASE_WITHOUT_HEAD(bool_node__value_and_set);107ATF_TEST_CASE_BODY(bool_node__value_and_set)108{109config::bool_node node;110node.set(false);111ATF_REQUIRE(!node.value());112node.set(true);113ATF_REQUIRE( node.value());114}115116117ATF_TEST_CASE_WITHOUT_HEAD(bool_node__push_lua);118ATF_TEST_CASE_BODY(bool_node__push_lua)119{120lutok::state state;121122config::bool_node node;123node.set(true);124node.push_lua(state);125ATF_REQUIRE(state.is_boolean(-1));126ATF_REQUIRE(state.to_boolean(-1));127state.pop(1);128}129130131ATF_TEST_CASE_WITHOUT_HEAD(bool_node__set_lua__ok);132ATF_TEST_CASE_BODY(bool_node__set_lua__ok)133{134lutok::state state;135136config::bool_node node;137state.push_boolean(false);138node.set_lua(state, -1);139state.pop(1);140ATF_REQUIRE(!node.value());141}142143144ATF_TEST_CASE_WITHOUT_HEAD(bool_node__set_lua__invalid_value);145ATF_TEST_CASE_BODY(bool_node__set_lua__invalid_value)146{147lutok::state state;148149config::bool_node node;150state.push_string("foo bar");151ATF_REQUIRE_THROW(config::value_error, node.set_lua(state, -1));152state.pop(1);153ATF_REQUIRE(!node.is_set());154}155156157ATF_TEST_CASE_WITHOUT_HEAD(bool_node__set_string__ok);158ATF_TEST_CASE_BODY(bool_node__set_string__ok)159{160config::bool_node node;161node.set_string("false");162ATF_REQUIRE(!node.value());163node.set_string("true");164ATF_REQUIRE( node.value());165}166167168ATF_TEST_CASE_WITHOUT_HEAD(bool_node__set_string__invalid_value);169ATF_TEST_CASE_BODY(bool_node__set_string__invalid_value)170{171config::bool_node node;172ATF_REQUIRE_THROW(config::value_error, node.set_string("12345"));173ATF_REQUIRE(!node.is_set());174}175176177ATF_TEST_CASE_WITHOUT_HEAD(bool_node__to_string);178ATF_TEST_CASE_BODY(bool_node__to_string)179{180config::bool_node node;181node.set(false);182ATF_REQUIRE_EQ("false", node.to_string());183node.set(true);184ATF_REQUIRE_EQ("true", node.to_string());185}186187188ATF_TEST_CASE_WITHOUT_HEAD(int_node__deep_copy);189ATF_TEST_CASE_BODY(int_node__deep_copy)190{191config::int_node node;192node.set(5);193config::detail::base_node* raw_copy = node.deep_copy();194config::int_node* copy = static_cast< config::int_node* >(raw_copy);195ATF_REQUIRE_EQ(5, copy->value());196copy->set(10);197ATF_REQUIRE_EQ(5, node.value());198ATF_REQUIRE_EQ(10, copy->value());199delete copy;200}201202203ATF_TEST_CASE_WITHOUT_HEAD(int_node__is_set_and_set);204ATF_TEST_CASE_BODY(int_node__is_set_and_set)205{206config::int_node node;207ATF_REQUIRE(!node.is_set());208node.set(20);209ATF_REQUIRE( node.is_set());210}211212213ATF_TEST_CASE_WITHOUT_HEAD(int_node__value_and_set);214ATF_TEST_CASE_BODY(int_node__value_and_set)215{216config::int_node node;217node.set(20);218ATF_REQUIRE_EQ(20, node.value());219node.set(0);220ATF_REQUIRE_EQ(0, node.value());221}222223224ATF_TEST_CASE_WITHOUT_HEAD(int_node__push_lua);225ATF_TEST_CASE_BODY(int_node__push_lua)226{227lutok::state state;228229config::int_node node;230node.set(754);231node.push_lua(state);232ATF_REQUIRE(state.is_number(-1));233ATF_REQUIRE_EQ(754, state.to_integer(-1));234state.pop(1);235}236237238ATF_TEST_CASE_WITHOUT_HEAD(int_node__set_lua__ok);239ATF_TEST_CASE_BODY(int_node__set_lua__ok)240{241lutok::state state;242243config::int_node node;244state.push_integer(123);245state.push_string("456");246node.set_lua(state, -2);247ATF_REQUIRE_EQ(123, node.value());248node.set_lua(state, -1);249ATF_REQUIRE_EQ(456, node.value());250state.pop(2);251}252253254ATF_TEST_CASE_WITHOUT_HEAD(int_node__set_lua__invalid_value);255ATF_TEST_CASE_BODY(int_node__set_lua__invalid_value)256{257lutok::state state;258259config::int_node node;260state.push_boolean(true);261ATF_REQUIRE_THROW(config::value_error, node.set_lua(state, -1));262state.pop(1);263ATF_REQUIRE(!node.is_set());264}265266267ATF_TEST_CASE_WITHOUT_HEAD(int_node__set_string__ok);268ATF_TEST_CASE_BODY(int_node__set_string__ok)269{270config::int_node node;271node.set_string("178");272ATF_REQUIRE_EQ(178, node.value());273node.set_string("-123");274ATF_REQUIRE_EQ(-123, node.value());275}276277278ATF_TEST_CASE_WITHOUT_HEAD(int_node__set_string__invalid_value);279ATF_TEST_CASE_BODY(int_node__set_string__invalid_value)280{281config::int_node node;282ATF_REQUIRE_THROW(config::value_error, node.set_string(" 23"));283ATF_REQUIRE(!node.is_set());284}285286287ATF_TEST_CASE_WITHOUT_HEAD(int_node__to_string);288ATF_TEST_CASE_BODY(int_node__to_string)289{290config::int_node node;291node.set(89);292ATF_REQUIRE_EQ("89", node.to_string());293node.set(-57);294ATF_REQUIRE_EQ("-57", node.to_string());295}296297298ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__deep_copy);299ATF_TEST_CASE_BODY(positive_int_node__deep_copy)300{301config::positive_int_node node;302node.set(5);303config::detail::base_node* raw_copy = node.deep_copy();304config::positive_int_node* copy = static_cast< config::positive_int_node* >(305raw_copy);306ATF_REQUIRE_EQ(5, copy->value());307copy->set(10);308ATF_REQUIRE_EQ(5, node.value());309ATF_REQUIRE_EQ(10, copy->value());310delete copy;311}312313314ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__is_set_and_set);315ATF_TEST_CASE_BODY(positive_int_node__is_set_and_set)316{317config::positive_int_node node;318ATF_REQUIRE(!node.is_set());319node.set(20);320ATF_REQUIRE( node.is_set());321}322323324ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__value_and_set);325ATF_TEST_CASE_BODY(positive_int_node__value_and_set)326{327config::positive_int_node node;328node.set(20);329ATF_REQUIRE_EQ(20, node.value());330node.set(1);331ATF_REQUIRE_EQ(1, node.value());332}333334335ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__push_lua);336ATF_TEST_CASE_BODY(positive_int_node__push_lua)337{338lutok::state state;339340config::positive_int_node node;341node.set(754);342node.push_lua(state);343ATF_REQUIRE(state.is_number(-1));344ATF_REQUIRE_EQ(754, state.to_integer(-1));345state.pop(1);346}347348349ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__set_lua__ok);350ATF_TEST_CASE_BODY(positive_int_node__set_lua__ok)351{352lutok::state state;353354config::positive_int_node node;355state.push_integer(123);356state.push_string("456");357node.set_lua(state, -2);358ATF_REQUIRE_EQ(123, node.value());359node.set_lua(state, -1);360ATF_REQUIRE_EQ(456, node.value());361state.pop(2);362}363364365ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__set_lua__invalid_value);366ATF_TEST_CASE_BODY(positive_int_node__set_lua__invalid_value)367{368lutok::state state;369370config::positive_int_node node;371state.push_boolean(true);372ATF_REQUIRE_THROW(config::value_error, node.set_lua(state, -1));373state.pop(1);374ATF_REQUIRE(!node.is_set());375state.push_integer(0);376ATF_REQUIRE_THROW(config::value_error, node.set_lua(state, -1));377state.pop(1);378ATF_REQUIRE(!node.is_set());379}380381382ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__set_string__ok);383ATF_TEST_CASE_BODY(positive_int_node__set_string__ok)384{385config::positive_int_node node;386node.set_string("1");387ATF_REQUIRE_EQ(1, node.value());388node.set_string("178");389ATF_REQUIRE_EQ(178, node.value());390}391392393ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__set_string__invalid_value);394ATF_TEST_CASE_BODY(positive_int_node__set_string__invalid_value)395{396config::positive_int_node node;397ATF_REQUIRE_THROW(config::value_error, node.set_string(" 23"));398ATF_REQUIRE(!node.is_set());399ATF_REQUIRE_THROW(config::value_error, node.set_string("0"));400ATF_REQUIRE(!node.is_set());401ATF_REQUIRE_THROW(config::value_error, node.set_string("-5"));402ATF_REQUIRE(!node.is_set());403}404405406ATF_TEST_CASE_WITHOUT_HEAD(positive_int_node__to_string);407ATF_TEST_CASE_BODY(positive_int_node__to_string)408{409config::positive_int_node node;410node.set(89);411ATF_REQUIRE_EQ("89", node.to_string());412}413414415ATF_TEST_CASE_WITHOUT_HEAD(string_node__deep_copy);416ATF_TEST_CASE_BODY(string_node__deep_copy)417{418config::string_node node;419node.set("first");420config::detail::base_node* raw_copy = node.deep_copy();421config::string_node* copy = static_cast< config::string_node* >(raw_copy);422ATF_REQUIRE_EQ("first", copy->value());423copy->set("second");424ATF_REQUIRE_EQ("first", node.value());425ATF_REQUIRE_EQ("second", copy->value());426delete copy;427}428429430ATF_TEST_CASE_WITHOUT_HEAD(string_node__is_set_and_set);431ATF_TEST_CASE_BODY(string_node__is_set_and_set)432{433config::string_node node;434ATF_REQUIRE(!node.is_set());435node.set("foo");436ATF_REQUIRE( node.is_set());437}438439440ATF_TEST_CASE_WITHOUT_HEAD(string_node__value_and_set);441ATF_TEST_CASE_BODY(string_node__value_and_set)442{443config::string_node node;444node.set("foo");445ATF_REQUIRE_EQ("foo", node.value());446node.set("");447ATF_REQUIRE_EQ("", node.value());448}449450451ATF_TEST_CASE_WITHOUT_HEAD(string_node__push_lua);452ATF_TEST_CASE_BODY(string_node__push_lua)453{454lutok::state state;455456config::string_node node;457node.set("some message");458node.push_lua(state);459ATF_REQUIRE(state.is_string(-1));460ATF_REQUIRE_EQ("some message", state.to_string(-1));461state.pop(1);462}463464465ATF_TEST_CASE_WITHOUT_HEAD(string_node__set_lua__ok);466ATF_TEST_CASE_BODY(string_node__set_lua__ok)467{468lutok::state state;469470config::string_node node;471state.push_string("text 1");472state.push_integer(231);473node.set_lua(state, -2);474ATF_REQUIRE_EQ("text 1", node.value());475node.set_lua(state, -1);476ATF_REQUIRE_EQ("231", node.value());477state.pop(2);478}479480481ATF_TEST_CASE_WITHOUT_HEAD(string_node__set_lua__invalid_value);482ATF_TEST_CASE_BODY(string_node__set_lua__invalid_value)483{484lutok::state state;485486config::bool_node node;487state.new_table();488ATF_REQUIRE_THROW(config::value_error, node.set_lua(state, -1));489state.pop(1);490ATF_REQUIRE(!node.is_set());491}492493494ATF_TEST_CASE_WITHOUT_HEAD(string_node__set_string);495ATF_TEST_CASE_BODY(string_node__set_string)496{497config::string_node node;498node.set_string("abcd efgh");499ATF_REQUIRE_EQ("abcd efgh", node.value());500node.set_string(" 1234 ");501ATF_REQUIRE_EQ(" 1234 ", node.value());502}503504505ATF_TEST_CASE_WITHOUT_HEAD(string_node__to_string);506ATF_TEST_CASE_BODY(string_node__to_string)507{508config::string_node node;509node.set("");510ATF_REQUIRE_EQ("", node.to_string());511node.set("aaa");512ATF_REQUIRE_EQ("aaa", node.to_string());513}514515516ATF_TEST_CASE_WITHOUT_HEAD(strings_set_node__deep_copy);517ATF_TEST_CASE_BODY(strings_set_node__deep_copy)518{519std::set< std::string > value;520config::strings_set_node node;521value.insert("foo");522node.set(value);523config::detail::base_node* raw_copy = node.deep_copy();524config::strings_set_node* copy =525static_cast< config::strings_set_node* >(raw_copy);526value.insert("bar");527ATF_REQUIRE_EQ(1, copy->value().size());528copy->set(value);529ATF_REQUIRE_EQ(1, node.value().size());530ATF_REQUIRE_EQ(2, copy->value().size());531delete copy;532}533534535ATF_TEST_CASE_WITHOUT_HEAD(strings_set_node__is_set_and_set);536ATF_TEST_CASE_BODY(strings_set_node__is_set_and_set)537{538std::set< std::string > value;539value.insert("foo");540541config::strings_set_node node;542ATF_REQUIRE(!node.is_set());543node.set(value);544ATF_REQUIRE( node.is_set());545}546547548ATF_TEST_CASE_WITHOUT_HEAD(strings_set_node__value_and_set);549ATF_TEST_CASE_BODY(strings_set_node__value_and_set)550{551std::set< std::string > value;552value.insert("first");553554config::strings_set_node node;555node.set(value);556ATF_REQUIRE(value == node.value());557value.clear();558node.set(value);559value.insert("second");560ATF_REQUIRE(node.value().empty());561}562563564ATF_TEST_CASE_WITHOUT_HEAD(strings_set_node__set_string);565ATF_TEST_CASE_BODY(strings_set_node__set_string)566{567config::strings_set_node node;568{569std::set< std::string > expected;570expected.insert("abcd");571expected.insert("efgh");572573node.set_string("abcd efgh");574ATF_REQUIRE(expected == node.value());575}576{577std::set< std::string > expected;578expected.insert("1234");579580node.set_string(" 1234 ");581ATF_REQUIRE(expected == node.value());582}583}584585586ATF_TEST_CASE_WITHOUT_HEAD(strings_set_node__to_string);587ATF_TEST_CASE_BODY(strings_set_node__to_string)588{589std::set< std::string > value;590config::strings_set_node node;591value.insert("second");592value.insert("first");593node.set(value);594ATF_REQUIRE_EQ("first second", node.to_string());595}596597598ATF_TEST_CASE_WITHOUT_HEAD(typed_leaf_node__validate_set);599ATF_TEST_CASE_BODY(typed_leaf_node__validate_set)600{601validation_node node;602node.set(1234);603ATF_REQUIRE_THROW_RE(config::value_error, "Custom validate method",604node.set(12345));605}606607608ATF_TEST_CASE_WITHOUT_HEAD(typed_leaf_node__validate_set_string);609ATF_TEST_CASE_BODY(typed_leaf_node__validate_set_string)610{611validation_node node;612node.set_string("1234");613ATF_REQUIRE_THROW_RE(config::value_error, "Custom validate method",614node.set_string("12345"));615}616617618ATF_TEST_CASE_WITHOUT_HEAD(base_set_node__validate_set);619ATF_TEST_CASE_BODY(base_set_node__validate_set)620{621set_validation_node node;622set_validation_node::value_type values;623values.insert("foo");624values.insert("bar");625node.set(values);626values.insert("throw");627values.insert("baz");628ATF_REQUIRE_THROW_RE(config::value_error, "Custom validate method",629node.set(values));630}631632633ATF_TEST_CASE_WITHOUT_HEAD(base_set_node__validate_set_string);634ATF_TEST_CASE_BODY(base_set_node__validate_set_string)635{636set_validation_node node;637node.set_string("foo bar");638ATF_REQUIRE_THROW_RE(config::value_error, "Custom validate method",639node.set_string("foo bar throw baz"));640}641642643ATF_INIT_TEST_CASES(tcs)644{645ATF_ADD_TEST_CASE(tcs, bool_node__deep_copy);646ATF_ADD_TEST_CASE(tcs, bool_node__is_set_and_set);647ATF_ADD_TEST_CASE(tcs, bool_node__value_and_set);648ATF_ADD_TEST_CASE(tcs, bool_node__push_lua);649ATF_ADD_TEST_CASE(tcs, bool_node__set_lua__ok);650ATF_ADD_TEST_CASE(tcs, bool_node__set_lua__invalid_value);651ATF_ADD_TEST_CASE(tcs, bool_node__set_string__ok);652ATF_ADD_TEST_CASE(tcs, bool_node__set_string__invalid_value);653ATF_ADD_TEST_CASE(tcs, bool_node__to_string);654655ATF_ADD_TEST_CASE(tcs, int_node__deep_copy);656ATF_ADD_TEST_CASE(tcs, int_node__is_set_and_set);657ATF_ADD_TEST_CASE(tcs, int_node__value_and_set);658ATF_ADD_TEST_CASE(tcs, int_node__push_lua);659ATF_ADD_TEST_CASE(tcs, int_node__set_lua__ok);660ATF_ADD_TEST_CASE(tcs, int_node__set_lua__invalid_value);661ATF_ADD_TEST_CASE(tcs, int_node__set_string__ok);662ATF_ADD_TEST_CASE(tcs, int_node__set_string__invalid_value);663ATF_ADD_TEST_CASE(tcs, int_node__to_string);664665ATF_ADD_TEST_CASE(tcs, positive_int_node__deep_copy);666ATF_ADD_TEST_CASE(tcs, positive_int_node__is_set_and_set);667ATF_ADD_TEST_CASE(tcs, positive_int_node__value_and_set);668ATF_ADD_TEST_CASE(tcs, positive_int_node__push_lua);669ATF_ADD_TEST_CASE(tcs, positive_int_node__set_lua__ok);670ATF_ADD_TEST_CASE(tcs, positive_int_node__set_lua__invalid_value);671ATF_ADD_TEST_CASE(tcs, positive_int_node__set_string__ok);672ATF_ADD_TEST_CASE(tcs, positive_int_node__set_string__invalid_value);673ATF_ADD_TEST_CASE(tcs, positive_int_node__to_string);674675ATF_ADD_TEST_CASE(tcs, string_node__deep_copy);676ATF_ADD_TEST_CASE(tcs, string_node__is_set_and_set);677ATF_ADD_TEST_CASE(tcs, string_node__value_and_set);678ATF_ADD_TEST_CASE(tcs, string_node__push_lua);679ATF_ADD_TEST_CASE(tcs, string_node__set_lua__ok);680ATF_ADD_TEST_CASE(tcs, string_node__set_lua__invalid_value);681ATF_ADD_TEST_CASE(tcs, string_node__set_string);682ATF_ADD_TEST_CASE(tcs, string_node__to_string);683684ATF_ADD_TEST_CASE(tcs, strings_set_node__deep_copy);685ATF_ADD_TEST_CASE(tcs, strings_set_node__is_set_and_set);686ATF_ADD_TEST_CASE(tcs, strings_set_node__value_and_set);687ATF_ADD_TEST_CASE(tcs, strings_set_node__set_string);688ATF_ADD_TEST_CASE(tcs, strings_set_node__to_string);689690ATF_ADD_TEST_CASE(tcs, typed_leaf_node__validate_set);691ATF_ADD_TEST_CASE(tcs, typed_leaf_node__validate_set_string);692ATF_ADD_TEST_CASE(tcs, base_set_node__validate_set);693ATF_ADD_TEST_CASE(tcs, base_set_node__validate_set_string);694}695696697