mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
Deduplicate settings merge code
Get rid of settings merging code in util/system.cpp repeated 5 places, inconsistently: - ArgsManagerHelper::GetArg - ArgsManagerHelper::GetNetBoolArg - ArgsManager::GetArgs - ArgsManager::IsArgNegated - ArgsManager::GetUnsuitableSectionOnlyArgs Having settings merging code separated from parsing simplifies parsing somewhat (for example negated values can simply be represented as false values instead of partially cleared or emply placeholder lists). Having settings merge happen one place instead of 5 makes it easier to add new settings sources and harder to introduce new inconsistencies in the way settings are merged. This commit does not change behavior in any way.
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <thread>
|
||||
#include <univalue.h>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#ifndef WIN32
|
||||
@@ -166,14 +167,12 @@ BOOST_AUTO_TEST_CASE(util_FormatISO8601Date)
|
||||
struct TestArgsManager : public ArgsManager
|
||||
{
|
||||
TestArgsManager() { m_network_only_args.clear(); }
|
||||
std::map<std::string, std::vector<std::string> >& GetOverrideArgs() { return m_override_args; }
|
||||
std::map<std::string, std::vector<std::string> >& GetConfigArgs() { return m_config_args; }
|
||||
void ReadConfigString(const std::string str_config)
|
||||
{
|
||||
std::istringstream streamConfig(str_config);
|
||||
{
|
||||
LOCK(cs_args);
|
||||
m_config_args.clear();
|
||||
m_settings.ro_config.clear();
|
||||
m_config_sections.clear();
|
||||
}
|
||||
std::string error;
|
||||
@@ -193,6 +192,7 @@ struct TestArgsManager : public ArgsManager
|
||||
using ArgsManager::ReadConfigStream;
|
||||
using ArgsManager::cs_args;
|
||||
using ArgsManager::m_network;
|
||||
using ArgsManager::m_settings;
|
||||
};
|
||||
|
||||
BOOST_AUTO_TEST_CASE(util_ParseParameters)
|
||||
@@ -206,28 +206,29 @@ BOOST_AUTO_TEST_CASE(util_ParseParameters)
|
||||
const char *argv_test[] = {"-ignored", "-a", "-b", "-ccc=argument", "-ccc=multiple", "f", "-d=e"};
|
||||
|
||||
std::string error;
|
||||
LOCK(testArgs.cs_args);
|
||||
testArgs.SetupArgs({a, b, ccc, d});
|
||||
BOOST_CHECK(testArgs.ParseParameters(0, (char**)argv_test, error));
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs().empty() && testArgs.GetConfigArgs().empty());
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options.empty() && testArgs.m_settings.ro_config.empty());
|
||||
|
||||
BOOST_CHECK(testArgs.ParseParameters(1, (char**)argv_test, error));
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs().empty() && testArgs.GetConfigArgs().empty());
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options.empty() && testArgs.m_settings.ro_config.empty());
|
||||
|
||||
BOOST_CHECK(testArgs.ParseParameters(7, (char**)argv_test, error));
|
||||
// expectation: -ignored is ignored (program name argument),
|
||||
// -a, -b and -ccc end up in map, -d ignored because it is after
|
||||
// a non-option argument (non-GNU option parsing)
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs().size() == 3 && testArgs.GetConfigArgs().empty());
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options.size() == 3 && testArgs.m_settings.ro_config.empty());
|
||||
BOOST_CHECK(testArgs.IsArgSet("-a") && testArgs.IsArgSet("-b") && testArgs.IsArgSet("-ccc")
|
||||
&& !testArgs.IsArgSet("f") && !testArgs.IsArgSet("-d"));
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs().count("-a") && testArgs.GetOverrideArgs().count("-b") && testArgs.GetOverrideArgs().count("-ccc")
|
||||
&& !testArgs.GetOverrideArgs().count("f") && !testArgs.GetOverrideArgs().count("-d"));
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options.count("a") && testArgs.m_settings.command_line_options.count("b") && testArgs.m_settings.command_line_options.count("ccc")
|
||||
&& !testArgs.m_settings.command_line_options.count("f") && !testArgs.m_settings.command_line_options.count("d"));
|
||||
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-a"].size() == 1);
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-a"].front() == "");
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].size() == 2);
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].front() == "argument");
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].back() == "multiple");
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options["a"].size() == 1);
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options["a"].front().get_str() == "");
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options["ccc"].size() == 2);
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options["ccc"].front().get_str() == "argument");
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options["ccc"].back().get_str() == "multiple");
|
||||
BOOST_CHECK(testArgs.GetArgs("-ccc").size() == 2);
|
||||
}
|
||||
|
||||
@@ -298,6 +299,7 @@ BOOST_AUTO_TEST_CASE(util_GetBoolArg)
|
||||
const char *argv_test[] = {
|
||||
"ignored", "-a", "-nob", "-c=0", "-d=1", "-e=false", "-f=true"};
|
||||
std::string error;
|
||||
LOCK(testArgs.cs_args);
|
||||
testArgs.SetupArgs({a, b, c, d, e, f});
|
||||
BOOST_CHECK(testArgs.ParseParameters(7, (char**)argv_test, error));
|
||||
|
||||
@@ -306,8 +308,8 @@ BOOST_AUTO_TEST_CASE(util_GetBoolArg)
|
||||
BOOST_CHECK(testArgs.IsArgSet({'-', opt}) || !opt);
|
||||
|
||||
// Nothing else should be in the map
|
||||
BOOST_CHECK(testArgs.GetOverrideArgs().size() == 6 &&
|
||||
testArgs.GetConfigArgs().empty());
|
||||
BOOST_CHECK(testArgs.m_settings.command_line_options.size() == 6 &&
|
||||
testArgs.m_settings.ro_config.empty());
|
||||
|
||||
// The -no prefix should get stripped on the way in.
|
||||
BOOST_CHECK(!testArgs.IsArgSet("-nob"));
|
||||
@@ -403,6 +405,7 @@ BOOST_AUTO_TEST_CASE(util_ReadConfigStream)
|
||||
"iii=2\n";
|
||||
|
||||
TestArgsManager test_args;
|
||||
LOCK(test_args.cs_args);
|
||||
const auto a = std::make_pair("-a", ArgsManager::ALLOW_BOOL);
|
||||
const auto b = std::make_pair("-b", ArgsManager::ALLOW_BOOL);
|
||||
const auto ccc = std::make_pair("-ccc", ArgsManager::ALLOW_STRING);
|
||||
@@ -419,22 +422,25 @@ BOOST_AUTO_TEST_CASE(util_ReadConfigStream)
|
||||
// expectation: a, b, ccc, d, fff, ggg, h, i end up in map
|
||||
// so do sec1.ccc, sec1.d, sec1.h, sec2.ccc, sec2.iii
|
||||
|
||||
BOOST_CHECK(test_args.GetOverrideArgs().empty());
|
||||
BOOST_CHECK(test_args.GetConfigArgs().size() == 13);
|
||||
BOOST_CHECK(test_args.m_settings.command_line_options.empty());
|
||||
BOOST_CHECK(test_args.m_settings.ro_config.size() == 3);
|
||||
BOOST_CHECK(test_args.m_settings.ro_config[""].size() == 8);
|
||||
BOOST_CHECK(test_args.m_settings.ro_config["sec1"].size() == 3);
|
||||
BOOST_CHECK(test_args.m_settings.ro_config["sec2"].size() == 2);
|
||||
|
||||
BOOST_CHECK(test_args.GetConfigArgs().count("-a")
|
||||
&& test_args.GetConfigArgs().count("-b")
|
||||
&& test_args.GetConfigArgs().count("-ccc")
|
||||
&& test_args.GetConfigArgs().count("-d")
|
||||
&& test_args.GetConfigArgs().count("-fff")
|
||||
&& test_args.GetConfigArgs().count("-ggg")
|
||||
&& test_args.GetConfigArgs().count("-h")
|
||||
&& test_args.GetConfigArgs().count("-i")
|
||||
BOOST_CHECK(test_args.m_settings.ro_config[""].count("a")
|
||||
&& test_args.m_settings.ro_config[""].count("b")
|
||||
&& test_args.m_settings.ro_config[""].count("ccc")
|
||||
&& test_args.m_settings.ro_config[""].count("d")
|
||||
&& test_args.m_settings.ro_config[""].count("fff")
|
||||
&& test_args.m_settings.ro_config[""].count("ggg")
|
||||
&& test_args.m_settings.ro_config[""].count("h")
|
||||
&& test_args.m_settings.ro_config[""].count("i")
|
||||
);
|
||||
BOOST_CHECK(test_args.GetConfigArgs().count("-sec1.ccc")
|
||||
&& test_args.GetConfigArgs().count("-sec1.h")
|
||||
&& test_args.GetConfigArgs().count("-sec2.ccc")
|
||||
&& test_args.GetConfigArgs().count("-sec2.iii")
|
||||
BOOST_CHECK(test_args.m_settings.ro_config["sec1"].count("ccc")
|
||||
&& test_args.m_settings.ro_config["sec1"].count("h")
|
||||
&& test_args.m_settings.ro_config["sec2"].count("ccc")
|
||||
&& test_args.m_settings.ro_config["sec2"].count("iii")
|
||||
);
|
||||
|
||||
BOOST_CHECK(test_args.IsArgSet("-a")
|
||||
@@ -573,24 +579,25 @@ BOOST_AUTO_TEST_CASE(util_ReadConfigStream)
|
||||
BOOST_AUTO_TEST_CASE(util_GetArg)
|
||||
{
|
||||
TestArgsManager testArgs;
|
||||
testArgs.GetOverrideArgs().clear();
|
||||
testArgs.GetOverrideArgs()["strtest1"] = {"string..."};
|
||||
LOCK(testArgs.cs_args);
|
||||
testArgs.m_settings.command_line_options.clear();
|
||||
testArgs.m_settings.command_line_options["strtest1"] = {"string..."};
|
||||
// strtest2 undefined on purpose
|
||||
testArgs.GetOverrideArgs()["inttest1"] = {"12345"};
|
||||
testArgs.GetOverrideArgs()["inttest2"] = {"81985529216486895"};
|
||||
testArgs.m_settings.command_line_options["inttest1"] = {"12345"};
|
||||
testArgs.m_settings.command_line_options["inttest2"] = {"81985529216486895"};
|
||||
// inttest3 undefined on purpose
|
||||
testArgs.GetOverrideArgs()["booltest1"] = {""};
|
||||
testArgs.m_settings.command_line_options["booltest1"] = {""};
|
||||
// booltest2 undefined on purpose
|
||||
testArgs.GetOverrideArgs()["booltest3"] = {"0"};
|
||||
testArgs.GetOverrideArgs()["booltest4"] = {"1"};
|
||||
testArgs.m_settings.command_line_options["booltest3"] = {"0"};
|
||||
testArgs.m_settings.command_line_options["booltest4"] = {"1"};
|
||||
|
||||
// priorities
|
||||
testArgs.GetOverrideArgs()["pritest1"] = {"a", "b"};
|
||||
testArgs.GetConfigArgs()["pritest2"] = {"a", "b"};
|
||||
testArgs.GetOverrideArgs()["pritest3"] = {"a"};
|
||||
testArgs.GetConfigArgs()["pritest3"] = {"b"};
|
||||
testArgs.GetOverrideArgs()["pritest4"] = {"a","b"};
|
||||
testArgs.GetConfigArgs()["pritest4"] = {"c","d"};
|
||||
testArgs.m_settings.command_line_options["pritest1"] = {"a", "b"};
|
||||
testArgs.m_settings.ro_config[""]["pritest2"] = {"a", "b"};
|
||||
testArgs.m_settings.command_line_options["pritest3"] = {"a"};
|
||||
testArgs.m_settings.ro_config[""]["pritest3"] = {"b"};
|
||||
testArgs.m_settings.command_line_options["pritest4"] = {"a","b"};
|
||||
testArgs.m_settings.ro_config[""]["pritest4"] = {"c","d"};
|
||||
|
||||
BOOST_CHECK_EQUAL(testArgs.GetArg("strtest1", "default"), "string...");
|
||||
BOOST_CHECK_EQUAL(testArgs.GetArg("strtest2", "default"), "default");
|
||||
|
||||
Reference in New Issue
Block a user