Add test for ArgsManager::GetChainName
There was some test coverage previously, but it was limited and didn't test conflicting and negated arguments.
This commit is contained in:
parent
4b331159df
commit
f6bb11fd37
1 changed files with 106 additions and 4 deletions
|
@ -601,7 +601,7 @@ BOOST_AUTO_TEST_CASE(util_GetChainName)
|
||||||
// outside a network section, and non-network specific settings like "-server"
|
// outside a network section, and non-network specific settings like "-server"
|
||||||
// that aren't sensitive to the network.
|
// that aren't sensitive to the network.
|
||||||
//
|
//
|
||||||
struct SettingsMergeTestingSetup : public BasicTestingSetup {
|
struct ArgsMergeTestingSetup : public BasicTestingSetup {
|
||||||
//! Max number of actions to sequence together. Can decrease this when
|
//! Max number of actions to sequence together. Can decrease this when
|
||||||
//! debugging to make test results easier to understand.
|
//! debugging to make test results easier to understand.
|
||||||
static constexpr int MAX_ACTIONS = 3;
|
static constexpr int MAX_ACTIONS = 3;
|
||||||
|
@ -661,11 +661,11 @@ struct SettingsMergeTestingSetup : public BasicTestingSetup {
|
||||||
// test parses and merges settings, representing the results as strings that get
|
// test parses and merges settings, representing the results as strings that get
|
||||||
// compared against an expected hash. To debug, the result strings can be dumped
|
// compared against an expected hash. To debug, the result strings can be dumped
|
||||||
// to a file (see comments below).
|
// to a file (see comments below).
|
||||||
BOOST_FIXTURE_TEST_CASE(util_SettingsMerge, SettingsMergeTestingSetup)
|
BOOST_FIXTURE_TEST_CASE(util_ArgsMerge, ArgsMergeTestingSetup)
|
||||||
{
|
{
|
||||||
CHash256 out_sha;
|
CHash256 out_sha;
|
||||||
FILE* out_file = nullptr;
|
FILE* out_file = nullptr;
|
||||||
if (const char* out_path = getenv("SETTINGS_MERGE_TEST_OUT")) {
|
if (const char* out_path = getenv("ARGS_MERGE_TEST_OUT")) {
|
||||||
out_file = fsbridge::fopen(out_path, "w");
|
out_file = fsbridge::fopen(out_path, "w");
|
||||||
if (!out_file) throw std::system_error(errno, std::generic_category(), "fopen failed");
|
if (!out_file) throw std::system_error(errno, std::generic_category(), "fopen failed");
|
||||||
}
|
}
|
||||||
|
@ -767,7 +767,7 @@ BOOST_FIXTURE_TEST_CASE(util_SettingsMerge, SettingsMergeTestingSetup)
|
||||||
|
|
||||||
// If check below fails, should manually dump the results with:
|
// If check below fails, should manually dump the results with:
|
||||||
//
|
//
|
||||||
// SETTINGS_MERGE_TEST_OUT=results.txt ./test_bitcoin --run_test=util_tests/util_SettingsMerge
|
// ARGS_MERGE_TEST_OUT=results.txt ./test_bitcoin --run_test=util_tests/util_ArgsMerge
|
||||||
//
|
//
|
||||||
// And verify diff against previous results to make sure the changes are expected.
|
// And verify diff against previous results to make sure the changes are expected.
|
||||||
//
|
//
|
||||||
|
@ -777,6 +777,108 @@ BOOST_FIXTURE_TEST_CASE(util_SettingsMerge, SettingsMergeTestingSetup)
|
||||||
BOOST_CHECK_EQUAL(out_sha_hex, "b835eef5977d69114eb039a976201f8c7121f34fe2b7ea2b73cafb516e5c9dc8");
|
BOOST_CHECK_EQUAL(out_sha_hex, "b835eef5977d69114eb039a976201f8c7121f34fe2b7ea2b73cafb516e5c9dc8");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Similar test as above, but for ArgsManager::GetChainName function.
|
||||||
|
struct ChainMergeTestingSetup : public BasicTestingSetup {
|
||||||
|
static constexpr int MAX_ACTIONS = 2;
|
||||||
|
|
||||||
|
enum Action { NONE, ENABLE_TEST, DISABLE_TEST, NEGATE_TEST, ENABLE_REG, DISABLE_REG, NEGATE_REG };
|
||||||
|
using ActionList = Action[MAX_ACTIONS];
|
||||||
|
|
||||||
|
//! Enumerate all possible test configurations.
|
||||||
|
template <typename Fn>
|
||||||
|
void ForEachMergeSetup(Fn&& fn)
|
||||||
|
{
|
||||||
|
ActionList arg_actions = {};
|
||||||
|
ForEachNoDup(arg_actions, ENABLE_TEST, NEGATE_REG, [&] {
|
||||||
|
ActionList conf_actions = {};
|
||||||
|
ForEachNoDup(conf_actions, ENABLE_TEST, NEGATE_REG, [&] { fn(arg_actions, conf_actions); });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BOOST_FIXTURE_TEST_CASE(util_ChainMerge, ChainMergeTestingSetup)
|
||||||
|
{
|
||||||
|
CHash256 out_sha;
|
||||||
|
FILE* out_file = nullptr;
|
||||||
|
if (const char* out_path = getenv("CHAIN_MERGE_TEST_OUT")) {
|
||||||
|
out_file = fsbridge::fopen(out_path, "w");
|
||||||
|
if (!out_file) throw std::system_error(errno, std::generic_category(), "fopen failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
ForEachMergeSetup([&](const ActionList& arg_actions, const ActionList& conf_actions) {
|
||||||
|
TestArgsManager parser;
|
||||||
|
LOCK(parser.cs_args);
|
||||||
|
parser.AddArg("-regtest", "regtest", false, OptionsCategory::OPTIONS);
|
||||||
|
parser.AddArg("-testnet", "testnet", false, OptionsCategory::OPTIONS);
|
||||||
|
|
||||||
|
auto arg = [](Action action) { return action == ENABLE_TEST ? "-testnet=1" :
|
||||||
|
action == DISABLE_TEST ? "-testnet=0" :
|
||||||
|
action == NEGATE_TEST ? "-notestnet=1" :
|
||||||
|
action == ENABLE_REG ? "-regtest=1" :
|
||||||
|
action == DISABLE_REG ? "-regtest=0" :
|
||||||
|
action == NEGATE_REG ? "-noregtest=1" : nullptr; };
|
||||||
|
|
||||||
|
std::string desc;
|
||||||
|
std::vector<const char*> argv = {"ignored"};
|
||||||
|
for (Action action : arg_actions) {
|
||||||
|
const char* argstr = arg(action);
|
||||||
|
if (!argstr) break;
|
||||||
|
argv.push_back(argstr);
|
||||||
|
desc += " ";
|
||||||
|
desc += argv.back();
|
||||||
|
}
|
||||||
|
std::string error;
|
||||||
|
BOOST_CHECK(parser.ParseParameters(argv.size(), argv.data(), error));
|
||||||
|
BOOST_CHECK_EQUAL(error, "");
|
||||||
|
|
||||||
|
std::string conf;
|
||||||
|
for (Action action : conf_actions) {
|
||||||
|
const char* argstr = arg(action);
|
||||||
|
if (!argstr) break;
|
||||||
|
desc += " ";
|
||||||
|
desc += argstr + 1;
|
||||||
|
conf += argstr + 1;
|
||||||
|
}
|
||||||
|
std::istringstream conf_stream(conf);
|
||||||
|
BOOST_CHECK(parser.ReadConfigStream(conf_stream, "filepath", error));
|
||||||
|
BOOST_CHECK_EQUAL(error, "");
|
||||||
|
|
||||||
|
desc += " || ";
|
||||||
|
try {
|
||||||
|
desc += parser.GetChainName();
|
||||||
|
} catch (const std::runtime_error& e) {
|
||||||
|
desc += "error: ";
|
||||||
|
desc += e.what();
|
||||||
|
}
|
||||||
|
desc += "\n";
|
||||||
|
|
||||||
|
out_sha.Write((const unsigned char*)desc.data(), desc.size());
|
||||||
|
if (out_file) {
|
||||||
|
BOOST_REQUIRE(fwrite(desc.data(), 1, desc.size(), out_file) == desc.size());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (out_file) {
|
||||||
|
if (fclose(out_file)) throw std::system_error(errno, std::generic_category(), "fclose failed");
|
||||||
|
out_file = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char out_sha_bytes[CSHA256::OUTPUT_SIZE];
|
||||||
|
out_sha.Finalize(out_sha_bytes);
|
||||||
|
std::string out_sha_hex = HexStr(std::begin(out_sha_bytes), std::end(out_sha_bytes));
|
||||||
|
|
||||||
|
// If check below fails, should manually dump the results with:
|
||||||
|
//
|
||||||
|
// CHAIN_MERGE_TEST_OUT=results.txt ./test_bitcoin --run_test=util_tests/util_ChainMerge
|
||||||
|
//
|
||||||
|
// And verify diff against previous results to make sure the changes are expected.
|
||||||
|
//
|
||||||
|
// Results file is formatted like:
|
||||||
|
//
|
||||||
|
// <input> || <output>
|
||||||
|
BOOST_CHECK_EQUAL(out_sha_hex, "b284f4b4a15dd6bf8c06213a69a004b1960388e1d9917173927db52ac220927f");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(util_FormatMoney)
|
BOOST_AUTO_TEST_CASE(util_FormatMoney)
|
||||||
{
|
{
|
||||||
BOOST_CHECK_EQUAL(FormatMoney(0), "0.00");
|
BOOST_CHECK_EQUAL(FormatMoney(0), "0.00");
|
||||||
|
|
Loading…
Reference in a new issue