Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
501BOOST_CHECK(!test_args.GetBoolArg("-ccc", def));502BOOST_CHECK(!test_args.GetBoolArg("-d", def));503BOOST_CHECK(!test_args.GetBoolArg("-fff", def));504BOOST_CHECK(test_args.GetBoolArg("-ggg", def));505BOOST_CHECK(!test_args.GetBoolArg("-h", def));506BOOST_CHECK(test_args.GetBoolArg("-i", def));507BOOST_CHECK(test_args.GetBoolArg("-zzz", def) == def);508BOOST_CHECK(test_args.GetBoolArg("-iii", def) == def);509}511BOOST_REQUIRE(test_args.GetArgs("-a").size() == 1);512BOOST_CHECK(test_args.GetArgs("-a").front() == "");513BOOST_REQUIRE(test_args.GetArgs("-b").size() == 1);514BOOST_CHECK(test_args.GetArgs("-b").front() == "1");515BOOST_REQUIRE(test_args.GetArgs("-ccc").size() == 2);516BOOST_CHECK(test_args.GetArgs("-ccc").front() == "argument");517BOOST_CHECK(test_args.GetArgs("-ccc").back() == "multiple");518BOOST_CHECK(test_args.GetArgs("-fff").size() == 0);519BOOST_CHECK(test_args.GetArgs("-nofff").size() == 0);520BOOST_REQUIRE(test_args.GetArgs("-ggg").size() == 1);521BOOST_CHECK(test_args.GetArgs("-ggg").front() == "1");522BOOST_CHECK(test_args.GetArgs("-noggg").size() == 0);523BOOST_CHECK(test_args.GetArgs("-h").size() == 0);524BOOST_CHECK(test_args.GetArgs("-noh").size() == 0);525BOOST_REQUIRE(test_args.GetArgs("-i").size() == 1);526BOOST_CHECK(test_args.GetArgs("-i").front() == "1");527BOOST_CHECK(test_args.GetArgs("-noi").size() == 0);528BOOST_CHECK(test_args.GetArgs("-zzz").size() == 0);530BOOST_CHECK(!test_args.IsArgNegated("-a"));531BOOST_CHECK(!test_args.IsArgNegated("-b"));532BOOST_CHECK(!test_args.IsArgNegated("-ccc"));533BOOST_CHECK(!test_args.IsArgNegated("-d"));534BOOST_CHECK(test_args.IsArgNegated("-fff"));535BOOST_CHECK(!test_args.IsArgNegated("-ggg"));536BOOST_CHECK(test_args.IsArgNegated("-h")); // last setting takes precedence537BOOST_CHECK(!test_args.IsArgNegated("-i")); // last setting takes precedence538BOOST_CHECK(!test_args.IsArgNegated("-zzz"));540// Test sections work541test_args.SelectConfigNetwork("sec1");543// same as original544BOOST_CHECK_EQUAL(test_args.GetArg("-a", "xxx"), "");545BOOST_CHECK_EQUAL(test_args.GetArg("-b", "xxx"), "1");546BOOST_CHECK_EQUAL(test_args.GetArg("-fff", "xxx"), "0");547BOOST_CHECK_EQUAL(test_args.GetArg("-ggg", "xxx"), "1");548BOOST_CHECK_EQUAL(test_args.GetArg("-zzz", "xxx"), "xxx");549BOOST_CHECK_EQUAL(test_args.GetArg("-iii", "xxx"), "xxx");550// d is overridden551BOOST_CHECK(test_args.GetArg("-d", "xxx") == "eee");552// section-specific setting553BOOST_CHECK(test_args.GetArg("-h", "xxx") == "1");554// section takes priority for multiple values555BOOST_CHECK(test_args.GetArg("-ccc", "xxx") == "extend1");556// check multiple values works557const std::vector<std::string> sec1_ccc_expected = {"extend1","extend2","argument","multiple"};558const auto& sec1_ccc_res = test_args.GetArgs("-ccc");559BOOST_CHECK_EQUAL_COLLECTIONS(sec1_ccc_res.begin(), sec1_ccc_res.end(), sec1_ccc_expected.begin(), sec1_ccc_expected.end());561test_args.SelectConfigNetwork("sec2");563// same as original564BOOST_CHECK(test_args.GetArg("-a", "xxx") == "");565BOOST_CHECK(test_args.GetArg("-b", "xxx") == "1");566BOOST_CHECK(test_args.GetArg("-d", "xxx") == "e");567BOOST_CHECK(test_args.GetArg("-fff", "xxx") == "0");568BOOST_CHECK(test_args.GetArg("-ggg", "xxx") == "1");569BOOST_CHECK(test_args.GetArg("-zzz", "xxx") == "xxx");570BOOST_CHECK(test_args.GetArg("-h", "xxx") == "0");571// section-specific setting572BOOST_CHECK(test_args.GetArg("-iii", "xxx") == "2");573// section takes priority for multiple values574BOOST_CHECK(test_args.GetArg("-ccc", "xxx") == "extend3");575// check multiple values works576const std::vector<std::string> sec2_ccc_expected = {"extend3","argument","multiple"};577const auto& sec2_ccc_res = test_args.GetArgs("-ccc");578BOOST_CHECK_EQUAL_COLLECTIONS(sec2_ccc_res.begin(), sec2_ccc_res.end(), sec2_ccc_expected.begin(), sec2_ccc_expected.end());580// Test section only options582const auto ccc2 = std::make_pair("-ccc", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY);583const auto d2 = std::make_pair("-d", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY);584const auto h2 = std::make_pair("-h", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY);585test_args.ClearArgs();586test_args.SetupArgs({a, b, ccc2, d2, e, fff, ggg, h2, i, iii});587test_args.ReadConfigString(str_config);589test_args.SelectConfigNetwork(ChainTypeToString(ChainType::MAIN));590BOOST_CHECK(test_args.GetArg("-d", "xxx") == "e");591BOOST_CHECK(test_args.GetArgs("-ccc").size() == 2);592BOOST_CHECK(test_args.GetArg("-h", "xxx") == "0");594test_args.SelectConfigNetwork("sec1");595BOOST_CHECK(test_args.GetArg("-d", "xxx") == "eee");596BOOST_CHECK(test_args.GetArgs("-d").size() == 1);597BOOST_CHECK(test_args.GetArgs("-ccc").size() == 2);598BOOST_CHECK(test_args.GetArg("-h", "xxx") == "1");600test_args.SelectConfigNetwork("sec2");601BOOST_CHECK(test_args.GetArg("-d", "xxx") == "xxx");602BOOST_CHECK(test_args.GetArgs("-d").size() == 0);603BOOST_CHECK(test_args.GetArgs("-ccc").size() == 1);604BOOST_CHECK(test_args.GetArg("-h", "xxx") == "0");605}607BOOST_AUTO_TEST_CASE(util_GetArg)608{609TestArgsManager testArgs;610testArgs.LockSettings([&](common::Settings& s) {611s.command_line_options.clear();612s.command_line_options["strtest1"] = {"string..."};613// strtest2 undefined on purpose614s.command_line_options["inttest1"] = {"12345"};615s.command_line_options["inttest2"] = {"81985529216486895"};616// inttest3 undefined on purpose617s.command_line_options["booltest1"] = {""};618// booltest2 undefined on purpose619s.command_line_options["booltest3"] = {"0"};620s.command_line_options["booltest4"] = {"1"};622// priorities623s.command_line_options["pritest1"] = {"a", "b"};624s.ro_config[""]["pritest2"] = {"a", "b"};625s.command_line_options["pritest3"] = {"a"};626s.ro_config[""]["pritest3"] = {"b"};627s.command_line_options["pritest4"] = {"a","b"};628s.ro_config[""]["pritest4"] = {"c","d"};629});631BOOST_CHECK_EQUAL(testArgs.GetArg("strtest1", "default"), "string...");632BOOST_CHECK_EQUAL(testArgs.GetArg("strtest2", "default"), "default");633BOOST_CHECK_EQUAL(testArgs.GetIntArg("inttest1", -1), 12345);634BOOST_CHECK_EQUAL(testArgs.GetIntArg("inttest2", -1), 81985529216486895LL);635BOOST_CHECK_EQUAL(testArgs.GetIntArg("inttest3", -1), -1);636BOOST_CHECK_EQUAL(testArgs.GetBoolArg("booltest1", false), true);637BOOST_CHECK_EQUAL(testArgs.GetBoolArg("booltest2", false), false);638BOOST_CHECK_EQUAL(testArgs.GetBoolArg("booltest3", false), false);639BOOST_CHECK_EQUAL(testArgs.GetBoolArg("booltest4", false), true);641BOOST_CHECK_EQUAL(testArgs.GetArg("pritest1", "default"), "b");642BOOST_CHECK_EQUAL(testArgs.GetArg("pritest2", "default"), "a");643BOOST_CHECK_EQUAL(testArgs.GetArg("pritest3", "default"), "a");644BOOST_CHECK_EQUAL(testArgs.GetArg("pritest4", "default"), "b");645}647BOOST_AUTO_TEST_CASE(util_AddCommand)648{649enum TestFail { SUCCESS,650PARSE_FAIL,651PARSE_ERROR,652NO_COMMAND,653COMMAND_OPTS_BAD_DETAILS,654COMMAND_OPTS };656auto testfn = [&](const auto& argv) -> TestFail {657TestArgsManager test_args;658test_args.AddArg("-opt1=<file name>", "Opt 1", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::COMMAND_OPTIONS);659test_args.AddArg("-opt2=<file name>", "Opt 2", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::COMMAND_OPTIONS);660test_args.AddArg("-opt3=<file name>", "Opt 3", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::OPTIONS);662test_args.AddCommand("cmd1", "No specific options");663test_args.AddCommand("cmd2", "Opt 1", {"-opt1"});664test_args.AddCommand("cmd3", "Opt 1 or 2", {"-opt1", "-opt2"});666std::string error;667if (!test_args.ParseParameters(argv.size(), argv.data(), error)) return PARSE_FAIL;668if (!error.empty()) return PARSE_ERROR;669const auto command = test_args.GetCommand();670if (!command) return NO_COMMAND;671std::vector<std::string> details;672if (!test_args.CheckCommandOptions(command->command, &details)) {673if (details.empty()) return COMMAND_OPTS_BAD_DETAILS;674return COMMAND_OPTS;675} else if (!details.empty()) {676return COMMAND_OPTS_BAD_DETAILS;677}678return SUCCESS;679};681BOOST_CHECK_EQUAL(COMMAND_OPTS, testfn(std::array{"x", "-opt1=foo", "cmd1"}));682BOOST_CHECK_EQUAL(SUCCESS, testfn(std::array{"x", "cmd1", "-opt1=foo"})); // things after the command are "args" and left unparsed, not options684BOOST_CHECK_EQUAL(SUCCESS, testfn(std::array{"x", "-opt1=foo", "cmd2"}));685BOOST_CHECK_EQUAL(SUCCESS, testfn(std::array{"x", "-opt1=foo", "cmd3"}));686BOOST_CHECK_EQUAL(COMMAND_OPTS, testfn(std::array{"x", "-opt2=foo", "cmd1"}));687BOOST_CHECK_EQUAL(COMMAND_OPTS, testfn(std::array{"x", "-opt2=foo", "cmd2"}));688BOOST_CHECK_EQUAL(SUCCESS, testfn(std::array{"x", "-opt2=foo", "cmd3"}));689BOOST_CHECK_EQUAL(SUCCESS, testfn(std::array{"x", "-opt3=foo", "cmd1"}));690BOOST_CHECK_EQUAL(SUCCESS, testfn(std::array{"x", "-opt3=foo", "cmd2"}));691BOOST_CHECK_EQUAL(SUCCESS, testfn(std::array{"x", "-opt3=foo", "cmd3"}));693BOOST_CHECK_EQUAL(COMMAND_OPTS, testfn(std::array{"x", "-opt1=foo", "-opt3=bar", "-opt2=baz", "cmd1"}));694BOOST_CHECK_EQUAL(COMMAND_OPTS, testfn(std::array{"x", "-opt1=foo", "-opt3=bar", "-opt2=baz", "cmd2"}));695BOOST_CHECK_EQUAL(SUCCESS, testfn(std::array{"x", "-opt1=foo", "-opt3=bar", "-opt2=baz", "cmd3"}));697BOOST_CHECK_EQUAL(PARSE_FAIL, testfn(std::array{"x", "cmd4"}));698BOOST_CHECK_EQUAL(NO_COMMAND, testfn(std::array{"x", "-opt3=foo"}));699BOOST_CHECK_EQUAL(PARSE_FAIL, testfn(std::array{"x", "-opt4=foo"}));700}702BOOST_AUTO_TEST_CASE(util_AddCommand_clearargs_replaces_command_options)703{704const auto add_command{[&](TestArgsManager& test_args, const std::string& option) {705test_args.AddArg(option, "option", ArgsManager::ALLOW_ANY, OptionsCategory::COMMAND_OPTIONS);706test_args.AddCommand("cmd", "cmd", {option});707}};709TestArgsManager test_args;710add_command(test_args, "-opt1");711test_args.ClearArgs();712add_command(test_args, "-opt2");714const auto help{test_args.GetHelpMessage()};715BOOST_CHECK(help.find("-opt2") != std::string::npos);717test_args.ForceSetArg("-opt2", "1");718std::vector<std::string> details;719BOOST_CHECK(test_args.CheckCommandOptions("cmd", &details));720BOOST_CHECK(details.empty());721}723BOOST_AUTO_TEST_CASE(util_GetChainTypeString)724{725TestArgsManager test_args;726const auto testnet = std::make_pair("-testnet", ArgsManager::ALLOW_ANY);727const auto testnet4 = std::make_pair("-testnet4", ArgsManager::ALLOW_ANY);728const auto regtest = std::make_pair("-regtest", ArgsManager::ALLOW_ANY);729test_args.SetupArgs({testnet, testnet4, regtest});731const char* argv_testnet4[] = {"cmd", "-testnet4"};732const char* argv_regtest[] = {"cmd", "-regtest"};733const char* argv_test_no_reg[] = {"cmd", "-testnet4", "-noregtest"};734const char* argv_both[] = {"cmd", "-testnet4", "-regtest"};736// regtest in test network section is ignored737const char* testnetconf = "testnet4=1\nregtest=0\n[testnet4]\nregtest=1";738std::string error;740BOOST_CHECK(test_args.ParseParameters(0, argv_testnet4, error));741BOOST_CHECK_EQUAL(test_args.GetChainTypeString(), "main");743BOOST_CHECK(test_args.ParseParameters(0, argv_testnet4, error));744BOOST_CHECK_EQUAL(test_args.GetChainTypeString(), "main");746BOOST_CHECK(test_args.ParseParameters(2, argv_testnet4, error));747BOOST_CHECK_EQUAL(test_args.GetChainTypeString(), "testnet4");749BOOST_CHECK(test_args.ParseParameters(2, argv_regtest, error));750BOOST_CHECK_EQUAL(test_args.GetChainTypeString(), "regtest");
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.