diff --git a/llarp/config/definition.hpp b/llarp/config/definition.hpp index 79f82a6d7..4d6351159 100644 --- a/llarp/config/definition.hpp +++ b/llarp/config/definition.hpp @@ -69,10 +69,11 @@ namespace llarp std::string defaultValueAsString() { - if (defaultValue) - return std::to_string(defaultValue.value()); - else - return ""; + std::ostringstream oss; + if (defaultValue.has_value()) + oss << defaultValue.value(); + + return oss.str(); } void @@ -89,7 +90,7 @@ namespace llarp iss >> t; if (iss.fail()) { - throw std::invalid_argument(stringify(input, " is not a valid" , typeid(T).name())); + throw std::invalid_argument(stringify(input, " is not a valid ", typeid(T).name())); } else { @@ -102,12 +103,13 @@ namespace llarp std::string writeValue(bool useDefault) { - if (parsedValue) - return std::to_string(parsedValue.value()); + std::ostringstream oss; + if (parsedValue.has_value()) + oss << parsedValue.value(); else if (useDefault and defaultValue.has_value()) - return std::to_string(defaultValue.value()); - else - return {}; + oss << defaultValue.value(); + + return oss.str(); } nonstd::optional defaultValue; diff --git a/test/config/test_llarp_config_definition.cpp b/test/config/test_llarp_config_definition.cpp index 7e1c7d6d9..d47bf5844 100644 --- a/test/config/test_llarp_config_definition.cpp +++ b/test/config/test_llarp_config_definition.cpp @@ -2,7 +2,7 @@ #include -TEST_CASE("ConfigDefinition parse test", "[config]") +TEST_CASE("ConfigDefinition int parse test", "[config]") { llarp::ConfigDefinition def("foo", "bar", false, false, 42); @@ -18,6 +18,18 @@ TEST_CASE("ConfigDefinition parse test", "[config]") CHECK(def.defaultValueAsString() == "42"); } +TEST_CASE("ConfigDefinition string parse test", "[config]") +{ + llarp::ConfigDefinition def("foo", "bar", false, false, "test"); + + CHECK(def.getValue() == "test"); + CHECK(def.defaultValueAsString() == "test"); + + CHECK_NOTHROW(def.parseValue("foo")); + CHECK(def.getValue() == "foo"); + CHECK(def.numFound == 1); +} + TEST_CASE("ConfigDefinition multiple parses test", "[config]") { { @@ -67,6 +79,22 @@ TEST_CASE("Configuration basic add/get test", "[config]") CHECK(config.getConfigValue("router", "threads") == 5); } +TEST_CASE("Configuration missing def test", "[config]") +{ + llarp::Configuration config; + CHECK_THROWS(config.addConfigValue("foo", "bar", "5")); + CHECK_THROWS(config.getConfigValue("foo", "bar") == 5); + + config.addDefinition(std::make_unique>( + "quux", + "bar", + false, + false, + 4)); + + CHECK_THROWS(config.addConfigValue("foo", "bar", "5")); +} + TEST_CASE("Configuration required test", "[config]") { llarp::Configuration config; @@ -83,3 +111,31 @@ TEST_CASE("Configuration required test", "[config]") CHECK_NOTHROW(config.validate()); } + +TEST_CASE("Configuration section test", "[config]") +{ + llarp::Configuration config; + config.addDefinition(std::make_unique>( + "foo", + "bar", + true, + false, + 1)); + config.addDefinition(std::make_unique>( + "goo", + "bar", + true, + false, + 1)); + + CHECK_THROWS(config.validate()); + + config.addConfigValue("foo", "bar", "5"); + CHECK_THROWS(config.validate()); + + CHECK_NOTHROW(config.addConfigValue("goo", "bar", "6")); + CHECK_NOTHROW(config.validate()); + + CHECK(config.getConfigValue("foo", "bar") == 5); + CHECK(config.getConfigValue("goo", "bar") == 6); +}