38 #include <sys/types.h> 45 #include <boost/test/unit_test.hpp> 71 explicit NoCopyOrMove(
int i) : i{i} { }
73 NoCopyOrMove() =
delete;
74 NoCopyOrMove(
const NoCopyOrMove&) =
delete;
75 NoCopyOrMove(NoCopyOrMove&&) =
delete;
76 NoCopyOrMove& operator=(
const NoCopyOrMove&) =
delete;
77 NoCopyOrMove& operator=(NoCopyOrMove&&) =
delete;
79 operator bool()
const {
return i != 0; }
81 int get_ip1() {
return i + 1; }
85 [&]() {
Assume(get_ip1()); }();
86 return Assume(get_ip1() != 5);
94 const std::unique_ptr<int> p_two =
Assert(std::make_unique<int>(2));
96 const int two = *
Assert(p_two);
100 const bool result{
Assume(two == 2)};
113 const int nine{*
Assert(std::optional<int>{9})};
125 BOOST_ERROR(
"break was swallowed!");
135 BOOST_ERROR(
"break was swallowed!");
140 0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
141 0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
142 0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
143 0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
148 std::vector<unsigned char> result;
151 result =
ParseHex(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
152 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
153 result = TryParseHex<uint8_t>(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f").value();
154 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
158 BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
159 result = TryParseHex<uint8_t>(
"12 34 56 78").value();
160 BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
164 BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
165 result = TryParseHex<uint8_t>(
" 89 34 56 78").value();
166 BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
170 BOOST_CHECK(result.size() == 2 && result[0] == 0xff && result[1] == 0xaa);
171 result = TryParseHex<uint8_t>(
" Ff aA ").value();
172 BOOST_CHECK(result.size() == 2 && result[0] == 0xff && result[1] == 0xaa);
177 result = TryParseHex<uint8_t>(
"").value();
185 const std::string with_embedded_null{
" 11 "s
205 "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
219 const std::string out_exp{
"04678afdb0"};
227 auto input = std::string();
228 for (
size_t i=0; i<256; ++i) {
229 input.push_back(static_cast<char>(i));
233 BOOST_TEST_REQUIRE(hex.size() == 512);
234 static constexpr
auto hexmap = std::string_view(
"0123456789abcdef");
235 for (
size_t i = 0; i < 256; ++i) {
236 auto upper = hexmap.find(hex[i * 2]);
237 auto lower = hexmap.find(hex[i * 2 + 1]);
238 BOOST_TEST_REQUIRE(upper != std::string_view::npos);
239 BOOST_TEST_REQUIRE(lower != std::string_view::npos);
240 BOOST_TEST_REQUIRE(i == upper*16 + lower);
247 std::array mut_arr{uint8_t{0xaa}, uint8_t{0xbb}};
249 mut_bytes[1] = std::byte{0x11};
262 const auto op_upper = [](
const std::string& s) {
return ToUpper(s); };
270 const std::string original(
"A test \"%s\" string '%s'.");
271 auto test_replaceall = [&original](
const std::string& search,
const std::string& substitute,
const std::string& expected) {
272 auto test = original;
277 test_replaceall(
"",
"foo", original);
278 test_replaceall(original,
"foo",
"foo");
279 test_replaceall(
"%s",
"foo",
"A test \"foo\" string 'foo'.");
280 test_replaceall(
"\"",
"foo",
"A test foo%sfoo string '%s'.");
281 test_replaceall(
"'",
"foo",
"A test \"%s\" string foo%sfoo.");
296 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));
358 BOOST_CHECK_EQUAL(ParseMoney("12345.").value(), COIN * 12345); 360 BOOST_CHECK_EQUAL(ParseMoney("12345.6789").value(), (COIN/10000)*123456789); 362 BOOST_CHECK_EQUAL(ParseMoney("10000000.00").value(), COIN*10000000); 363 BOOST_CHECK_EQUAL(ParseMoney("1000000.00").value(), COIN*1000000); 364 BOOST_CHECK_EQUAL(ParseMoney("100000.00").value(), COIN*100000); 365 BOOST_CHECK_EQUAL(ParseMoney("10000.00").value(), COIN*10000); 366 BOOST_CHECK_EQUAL(ParseMoney("1000.00").value(), COIN*1000); 367 BOOST_CHECK_EQUAL(ParseMoney("100.00").value(), COIN*100); 368 BOOST_CHECK_EQUAL(ParseMoney("10.00").value(), COIN*10); 369 BOOST_CHECK_EQUAL(ParseMoney("1.00").value(), COIN); 370 BOOST_CHECK_EQUAL(ParseMoney("1").value(), COIN); 371 BOOST_CHECK_EQUAL(ParseMoney(" 1").value(), COIN); 372 BOOST_CHECK_EQUAL(ParseMoney("1 ").value(), COIN); 373 BOOST_CHECK_EQUAL(ParseMoney(" 1 ").value(), COIN); 374 BOOST_CHECK_EQUAL(ParseMoney("0.1").value(), COIN/10); 375 BOOST_CHECK_EQUAL(ParseMoney("0.01").value(), COIN/100); 376 BOOST_CHECK_EQUAL(ParseMoney("0.001").value(), COIN/1000); 377 BOOST_CHECK_EQUAL(ParseMoney("0.0001").value(), COIN/10000); 378 BOOST_CHECK_EQUAL(ParseMoney("0.00001").value(), COIN/100000); 379 BOOST_CHECK_EQUAL(ParseMoney("0.000001").value(), COIN/1000000); 380 BOOST_CHECK_EQUAL(ParseMoney("0.0000001").value(), COIN/10000000); 381 BOOST_CHECK_EQUAL(ParseMoney("0.00000001").value(), COIN/100000000); 382 BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001 ").value(), COIN/100000000); 383 BOOST_CHECK_EQUAL(ParseMoney("0.00000001 ").value(), COIN/100000000); 384 BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001").value(), COIN/100000000); 386 // Parsing amount that cannot be represented should fail 387 BOOST_CHECK(!ParseMoney("100000000.00")); 388 BOOST_CHECK(!ParseMoney("0.000000001")); 390 // Parsing empty string should fail 391 BOOST_CHECK(!ParseMoney("")); 392 BOOST_CHECK(!ParseMoney(" ")); 393 BOOST_CHECK(!ParseMoney(" ")); 395 // Parsing two numbers should fail 396 BOOST_CHECK(!ParseMoney("..")); 397 BOOST_CHECK(!ParseMoney("0..0")); 398 BOOST_CHECK(!ParseMoney("1 2")); 399 BOOST_CHECK(!ParseMoney(" 1 2 ")); 400 BOOST_CHECK(!ParseMoney(" 1.2 3 ")); 401 BOOST_CHECK(!ParseMoney(" 1 2.3 ")); 403 // Embedded whitespace should fail 404 BOOST_CHECK(!ParseMoney(" -1 .2 ")); 405 BOOST_CHECK(!ParseMoney(" 1 .2 ")); 406 BOOST_CHECK(!ParseMoney(" +1 .2 ")); 408 // Attempted 63 bit overflow should fail 409 BOOST_CHECK(!ParseMoney("92233720368.54775808")); 411 // Parsing negative amounts must fail 412 BOOST_CHECK(!ParseMoney("-1")); 414 // Parsing strings with embedded NUL characters should fail 415 BOOST_CHECK(!ParseMoney("\0-1"s)); 416 BOOST_CHECK(!ParseMoney(STRING_WITH_EMBEDDED_NULL_CHAR)); 417 BOOST_CHECK(!ParseMoney("1\0"s)); 420 BOOST_AUTO_TEST_CASE(util_IsHex) 422 BOOST_CHECK(IsHex("00")); 423 BOOST_CHECK(IsHex("00112233445566778899aabbccddeeffAABBCCDDEEFF")); 424 BOOST_CHECK(IsHex("ff")); 425 BOOST_CHECK(IsHex("FF")); 427 BOOST_CHECK(!IsHex("")); 428 BOOST_CHECK(!IsHex("0")); 429 BOOST_CHECK(!IsHex("a")); 430 BOOST_CHECK(!IsHex("eleven")); 431 BOOST_CHECK(!IsHex("00xx00")); 432 BOOST_CHECK(!IsHex("0x0000")); 435 BOOST_AUTO_TEST_CASE(util_IsHexNumber) 437 BOOST_CHECK(IsHexNumber("0x0")); 438 BOOST_CHECK(IsHexNumber("0")); 439 BOOST_CHECK(IsHexNumber("0x10")); 440 BOOST_CHECK(IsHexNumber("10")); 441 BOOST_CHECK(IsHexNumber("0xff")); 442 BOOST_CHECK(IsHexNumber("ff")); 443 BOOST_CHECK(IsHexNumber("0xFfa")); 444 BOOST_CHECK(IsHexNumber("Ffa")); 445 BOOST_CHECK(IsHexNumber("0x00112233445566778899aabbccddeeffAABBCCDDEEFF")); 446 BOOST_CHECK(IsHexNumber("00112233445566778899aabbccddeeffAABBCCDDEEFF")); 448 BOOST_CHECK(!IsHexNumber("")); // empty string not allowed 449 BOOST_CHECK(!IsHexNumber("0x")); // empty string after prefix not allowed 450 BOOST_CHECK(!IsHexNumber("0x0 ")); // no spaces at end, 451 BOOST_CHECK(!IsHexNumber(" 0x0")); // or beginning, 452 BOOST_CHECK(!IsHexNumber("0x 0")); // or middle, 453 BOOST_CHECK(!IsHexNumber(" ")); // etc. 454 BOOST_CHECK(!IsHexNumber("0x0ga")); // invalid character 455 BOOST_CHECK(!IsHexNumber("x0")); // broken prefix 456 BOOST_CHECK(!IsHexNumber("0x0x00")); // two prefixes not allowed 460 BOOST_AUTO_TEST_CASE(util_seed_insecure_rand) 462 SeedRandomForTest(SeedRand::ZEROS); 463 for (int mod=2;mod<11;mod++) 466 // Really rough binomial confidence approximation. 467 int err = 30*10000./mod*sqrt((1./mod*(1-1./mod))/10000.); 468 //mask is 2^ceil(log2(mod))-1 469 while(mask<mod-1)mask=(mask<<1)+1; 472 //How often does it get a zero from the uniform range [0,mod)? 473 for (int i = 0; i < 10000; i++) { 476 rval=InsecureRand32()&mask; 477 }while(rval>=(uint32_t)mod); 480 BOOST_CHECK(count<=10000/mod+err); 481 BOOST_CHECK(count>=10000/mod-err); 485 BOOST_AUTO_TEST_CASE(util_TimingResistantEqual) 487 BOOST_CHECK(TimingResistantEqual(std::string(""), std::string(""))); 488 BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string(""))); 489 BOOST_CHECK(!TimingResistantEqual(std::string(""), std::string("abc"))); 490 BOOST_CHECK(!TimingResistantEqual(std::string("a"), std::string("aa"))); 491 BOOST_CHECK(!TimingResistantEqual(std::string("aa"), std::string("a"))); 492 BOOST_CHECK(TimingResistantEqual(std::string("abc"), std::string("abc"))); 493 BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string("aba"))); 496 /* Test strprintf formatting directives. 497 * Put a string before and after to ensure sanity of element sizes on stack. */ 498 #define B "check_prefix" 499 #define E "check_postfix" 500 BOOST_AUTO_TEST_CASE(strprintf_numbers) 502 int64_t s64t = -9223372036854775807LL; /* signed 64 bit test value */ 503 uint64_t u64t = 18446744073709551615ULL; /* unsigned 64 bit test value */ 504 BOOST_CHECK(strprintf("%s %d %s", B, s64t, E) == B" -9223372036854775807 " E); 505 BOOST_CHECK(strprintf("%s %u %s", B, u64t, E) == B" 18446744073709551615 " E); 506 BOOST_CHECK(strprintf("%s %x %s", B, u64t, E) == B" ffffffffffffffff " E); 508 size_t st = 12345678; /* unsigned size_t test value */ 509 ssize_t sst = -12345678; /* signed size_t test value */ 510 BOOST_CHECK(strprintf("%s %d %s", B, sst, E) == B" -12345678 " E); 511 BOOST_CHECK(strprintf("%s %u %s", B, st, E) == B" 12345678 " E); 512 BOOST_CHECK(strprintf("%s %x %s", B, st, E) == B" bc614e " E); 514 ptrdiff_t pt = 87654321; /* positive ptrdiff_t test value */ 515 ptrdiff_t spt = -87654321; /* negative ptrdiff_t test value */ 516 BOOST_CHECK(strprintf("%s %d %s", B, spt, E) == B" -87654321 " E); 517 BOOST_CHECK(strprintf("%s %u %s", B, pt, E) == B" 87654321 " E); 518 BOOST_CHECK(strprintf("%s %x %s", B, pt, E) == B" 5397fb1 " E); 523 /* Check for mingw/wine issue #3494 524 * Remove this test before time.ctime(0xffffffff) == 'Sun Feb 7 07:28:15 2106
' 526 BOOST_AUTO_TEST_CASE(gettime) 528 BOOST_CHECK((GetTime() & ~0xFFFFFFFFLL) == 0); 531 BOOST_AUTO_TEST_CASE(util_time_GetTime) 534 // Check that mock time does not change after a sleep 535 for (const auto& num_sleep : {0ms, 1ms}) { 536 UninterruptibleSleep(num_sleep); 537 BOOST_CHECK_EQUAL(111, GetTime()); // Deprecated time getter 538 BOOST_CHECK_EQUAL(111, Now<NodeSeconds>().time_since_epoch().count()); 539 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now())); 540 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<SecondsDouble>(Now<NodeSeconds>())); 541 BOOST_CHECK_EQUAL(111, GetTime<std::chrono::seconds>().count()); 542 BOOST_CHECK_EQUAL(111000, GetTime<std::chrono::milliseconds>().count()); 543 BOOST_CHECK_EQUAL(111000, TicksSinceEpoch<std::chrono::milliseconds>(NodeClock::now())); 544 BOOST_CHECK_EQUAL(111000000, GetTime<std::chrono::microseconds>().count()); 548 // Check that steady time and system time changes after a sleep 549 const auto steady_ms_0 = Now<SteadyMilliseconds>(); 550 const auto steady_0 = std::chrono::steady_clock::now(); 551 const auto ms_0 = GetTime<std::chrono::milliseconds>(); 552 const auto us_0 = GetTime<std::chrono::microseconds>(); 553 UninterruptibleSleep(1ms); 554 BOOST_CHECK(steady_ms_0 < Now<SteadyMilliseconds>()); 555 BOOST_CHECK(steady_0 + 1ms <= std::chrono::steady_clock::now()); 556 BOOST_CHECK(ms_0 < GetTime<std::chrono::milliseconds>()); 557 BOOST_CHECK(us_0 < GetTime<std::chrono::microseconds>()); 560 BOOST_AUTO_TEST_CASE(test_IsDigit) 562 BOOST_CHECK_EQUAL(IsDigit('0
'), true); 563 BOOST_CHECK_EQUAL(IsDigit('1
'), true); 564 BOOST_CHECK_EQUAL(IsDigit('8
'), true); 565 BOOST_CHECK_EQUAL(IsDigit('9
'), true); 567 BOOST_CHECK_EQUAL(IsDigit('0
' - 1), false); 568 BOOST_CHECK_EQUAL(IsDigit('9
' + 1), false); 569 BOOST_CHECK_EQUAL(IsDigit(0), false); 570 BOOST_CHECK_EQUAL(IsDigit(1), false); 571 BOOST_CHECK_EQUAL(IsDigit(8), false); 572 BOOST_CHECK_EQUAL(IsDigit(9), false); 575 /* Check for overflow */ 576 template <typename T> 577 static void TestAddMatrixOverflow() 579 constexpr T MAXI{std::numeric_limits<T>::max()}; 580 BOOST_CHECK(!CheckedAdd(T{1}, MAXI)); 581 BOOST_CHECK(!CheckedAdd(MAXI, MAXI)); 582 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI)); 583 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(MAXI, MAXI)); 585 BOOST_CHECK_EQUAL(0, CheckedAdd(T{0}, T{0}).value()); 586 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{0}, MAXI).value()); 587 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{1}, MAXI - 1).value()); 588 BOOST_CHECK_EQUAL(MAXI - 1, CheckedAdd(T{1}, MAXI - 2).value()); 589 BOOST_CHECK_EQUAL(0, SaturatingAdd(T{0}, T{0})); 590 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{0}, MAXI)); 591 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI - 1)); 592 BOOST_CHECK_EQUAL(MAXI - 1, SaturatingAdd(T{1}, MAXI - 2)); 595 /* Check for overflow or underflow */ 596 template <typename T> 597 static void TestAddMatrix() 599 TestAddMatrixOverflow<T>(); 600 constexpr T MINI{std::numeric_limits<T>::min()}; 601 constexpr T MAXI{std::numeric_limits<T>::max()}; 602 BOOST_CHECK(!CheckedAdd(T{-1}, MINI)); 603 BOOST_CHECK(!CheckedAdd(MINI, MINI)); 604 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI)); 605 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(MINI, MINI)); 607 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{0}, MINI).value()); 608 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{-1}, MINI + 1).value()); 609 BOOST_CHECK_EQUAL(-1, CheckedAdd(MINI, MAXI).value()); 610 BOOST_CHECK_EQUAL(MINI + 1, CheckedAdd(T{-1}, MINI + 2).value()); 611 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{0}, MINI)); 612 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI + 1)); 613 BOOST_CHECK_EQUAL(MINI + 1, SaturatingAdd(T{-1}, MINI + 2)); 614 BOOST_CHECK_EQUAL(-1, SaturatingAdd(MINI, MAXI)); 617 BOOST_AUTO_TEST_CASE(util_overflow) 619 TestAddMatrixOverflow<unsigned>(); 620 TestAddMatrix<signed>(); 623 BOOST_AUTO_TEST_CASE(test_ParseInt32) 627 BOOST_CHECK(ParseInt32("1234", nullptr)); 628 BOOST_CHECK(ParseInt32("0", &n) && n == 0); 629 BOOST_CHECK(ParseInt32("1234", &n) && n == 1234); 630 BOOST_CHECK(ParseInt32("01234", &n) && n == 1234); // no octal 631 BOOST_CHECK(ParseInt32("2147483647", &n) && n == 2147483647); 632 BOOST_CHECK(ParseInt32("-2147483648", &n) && n == (-2147483647 - 1)); // (-2147483647 - 1) equals INT_MIN 633 BOOST_CHECK(ParseInt32("-1234", &n) && n == -1234); 634 BOOST_CHECK(ParseInt32("00000000000000001234", &n) && n == 1234); 635 BOOST_CHECK(ParseInt32("-00000000000000001234", &n) && n == -1234); 636 BOOST_CHECK(ParseInt32("00000000000000000000", &n) && n == 0); 637 BOOST_CHECK(ParseInt32("-00000000000000000000", &n) && n == 0); 639 BOOST_CHECK(!ParseInt32("", &n)); 640 BOOST_CHECK(!ParseInt32(" 1", &n)); // no padding inside 641 BOOST_CHECK(!ParseInt32("1 ", &n)); 642 BOOST_CHECK(!ParseInt32("++1", &n)); 643 BOOST_CHECK(!ParseInt32("+-1", &n)); 644 BOOST_CHECK(!ParseInt32("-+1", &n)); 645 BOOST_CHECK(!ParseInt32("--1", &n)); 646 BOOST_CHECK(!ParseInt32("1a", &n)); 647 BOOST_CHECK(!ParseInt32("aap", &n)); 648 BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex 649 BOOST_CHECK(!ParseInt32(STRING_WITH_EMBEDDED_NULL_CHAR, &n)); 650 // Overflow and underflow 651 BOOST_CHECK(!ParseInt32("-2147483649", nullptr)); 652 BOOST_CHECK(!ParseInt32("2147483648", nullptr)); 653 BOOST_CHECK(!ParseInt32("-32482348723847471234", nullptr)); 654 BOOST_CHECK(!ParseInt32("32482348723847471234", nullptr)); 657 template <typename T> 658 static void RunToIntegralTests() 660 BOOST_CHECK(!ToIntegral<T>(STRING_WITH_EMBEDDED_NULL_CHAR)); 661 BOOST_CHECK(!ToIntegral<T>(" 1")); 662 BOOST_CHECK(!ToIntegral<T>("1 ")); 663 BOOST_CHECK(!ToIntegral<T>("1a")); 664 BOOST_CHECK(!ToIntegral<T>("1.1")); 665 BOOST_CHECK(!ToIntegral<T>("1.9")); 666 BOOST_CHECK(!ToIntegral<T>("+01.9")); 667 BOOST_CHECK(!ToIntegral<T>("-")); 668 BOOST_CHECK(!ToIntegral<T>("+")); 669 BOOST_CHECK(!ToIntegral<T>(" -1")); 670 BOOST_CHECK(!ToIntegral<T>("-1 ")); 671 BOOST_CHECK(!ToIntegral<T>(" -1 ")); 672 BOOST_CHECK(!ToIntegral<T>("+1")); 673 BOOST_CHECK(!ToIntegral<T>(" +1")); 674 BOOST_CHECK(!ToIntegral<T>(" +1 ")); 675 BOOST_CHECK(!ToIntegral<T>("+-1")); 676 BOOST_CHECK(!ToIntegral<T>("-+1")); 677 BOOST_CHECK(!ToIntegral<T>("++1")); 678 BOOST_CHECK(!ToIntegral<T>("--1")); 679 BOOST_CHECK(!ToIntegral<T>("")); 680 BOOST_CHECK(!ToIntegral<T>("aap")); 681 BOOST_CHECK(!ToIntegral<T>("0x1")); 682 BOOST_CHECK(!ToIntegral<T>("-32482348723847471234")); 683 BOOST_CHECK(!ToIntegral<T>("32482348723847471234")); 686 BOOST_AUTO_TEST_CASE(test_ToIntegral) 688 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("1234").value(), 1'234);
691 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000001234").value(), 1'234);
693 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000000000").value(), 0); 694 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-00000000000000000000").value(), 0); 695 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1234").value(), -1'234);
698 RunToIntegralTests<uint64_t>();
699 RunToIntegralTests<int64_t>();
700 RunToIntegralTests<uint32_t>();
701 RunToIntegralTests<int32_t>();
702 RunToIntegralTests<uint16_t>();
703 RunToIntegralTests<int16_t>();
704 RunToIntegralTests<uint8_t>();
705 RunToIntegralTests<int8_t>();
707 BOOST_CHECK(!ToIntegral<int64_t>(
"-9223372036854775809"));
708 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"-9223372036854775808").value(), -9
'223'372
'036'854
'775'807LL - 1LL);
709 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"9223372036854775807").value(), 9
'223'372
'036'854
'775'807);
710 BOOST_CHECK(!ToIntegral<int64_t>(
"9223372036854775808"));
714 BOOST_CHECK_EQUAL(ToIntegral<uint64_t>(
"18446744073709551615").value(), 18
'446'744
'073'709
'551'615ULL);
715 BOOST_CHECK(!ToIntegral<uint64_t>(
"18446744073709551616"));
719 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("2147483647").value(), 2'147
'483'647);
725 BOOST_CHECK(!ToIntegral<uint32_t>("4294967296")); 727 BOOST_CHECK(!ToIntegral<int16_t>("-32769")); 728 BOOST_CHECK_EQUAL(ToIntegral<int16_t>("-32768").value(), -32'768);
730 BOOST_CHECK(!ToIntegral<int16_t>("32768")); 732 BOOST_CHECK(!ToIntegral<uint16_t>("-1")); 733 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("0").value(), 0U); 734 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("65535").value(), 65'535U);
750 return strtoll(str.c_str(),
nullptr, 10);
756 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0"), 0); 757 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("01234"), 1'234);
759 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" 1"), 1); 760 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1 "), 1); 761 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1a"), 1); 762 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.1"), 1); 763 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.9"), 1); 764 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+01.9"), 1); 765 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1"), -1); 766 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1"), -1); 767 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1 "), -1); 768 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1 "), -1); 769 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+1"), 1); 770 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1"), 1); 771 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1 "), 1); 773 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+-1"), 0); 774 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-+1"), 0); 775 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("++1"), 0); 776 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("--1"), 0); 777 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(""), 0); 778 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("aap"), 0); 779 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0x1"), 0); 780 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-32482348723847471234"), -2'147
'483'647 - 1);
781 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"32482348723847471234"), 2
'147'483
'647); 783 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775809"), -9'223
'372'036
'854'775
'807LL - 1LL); 784 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775808"), -9'223
'372'036
'854'775
'807LL - 1LL); 785 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775807"), 9'223
'372'036
'854'775
'807); 786 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775808"), 9'223
'372'036
'854'775
'807); 788 std::map<std::string, int64_t> atoi64_test_pairs = { 789 {"-9223372036854775809", std::numeric_limits<int64_t>::min()}, 790 {"-9223372036854775808", -9'223
'372'036
'854'775
'807LL - 1LL}, 791 {"9223372036854775807", 9'223
'372'036
'854'775
'807}, 792 {"9223372036854775808", std::numeric_limits<int64_t>::max()}, 799 for (const auto& pair : atoi64_test_pairs) { 800 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(pair.first), pair.second); 803 // Ensure legacy compatibility with previous versions of Bitcoin Core's atoi64
804 for (
const auto& pair : atoi64_test_pairs) {
810 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551615"), 18
'446'744
'073'709
'551'615ULL);
811 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551616"), 18
'446'744
'073'709
'551'615ULL);
813 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-2147483649"), -2
'147'483
'648LL); 814 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-2147483648"), -2'147
'483'648LL);
816 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("2147483648"), 2'147
'483'647);
820 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967295"), 4
'294'967
'295U); 821 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("4294967296"), 4'294
'967'295U);
824 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("-32768"), -32'768);
826 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("32768"), 32'767);
831 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("65536"), 65'535U);
1022 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");
1025 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");
1026 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");
1028 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");
1030 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.");
1031 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.");
1032 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.");
1033 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.");
1038 std::vector<std::string> comments;
1039 comments.emplace_back(
"comment1");
1040 std::vector<std::string> comments2;
1041 comments2.emplace_back(
"comment1");
1122 #ifndef WIN32 // Cannot do this test on WIN32 due to lack of fork() 1137 int rv = read(fd, &ch, 1);
1149 rv = write(fd, &ch, 1);
1155 rv = write(fd, &ch, 1);
1170 fs::path dirname = m_args.GetDataDirBase() /
"lock_dir";
1176 void (*old_handler)(int) = signal(SIGCHLD, SIG_DFL);
1256 signal(SIGCHLD, old_handler);
1261 fs::remove_all(dirname);
1301 return std::string(span.
begin(), span.
end());
1312 input =
"MilkToastHoney";
1314 success =
Const(
"", sp);
1318 success =
Const(
"Milk", sp);
1322 success =
Const(
"Bread", sp);
1325 success =
Const(
"Toast", sp);
1329 success =
Const(
"Honeybadger", sp);
1332 success =
Const(
"Honey", sp);
1337 input =
"Foo(Bar(xy,z()))";
1340 success =
Func(
"FooBar", sp);
1343 success =
Func(
"Foo(", sp);
1346 success =
Func(
"Foo", sp);
1350 success =
Func(
"Bar", sp);
1354 success =
Func(
"xy", sp);
1360 input =
"(n*(n-1))/2";
1372 input =
"(aaaaa,bbbbb()),c";
1384 input =
"((a),(b),(c)),xxx";
1391 std::vector<Span<const char>> results;
1394 results =
Split(input,
'x');
1401 input =
"one#two#three";
1402 results =
Split(input,
'-');
1406 input =
"one#two#three";
1407 results =
Split(input,
'#');
1413 input =
"*foo*bar*";
1414 results =
Split(input,
'*');
1426 std::vector<std::string> result =
SplitString(
"",
'-');
1433 std::vector<std::string> result =
SplitString(
"-",
'-');
1441 std::vector<std::string> result =
SplitString(
"--",
'-');
1450 std::vector<std::string> result =
SplitString(
"abc",
'-');
1457 std::vector<std::string> result =
SplitString(
"a-b",
'-');
1465 std::vector<std::string> result =
SplitString(
"AAA",
'a');
1472 using V = std::vector<std::string>;
1473 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;") == V({
"a",
"b.c:d",
"e"}));
1474 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;:.") == V({
"a",
"b",
"c",
"d",
"e"}));
1475 BOOST_TEST(
SplitString(
"a,b.c:d;e",
"") == V({
"a,b.c:d;e"}));
1476 BOOST_TEST(
SplitString(
"aaa",
"bcdefg") == V({
"aaa"}));
1477 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0"s) == V({
"x",
"a,b"}));
1478 BOOST_TEST(
SplitString(
"x\0a,b"s,
'\0') == V({
"x",
"a,b"}));
1479 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0,"s) == V({
"x",
"a",
"b"}));
1480 BOOST_TEST(
SplitString(
"abcdefg",
"bcd") == V({
"a",
"",
"",
"efg"}));
1493 const std::string NUL(
"O\x00O", 3);
1502 const Tracker* origin;
1506 Tracker() noexcept : origin(this) {}
1507 Tracker(
const Tracker& t) noexcept : origin(
t.origin), copies(
t.copies + 1) {}
1508 Tracker(Tracker&& t) noexcept : origin(
t.origin), copies(
t.copies) {}
1509 Tracker& operator=(
const Tracker& t) noexcept
1513 copies =
t.copies + 1;
1536 auto v2 =
Vector(std::move(t2));
1541 auto v3 =
Vector(t1, std::move(t2));
1548 auto v4 =
Vector(std::move(v3[0]), v3[1], std::move(t3));
1557 auto v5 =
Cat(v1, v4);
1568 auto v6 =
Cat(std::move(v1), v3);
1577 auto v7 =
Cat(v2, std::move(v4));
1588 auto v8 =
Cat(std::move(v2), std::move(v3));
1600 const std::array<unsigned char, 32> privkey_bytes = {
1603 0xD9, 0x7F, 0x51, 0x08, 0xF1, 0x1C, 0xDA, 0x6E,
1604 0xEE, 0xBA, 0xAA, 0x42, 0x0F, 0xEF, 0x07, 0x26,
1605 0xB1, 0xF8, 0x98, 0x06, 0x0B, 0x98, 0x48, 0x9F,
1606 0xA3, 0x09, 0x84, 0x63, 0xC0, 0x03, 0x28, 0x66
1609 const std::string message =
"Trust no one";
1611 const std::string expected_signature =
1612 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=";
1615 std::string generated_signature;
1617 BOOST_REQUIRE_MESSAGE(!privkey.
IsValid(),
1618 "Confirm the private key is invalid");
1620 BOOST_CHECK_MESSAGE(!
MessageSign(privkey, message, generated_signature),
1621 "Sign with an invalid private key");
1623 privkey.
Set(privkey_bytes.begin(), privkey_bytes.end(),
true);
1625 BOOST_REQUIRE_MESSAGE(privkey.
IsValid(),
1626 "Confirm the private key is valid");
1628 BOOST_CHECK_MESSAGE(
MessageSign(privkey, message, generated_signature),
1629 "Sign with a valid private key");
1639 "signature should be irrelevant",
1645 "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
1646 "signature should be irrelevant",
1652 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1653 "invalid signature, not in base64 encoding",
1654 "message should be irrelevant"),
1659 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1660 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
1661 "message should be irrelevant"),
1666 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1667 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1668 "I never signed this"),
1673 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1674 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1680 "11canuhp9X2NocwCq7xNrQYTmUgZAnLK3",
1681 "IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=",
1688 const std::string unsigned_tx =
"...";
1689 const std::string prefixed_message =
1692 std::string(1, (
char)unsigned_tx.length()) +
1696 const uint256 message_hash1 =
Hash(prefixed_message);
1700 BOOST_CHECK_NE(message_hash1, signature_hash);
1731 BOOST_CHECK_EQUAL(ParseByteUnits("3G", noop).value(), 3ULL << 30); 1733 BOOST_CHECK_EQUAL(ParseByteUnits("4t", noop).value(), 4'000
'000'000
'000ULL); 1734 BOOST_CHECK_EQUAL(ParseByteUnits("4T", noop).value(), 4ULL << 40); 1736 // check default multiplier 1737 BOOST_CHECK_EQUAL(ParseByteUnits("5", ByteUnit::K).value(), 5ULL << 10); 1740 BOOST_CHECK(!ParseByteUnits("", noop)); 1741 BOOST_CHECK(!ParseByteUnits("foo", noop)); 1744 BOOST_CHECK(!ParseByteUnits("123m ", noop)); 1745 BOOST_CHECK(!ParseByteUnits(" 123m", noop)); 1748 BOOST_CHECK(!ParseByteUnits("-123m", noop)); 1749 BOOST_CHECK(!ParseByteUnits("+123m", noop)); 1752 BOOST_CHECK_EQUAL(ParseByteUnits("020M", noop).value(), 20ULL << 20); 1754 // fractions not allowed 1755 BOOST_CHECK(!ParseByteUnits("0.5T", noop)); 1758 BOOST_CHECK(!ParseByteUnits("18446744073709551615g", noop)); 1761 BOOST_CHECK(!ParseByteUnits("1x", noop)); 1764 BOOST_AUTO_TEST_CASE(util_ReadBinaryFile) 1766 fs::path tmpfolder = m_args.GetDataDirBase(); 1767 fs::path tmpfile = tmpfolder / "read_binary.dat"; 1768 std::string expected_text; 1769 for (int i = 0; i < 30; i++) { 1770 expected_text += "0123456789"; 1773 std::ofstream file{tmpfile}; 1774 file << expected_text; 1777 // read all contents in file 1778 auto [valid, text] = ReadBinaryFile(tmpfile); 1780 BOOST_CHECK_EQUAL(text, expected_text); 1783 // read half contents in file 1784 auto [valid, text] = ReadBinaryFile(tmpfile, expected_text.size() / 2); 1786 BOOST_CHECK_EQUAL(text, expected_text.substr(0, expected_text.size() / 2)); 1789 // read from non-existent file 1790 fs::path invalid_file = tmpfolder / "invalid_binary.dat"; 1791 auto [valid, text] = ReadBinaryFile(invalid_file); 1792 BOOST_CHECK(!valid); 1793 BOOST_CHECK(text.empty()); 1797 BOOST_AUTO_TEST_CASE(util_WriteBinaryFile) 1799 fs::path tmpfolder = m_args.GetDataDirBase(); 1800 fs::path tmpfile = tmpfolder / "write_binary.dat"; 1801 std::string expected_text = "bitcoin"; 1802 auto valid = WriteBinaryFile(tmpfile, expected_text); 1803 std::string actual_text; 1804 std::ifstream file{tmpfile}; 1805 file >> actual_text; 1807 BOOST_CHECK_EQUAL(actual_text, expected_text); 1810 BOOST_AUTO_TEST_CASE(clearshrink_test) 1813 std::vector<uint8_t> v = {1, 2, 3}; 1815 BOOST_CHECK_EQUAL(v.size(), 0); 1816 BOOST_CHECK_EQUAL(v.capacity(), 0); 1820 std::vector<bool> v = {false, true, false, false, true, true}; 1822 BOOST_CHECK_EQUAL(v.size(), 0); 1823 BOOST_CHECK_EQUAL(v.capacity(), 0); 1827 std::deque<int> v = {1, 3, 3, 7}; 1829 BOOST_CHECK_EQUAL(v.size(), 0); 1830 // std::deque has no capacity() we can observe. 1834 BOOST_AUTO_TEST_SUITE_END() void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
std::vector< std::string > SplitString(std::string_view str, char sep)
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
std::string TrimString(std::string_view str, std::string_view pattern=" \\\)
std::string FormatISO8601Date(int64_t nTime)
#define TRY_LOCK(cs, name)
constexpr C * end() const noexcept
A public key could not be recovered from the provided signature and message.
The message verification was successful.
The provided address is invalid.
The provided signature couldn't be parsed (maybe invalid base64).
bool MessageSign(const CKey &privkey, const std::string &message, std::string &signature)
Sign a message.
Span< std::byte > MakeWritableByteSpan(V &&v) noexcept
Span< const char > Expr(Span< const char > &sp)
Extract the expression that sp begins with.
const std::string MESSAGE_MAGIC
Text used to signify that a signed message follows and to prevent inadvertently signing a transaction...
std::string RemovePrefix(std::string_view str, std::string_view prefix)
bool ParseUInt64(std::string_view str, uint64_t *out)
Convert decimal string to unsigned 64-bit integer with strict parse error feedback.
std::string FormatISO8601DateTime(int64_t nTime)
ISO 8601 formatting is preferred.
MessageVerificationResult MessageVerify(const std::string &address, const std::string &signature, const std::string &message)
Verify a signed message.
static const unsigned char ParseHex_expected[65]
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
int64_t atoi64_legacy(const std::string &str)
bool Func(const std::string &str, Span< const char > &sp)
Parse a function call.
std::string LogEscapeMessage(std::string_view str)
Belts and suspenders: make sure outgoing log messages don't contain potentially suspicious characters...
std::vector< typename std::common_type< Args... >::type > Vector(Args &&... args)
Construct a vector with the specified elements.
BOOST_AUTO_TEST_CASE(util_check)
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \\\)
int64_t CAmount
Amount in satoshis (Can be negative)
std::string SanitizeString(std::string_view str, int rule)
Remove unsafe chars.
bool ParseUInt32(std::string_view str, uint32_t *out)
Convert decimal string to unsigned 32-bit integer with strict parse error feedback.
static constexpr char ExitCommand
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.
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.
LockResult LockDirectory(const fs::path &directory, const fs::path &lockfile_name, bool probe_only)
bool ParseUInt8(std::string_view str, uint8_t *out)
Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
bool Const(const std::string &str, Span< const char > &sp)
Parse a constant.
void ReleaseDirectoryLocks()
Release all directory locks.
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
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...
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
#define Assume(val)
Assume is the identity function.
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.
bool ParseFixedPoint(std::string_view val, int decimals, int64_t *amount_out)
Parse number as fixed point according to JSON number syntax.
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 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)
The message was not signed with the private key of the provided address.
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...
The provided address is valid but does not refer to a public key.
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
constexpr auto MakeUCharSpan(V &&v) -> decltype(UCharSpanCast(Span
Like the Span constructor, but for (const) unsigned char member types only.
static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
uint256 MessageHash(const std::string &message)
Hashes a message for signing and verification in a manner that prevents inadvertently signing a trans...
std::optional< std::vector< Byte > > TryParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).
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.
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
static std::string SpanToStr(const Span< const char > &span)
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
static constexpr char UnlockCommand
#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.
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.