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.
1// Copyright (c) 2012-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <common/args.h>6#include <common/settings.h>7#include <logging.h>8#include <test/util/common.h>9#include <test/util/setup_common.h>10#include <univalue.h>11#include <util/strencodings.h>13#include <limits>14#include <string>15#include <utility>16#include <vector>18#include <boost/test/unit_test.hpp>20using util::SplitString;22BOOST_FIXTURE_TEST_SUITE(getarg_tests, BasicTestingSetup)24void ResetArgs(ArgsManager& local_args, const std::string& strArg)25{26std::vector<std::string> vecArg;27if (strArg.size()) {28vecArg = SplitString(strArg, ' ');29}31// Insert dummy executable name:32vecArg.insert(vecArg.begin(), "testbitcoin");34// Convert to char*:35std::vector<const char*> vecChar;36vecChar.reserve(vecArg.size());37for (const std::string& s : vecArg)38vecChar.push_back(s.c_str());40std::string error;41BOOST_CHECK(local_args.ParseParameters(vecChar.size(), vecChar.data(), error));42}44void SetupArgs(ArgsManager& local_args, const std::vector<std::pair<std::string, unsigned int>>& args)45{46for (const auto& arg : args) {47local_args.AddArg(arg.first, "", arg.second, OptionsCategory::OPTIONS);48}49}51// Test behavior of GetArg functions when string, integer, and boolean types52// are specified in the settings.json file. GetArg functions are convenience53// functions. The GetSetting method can always be used instead of GetArg54// methods to retrieve original values, and there's not always an objective55// answer to what GetArg behavior is best in every case. This test makes sure56// there's test coverage for whatever the current behavior is, so it's not57// broken or changed unintentionally.58BOOST_AUTO_TEST_CASE(setting_args)59{60ArgsManager args;61SetupArgs(args, {{"-foo", ArgsManager::ALLOW_ANY}});63auto set_foo = [&](const common::SettingsValue& value) {64args.LockSettings([&](common::Settings& settings) {65settings.rw_settings["foo"] = value;66});67};69set_foo("str");70BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "\"str\"");71BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "str");72BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 0);73BOOST_CHECK_EQUAL(args.GetBoolArg("foo", true), false);74BOOST_CHECK_EQUAL(args.GetBoolArg("foo", false), false);76set_foo("99");77BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "\"99\"");78BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "99");79BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 99);80BOOST_CHECK_EQUAL(args.GetBoolArg("foo", true), true);81BOOST_CHECK_EQUAL(args.GetBoolArg("foo", false), true);83set_foo("3.25");84BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "\"3.25\"");85BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "3.25");86BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 3);87BOOST_CHECK_EQUAL(args.GetBoolArg("foo", true), true);88BOOST_CHECK_EQUAL(args.GetBoolArg("foo", false), true);90set_foo("0");91BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "\"0\"");92BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "0");93BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 0);94BOOST_CHECK_EQUAL(args.GetBoolArg("foo", true), false);95BOOST_CHECK_EQUAL(args.GetBoolArg("foo", false), false);97set_foo("");98BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "\"\"");99BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "");100BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 0);101BOOST_CHECK_EQUAL(args.GetBoolArg("foo", true), true);102BOOST_CHECK_EQUAL(args.GetBoolArg("foo", false), true);104set_foo(99);105BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "99");106BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "99");107BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 99);108BOOST_CHECK_THROW(args.GetBoolArg("foo", true), std::runtime_error);109BOOST_CHECK_THROW(args.GetBoolArg("foo", false), std::runtime_error);111set_foo(3.25);112BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "3.25");113BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "3.25");114BOOST_CHECK_THROW(args.GetIntArg("foo", 100), std::runtime_error);115BOOST_CHECK_THROW(args.GetBoolArg("foo", true), std::runtime_error);116BOOST_CHECK_THROW(args.GetBoolArg("foo", false), std::runtime_error);118set_foo(0);119BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "0");120BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "0");121BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 0);122BOOST_CHECK_THROW(args.GetBoolArg("foo", true), std::runtime_error);123BOOST_CHECK_THROW(args.GetBoolArg("foo", false), std::runtime_error);125set_foo(true);126BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "true");127BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "1");128BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 1);129BOOST_CHECK_EQUAL(args.GetBoolArg("foo", true), true);130BOOST_CHECK_EQUAL(args.GetBoolArg("foo", false), true);132set_foo(false);133BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "false");134BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "0");135BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 0);136BOOST_CHECK_EQUAL(args.GetBoolArg("foo", true), false);137BOOST_CHECK_EQUAL(args.GetBoolArg("foo", false), false);139set_foo(UniValue::VOBJ);140BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "{}");141BOOST_CHECK_THROW(args.GetArg("foo", "default"), std::runtime_error);142BOOST_CHECK_THROW(args.GetIntArg("foo", 100), std::runtime_error);143BOOST_CHECK_THROW(args.GetBoolArg("foo", true), std::runtime_error);144BOOST_CHECK_THROW(args.GetBoolArg("foo", false), std::runtime_error);146set_foo(UniValue::VARR);147BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "[]");148BOOST_CHECK_THROW(args.GetArg("foo", "default"), std::runtime_error);149BOOST_CHECK_THROW(args.GetIntArg("foo", 100), std::runtime_error);150BOOST_CHECK_THROW(args.GetBoolArg("foo", true), std::runtime_error);151BOOST_CHECK_THROW(args.GetBoolArg("foo", false), std::runtime_error);153set_foo(UniValue::VNULL);154BOOST_CHECK_EQUAL(args.GetSetting("foo").write(), "null");155BOOST_CHECK_EQUAL(args.GetArg("foo", "default"), "default");156BOOST_CHECK_EQUAL(args.GetIntArg("foo", 100), 100);157BOOST_CHECK_EQUAL(args.GetBoolArg("foo", true), true);158BOOST_CHECK_EQUAL(args.GetBoolArg("foo", false), false);159}161BOOST_AUTO_TEST_CASE(boolarg)162{163ArgsManager local_args;165const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);166SetupArgs(local_args, {foo});167ResetArgs(local_args, "-foo");168BOOST_CHECK(local_args.GetBoolArg("-foo", false));169BOOST_CHECK(local_args.GetBoolArg("-foo", true));171BOOST_CHECK(!local_args.GetBoolArg("-fo", false));172BOOST_CHECK(local_args.GetBoolArg("-fo", true));174BOOST_CHECK(!local_args.GetBoolArg("-fooo", false));175BOOST_CHECK(local_args.GetBoolArg("-fooo", true));177ResetArgs(local_args, "-foo=0");178BOOST_CHECK(!local_args.GetBoolArg("-foo", false));179BOOST_CHECK(!local_args.GetBoolArg("-foo", true));181ResetArgs(local_args, "-foo=1");182BOOST_CHECK(local_args.GetBoolArg("-foo", false));183BOOST_CHECK(local_args.GetBoolArg("-foo", true));185// New 0.6 feature: auto-map -nosomething to !-something:186ResetArgs(local_args, "-nofoo");187BOOST_CHECK(!local_args.GetBoolArg("-foo", false));188BOOST_CHECK(!local_args.GetBoolArg("-foo", true));190ResetArgs(local_args, "-nofoo=1");191BOOST_CHECK(!local_args.GetBoolArg("-foo", false));192BOOST_CHECK(!local_args.GetBoolArg("-foo", true));194ResetArgs(local_args, "-foo -nofoo"); // -nofoo should win195BOOST_CHECK(!local_args.GetBoolArg("-foo", false));196BOOST_CHECK(!local_args.GetBoolArg("-foo", true));198ResetArgs(local_args, "-foo=1 -nofoo=1"); // -nofoo should win199BOOST_CHECK(!local_args.GetBoolArg("-foo", false));200BOOST_CHECK(!local_args.GetBoolArg("-foo", true));202ResetArgs(local_args, "-foo=0 -nofoo=0"); // -nofoo=0 should win203BOOST_CHECK(local_args.GetBoolArg("-foo", false));204BOOST_CHECK(local_args.GetBoolArg("-foo", true));206// New 0.6 feature: treat -- same as -:207ResetArgs(local_args, "--foo=1");208BOOST_CHECK(local_args.GetBoolArg("-foo", false));209BOOST_CHECK(local_args.GetBoolArg("-foo", true));211ResetArgs(local_args, "--nofoo=1");212BOOST_CHECK(!local_args.GetBoolArg("-foo", false));213BOOST_CHECK(!local_args.GetBoolArg("-foo", true));214}216BOOST_AUTO_TEST_CASE(stringarg)217{218ArgsManager local_args;220const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);221const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY);222SetupArgs(local_args, {foo, bar});223ResetArgs(local_args, "");224BOOST_CHECK_EQUAL(local_args.GetArg("-foo", ""), "");225BOOST_CHECK_EQUAL(local_args.GetArg("-foo", "eleven"), "eleven");227ResetArgs(local_args, "-foo -bar");228BOOST_CHECK_EQUAL(local_args.GetArg("-foo", ""), "");229BOOST_CHECK_EQUAL(local_args.GetArg("-foo", "eleven"), "");231ResetArgs(local_args, "-foo=");232BOOST_CHECK_EQUAL(local_args.GetArg("-foo", ""), "");233BOOST_CHECK_EQUAL(local_args.GetArg("-foo", "eleven"), "");235ResetArgs(local_args, "-foo=11");236BOOST_CHECK_EQUAL(local_args.GetArg("-foo", ""), "11");237BOOST_CHECK_EQUAL(local_args.GetArg("-foo", "eleven"), "11");239ResetArgs(local_args, "-foo=eleven");240BOOST_CHECK_EQUAL(local_args.GetArg("-foo", ""), "eleven");241BOOST_CHECK_EQUAL(local_args.GetArg("-foo", "eleven"), "eleven");242}244BOOST_AUTO_TEST_CASE(intarg)245{246ArgsManager local_args;248const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);249const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY);250SetupArgs(local_args, {foo, bar});
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.