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.
252ResetArgs(local_args, "");253BOOST_CHECK(!local_args.GetArg<int64_t>("-foo").has_value());254BOOST_CHECK(!local_args.GetArg<uint8_t>("-bar").has_value());255BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 11), 11);256BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 0), 0);257BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{222}), 222);258BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{0}), 0);260ResetArgs(local_args, "-foo -bar");261BOOST_CHECK_EQUAL(local_args.GetArg<int64_t>("-foo"), 0);262BOOST_CHECK_EQUAL(local_args.GetArg<uint8_t>("-bar"), 0);263BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 11), 0);264BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{222}), 0);266// Check under-/overflow behavior.267ResetArgs(local_args, "-foo=-9223372036854775809 -bar=9223372036854775808");268BOOST_CHECK_EQUAL(local_args.GetArg<int64_t>("-foo"), std::numeric_limits<int64_t>::min());269BOOST_CHECK_EQUAL(local_args.GetArg<uint8_t>("-bar"), std::numeric_limits<uint8_t>::max());270BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 0), std::numeric_limits<int64_t>::min());271BOOST_CHECK_EQUAL(local_args.GetIntArg("-bar", 0), std::numeric_limits<int64_t>::max());272BOOST_CHECK_EQUAL(local_args.GetArg("-foo", uint8_t{0}), std::numeric_limits<uint8_t>::min());273BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{0}), std::numeric_limits<uint8_t>::max());275ResetArgs(local_args, "-foo=11 -bar=12");276BOOST_CHECK_EQUAL(local_args.GetArg<int64_t>("-foo"), 11);277BOOST_CHECK_EQUAL(local_args.GetArg<uint8_t>("-bar"), 12);278BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 0), 11);279BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{11}), 12);281ResetArgs(local_args, "-foo=NaN -bar=NotANumber");282BOOST_CHECK_EQUAL(local_args.GetArg<int64_t>("-foo"), 0);283BOOST_CHECK_EQUAL(local_args.GetArg<uint8_t>("-bar"), 0);284BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 1), 0);285BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{11}), 0);286}288BOOST_AUTO_TEST_CASE(patharg)289{290ArgsManager local_args;292const auto dir = std::make_pair("-dir", ArgsManager::ALLOW_ANY);293SetupArgs(local_args, {dir});294ResetArgs(local_args, "");295BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), fs::path{});297const fs::path root_path{"/"};298ResetArgs(local_args, "-dir=/");299BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), root_path);301ResetArgs(local_args, "-dir=/.");302BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), root_path);304ResetArgs(local_args, "-dir=/./");305BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), root_path);307ResetArgs(local_args, "-dir=/.//");308BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), root_path);310#ifdef WIN32311const fs::path win_root_path{"C:\\"};312ResetArgs(local_args, "-dir=C:\\");313BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), win_root_path);315ResetArgs(local_args, "-dir=C:/");316BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), win_root_path);318ResetArgs(local_args, "-dir=C:\\\\");319BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), win_root_path);321ResetArgs(local_args, "-dir=C:\\.");322BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), win_root_path);324ResetArgs(local_args, "-dir=C:\\.\\");325BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), win_root_path);327ResetArgs(local_args, "-dir=C:\\.\\\\");328BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), win_root_path);329#endif331const fs::path absolute_path{"/home/user/.bitcoin"};332ResetArgs(local_args, "-dir=/home/user/.bitcoin");333BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), absolute_path);335ResetArgs(local_args, "-dir=/root/../home/user/.bitcoin");336BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), absolute_path);338ResetArgs(local_args, "-dir=/home/./user/.bitcoin");339BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), absolute_path);341ResetArgs(local_args, "-dir=/home/user/.bitcoin/");342BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), absolute_path);344ResetArgs(local_args, "-dir=/home/user/.bitcoin//");345BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), absolute_path);347ResetArgs(local_args, "-dir=/home/user/.bitcoin/.");348BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), absolute_path);350ResetArgs(local_args, "-dir=/home/user/.bitcoin/./");351BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), absolute_path);353ResetArgs(local_args, "-dir=/home/user/.bitcoin/.//");354BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), absolute_path);356const fs::path relative_path{"user/.bitcoin"};357ResetArgs(local_args, "-dir=user/.bitcoin");358BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), relative_path);360ResetArgs(local_args, "-dir=somewhere/../user/.bitcoin");361BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), relative_path);363ResetArgs(local_args, "-dir=user/./.bitcoin");364BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), relative_path);366ResetArgs(local_args, "-dir=user/.bitcoin/");367BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), relative_path);369ResetArgs(local_args, "-dir=user/.bitcoin//");370BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), relative_path);372ResetArgs(local_args, "-dir=user/.bitcoin/.");373BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), relative_path);375ResetArgs(local_args, "-dir=user/.bitcoin/./");376BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), relative_path);378ResetArgs(local_args, "-dir=user/.bitcoin/.//");379BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir"), relative_path);381// Check negated and default argument handling. Specifying an empty argument382// is the same as not specifying the argument. This is convenient for383// scripting so later command line arguments can override earlier command384// line arguments or bitcoin.conf values. Currently the -dir= case cannot be385// distinguished from -dir case with no assignment, but #16545 would add the386// ability to distinguish these in the future (and treat the no-assign case387// like an imperative command or an error).388ResetArgs(local_args, "");389BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir", "default"), fs::path{"default"});390ResetArgs(local_args, "-dir=override");391BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir", "default"), fs::path{"override"});392ResetArgs(local_args, "-dir=");393BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir", "default"), fs::path{"default"});394ResetArgs(local_args, "-dir");395BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir", "default"), fs::path{"default"});396ResetArgs(local_args, "-nodir");397BOOST_CHECK_EQUAL(local_args.GetPathArg("-dir", "default"), fs::path{""});398}400BOOST_AUTO_TEST_CASE(doubledash)401{402ArgsManager local_args;404const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);405const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY);406SetupArgs(local_args, {foo, bar});407ResetArgs(local_args, "--foo");408BOOST_CHECK_EQUAL(local_args.GetBoolArg("-foo", false), true);410ResetArgs(local_args, "--foo=verbose --bar=1");411BOOST_CHECK_EQUAL(local_args.GetArg("-foo", ""), "verbose");412BOOST_CHECK_EQUAL(local_args.GetIntArg("-bar", 0), 1);413}415BOOST_AUTO_TEST_CASE(boolargno)416{417ArgsManager local_args;419const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);420const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY);421SetupArgs(local_args, {foo, bar});422ResetArgs(local_args, "-nofoo");423BOOST_CHECK(!local_args.GetBoolArg("-foo", true));424BOOST_CHECK(!local_args.GetBoolArg("-foo", false));426ResetArgs(local_args, "-nofoo=1");427BOOST_CHECK(!local_args.GetBoolArg("-foo", true));428BOOST_CHECK(!local_args.GetBoolArg("-foo", false));430ResetArgs(local_args, "-nofoo=0");431BOOST_CHECK(local_args.GetBoolArg("-foo", true));432BOOST_CHECK(local_args.GetBoolArg("-foo", false));434ResetArgs(local_args, "-foo --nofoo"); // --nofoo should win435BOOST_CHECK(!local_args.GetBoolArg("-foo", true));436BOOST_CHECK(!local_args.GetBoolArg("-foo", false));438ResetArgs(local_args, "-nofoo -foo"); // foo always wins:439BOOST_CHECK(local_args.GetBoolArg("-foo", true));440BOOST_CHECK(local_args.GetBoolArg("-foo", false));441}443BOOST_AUTO_TEST_CASE(logargs)444{445ArgsManager local_args;447const auto okaylog_bool = std::make_pair("-okaylog-bool", ArgsManager::ALLOW_ANY);448const auto okaylog_negbool = std::make_pair("-okaylog-negbool", ArgsManager::ALLOW_ANY);449const auto okaylog = std::make_pair("-okaylog", ArgsManager::ALLOW_ANY);450const auto dontlog = std::make_pair("-dontlog", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE);451SetupArgs(local_args, {okaylog_bool, okaylog_negbool, okaylog, dontlog});452ResetArgs(local_args, "-okaylog-bool -nookaylog-negbool -okaylog=public -dontlog=private42");454// Everything logged to debug.log will also append to str455std::string str;456auto print_connection = LogInstance().PushBackCallback(457[&str](const std::string& s) {458str += s;459});461// Log the arguments462local_args.LogArgs();464LogInstance().DeleteCallback(print_connection);465// Check that what should appear does, and what shouldn't doesn't.466BOOST_CHECK(str.find("Command-line arg: okaylog-bool=\"\"") != std::string::npos);467BOOST_CHECK(str.find("Command-line arg: okaylog-negbool=false") != std::string::npos);468BOOST_CHECK(str.find("Command-line arg: okaylog=\"public\"") != std::string::npos);469BOOST_CHECK(str.find("dontlog=****") != std::string::npos);470BOOST_CHECK(str.find("private42") == std::string::npos);471}473BOOST_AUTO_TEST_SUITE_END()
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.