41 #include <sys/types.h> 45 #include <boost/test/unit_test.hpp> 87 explicit NoCopyOrMove(
int i) : i{i} { }
89 NoCopyOrMove() =
delete;
90 NoCopyOrMove(
const NoCopyOrMove&) =
delete;
91 NoCopyOrMove(NoCopyOrMove&&) =
delete;
92 NoCopyOrMove& operator=(
const NoCopyOrMove&) =
delete;
93 NoCopyOrMove& operator=(NoCopyOrMove&&) =
delete;
95 operator bool()
const {
return i != 0; }
97 int get_ip1() {
return i + 1; }
101 [&]() {
Assume(get_ip1()); }();
102 return Assume(get_ip1() != 5);
110 const std::unique_ptr<int> p_two =
Assert(std::make_unique<int>(2));
112 const int two = *
Assert(p_two);
116 const bool result{
Assume(two == 2)};
136 BOOST_ERROR(
"break was swallowed!");
146 BOOST_ERROR(
"break was swallowed!");
151 0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
152 0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
153 0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
154 0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
159 std::vector<unsigned char> result;
162 result =
ParseHex(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
163 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
167 BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
171 BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
174 const std::string with_embedded_null{
" 11 "s
178 result =
ParseHex(with_embedded_null);
179 BOOST_CHECK(result.size() == 1 && result[0] == 0x11);
182 result =
ParseHex(
"1234 invalid 1234");
183 BOOST_CHECK(result.size() == 2 && result[0] == 0x12 && result[1] == 0x34);
190 "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
204 const std::string out_exp{
"04678afdb0"};
212 auto input = std::string();
213 for (
size_t i=0; i<256; ++i) {
214 input.push_back(static_cast<char>(i));
218 BOOST_TEST_REQUIRE(hex.size() == 512);
219 static constexpr
auto hexmap = std::string_view(
"0123456789abcdef");
220 for (
size_t i = 0; i < 256; ++i) {
221 auto upper = hexmap.find(hex[i * 2]);
222 auto lower = hexmap.find(hex[i * 2 + 1]);
223 BOOST_TEST_REQUIRE(upper != std::string_view::npos);
224 BOOST_TEST_REQUIRE(lower != std::string_view::npos);
225 BOOST_TEST_REQUIRE(i == upper*16 + lower);
232 std::array mut_arr{uint8_t{0xaa}, uint8_t{0xbb}};
234 mut_bytes[1] = std::byte{0x11};
247 const auto op_upper = [](
const std::string& s) {
return ToUpper(s); };
255 const std::string original(
"A test \"%s\" string '%s'.");
256 auto test_replaceall = [&original](
const std::string& search,
const std::string& substitute,
const std::string& expected) {
257 auto test = original;
262 test_replaceall(
"",
"foo", original);
263 test_replaceall(original,
"foo",
"foo");
264 test_replaceall(
"%s",
"foo",
"A test \"foo\" string 'foo'.");
265 test_replaceall(
"\"",
"foo",
"A test foo%sfoo string '%s'.");
266 test_replaceall(
"'",
"foo",
"A test \"%s\" string foo%sfoo.");
281 BOOST_CHECK_EQUAL(
TrimString(std::string(
"\x05\x04\x03\x02\x01\x00", 6), std::string(
"\x05\x04\x03\x02\x01", 5)), std::string(
"\0", 1));
305 std::istringstream streamConfig(str_config);
308 m_settings.ro_config.clear();
309 m_config_sections.clear();
312 BOOST_REQUIRE(ReadConfigStream(streamConfig,
"",
error));
317 m_network_only_args.insert(arg);
319 void SetupArgs(
const std::vector<std::pair<std::string, unsigned int>>&
args)
321 for (
const auto& arg :
args) {
329 using ArgsManager::m_network;
330 using ArgsManager::m_settings;
339 bool default_string =
false;
340 bool default_int =
false;
341 bool default_bool =
false;
342 const char* string_value =
nullptr;
355 Expect&
List(std::vector<std::string> m) { list_value = std::move(
m);
return *
this; }
363 const char* argv[] = {
"ignored", arg};
369 if (
expect.setting.isNull() ||
expect.setting.isFalse()) {
378 BOOST_CHECK_NE(
error.find(
expect.error), std::string::npos);
384 if (
expect.default_string) {
386 }
else if (
expect.string_value) {
394 }
else if (
expect.int_value) {
400 if (
expect.default_bool) {
403 }
else if (
expect.bool_value) {
411 auto l = test.
GetArgs(
"-value");
412 BOOST_CHECK_EQUAL_COLLECTIONS(l.begin(), l.end(),
expect.list_value->begin(),
expect.list_value->end());
423 CheckValue(M::ALLOW_ANY,
nullptr, Expect{{}}.DefaultString().DefaultInt().DefaultBool().List({}));
424 CheckValue(M::ALLOW_ANY,
"-novalue", Expect{
false}.String(
"0").Int(0).Bool(
false).List({}));
425 CheckValue(M::ALLOW_ANY,
"-novalue=", Expect{
false}.String(
"0").Int(0).Bool(
false).List({}));
426 CheckValue(M::ALLOW_ANY,
"-novalue=0", Expect{
true}.String(
"1").Int(1).Bool(
true).List({
"1"}));
427 CheckValue(M::ALLOW_ANY,
"-novalue=1", Expect{
false}.String(
"0").Int(0).Bool(
false).List({}));
428 CheckValue(M::ALLOW_ANY,
"-novalue=2", Expect{
false}.String(
"0").Int(0).Bool(
false).List({}));
429 CheckValue(M::ALLOW_ANY,
"-novalue=abc", Expect{
true}.String(
"1").Int(1).Bool(
true).List({
"1"}));
430 CheckValue(M::ALLOW_ANY,
"-value", Expect{
""}.String(
"").Int(0).Bool(
true).List({
""}));
431 CheckValue(M::ALLOW_ANY,
"-value=", Expect{
""}.String(
"").Int(0).Bool(
true).List({
""}));
432 CheckValue(M::ALLOW_ANY,
"-value=0", Expect{
"0"}.String(
"0").Int(0).Bool(
false).List({
"0"}));
433 CheckValue(M::ALLOW_ANY,
"-value=1", Expect{
"1"}.String(
"1").Int(1).Bool(
true).List({
"1"}));
434 CheckValue(M::ALLOW_ANY,
"-value=2", Expect{
"2"}.String(
"2").Int(2).Bool(
true).List({
"2"}));
435 CheckValue(M::ALLOW_ANY,
"-value=abc", Expect{
"abc"}.String(
"abc").Int(0).Bool(
false).List({
"abc"}));
443 std::array argv{
"ignored", arg};
453 BOOST_CHECK_EQUAL(
Parse(
"-includeconf"),
"-includeconf cannot be used from commandline; -includeconf=\"\"");
454 BOOST_CHECK_EQUAL(
Parse(
"-includeconf=file"),
"-includeconf cannot be used from commandline; -includeconf=\"file\"");
465 const char *argv_test[] = {
"-ignored",
"-a",
"-b",
"-ccc=argument",
"-ccc=multiple",
"f",
"-d=e"};
471 BOOST_CHECK(testArgs.m_settings.command_line_options.empty() && testArgs.m_settings.ro_config.empty());
474 BOOST_CHECK(testArgs.m_settings.command_line_options.empty() && testArgs.m_settings.ro_config.empty());
480 BOOST_CHECK(testArgs.m_settings.command_line_options.size() == 3 && testArgs.m_settings.ro_config.empty());
483 BOOST_CHECK(testArgs.m_settings.command_line_options.count(
"a") && testArgs.m_settings.command_line_options.count(
"b") && testArgs.m_settings.command_line_options.count(
"ccc")
484 && !testArgs.m_settings.command_line_options.count(
"f") && !testArgs.m_settings.command_line_options.count(
"d"));
486 BOOST_CHECK(testArgs.m_settings.command_line_options[
"a"].size() == 1);
487 BOOST_CHECK(testArgs.m_settings.command_line_options[
"a"].front().get_str() ==
"");
488 BOOST_CHECK(testArgs.m_settings.command_line_options[
"ccc"].size() == 2);
489 BOOST_CHECK(testArgs.m_settings.command_line_options[
"ccc"].front().get_str() ==
"argument");
490 BOOST_CHECK(testArgs.m_settings.command_line_options[
"ccc"].back().get_str() ==
"multiple");
499 const char* argv[] = {
"ignored",
"-registered"};
504 argv[1] =
"-unregistered";
510 argv[1] =
"-test.registered";
515 static void TestParse(
const std::string& str,
bool expected_bool, int64_t expected_int)
519 std::string arg =
"-value=" + str;
520 const char* argv[] = {
"ignored", arg.c_str()};
579 const char *argv_test[] = {
580 "ignored",
"-a",
"-nob",
"-c=0",
"-d=1",
"-e=false",
"-f=true"};
587 for (
const char opt :
"abcdef")
591 BOOST_CHECK(testArgs.m_settings.command_line_options.size() == 6 &&
592 testArgs.m_settings.ro_config.empty());
618 const char *argv_test[] = {
"ignored",
"-nofoo",
"-foo",
"-nobar=0"};
632 const char *conf_test =
"nofoo=1\nfoo=1\nnobar=0\n";
646 const char *combo_test_args[] = {
"ignored",
"-nofoo",
"-bar"};
647 const char *combo_test_conf =
"foo=1\nnobar=1\n";
660 && testArgs.
GetArgs(
"-bar").front() ==
"");
665 const char *str_config =
699 test_args.
SetupArgs({a, b, ccc, d, e, fff, ggg, h, i, iii});
705 BOOST_CHECK(test_args.m_settings.command_line_options.empty());
706 BOOST_CHECK(test_args.m_settings.ro_config.size() == 3);
707 BOOST_CHECK(test_args.m_settings.ro_config[
""].size() == 8);
708 BOOST_CHECK(test_args.m_settings.ro_config[
"sec1"].size() == 3);
709 BOOST_CHECK(test_args.m_settings.ro_config[
"sec2"].size() == 2);
711 BOOST_CHECK(test_args.m_settings.ro_config[
""].count(
"a"));
712 BOOST_CHECK(test_args.m_settings.ro_config[
""].count(
"b"));
713 BOOST_CHECK(test_args.m_settings.ro_config[
""].count(
"ccc"));
714 BOOST_CHECK(test_args.m_settings.ro_config[
""].count(
"d"));
715 BOOST_CHECK(test_args.m_settings.ro_config[
""].count(
"fff"));
716 BOOST_CHECK(test_args.m_settings.ro_config[
""].count(
"ggg"));
717 BOOST_CHECK(test_args.m_settings.ro_config[
""].count(
"h"));
718 BOOST_CHECK(test_args.m_settings.ro_config[
""].count(
"i"));
719 BOOST_CHECK(test_args.m_settings.ro_config[
"sec1"].count(
"ccc"));
720 BOOST_CHECK(test_args.m_settings.ro_config[
"sec1"].count(
"h"));
721 BOOST_CHECK(test_args.m_settings.ro_config[
"sec2"].count(
"ccc"));
722 BOOST_CHECK(test_args.m_settings.ro_config[
"sec2"].count(
"iii"));
746 for (
const bool def : {
false,
true}) {
760 && test_args.
GetArgs(
"-a").front() ==
"");
762 && test_args.
GetArgs(
"-b").front() ==
"1");
764 && test_args.
GetArgs(
"-ccc").front() ==
"argument" 765 && test_args.
GetArgs(
"-ccc").back() ==
"multiple");
769 && test_args.
GetArgs(
"-ggg").front() ==
"1");
774 && test_args.
GetArgs(
"-i").front() ==
"1");
805 const std::vector<std::string> sec1_ccc_expected = {
"extend1",
"extend2",
"argument",
"multiple"};
806 const auto& sec1_ccc_res = test_args.
GetArgs(
"-ccc");
807 BOOST_CHECK_EQUAL_COLLECTIONS(sec1_ccc_res.begin(), sec1_ccc_res.end(), sec1_ccc_expected.begin(), sec1_ccc_expected.end());
824 const std::vector<std::string> sec2_ccc_expected = {
"extend3",
"argument",
"multiple"};
825 const auto& sec2_ccc_res = test_args.
GetArgs(
"-ccc");
826 BOOST_CHECK_EQUAL_COLLECTIONS(sec2_ccc_res.begin(), sec2_ccc_res.end(), sec2_ccc_expected.begin(), sec2_ccc_expected.end());
856 testArgs.m_settings.command_line_options.clear();
857 testArgs.m_settings.command_line_options[
"strtest1"] = {
"string..."};
859 testArgs.m_settings.command_line_options[
"inttest1"] = {
"12345"};
860 testArgs.m_settings.command_line_options[
"inttest2"] = {
"81985529216486895"};
862 testArgs.m_settings.command_line_options[
"booltest1"] = {
""};
864 testArgs.m_settings.command_line_options[
"booltest3"] = {
"0"};
865 testArgs.m_settings.command_line_options[
"booltest4"] = {
"1"};
868 testArgs.m_settings.command_line_options[
"pritest1"] = {
"a",
"b"};
869 testArgs.m_settings.ro_config[
""][
"pritest2"] = {
"a",
"b"};
870 testArgs.m_settings.command_line_options[
"pritest3"] = {
"a"};
871 testArgs.m_settings.ro_config[
""][
"pritest3"] = {
"b"};
872 testArgs.m_settings.command_line_options[
"pritest4"] = {
"a",
"b"};
873 testArgs.m_settings.ro_config[
""][
"pritest4"] = {
"c",
"d"};
898 const char* argv_testnet[] = {
"cmd",
"-testnet"};
899 const char* argv_regtest[] = {
"cmd",
"-regtest"};
900 const char* argv_test_no_reg[] = {
"cmd",
"-testnet",
"-noregtest"};
901 const char* argv_both[] = {
"cmd",
"-testnet",
"-regtest"};
905 const char* testnetconf =
"testnet=1\nregtest=0\n[test]\nregtest=1";
993 static constexpr
int MAX_ACTIONS = 3;
995 enum Action { NONE,
SET, NEGATE, SECTION_SET, SECTION_NEGATE };
999 template <
typename Fn>
1007 for (
bool soft_set : {
false,
true}) {
1008 for (
bool force_set : {
false,
true}) {
1011 for (
bool net_specific : {
false,
true}) {
1012 fn(arg_actions, conf_actions, soft_set, force_set, section, network, net_specific);
1024 const std::string& section,
1025 const std::string&
name,
1026 const std::string& value_prefix)
1028 std::vector<std::string>
values;
1030 for (
Action action : actions) {
1031 if (action == NONE)
break;
1033 if (action == SECTION_SET || action == SECTION_NEGATE)
prefix = section +
".";
1034 if (action == SET || action == SECTION_SET) {
1035 for (
int i = 0; i < 2; ++i) {
1039 if (action == NEGATE || action == SECTION_NEGATE) {
1054 FILE* out_file =
nullptr;
1055 if (
const char* out_path = getenv(
"ARGS_MERGE_TEST_OUT")) {
1057 if (!out_file)
throw std::system_error(errno, std::generic_category(),
"fopen failed");
1060 ForEachMergeSetup([&](
const ActionList& arg_actions,
const ActionList& conf_actions,
bool soft_set,
bool force_set,
1061 const std::string& section,
const std::string& network,
bool net_specific) {
1065 std::string desc =
"net=";
1067 parser.m_network = network;
1069 const std::string&
name = net_specific ?
"wallet" :
"server";
1070 const std::string key =
"-" +
name;
1074 auto args = GetValues(arg_actions, section,
name,
"a");
1075 std::vector<const char*> argv = {
"ignored"};
1076 for (
auto& arg :
args) {
1080 argv.push_back(arg.c_str());
1087 for (
auto& conf_val : GetValues(conf_actions, section,
name,
"c")) {
1093 std::istringstream conf_stream(conf);
1121 desc += parser.
GetArg(key,
"default");
1123 for (
const auto& arg : parser.
GetArgs(key)) {
1130 if (!ignored.empty()) {
1131 desc +=
" | ignored";
1132 for (
const auto& arg : ignored) {
1142 BOOST_REQUIRE(fwrite(desc.data(), 1, desc.size(), out_file) == desc.size());
1147 if (fclose(out_file))
throw std::system_error(errno, std::generic_category(),
"fclose failed");
1153 std::string out_sha_hex =
HexStr(out_sha_bytes);
1164 BOOST_CHECK_EQUAL(out_sha_hex,
"d1e436c1cd510d0ec44d5205d4b4e3bee6387d316e0075c58206cb16603f3d82");
1169 static constexpr
int MAX_ACTIONS = 2;
1171 enum Action {
NONE, ENABLE_TEST, DISABLE_TEST, NEGATE_TEST, ENABLE_REG, DISABLE_REG, NEGATE_REG };
1175 template <
typename Fn>
1179 ForEachNoDup(arg_actions, ENABLE_TEST, NEGATE_REG, [&] {
1181 ForEachNoDup(conf_actions, ENABLE_TEST, NEGATE_REG, [&] { fn(arg_actions, conf_actions); });
1189 FILE* out_file =
nullptr;
1190 if (
const char* out_path = getenv(
"CHAIN_MERGE_TEST_OUT")) {
1192 if (!out_file)
throw std::system_error(errno, std::generic_category(),
"fopen failed");
1195 ForEachMergeSetup([&](
const ActionList& arg_actions,
const ActionList& conf_actions) {
1201 auto arg = [](Action action) {
return action == ENABLE_TEST ?
"-testnet=1" :
1202 action == DISABLE_TEST ?
"-testnet=0" :
1203 action == NEGATE_TEST ?
"-notestnet=1" :
1204 action == ENABLE_REG ?
"-regtest=1" :
1205 action == DISABLE_REG ?
"-regtest=0" :
1206 action == NEGATE_REG ?
"-noregtest=1" :
nullptr; };
1209 std::vector<const char*> argv = {
"ignored"};
1210 for (Action action : arg_actions) {
1211 const char* argstr = arg(action);
1213 argv.push_back(argstr);
1215 desc += argv.back();
1222 for (Action action : conf_actions) {
1223 const char* argstr = arg(action);
1230 std::istringstream conf_stream(conf);
1237 }
catch (
const std::runtime_error& e) {
1245 BOOST_REQUIRE(fwrite(desc.data(), 1, desc.size(), out_file) == desc.size());
1250 if (fclose(out_file))
throw std::system_error(errno, std::generic_category(),
"fclose failed");
1256 std::string out_sha_hex =
HexStr(out_sha_bytes);
1267 BOOST_CHECK_EQUAL(out_sha_hex,
"f263493e300023b6509963887444c41386f44b63bc30047eb8402e8c1144854c");
1336 BOOST_CHECK_EQUAL(ParseMoney("12345.").value(), COIN * 12345); 1338 BOOST_CHECK_EQUAL(ParseMoney("12345.6789").value(), (COIN/10000)*123456789); 1340 BOOST_CHECK_EQUAL(ParseMoney("10000000.00").value(), COIN*10000000); 1341 BOOST_CHECK_EQUAL(ParseMoney("1000000.00").value(), COIN*1000000); 1342 BOOST_CHECK_EQUAL(ParseMoney("100000.00").value(), COIN*100000); 1343 BOOST_CHECK_EQUAL(ParseMoney("10000.00").value(), COIN*10000); 1344 BOOST_CHECK_EQUAL(ParseMoney("1000.00").value(), COIN*1000); 1345 BOOST_CHECK_EQUAL(ParseMoney("100.00").value(), COIN*100); 1346 BOOST_CHECK_EQUAL(ParseMoney("10.00").value(), COIN*10); 1347 BOOST_CHECK_EQUAL(ParseMoney("1.00").value(), COIN); 1348 BOOST_CHECK_EQUAL(ParseMoney("1").value(), COIN); 1349 BOOST_CHECK_EQUAL(ParseMoney(" 1").value(), COIN); 1350 BOOST_CHECK_EQUAL(ParseMoney("1 ").value(), COIN); 1351 BOOST_CHECK_EQUAL(ParseMoney(" 1 ").value(), COIN); 1352 BOOST_CHECK_EQUAL(ParseMoney("0.1").value(), COIN/10); 1353 BOOST_CHECK_EQUAL(ParseMoney("0.01").value(), COIN/100); 1354 BOOST_CHECK_EQUAL(ParseMoney("0.001").value(), COIN/1000); 1355 BOOST_CHECK_EQUAL(ParseMoney("0.0001").value(), COIN/10000); 1356 BOOST_CHECK_EQUAL(ParseMoney("0.00001").value(), COIN/100000); 1357 BOOST_CHECK_EQUAL(ParseMoney("0.000001").value(), COIN/1000000); 1358 BOOST_CHECK_EQUAL(ParseMoney("0.0000001").value(), COIN/10000000); 1359 BOOST_CHECK_EQUAL(ParseMoney("0.00000001").value(), COIN/100000000); 1360 BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001 ").value(), COIN/100000000); 1361 BOOST_CHECK_EQUAL(ParseMoney("0.00000001 ").value(), COIN/100000000); 1362 BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001").value(), COIN/100000000); 1364 // Parsing amount that cannot be represented should fail 1365 BOOST_CHECK(!ParseMoney("100000000.00")); 1366 BOOST_CHECK(!ParseMoney("0.000000001")); 1368 // Parsing empty string should fail 1369 BOOST_CHECK(!ParseMoney("")); 1370 BOOST_CHECK(!ParseMoney(" ")); 1371 BOOST_CHECK(!ParseMoney(" ")); 1373 // Parsing two numbers should fail 1374 BOOST_CHECK(!ParseMoney("..")); 1375 BOOST_CHECK(!ParseMoney("0..0")); 1376 BOOST_CHECK(!ParseMoney("1 2")); 1377 BOOST_CHECK(!ParseMoney(" 1 2 ")); 1378 BOOST_CHECK(!ParseMoney(" 1.2 3 ")); 1379 BOOST_CHECK(!ParseMoney(" 1 2.3 ")); 1381 // Embedded whitespace should fail 1382 BOOST_CHECK(!ParseMoney(" -1 .2 ")); 1383 BOOST_CHECK(!ParseMoney(" 1 .2 ")); 1384 BOOST_CHECK(!ParseMoney(" +1 .2 ")); 1386 // Attempted 63 bit overflow should fail 1387 BOOST_CHECK(!ParseMoney("92233720368.54775808")); 1389 // Parsing negative amounts must fail 1390 BOOST_CHECK(!ParseMoney("-1")); 1392 // Parsing strings with embedded NUL characters should fail 1393 BOOST_CHECK(!ParseMoney("\0-1"s)); 1394 BOOST_CHECK(!ParseMoney(STRING_WITH_EMBEDDED_NULL_CHAR)); 1395 BOOST_CHECK(!ParseMoney("1\0"s)); 1398 BOOST_AUTO_TEST_CASE(util_IsHex) 1400 BOOST_CHECK(IsHex("00")); 1401 BOOST_CHECK(IsHex("00112233445566778899aabbccddeeffAABBCCDDEEFF")); 1402 BOOST_CHECK(IsHex("ff")); 1403 BOOST_CHECK(IsHex("FF")); 1405 BOOST_CHECK(!IsHex("")); 1406 BOOST_CHECK(!IsHex("0")); 1407 BOOST_CHECK(!IsHex("a")); 1408 BOOST_CHECK(!IsHex("eleven")); 1409 BOOST_CHECK(!IsHex("00xx00")); 1410 BOOST_CHECK(!IsHex("0x0000")); 1413 BOOST_AUTO_TEST_CASE(util_IsHexNumber) 1415 BOOST_CHECK(IsHexNumber("0x0")); 1416 BOOST_CHECK(IsHexNumber("0")); 1417 BOOST_CHECK(IsHexNumber("0x10")); 1418 BOOST_CHECK(IsHexNumber("10")); 1419 BOOST_CHECK(IsHexNumber("0xff")); 1420 BOOST_CHECK(IsHexNumber("ff")); 1421 BOOST_CHECK(IsHexNumber("0xFfa")); 1422 BOOST_CHECK(IsHexNumber("Ffa")); 1423 BOOST_CHECK(IsHexNumber("0x00112233445566778899aabbccddeeffAABBCCDDEEFF")); 1424 BOOST_CHECK(IsHexNumber("00112233445566778899aabbccddeeffAABBCCDDEEFF")); 1426 BOOST_CHECK(!IsHexNumber("")); // empty string not allowed 1427 BOOST_CHECK(!IsHexNumber("0x")); // empty string after prefix not allowed 1428 BOOST_CHECK(!IsHexNumber("0x0 ")); // no spaces at end, 1429 BOOST_CHECK(!IsHexNumber(" 0x0")); // or beginning, 1430 BOOST_CHECK(!IsHexNumber("0x 0")); // or middle, 1431 BOOST_CHECK(!IsHexNumber(" ")); // etc. 1432 BOOST_CHECK(!IsHexNumber("0x0ga")); // invalid character 1433 BOOST_CHECK(!IsHexNumber("x0")); // broken prefix 1434 BOOST_CHECK(!IsHexNumber("0x0x00")); // two prefixes not allowed 1438 BOOST_AUTO_TEST_CASE(util_seed_insecure_rand) 1440 SeedInsecureRand(SeedRand::ZEROS); 1441 for (int mod=2;mod<11;mod++) 1444 // Really rough binomial confidence approximation. 1445 int err = 30*10000./mod*sqrt((1./mod*(1-1./mod))/10000.); 1446 //mask is 2^ceil(log2(mod))-1 1447 while(mask<mod-1)mask=(mask<<1)+1; 1450 //How often does it get a zero from the uniform range [0,mod)? 1451 for (int i = 0; i < 10000; i++) { 1454 rval=InsecureRand32()&mask; 1455 }while(rval>=(uint32_t)mod); 1458 BOOST_CHECK(count<=10000/mod+err); 1459 BOOST_CHECK(count>=10000/mod-err); 1463 BOOST_AUTO_TEST_CASE(util_TimingResistantEqual) 1465 BOOST_CHECK(TimingResistantEqual(std::string(""), std::string(""))); 1466 BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string(""))); 1467 BOOST_CHECK(!TimingResistantEqual(std::string(""), std::string("abc"))); 1468 BOOST_CHECK(!TimingResistantEqual(std::string("a"), std::string("aa"))); 1469 BOOST_CHECK(!TimingResistantEqual(std::string("aa"), std::string("a"))); 1470 BOOST_CHECK(TimingResistantEqual(std::string("abc"), std::string("abc"))); 1471 BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string("aba"))); 1474 /* Test strprintf formatting directives. 1475 * Put a string before and after to ensure sanity of element sizes on stack. */ 1476 #define B "check_prefix" 1477 #define E "check_postfix" 1478 BOOST_AUTO_TEST_CASE(strprintf_numbers) 1480 int64_t s64t = -9223372036854775807LL; /* signed 64 bit test value */ 1481 uint64_t u64t = 18446744073709551615ULL; /* unsigned 64 bit test value */ 1482 BOOST_CHECK(strprintf("%s %d %s", B, s64t, E) == B" -9223372036854775807 " E); 1483 BOOST_CHECK(strprintf("%s %u %s", B, u64t, E) == B" 18446744073709551615 " E); 1484 BOOST_CHECK(strprintf("%s %x %s", B, u64t, E) == B" ffffffffffffffff " E); 1486 size_t st = 12345678; /* unsigned size_t test value */ 1487 ssize_t sst = -12345678; /* signed size_t test value */ 1488 BOOST_CHECK(strprintf("%s %d %s", B, sst, E) == B" -12345678 " E); 1489 BOOST_CHECK(strprintf("%s %u %s", B, st, E) == B" 12345678 " E); 1490 BOOST_CHECK(strprintf("%s %x %s", B, st, E) == B" bc614e " E); 1492 ptrdiff_t pt = 87654321; /* positive ptrdiff_t test value */ 1493 ptrdiff_t spt = -87654321; /* negative ptrdiff_t test value */ 1494 BOOST_CHECK(strprintf("%s %d %s", B, spt, E) == B" -87654321 " E); 1495 BOOST_CHECK(strprintf("%s %u %s", B, pt, E) == B" 87654321 " E); 1496 BOOST_CHECK(strprintf("%s %x %s", B, pt, E) == B" 5397fb1 " E); 1501 /* Check for mingw/wine issue #3494 1502 * Remove this test before time.ctime(0xffffffff) == 'Sun Feb 7 07:28:15 2106
' 1504 BOOST_AUTO_TEST_CASE(gettime) 1506 BOOST_CHECK((GetTime() & ~0xFFFFFFFFLL) == 0); 1509 BOOST_AUTO_TEST_CASE(util_time_GetTime) 1512 // Check that mock time does not change after a sleep 1513 for (const auto& num_sleep : {0ms, 1ms}) { 1514 UninterruptibleSleep(num_sleep); 1515 BOOST_CHECK_EQUAL(111, GetTime()); // Deprecated time getter 1516 BOOST_CHECK_EQUAL(111, Now<NodeSeconds>().time_since_epoch().count()); 1517 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now())); 1518 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<SecondsDouble>(Now<NodeSeconds>())); 1519 BOOST_CHECK_EQUAL(111, GetTime<std::chrono::seconds>().count()); 1520 BOOST_CHECK_EQUAL(111000, GetTime<std::chrono::milliseconds>().count()); 1521 BOOST_CHECK_EQUAL(111000, TicksSinceEpoch<std::chrono::milliseconds>(NodeClock::now())); 1522 BOOST_CHECK_EQUAL(111000000, GetTime<std::chrono::microseconds>().count()); 1526 // Check that steady time and system time changes after a sleep 1527 const auto steady_ms_0 = Now<SteadyMilliseconds>(); 1528 const auto steady_0 = std::chrono::steady_clock::now(); 1529 const auto ms_0 = GetTime<std::chrono::milliseconds>(); 1530 const auto us_0 = GetTime<std::chrono::microseconds>(); 1531 UninterruptibleSleep(1ms); 1532 BOOST_CHECK(steady_ms_0 < Now<SteadyMilliseconds>()); 1533 BOOST_CHECK(steady_0 + 1ms <= std::chrono::steady_clock::now()); 1534 BOOST_CHECK(ms_0 < GetTime<std::chrono::milliseconds>()); 1535 BOOST_CHECK(us_0 < GetTime<std::chrono::microseconds>()); 1538 BOOST_AUTO_TEST_CASE(test_IsDigit) 1540 BOOST_CHECK_EQUAL(IsDigit('0
'), true); 1541 BOOST_CHECK_EQUAL(IsDigit('1
'), true); 1542 BOOST_CHECK_EQUAL(IsDigit('8
'), true); 1543 BOOST_CHECK_EQUAL(IsDigit('9
'), true); 1545 BOOST_CHECK_EQUAL(IsDigit('0
' - 1), false); 1546 BOOST_CHECK_EQUAL(IsDigit('9
' + 1), false); 1547 BOOST_CHECK_EQUAL(IsDigit(0), false); 1548 BOOST_CHECK_EQUAL(IsDigit(1), false); 1549 BOOST_CHECK_EQUAL(IsDigit(8), false); 1550 BOOST_CHECK_EQUAL(IsDigit(9), false); 1553 /* Check for overflow */ 1554 template <typename T> 1555 static void TestAddMatrixOverflow() 1557 constexpr T MAXI{std::numeric_limits<T>::max()}; 1558 BOOST_CHECK(!CheckedAdd(T{1}, MAXI)); 1559 BOOST_CHECK(!CheckedAdd(MAXI, MAXI)); 1560 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI)); 1561 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(MAXI, MAXI)); 1563 BOOST_CHECK_EQUAL(0, CheckedAdd(T{0}, T{0}).value()); 1564 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{0}, MAXI).value()); 1565 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{1}, MAXI - 1).value()); 1566 BOOST_CHECK_EQUAL(MAXI - 1, CheckedAdd(T{1}, MAXI - 2).value()); 1567 BOOST_CHECK_EQUAL(0, SaturatingAdd(T{0}, T{0})); 1568 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{0}, MAXI)); 1569 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI - 1)); 1570 BOOST_CHECK_EQUAL(MAXI - 1, SaturatingAdd(T{1}, MAXI - 2)); 1573 /* Check for overflow or underflow */ 1574 template <typename T> 1575 static void TestAddMatrix() 1577 TestAddMatrixOverflow<T>(); 1578 constexpr T MINI{std::numeric_limits<T>::min()}; 1579 constexpr T MAXI{std::numeric_limits<T>::max()}; 1580 BOOST_CHECK(!CheckedAdd(T{-1}, MINI)); 1581 BOOST_CHECK(!CheckedAdd(MINI, MINI)); 1582 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI)); 1583 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(MINI, MINI)); 1585 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{0}, MINI).value()); 1586 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{-1}, MINI + 1).value()); 1587 BOOST_CHECK_EQUAL(-1, CheckedAdd(MINI, MAXI).value()); 1588 BOOST_CHECK_EQUAL(MINI + 1, CheckedAdd(T{-1}, MINI + 2).value()); 1589 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{0}, MINI)); 1590 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI + 1)); 1591 BOOST_CHECK_EQUAL(MINI + 1, SaturatingAdd(T{-1}, MINI + 2)); 1592 BOOST_CHECK_EQUAL(-1, SaturatingAdd(MINI, MAXI)); 1595 BOOST_AUTO_TEST_CASE(util_overflow) 1597 TestAddMatrixOverflow<unsigned>(); 1598 TestAddMatrix<signed>(); 1601 BOOST_AUTO_TEST_CASE(test_ParseInt32) 1605 BOOST_CHECK(ParseInt32("1234", nullptr)); 1606 BOOST_CHECK(ParseInt32("0", &n) && n == 0); 1607 BOOST_CHECK(ParseInt32("1234", &n) && n == 1234); 1608 BOOST_CHECK(ParseInt32("01234", &n) && n == 1234); // no octal 1609 BOOST_CHECK(ParseInt32("2147483647", &n) && n == 2147483647); 1610 BOOST_CHECK(ParseInt32("-2147483648", &n) && n == (-2147483647 - 1)); // (-2147483647 - 1) equals INT_MIN 1611 BOOST_CHECK(ParseInt32("-1234", &n) && n == -1234); 1612 BOOST_CHECK(ParseInt32("00000000000000001234", &n) && n == 1234); 1613 BOOST_CHECK(ParseInt32("-00000000000000001234", &n) && n == -1234); 1614 BOOST_CHECK(ParseInt32("00000000000000000000", &n) && n == 0); 1615 BOOST_CHECK(ParseInt32("-00000000000000000000", &n) && n == 0); 1617 BOOST_CHECK(!ParseInt32("", &n)); 1618 BOOST_CHECK(!ParseInt32(" 1", &n)); // no padding inside 1619 BOOST_CHECK(!ParseInt32("1 ", &n)); 1620 BOOST_CHECK(!ParseInt32("++1", &n)); 1621 BOOST_CHECK(!ParseInt32("+-1", &n)); 1622 BOOST_CHECK(!ParseInt32("-+1", &n)); 1623 BOOST_CHECK(!ParseInt32("--1", &n)); 1624 BOOST_CHECK(!ParseInt32("1a", &n)); 1625 BOOST_CHECK(!ParseInt32("aap", &n)); 1626 BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex 1627 BOOST_CHECK(!ParseInt32(STRING_WITH_EMBEDDED_NULL_CHAR, &n)); 1628 // Overflow and underflow 1629 BOOST_CHECK(!ParseInt32("-2147483649", nullptr)); 1630 BOOST_CHECK(!ParseInt32("2147483648", nullptr)); 1631 BOOST_CHECK(!ParseInt32("-32482348723847471234", nullptr)); 1632 BOOST_CHECK(!ParseInt32("32482348723847471234", nullptr)); 1635 template <typename T> 1636 static void RunToIntegralTests() 1638 BOOST_CHECK(!ToIntegral<T>(STRING_WITH_EMBEDDED_NULL_CHAR)); 1639 BOOST_CHECK(!ToIntegral<T>(" 1")); 1640 BOOST_CHECK(!ToIntegral<T>("1 ")); 1641 BOOST_CHECK(!ToIntegral<T>("1a")); 1642 BOOST_CHECK(!ToIntegral<T>("1.1")); 1643 BOOST_CHECK(!ToIntegral<T>("1.9")); 1644 BOOST_CHECK(!ToIntegral<T>("+01.9")); 1645 BOOST_CHECK(!ToIntegral<T>("-")); 1646 BOOST_CHECK(!ToIntegral<T>("+")); 1647 BOOST_CHECK(!ToIntegral<T>(" -1")); 1648 BOOST_CHECK(!ToIntegral<T>("-1 ")); 1649 BOOST_CHECK(!ToIntegral<T>(" -1 ")); 1650 BOOST_CHECK(!ToIntegral<T>("+1")); 1651 BOOST_CHECK(!ToIntegral<T>(" +1")); 1652 BOOST_CHECK(!ToIntegral<T>(" +1 ")); 1653 BOOST_CHECK(!ToIntegral<T>("+-1")); 1654 BOOST_CHECK(!ToIntegral<T>("-+1")); 1655 BOOST_CHECK(!ToIntegral<T>("++1")); 1656 BOOST_CHECK(!ToIntegral<T>("--1")); 1657 BOOST_CHECK(!ToIntegral<T>("")); 1658 BOOST_CHECK(!ToIntegral<T>("aap")); 1659 BOOST_CHECK(!ToIntegral<T>("0x1")); 1660 BOOST_CHECK(!ToIntegral<T>("-32482348723847471234")); 1661 BOOST_CHECK(!ToIntegral<T>("32482348723847471234")); 1664 BOOST_AUTO_TEST_CASE(test_ToIntegral) 1666 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("1234").value(), 1'234);
1669 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000001234").value(), 1'234);
1670 BOOST_CHECK_EQUAL(ToIntegral<int32_t>(
"-00000000000000001234").value(), -1
'234); 1671 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000000000").value(), 0); 1672 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-00000000000000000000").value(), 0); 1673 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1234").value(), -1'234);
1676 RunToIntegralTests<uint64_t>();
1677 RunToIntegralTests<int64_t>();
1678 RunToIntegralTests<uint32_t>();
1679 RunToIntegralTests<int32_t>();
1680 RunToIntegralTests<uint16_t>();
1681 RunToIntegralTests<int16_t>();
1682 RunToIntegralTests<uint8_t>();
1683 RunToIntegralTests<int8_t>();
1685 BOOST_CHECK(!ToIntegral<int64_t>(
"-9223372036854775809"));
1686 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"-9223372036854775808").value(), -9
'223'372
'036'854
'775'807LL - 1LL);
1687 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"9223372036854775807").value(), 9
'223'372
'036'854
'775'807);
1688 BOOST_CHECK(!ToIntegral<int64_t>(
"9223372036854775808"));
1692 BOOST_CHECK_EQUAL(ToIntegral<uint64_t>(
"18446744073709551615").value(), 18
'446'744
'073'709
'551'615ULL);
1693 BOOST_CHECK(!ToIntegral<uint64_t>(
"18446744073709551616"));
1696 BOOST_CHECK_EQUAL(ToIntegral<int32_t>(
"-2147483648").value(), -2
'147'483
'648LL); 1697 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("2147483647").value(), 2'147
'483'647);
1703 BOOST_CHECK(!ToIntegral<uint32_t>("4294967296")); 1705 BOOST_CHECK(!ToIntegral<int16_t>("-32769")); 1706 BOOST_CHECK_EQUAL(ToIntegral<int16_t>("-32768").value(), -32'768);
1708 BOOST_CHECK(!ToIntegral<int16_t>("32768")); 1710 BOOST_CHECK(!ToIntegral<uint16_t>("-1")); 1711 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("0").value(), 0U); 1712 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("65535").value(), 65'535U);
1728 return strtoll(str.c_str(),
nullptr, 10);
1734 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0"), 0); 1735 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("01234"), 1'234);
1737 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" 1"), 1); 1738 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1 "), 1); 1739 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1a"), 1); 1740 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.1"), 1); 1741 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.9"), 1); 1742 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+01.9"), 1); 1743 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1"), -1); 1744 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1"), -1); 1745 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1 "), -1); 1746 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1 "), -1); 1747 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+1"), 1); 1748 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1"), 1); 1749 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1 "), 1); 1751 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+-1"), 0); 1752 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-+1"), 0); 1753 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("++1"), 0); 1754 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("--1"), 0); 1755 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(""), 0); 1756 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("aap"), 0); 1757 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0x1"), 0); 1758 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-32482348723847471234"), -2'147
'483'647 - 1);
1759 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"32482348723847471234"), 2
'147'483
'647); 1761 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775809"), -9'223
'372'036
'854'775
'807LL - 1LL); 1762 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775808"), -9'223
'372'036
'854'775
'807LL - 1LL); 1763 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775807"), 9'223
'372'036
'854'775
'807); 1764 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775808"), 9'223
'372'036
'854'775
'807); 1766 std::map<std::string, int64_t> atoi64_test_pairs = { 1767 {"-9223372036854775809", std::numeric_limits<int64_t>::min()}, 1768 {"-9223372036854775808", -9'223
'372'036
'854'775
'807LL - 1LL}, 1769 {"9223372036854775807", 9'223
'372'036
'854'775
'807}, 1770 {"9223372036854775808", std::numeric_limits<int64_t>::max()}, 1777 for (const auto& pair : atoi64_test_pairs) { 1778 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(pair.first), pair.second); 1781 // Ensure legacy compatibility with previous versions of Bitcoin Core's atoi64
1782 for (
const auto& pair : atoi64_test_pairs) {
1788 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551615"), 18
'446'744
'073'709
'551'615ULL);
1789 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551616"), 18
'446'744
'073'709
'551'615ULL);
1791 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-2147483649"), -2
'147'483
'648LL); 1792 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-2147483648"), -2'147
'483'648LL);
1794 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("2147483648"), 2'147
'483'647);
1798 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967295"), 4
'294'967
'295U); 1799 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("4294967296"), 4'294
'967'295U);
1802 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("-32768"), -32'768);
1804 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("32768"), 32'767);
1809 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("65536"), 65'535U);
2000 BOOST_CHECK_EQUAL(
FormatParagraph(
"This_is_a_very_long_test_string_without_any_spaces_so_it_should_just_get_returned_as_is_despite_the_length until it gets here", 79),
"This_is_a_very_long_test_string_without_any_spaces_so_it_should_just_get_returned_as_is_despite_the_length\nuntil it gets here");
2003 BOOST_CHECK_EQUAL(
FormatParagraph(
"a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p", 79),
"a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\nf g h i j k l m n o p");
2004 BOOST_CHECK_EQUAL(
FormatParagraph(
"x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p", 79),
"x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\nf g h i j k l m n o p");
2006 BOOST_CHECK_EQUAL(
FormatParagraph(
"x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e fg h i j k", 79, 4),
"x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\n f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e fg\n h i j k");
2008 BOOST_CHECK_EQUAL(
FormatParagraph(
"This is a very long test string. This is a second sentence in the very long test string.", 79),
"This is a very long test string. This is a second sentence in the very long\ntest string.");
2009 BOOST_CHECK_EQUAL(
FormatParagraph(
"This is a very long test string.\nThis is a second sentence in the very long test string. This is a third sentence in the very long test string.", 79),
"This is a very long test string.\nThis is a second sentence in the very long test string. This is a third\nsentence in the very long test string.");
2010 BOOST_CHECK_EQUAL(
FormatParagraph(
"This is a very long test string.\n\nThis is a second sentence in the very long test string. This is a third sentence in the very long test string.", 79),
"This is a very long test string.\n\nThis is a second sentence in the very long test string. This is a third\nsentence in the very long test string.");
2011 BOOST_CHECK_EQUAL(
FormatParagraph(
"Testing that normal newlines do not get indented.\nLike here.", 79),
"Testing that normal newlines do not get indented.\nLike here.");
2016 std::vector<std::string> comments;
2017 comments.push_back(std::string(
"comment1"));
2018 std::vector<std::string> comments2;
2019 comments2.push_back(std::string(
"comment1"));
2105 #ifndef WIN32 // Cannot do this test on WIN32 due to lack of fork() 2114 int rv = read(fd, &ch, 1);
2119 rv = write(fd, &ch, 1);
2125 rv = write(fd, &ch, 1);
2140 fs::path dirname = m_args.GetDataDirBase() /
"lock_dir";
2146 void (*old_handler)(int) = signal(SIGCHLD, SIG_DFL);
2218 signal(SIGCHLD, old_handler);
2223 fs::remove_all(dirname);
2229 fs::path tmpdirname = m_args.GetDataDirBase();
2236 fs::create_directory(tmpdirname);
2239 fs::remove(tmpdirname);
2279 return std::string(span.
begin(), span.
end());
2290 input =
"MilkToastHoney";
2292 success =
Const(
"", sp);
2296 success =
Const(
"Milk", sp);
2300 success =
Const(
"Bread", sp);
2303 success =
Const(
"Toast", sp);
2307 success =
Const(
"Honeybadger", sp);
2310 success =
Const(
"Honey", sp);
2315 input =
"Foo(Bar(xy,z()))";
2318 success =
Func(
"FooBar", sp);
2321 success =
Func(
"Foo(", sp);
2324 success =
Func(
"Foo", sp);
2328 success =
Func(
"Bar", sp);
2332 success =
Func(
"xy", sp);
2338 input =
"(n*(n-1))/2";
2350 input =
"(aaaaa,bbbbb()),c";
2362 input =
"((a),(b),(c)),xxx";
2369 std::vector<Span<const char>> results;
2372 results =
Split(input,
'x');
2379 input =
"one#two#three";
2380 results =
Split(input,
'-');
2384 input =
"one#two#three";
2385 results =
Split(input,
'#');
2391 input =
"*foo*bar*";
2392 results =
Split(input,
'*');
2404 std::vector<std::string> result =
SplitString(
"",
'-');
2411 std::vector<std::string> result =
SplitString(
"-",
'-');
2419 std::vector<std::string> result =
SplitString(
"--",
'-');
2428 std::vector<std::string> result =
SplitString(
"abc",
'-');
2435 std::vector<std::string> result =
SplitString(
"a-b",
'-');
2443 std::vector<std::string> result =
SplitString(
"AAA",
'a');
2450 using V = std::vector<std::string>;
2451 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;") == V({
"a",
"b.c:d",
"e"}));
2452 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;:.") == V({
"a",
"b",
"c",
"d",
"e"}));
2453 BOOST_TEST(
SplitString(
"a,b.c:d;e",
"") == V({
"a,b.c:d;e"}));
2454 BOOST_TEST(
SplitString(
"aaa",
"bcdefg") == V({
"aaa"}));
2455 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0"s) == V({
"x",
"a,b"}));
2456 BOOST_TEST(
SplitString(
"x\0a,b"s,
'\0') == V({
"x",
"a,b"}));
2457 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0,"s) == V({
"x",
"a",
"b"}));
2458 BOOST_TEST(
SplitString(
"abcdefg",
"bcd") == V({
"a",
"",
"",
"efg"}));
2471 const std::string NUL(
"O\x00O", 3);
2480 const Tracker* origin;
2484 Tracker() noexcept : origin(this) {}
2485 Tracker(
const Tracker& t) noexcept : origin(
t.origin), copies(
t.copies + 1) {}
2486 Tracker(Tracker&& t) noexcept : origin(
t.origin), copies(
t.copies) {}
2487 Tracker& operator=(
const Tracker& t) noexcept
2490 copies =
t.copies + 1;
2512 auto v2 =
Vector(std::move(t2));
2517 auto v3 =
Vector(t1, std::move(t2));
2524 auto v4 =
Vector(std::move(v3[0]), v3[1], std::move(t3));
2533 auto v5 =
Cat(v1, v4);
2544 auto v6 =
Cat(std::move(v1), v3);
2553 auto v7 =
Cat(v2, std::move(v4));
2564 auto v8 =
Cat(std::move(v2), std::move(v3));
2576 const std::array<unsigned char, 32> privkey_bytes = {
2579 0xD9, 0x7F, 0x51, 0x08, 0xF1, 0x1C, 0xDA, 0x6E,
2580 0xEE, 0xBA, 0xAA, 0x42, 0x0F, 0xEF, 0x07, 0x26,
2581 0xB1, 0xF8, 0x98, 0x06, 0x0B, 0x98, 0x48, 0x9F,
2582 0xA3, 0x09, 0x84, 0x63, 0xC0, 0x03, 0x28, 0x66
2585 const std::string message =
"Trust no one";
2587 const std::string expected_signature =
2588 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=";
2591 std::string generated_signature;
2593 BOOST_REQUIRE_MESSAGE(!privkey.
IsValid(),
2594 "Confirm the private key is invalid");
2596 BOOST_CHECK_MESSAGE(!
MessageSign(privkey, message, generated_signature),
2597 "Sign with an invalid private key");
2599 privkey.
Set(privkey_bytes.begin(), privkey_bytes.end(),
true);
2601 BOOST_REQUIRE_MESSAGE(privkey.
IsValid(),
2602 "Confirm the private key is valid");
2604 BOOST_CHECK_MESSAGE(
MessageSign(privkey, message, generated_signature),
2605 "Sign with a valid private key");
2615 "signature should be irrelevant",
2621 "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
2622 "signature should be irrelevant",
2628 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
2629 "invalid signature, not in base64 encoding",
2630 "message should be irrelevant"),
2635 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
2636 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
2637 "message should be irrelevant"),
2642 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
2643 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
2644 "I never signed this"),
2649 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
2650 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
2656 "11canuhp9X2NocwCq7xNrQYTmUgZAnLK3",
2657 "IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=",
2664 const std::string unsigned_tx =
"...";
2665 const std::string prefixed_message =
2668 std::string(1, (
char)unsigned_tx.length()) +
2672 const uint256 message_hash1 =
Hash(prefixed_message);
2676 BOOST_CHECK_NE(message_hash1, signature_hash);
2707 BOOST_CHECK_EQUAL(ParseByteUnits("3G", noop).value(), 3ULL << 30); 2709 BOOST_CHECK_EQUAL(ParseByteUnits("4t", noop).value(), 4'000
'000'000
'000ULL); 2710 BOOST_CHECK_EQUAL(ParseByteUnits("4T", noop).value(), 4ULL << 40); 2712 // check default multiplier 2713 BOOST_CHECK_EQUAL(ParseByteUnits("5", ByteUnit::K).value(), 5ULL << 10); 2716 BOOST_CHECK(!ParseByteUnits("", noop)); 2717 BOOST_CHECK(!ParseByteUnits("foo", noop)); 2720 BOOST_CHECK(!ParseByteUnits("123m ", noop)); 2721 BOOST_CHECK(!ParseByteUnits(" 123m", noop)); 2724 BOOST_CHECK(!ParseByteUnits("-123m", noop)); 2725 BOOST_CHECK(!ParseByteUnits("+123m", noop)); 2728 BOOST_CHECK_EQUAL(ParseByteUnits("020M", noop).value(), 20ULL << 20); 2730 // fractions not allowed 2731 BOOST_CHECK(!ParseByteUnits("0.5T", noop)); 2734 BOOST_CHECK(!ParseByteUnits("18446744073709551615g", noop)); 2737 BOOST_CHECK(!ParseByteUnits("1x", noop)); 2740 BOOST_AUTO_TEST_CASE(util_ReadBinaryFile) 2742 fs::path tmpfolder = m_args.GetDataDirBase(); 2743 fs::path tmpfile = tmpfolder / "read_binary.dat"; 2744 std::string expected_text; 2745 for (int i = 0; i < 30; i++) { 2746 expected_text += "0123456789"; 2749 std::ofstream file{tmpfile}; 2750 file << expected_text; 2753 // read all contents in file 2754 auto [valid, text] = ReadBinaryFile(tmpfile); 2756 BOOST_CHECK_EQUAL(text, expected_text); 2759 // read half contents in file 2760 auto [valid, text] = ReadBinaryFile(tmpfile, expected_text.size() / 2); 2762 BOOST_CHECK_EQUAL(text, expected_text.substr(0, expected_text.size() / 2)); 2765 // read from non-existent file 2766 fs::path invalid_file = tmpfolder / "invalid_binary.dat"; 2767 auto [valid, text] = ReadBinaryFile(invalid_file); 2768 BOOST_CHECK(!valid); 2769 BOOST_CHECK(text.empty()); 2773 BOOST_AUTO_TEST_CASE(util_WriteBinaryFile) 2775 fs::path tmpfolder = m_args.GetDataDirBase(); 2776 fs::path tmpfile = tmpfolder / "write_binary.dat"; 2777 std::string expected_text = "bitcoin"; 2778 auto valid = WriteBinaryFile(tmpfile, expected_text); 2779 std::string actual_text; 2780 std::ifstream file{tmpfile}; 2781 file >> actual_text; 2783 BOOST_CHECK_EQUAL(actual_text, expected_text); 2785 BOOST_AUTO_TEST_SUITE_END() Expect & Error(const char *e)
std::map< std::string, SettingsValue > rw_settings
Map of setting name to read-write file setting value.
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
static void TestOtherThread(fs::path dirname, fs::path lockname, bool *result)
std::vector< std::string > GetValues(const ActionList &actions, const std::string §ion, const std::string &name, const std::string &value_prefix)
Translate actions into a list of <key>=setting strings.
void SetNetworkOnlyArg(const std::string arg)
std::vector< T > Split(const Span< const char > &sp, std::string_view separators)
Split a string on any char found in separators, returning a vector.
void Finalize(Span< unsigned char > output)
#define BOOST_CHECK_THROW(stmt, excMatch)
bool Func(const std::string &str, Span< const char > &sp)
Parse a function call.
FILE * fopen(const fs::path &p, const char *mode)
std::string FormatISO8601Date(int64_t nTime)
#define TRY_LOCK(cs, name)
constexpr C * end() const noexcept
The provided signature couldn't be parsed (maybe invalid base64).
Action[MAX_ACTIONS] ActionList
MessageVerificationResult MessageVerify(const std::string &address, const std::string &signature, const std::string &message)
Verify a signed message.
Span< std::byte > MakeWritableByteSpan(V &&v) noexcept
bool MessageSign(const CKey &privkey, const std::string &message, std::string &signature)
Sign a message.
bool Const(const std::string &str, Span< const char > &sp)
Parse a constant.
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \\\)
void SelectConfigNetwork(const std::string &network)
Select the network in use.
bool ReadConfigStream(std::istream &stream, const std::string &filepath, std::string &error, bool ignore_invalid_keys=false)
bool ParseUInt64(std::string_view str, uint64_t *out)
Convert decimal string to unsigned 64-bit integer with strict parse error feedback.
util::SettingsValue GetSetting(const std::string &arg) const
Get setting value.
std::string FormatISO8601DateTime(int64_t nTime)
ISO 8601 formatting is preferred.
fs::path GetUniquePath(const fs::path &base)
Helper function for getting a unique path.
bool ParseParameters(int argc, const char *const argv[], std::string &error)
util::SettingsValue GetSetting(const std::string &arg) const
Get setting value.
The message verification was successful.
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
A hasher class for Bitcoin's 256-bit hash (double SHA-256).
static const int64_t values[]
A selection of numbers that do not trigger int64_t overflow when added/subtracted.
void ForceSetArg(const std::string &strArg, const std::string &strValue)
std::vector< std::string > SplitString(std::string_view str, char sep)
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Set an argument if it doesn't already have a value.
std::optional< bool > bool_value
const fs::path & GetDataDirBase() const
Get data directory path.
static const unsigned char ParseHex_expected[65]
void ReleaseDirectoryLocks()
Release all directory locks.
int64_t ParseISO8601DateTime(const std::string &str)
BOOST_AUTO_TEST_CASE(util_datadir)
int64_t atoi64_legacy(const std::string &str)
BOOST_FIXTURE_TEST_CASE(util_CheckValue, CheckValueTest)
Span< const char > Expr(Span< const char > &sp)
Extract the expression that sp begins with.
std::vector< typename std::common_type< Args... >::type > Vector(Args &&... args)
Construct a vector with the specified elements.
static const std::string MAIN
Chain name strings.
int64_t CAmount
Amount in satoshis (Can be negative)
util::SettingsValue setting
std::unique_ptr< Descriptor > Parse(const std::string &descriptor, FlatSigningProvider &out, std::string &error, bool require_checksum)
Parse a descriptor string.
std::string SanitizeString(std::string_view str, int rule)
Remove unsafe chars.
std::string ToString(const T &t)
Locale-independent version of std::to_string.
bool ParseUInt32(std::string_view str, uint32_t *out)
Convert decimal string to unsigned 32-bit integer with strict parse error feedback.
static void TestParse(const std::string &str, bool expected_bool, int64_t expected_int)
bool ReadSettingsFile(std::vector< std::string > *errors=nullptr)
Read settings file.
static constexpr char ExitCommand
std::vector< Byte > ParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).
bool IsArgNegated(const std::string &strArg) const
Return true if the argument was originally passed as a negated option, i.e.
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
void ReadConfigString(const std::string str_config)
static std::string PathToString(const path &path)
Convert path object to a byte string.
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
void CheckValue(unsigned int flags, const char *arg, const Expect &expect)
void ForEachNoDup(CharType(&string)[StringLength], CharType min_char, CharType max_char, Fn &&fn)
Iterate over string values and call function for each string without successive duplicate characters...
Test GetSetting and GetArg type coercion, negation, and default value handling.
static const std::string STRING_WITH_EMBEDDED_NULL_CHAR
bool ParseUInt16(std::string_view str, uint16_t *out)
Convert decimal string to unsigned 16-bit integer with strict parse error feedback.
void AddArg(const std::string &name, const std::string &help, unsigned int flags, const OptionsCategory &cat)
Add argument.
std::optional< uint64_t > ParseByteUnits(std::string_view str, ByteUnit default_multiplier)
Parse a string with suffix unit [k|K|m|M|g|G|t|T].
std::optional< CAmount > ParseMoney(const std::string &money_string)
Parse an amount denoted in full coins.
std::vector< util::SettingsValue > GetSettingsList(const std::string &arg) const
Get list of setting values.
bool ParseUInt8(std::string_view str, uint8_t *out)
Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
Action[MAX_ACTIONS] ActionList
bool DirIsWritable(const fs::path &directory)
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
void SetupArgs(const std::vector< std::pair< std::string, unsigned int >> &args)
uint256 MessageHash(const std::string &message)
Hashes a message for signing and verification in a manner that prevents inadvertently signing a trans...
void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
std::string FormatParagraph(std::string_view in, size_t width, size_t indent)
Format a paragraph of text to a fixed width, adding spaces for indentation to any added line...
static constexpr char LockCommand
Testing fixture that pre-creates a 100-block REGTEST-mode block chain.
#define ASSERT_DEBUG_LOG(message)
static bool create_directories(const std::filesystem::path &p)
Create directory (and if necessary its parents), unless the leaf directory already exists or is a sym...
bool LockDirectory(const fs::path &directory, const fs::path &lockfile_name, bool probe_only)
std::string Parse(const char *arg)
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
Expect(util::SettingsValue s)
#define Assume(val)
Assume is the identity function.
bool ParseFixedPoint(std::string_view val, int decimals, int64_t *amount_out)
Parse number as fixed point according to JSON number syntax.
The message was not signed with the private key of the provided address.
std::string ToLower(std::string_view str)
Returns the lowercase equivalent of the given string.
constexpr C * begin() const noexcept
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
bool WriteSettingsFile(std::vector< std::string > *errors=nullptr, bool backup=false) const
Write settings file or backup settings file.
bool ParseInt64(std::string_view str, int64_t *out)
Convert string to signed 64-bit integer with strict parse error feedback.
#define BOOST_CHECK_EQUAL(v1, v2)
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
The provided address is invalid.
std::optional< std::vector< std::string > > list_value
Span< const std::byte > MakeByteSpan(V &&v) noexcept
std::string FormatSubVersion(const std::string &name, int nClientVersion, const std::vector< std::string > &comments)
Format the subversion field according to BIP 14 spec (https://github.com/bitcoin/bips/blob/master/bip...
std::optional< int64_t > int_value
constexpr auto MakeUCharSpan(V &&v) -> decltype(UCharSpanCast(Span
Like the Span constructor, but for (const) unsigned char member types only.
static const size_t OUTPUT_SIZE
std::string RemovePrefix(std::string_view str, std::string_view prefix)
static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
static const std::string TESTNET
std::string GetChainName() const
Returns the appropriate chain name from the program arguments.
const std::string MESSAGE_MAGIC
Text used to signify that a signed message follows and to prevent inadvertently signing a transaction...
An encapsulated private key.
A Span is an object that can refer to a contiguous sequence of objects.
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
void ForEachMergeSetup(Fn &&fn)
Enumerate all possible test configurations.
void LockSettings(Fn &&fn)
Access settings with lock held.
std::vector< std::string > GetArgs(const std::string &strArg) const
Return a vector of strings of the given argument.
std::string LogEscapeMessage(const std::string &str)
Belts and suspenders: make sure outgoing log messages don't contain potentially suspicious characters...
A public key could not be recovered from the provided signature and message.
bool ReadConfigStream(std::istream &stream, const std::string &filepath, std::string &error, bool ignore_invalid_keys=false)
void ClearPathCache()
Clear cached directory paths.
std::string TrimString(std::string_view str, std::string_view pattern=" \\\)
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
std::vector< util::SettingsValue > GetSettingsList(const std::string &arg) const
Get list of setting values.
static std::string SpanToStr(const Span< const char > &span)
void ForEachMergeSetup(Fn &&fn)
Enumerate all possible test configurations.
const std::set< std::string > GetUnsuitableSectionOnlyArgs() const
Log warnings for options in m_section_only_args when they are specified in the default section but no...
static constexpr char UnlockCommand
bool error(const char *fmt, const Args &... args)
static const std::string SIGNET
CHash256 & Write(Span< const unsigned char > input)
Expect & String(const char *s)
The provided address is valid but does not refer to a public key.
#define Assert(val)
Identity function.
std::string Capitalize(std::string str)
Capitalizes the first character of the given string.
bool IsValid() const
Check whether this private key is valid.
#define BOOST_CHECK(expr)
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.
Expect & List(std::vector< std::string > m)
static constexpr CAmount COIN
The amount of satoshis in one BTC.
std::string ToUpper(std::string_view str)
Returns the uppercase equivalent of the given string.