Changeset View
Changeset View
Standalone View
Standalone View
src/test/util_tests.cpp
Show First 20 Lines • Show All 165 Lines • ▼ Show 20 Lines | std::map<std::string, std::vector<std::string>> &GetConfigArgs() { | ||||
return m_config_args; | return m_config_args; | ||||
} | } | ||||
void ReadConfigString(const std::string str_config) { | void ReadConfigString(const std::string str_config) { | ||||
std::istringstream streamConfig(str_config); | std::istringstream streamConfig(str_config); | ||||
{ | { | ||||
LOCK(cs_args); | LOCK(cs_args); | ||||
m_config_args.clear(); | m_config_args.clear(); | ||||
} | } | ||||
ReadConfigStream(streamConfig); | std::string error; | ||||
ReadConfigStream(streamConfig, error); | |||||
} | } | ||||
void SetNetworkOnlyArg(const std::string arg) { | void SetNetworkOnlyArg(const std::string arg) { | ||||
LOCK(cs_args); | LOCK(cs_args); | ||||
m_network_only_args.insert(arg); | m_network_only_args.insert(arg); | ||||
} | } | ||||
void SetupArgs(int argv, const char *args[]) { | |||||
for (int i = 0; i < argv; ++i) { | |||||
AddArg(args[i], "", false, OptionsCategory::OPTIONS); | |||||
} | |||||
} | |||||
}; | }; | ||||
BOOST_AUTO_TEST_CASE(util_ParseParameters) { | BOOST_AUTO_TEST_CASE(util_ParseParameters) { | ||||
TestArgsManager testArgs; | TestArgsManager testArgs; | ||||
const char *avail_args[] = {"-a", "-b", "-ccc", "-d"}; | |||||
const char *argv_test[] = {"-ignored", "-a", "-b", "-ccc=argument", | const char *argv_test[] = {"-ignored", "-a", "-b", "-ccc=argument", | ||||
"-ccc=multiple", "f", "-d=e"}; | "-ccc=multiple", "f", "-d=e"}; | ||||
testArgs.ParseParameters(0, (char **)argv_test); | std::string error; | ||||
testArgs.SetupArgs(4, avail_args); | |||||
testArgs.ParseParameters(0, (char **)argv_test, error); | |||||
BOOST_CHECK(testArgs.GetOverrideArgs().empty() && | BOOST_CHECK(testArgs.GetOverrideArgs().empty() && | ||||
testArgs.GetConfigArgs().empty()); | testArgs.GetConfigArgs().empty()); | ||||
testArgs.ParseParameters(1, (char **)argv_test); | testArgs.ParseParameters(1, (char **)argv_test, error); | ||||
BOOST_CHECK(testArgs.GetOverrideArgs().empty() && | BOOST_CHECK(testArgs.GetOverrideArgs().empty() && | ||||
testArgs.GetConfigArgs().empty()); | testArgs.GetConfigArgs().empty()); | ||||
testArgs.ParseParameters(7, (char **)argv_test); | testArgs.ParseParameters(7, (char **)argv_test, error); | ||||
// expectation: -ignored is ignored (program name argument), | // expectation: -ignored is ignored (program name argument), | ||||
// -a, -b and -ccc end up in map, -d ignored because it is after | // -a, -b and -ccc end up in map, -d ignored because it is after | ||||
// a non-option argument (non-GNU option parsing) | // a non-option argument (non-GNU option parsing) | ||||
BOOST_CHECK(testArgs.GetOverrideArgs().size() == 3 && | BOOST_CHECK(testArgs.GetOverrideArgs().size() == 3 && | ||||
testArgs.GetConfigArgs().empty()); | testArgs.GetConfigArgs().empty()); | ||||
BOOST_CHECK(testArgs.IsArgSet("-a") && testArgs.IsArgSet("-b") && | BOOST_CHECK(testArgs.IsArgSet("-a") && testArgs.IsArgSet("-b") && | ||||
testArgs.IsArgSet("-ccc") && !testArgs.IsArgSet("f") && | testArgs.IsArgSet("-ccc") && !testArgs.IsArgSet("f") && | ||||
!testArgs.IsArgSet("-d")); | !testArgs.IsArgSet("-d")); | ||||
BOOST_CHECK(testArgs.GetOverrideArgs().count("-a") && | BOOST_CHECK(testArgs.GetOverrideArgs().count("-a") && | ||||
testArgs.GetOverrideArgs().count("-b") && | testArgs.GetOverrideArgs().count("-b") && | ||||
testArgs.GetOverrideArgs().count("-ccc") && | testArgs.GetOverrideArgs().count("-ccc") && | ||||
!testArgs.GetOverrideArgs().count("f") && | !testArgs.GetOverrideArgs().count("f") && | ||||
!testArgs.GetOverrideArgs().count("-d")); | !testArgs.GetOverrideArgs().count("-d")); | ||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-a"].size() == 1); | BOOST_CHECK(testArgs.GetOverrideArgs()["-a"].size() == 1); | ||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-a"].front() == ""); | BOOST_CHECK(testArgs.GetOverrideArgs()["-a"].front() == ""); | ||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].size() == 2); | BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].size() == 2); | ||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].front() == "argument"); | BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].front() == "argument"); | ||||
BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].back() == "multiple"); | BOOST_CHECK(testArgs.GetOverrideArgs()["-ccc"].back() == "multiple"); | ||||
BOOST_CHECK(testArgs.GetArgs("-ccc").size() == 2); | BOOST_CHECK(testArgs.GetArgs("-ccc").size() == 2); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(util_GetBoolArg) { | BOOST_AUTO_TEST_CASE(util_GetBoolArg) { | ||||
TestArgsManager testArgs; | TestArgsManager testArgs; | ||||
const char *avail_args[] = {"-a", "-b", "-c", "-d", "-e", "-f"}; | |||||
const char *argv_test[] = {"ignored", "-a", "-nob", "-c=0", | const char *argv_test[] = {"ignored", "-a", "-nob", "-c=0", | ||||
"-d=1", "-e=false", "-f=true"}; | "-d=1", "-e=false", "-f=true"}; | ||||
testArgs.ParseParameters(7, (char **)argv_test); | std::string error; | ||||
testArgs.SetupArgs(6, avail_args); | |||||
testArgs.ParseParameters(7, (char **)argv_test, error); | |||||
// Each letter should be set. | // Each letter should be set. | ||||
for (char opt : "abcdef") { | for (char opt : "abcdef") { | ||||
BOOST_CHECK(testArgs.IsArgSet({'-', opt}) || !opt); | BOOST_CHECK(testArgs.IsArgSet({'-', opt}) || !opt); | ||||
} | } | ||||
// Nothing else should be in the map | // Nothing else should be in the map | ||||
BOOST_CHECK(testArgs.GetOverrideArgs().size() == 6 && | BOOST_CHECK(testArgs.GetOverrideArgs().size() == 6 && | ||||
Show All 15 Lines | BOOST_AUTO_TEST_CASE(util_GetBoolArg) { | ||||
BOOST_CHECK(testArgs.GetBoolArg("-f", true) == false); | BOOST_CHECK(testArgs.GetBoolArg("-f", true) == false); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(util_GetBoolArgEdgeCases) { | BOOST_AUTO_TEST_CASE(util_GetBoolArgEdgeCases) { | ||||
// Test some awful edge cases that hopefully no user will ever exercise. | // Test some awful edge cases that hopefully no user will ever exercise. | ||||
TestArgsManager testArgs; | TestArgsManager testArgs; | ||||
// Params test | // Params test | ||||
const char *avail_args[] = {"-foo", "-bar"}; | |||||
const char *argv_test[] = {"ignored", "-nofoo", "-foo", "-nobar=0"}; | const char *argv_test[] = {"ignored", "-nofoo", "-foo", "-nobar=0"}; | ||||
testArgs.ParseParameters(4, (char **)argv_test); | testArgs.SetupArgs(2, avail_args); | ||||
std::string error; | |||||
testArgs.ParseParameters(4, (char **)argv_test, error); | |||||
// This was passed twice, second one overrides the negative setting. | // This was passed twice, second one overrides the negative setting. | ||||
BOOST_CHECK(!testArgs.IsArgNegated("-foo")); | BOOST_CHECK(!testArgs.IsArgNegated("-foo")); | ||||
BOOST_CHECK(testArgs.GetArg("-foo", "xxx") == ""); | BOOST_CHECK(testArgs.GetArg("-foo", "xxx") == ""); | ||||
// A double negative is a positive, and not marked as negated. | // A double negative is a positive, and not marked as negated. | ||||
BOOST_CHECK(!testArgs.IsArgNegated("-bar")); | BOOST_CHECK(!testArgs.IsArgNegated("-bar")); | ||||
BOOST_CHECK(testArgs.GetArg("-bar", "xxx") == "1"); | BOOST_CHECK(testArgs.GetArg("-bar", "xxx") == "1"); | ||||
// Config test | // Config test | ||||
const char *conf_test = "nofoo=1\nfoo=1\nnobar=0\n"; | const char *conf_test = "nofoo=1\nfoo=1\nnobar=0\n"; | ||||
testArgs.ParseParameters(1, (char **)argv_test); | testArgs.ParseParameters(1, (char **)argv_test, error); | ||||
testArgs.ReadConfigString(conf_test); | testArgs.ReadConfigString(conf_test); | ||||
// This was passed twice, second one overrides the negative setting, | // This was passed twice, second one overrides the negative setting, | ||||
// and the value. | // and the value. | ||||
BOOST_CHECK(!testArgs.IsArgNegated("-foo")); | BOOST_CHECK(!testArgs.IsArgNegated("-foo")); | ||||
BOOST_CHECK(testArgs.GetArg("-foo", "xxx") == "1"); | BOOST_CHECK(testArgs.GetArg("-foo", "xxx") == "1"); | ||||
// A double negative is a positive, and does not count as negated. | // A double negative is a positive, and does not count as negated. | ||||
BOOST_CHECK(!testArgs.IsArgNegated("-bar")); | BOOST_CHECK(!testArgs.IsArgNegated("-bar")); | ||||
BOOST_CHECK(testArgs.GetArg("-bar", "xxx") == "1"); | BOOST_CHECK(testArgs.GetArg("-bar", "xxx") == "1"); | ||||
// Combined test | // Combined test | ||||
const char *combo_test_args[] = {"ignored", "-nofoo", "-bar"}; | const char *combo_test_args[] = {"ignored", "-nofoo", "-bar"}; | ||||
const char *combo_test_conf = "foo=1\nnobar=1\n"; | const char *combo_test_conf = "foo=1\nnobar=1\n"; | ||||
testArgs.ParseParameters(3, (char **)combo_test_args); | testArgs.ParseParameters(3, (char **)combo_test_args, error); | ||||
testArgs.ReadConfigString(combo_test_conf); | testArgs.ReadConfigString(combo_test_conf); | ||||
// Command line overrides, but doesn't erase old setting | // Command line overrides, but doesn't erase old setting | ||||
BOOST_CHECK(testArgs.IsArgNegated("-foo")); | BOOST_CHECK(testArgs.IsArgNegated("-foo")); | ||||
BOOST_CHECK(testArgs.GetArg("-foo", "xxx") == "0"); | BOOST_CHECK(testArgs.GetArg("-foo", "xxx") == "0"); | ||||
BOOST_CHECK(testArgs.GetArgs("-foo").size() == 0); | BOOST_CHECK(testArgs.GetArgs("-foo").size() == 0); | ||||
// Command line overrides, but doesn't erase old setting | // Command line overrides, but doesn't erase old setting | ||||
Show All 21 Lines | const char *str_config = "a=\n" | ||||
"ccc=extend2\n" | "ccc=extend2\n" | ||||
"d=eee\n" | "d=eee\n" | ||||
"h=1\n" | "h=1\n" | ||||
"[sec2]\n" | "[sec2]\n" | ||||
"ccc=extend3\n" | "ccc=extend3\n" | ||||
"iii=2\n"; | "iii=2\n"; | ||||
TestArgsManager test_args; | TestArgsManager test_args; | ||||
const char *avail_args[] = {"-a", "-b", "-ccc", "-d", "-e", | |||||
"-fff", "-ggg", "-h", "-i", "-iii"}; | |||||
test_args.SetupArgs(10, avail_args); | |||||
test_args.ReadConfigString(str_config); | test_args.ReadConfigString(str_config); | ||||
// expectation: a, b, ccc, d, fff, ggg, h, i end up in map | // 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 | // so do sec1.ccc, sec1.d, sec1.h, sec2.ccc, sec2.iii | ||||
BOOST_CHECK(test_args.GetOverrideArgs().empty()); | BOOST_CHECK(test_args.GetOverrideArgs().empty()); | ||||
BOOST_CHECK(test_args.GetConfigArgs().size() == 13); | BOOST_CHECK(test_args.GetConfigArgs().size() == 13); | ||||
▲ Show 20 Lines • Show All 276 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(util_SetArg) { | ||||
testArgs.ForceSetArg("strtest2", "...gnirts"); | testArgs.ForceSetArg("strtest2", "...gnirts"); | ||||
BOOST_CHECK_EQUAL(testArgs.GetArg("strtest2", "default"), "...gnirts"); | BOOST_CHECK_EQUAL(testArgs.GetArg("strtest2", "default"), "...gnirts"); | ||||
BOOST_CHECK_EQUAL(testArgs.GetArgs("strtest2").size(), 1); | BOOST_CHECK_EQUAL(testArgs.GetArgs("strtest2").size(), 1); | ||||
BOOST_CHECK_EQUAL(testArgs.GetArgs("strtest2").front(), "...gnirts"); | BOOST_CHECK_EQUAL(testArgs.GetArgs("strtest2").front(), "...gnirts"); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(util_GetChainName) { | BOOST_AUTO_TEST_CASE(util_GetChainName) { | ||||
TestArgsManager test_args; | TestArgsManager test_args; | ||||
const char *avail_args[] = {"-testnet", "-regtest"}; | |||||
test_args.SetupArgs(2, avail_args); | |||||
const char *argv_testnet[] = {"cmd", "-testnet"}; | const char *argv_testnet[] = {"cmd", "-testnet"}; | ||||
const char *argv_regtest[] = {"cmd", "-regtest"}; | const char *argv_regtest[] = {"cmd", "-regtest"}; | ||||
const char *argv_test_no_reg[] = {"cmd", "-testnet", "-noregtest"}; | const char *argv_test_no_reg[] = {"cmd", "-testnet", "-noregtest"}; | ||||
const char *argv_both[] = {"cmd", "-testnet", "-regtest"}; | const char *argv_both[] = {"cmd", "-testnet", "-regtest"}; | ||||
// equivalent to "-testnet" | // equivalent to "-testnet" | ||||
// regtest in testnet section is ignored | // regtest in testnet section is ignored | ||||
const char *testnetconf = "testnet=1\nregtest=0\n[test]\nregtest=1"; | const char *testnetconf = "testnet=1\nregtest=0\n[test]\nregtest=1"; | ||||
std::string error; | |||||
test_args.ParseParameters(0, (char **)argv_testnet); | test_args.ParseParameters(0, (char **)argv_testnet, error); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "main"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "main"); | ||||
test_args.ParseParameters(2, (char **)argv_testnet); | test_args.ParseParameters(2, (char **)argv_testnet, error); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | ||||
test_args.ParseParameters(2, (char **)argv_regtest); | test_args.ParseParameters(2, (char **)argv_regtest, error); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "regtest"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "regtest"); | ||||
test_args.ParseParameters(3, (char **)argv_test_no_reg); | test_args.ParseParameters(3, (char **)argv_test_no_reg, error); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | ||||
test_args.ParseParameters(3, (char **)argv_both); | test_args.ParseParameters(3, (char **)argv_both, error); | ||||
BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | ||||
test_args.ParseParameters(0, (char **)argv_testnet); | test_args.ParseParameters(0, (char **)argv_testnet, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | ||||
test_args.ParseParameters(2, (char **)argv_testnet); | test_args.ParseParameters(2, (char **)argv_testnet, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | ||||
test_args.ParseParameters(2, (char **)argv_regtest); | test_args.ParseParameters(2, (char **)argv_regtest, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | ||||
test_args.ParseParameters(3, (char **)argv_test_no_reg); | test_args.ParseParameters(3, (char **)argv_test_no_reg, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | ||||
test_args.ParseParameters(3, (char **)argv_both); | test_args.ParseParameters(3, (char **)argv_both, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | ||||
// check setting the network to test (and thus making | // check setting the network to test (and thus making | ||||
// [test] regtest=1 potentially relevant) doesn't break things | // [test] regtest=1 potentially relevant) doesn't break things | ||||
test_args.SelectConfigNetwork("test"); | test_args.SelectConfigNetwork("test"); | ||||
test_args.ParseParameters(0, (char **)argv_testnet); | test_args.ParseParameters(0, (char **)argv_testnet, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | ||||
test_args.ParseParameters(2, (char **)argv_testnet); | test_args.ParseParameters(2, (char **)argv_testnet, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | ||||
test_args.ParseParameters(2, (char **)argv_regtest); | test_args.ParseParameters(2, (char **)argv_regtest, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | ||||
test_args.ParseParameters(2, (char **)argv_test_no_reg); | test_args.ParseParameters(2, (char **)argv_test_no_reg, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | BOOST_CHECK_EQUAL(test_args.GetChainName(), "test"); | ||||
test_args.ParseParameters(3, (char **)argv_both); | test_args.ParseParameters(3, (char **)argv_both, error); | ||||
test_args.ReadConfigString(testnetconf); | test_args.ReadConfigString(testnetconf); | ||||
BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | BOOST_CHECK_THROW(test_args.GetChainName(), std::runtime_error); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(util_FormatMoney) { | BOOST_AUTO_TEST_CASE(util_FormatMoney) { | ||||
BOOST_CHECK_EQUAL(FormatMoney(Amount::zero()), "0.00"); | BOOST_CHECK_EQUAL(FormatMoney(Amount::zero()), "0.00"); | ||||
BOOST_CHECK_EQUAL(FormatMoney(123456789 * (COIN / 10000)), "12345.6789"); | BOOST_CHECK_EQUAL(FormatMoney(123456789 * (COIN / 10000)), "12345.6789"); | ||||
BOOST_CHECK_EQUAL(FormatMoney(-1 * COIN), "-1.00"); | BOOST_CHECK_EQUAL(FormatMoney(-1 * COIN), "-1.00"); | ||||
▲ Show 20 Lines • Show All 726 Lines • Show Last 20 Lines |