40 #include <sys/types.h> 47 #include <boost/test/unit_test.hpp> 75 explicit NoCopyOrMove(
int i) : i{i} { }
77 NoCopyOrMove() =
delete;
78 NoCopyOrMove(
const NoCopyOrMove&) =
delete;
79 NoCopyOrMove(NoCopyOrMove&&) =
delete;
80 NoCopyOrMove& operator=(
const NoCopyOrMove&) =
delete;
81 NoCopyOrMove& operator=(NoCopyOrMove&&) =
delete;
83 operator bool()
const {
return i != 0; }
85 int get_ip1() {
return i + 1; }
89 [&]() {
Assume(get_ip1()); }();
90 return Assume(get_ip1() != 5);
98 const std::unique_ptr<int> p_two =
Assert(std::make_unique<int>(2));
100 const int two = *
Assert(p_two);
117 const int nine{*
Assert(std::optional<int>{9})};
129 BOOST_ERROR(
"break was swallowed!");
139 BOOST_ERROR(
"break was swallowed!");
143 constexpr
char HEX_PARSE_INPUT[] =
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f";
145 0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
146 0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
147 0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
148 0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
154 std::vector<unsigned char>
result;
158 constexpr std::array<std::byte, 65> hex_literal_array{
operator""_hex<util::detail::Hex(HEX_PARSE_INPUT)>()};
160 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
162 const std::vector<std::byte> hex_literal_vector{
operator""_hex_v<util::detail::Hex(HEX_PARSE_INPUT)>()};
164 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
166 constexpr std::array<uint8_t, 65> hex_literal_array_uint8{
operator""_hex_u8<util::detail::Hex(HEX_PARSE_INPUT)>()};
167 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_array_uint8.begin(), hex_literal_array_uint8.end(), expected.begin(), expected.end());
169 result =
operator""_hex_v_u8<util::detail::Hex(HEX_PARSE_INPUT)>();
170 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
173 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
176 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
179 expected = {0x12, 0x34, 0x56, 0x78};
181 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
182 result = TryParseHex<uint8_t>(
"12 34 56 78").value();
183 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
186 expected = {0x89, 0x34, 0x56, 0x78};
188 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
189 result = TryParseHex<uint8_t>(
" 89 34 56 78").value();
190 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
193 expected = {0xff, 0xaa};
195 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
196 result = TryParseHex<uint8_t>(
" Ff aA ").value();
197 BOOST_CHECK_EQUAL_COLLECTIONS(
result.begin(),
result.end(), expected.begin(), expected.end());
200 static_assert(
""_hex.empty());
201 static_assert(
""_hex_u8.empty());
212 const std::string with_embedded_null{
" 11 "s 243 constexpr std::string_view out_exp{
"04678afdb0"};
254 auto input = std::string();
255 for (
size_t i=0; i<256; ++i) {
256 input.push_back(static_cast<char>(i));
260 BOOST_TEST_REQUIRE(hex.size() == 512);
261 static constexpr
auto hexmap = std::string_view(
"0123456789abcdef");
262 for (
size_t i = 0; i < 256; ++i) {
263 auto upper = hexmap.find(hex[i * 2]);
264 auto lower = hexmap.find(hex[i * 2 + 1]);
265 BOOST_TEST_REQUIRE(upper != std::string_view::npos);
266 BOOST_TEST_REQUIRE(lower != std::string_view::npos);
267 BOOST_TEST_REQUIRE(i == upper*16 + lower);
274 std::array mut_arr{uint8_t{0xaa}, uint8_t{0xbb}};
276 mut_bytes[1] = std::byte{0x11};
289 const auto op_upper = [](
const std::string&
s) {
return ToUpper(
s); };
297 const std::string original(
"A test \"%s\" string '%s'.");
298 auto test_replaceall = [&original](
const std::string& search,
const std::string& substitute,
const std::string& expected) {
299 auto test = original;
304 test_replaceall(
"",
"foo", original);
305 test_replaceall(original,
"foo",
"foo");
306 test_replaceall(
"%s",
"foo",
"A test \"foo\" string 'foo'.");
307 test_replaceall(
"\"",
"foo",
"A test foo%sfoo string '%s'.");
308 test_replaceall(
"'",
"foo",
"A test \"%s\" string foo%sfoo.");
323 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));
356 const std::string valid{
"2000-01-01T00:00:01Z"};
358 for (
auto mut{0U}; mut < valid.size(); ++mut) {
359 std::string invalid{valid};
430 BOOST_CHECK_EQUAL(ParseMoney("12345.").value(), COIN * 12345); 432 BOOST_CHECK_EQUAL(ParseMoney("12345.6789").value(), (COIN/10000)*123456789); 434 BOOST_CHECK_EQUAL(ParseMoney("10000000.00").value(), COIN*10000000); 435 BOOST_CHECK_EQUAL(ParseMoney("1000000.00").value(), COIN*1000000); 436 BOOST_CHECK_EQUAL(ParseMoney("100000.00").value(), COIN*100000); 437 BOOST_CHECK_EQUAL(ParseMoney("10000.00").value(), COIN*10000); 438 BOOST_CHECK_EQUAL(ParseMoney("1000.00").value(), COIN*1000); 439 BOOST_CHECK_EQUAL(ParseMoney("100.00").value(), COIN*100); 440 BOOST_CHECK_EQUAL(ParseMoney("10.00").value(), COIN*10); 441 BOOST_CHECK_EQUAL(ParseMoney("1.00").value(), COIN); 442 BOOST_CHECK_EQUAL(ParseMoney("1").value(), COIN); 443 BOOST_CHECK_EQUAL(ParseMoney(" 1").value(), COIN); 444 BOOST_CHECK_EQUAL(ParseMoney("1 ").value(), COIN); 445 BOOST_CHECK_EQUAL(ParseMoney(" 1 ").value(), COIN); 446 BOOST_CHECK_EQUAL(ParseMoney("0.1").value(), COIN/10); 447 BOOST_CHECK_EQUAL(ParseMoney("0.01").value(), COIN/100); 448 BOOST_CHECK_EQUAL(ParseMoney("0.001").value(), COIN/1000); 449 BOOST_CHECK_EQUAL(ParseMoney("0.0001").value(), COIN/10000); 450 BOOST_CHECK_EQUAL(ParseMoney("0.00001").value(), COIN/100000); 451 BOOST_CHECK_EQUAL(ParseMoney("0.000001").value(), COIN/1000000); 452 BOOST_CHECK_EQUAL(ParseMoney("0.0000001").value(), COIN/10000000); 453 BOOST_CHECK_EQUAL(ParseMoney("0.00000001").value(), COIN/100000000); 454 BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001 ").value(), COIN/100000000); 455 BOOST_CHECK_EQUAL(ParseMoney("0.00000001 ").value(), COIN/100000000); 456 BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001").value(), COIN/100000000); 458 // Parsing amount that cannot be represented should fail 459 BOOST_CHECK(!ParseMoney("100000000.00")); 460 BOOST_CHECK(!ParseMoney("0.000000001")); 462 // Parsing empty string should fail 463 BOOST_CHECK(!ParseMoney("")); 464 BOOST_CHECK(!ParseMoney(" ")); 465 BOOST_CHECK(!ParseMoney(" ")); 467 // Parsing two numbers should fail 468 BOOST_CHECK(!ParseMoney("..")); 469 BOOST_CHECK(!ParseMoney("0..0")); 470 BOOST_CHECK(!ParseMoney("1 2")); 471 BOOST_CHECK(!ParseMoney(" 1 2 ")); 472 BOOST_CHECK(!ParseMoney(" 1.2 3 ")); 473 BOOST_CHECK(!ParseMoney(" 1 2.3 ")); 475 // Embedded whitespace should fail 476 BOOST_CHECK(!ParseMoney(" -1 .2 ")); 477 BOOST_CHECK(!ParseMoney(" 1 .2 ")); 478 BOOST_CHECK(!ParseMoney(" +1 .2 ")); 480 // Attempted 63 bit overflow should fail 481 BOOST_CHECK(!ParseMoney("92233720368.54775808")); 483 // Parsing negative amounts must fail 484 BOOST_CHECK(!ParseMoney("-1")); 486 // Parsing strings with embedded NUL characters should fail 487 BOOST_CHECK(!ParseMoney("\0-1"s)); 488 BOOST_CHECK(!ParseMoney(STRING_WITH_EMBEDDED_NULL_CHAR)); 489 BOOST_CHECK(!ParseMoney("1\0"s)); 492 BOOST_AUTO_TEST_CASE(util_IsHex) 494 BOOST_CHECK(IsHex("00")); 495 BOOST_CHECK(IsHex("00112233445566778899aabbccddeeffAABBCCDDEEFF")); 496 BOOST_CHECK(IsHex("ff")); 497 BOOST_CHECK(IsHex("FF")); 499 BOOST_CHECK(!IsHex("")); 500 BOOST_CHECK(!IsHex("0")); 501 BOOST_CHECK(!IsHex("a")); 502 BOOST_CHECK(!IsHex("eleven")); 503 BOOST_CHECK(!IsHex("00xx00")); 504 BOOST_CHECK(!IsHex("0x0000")); 507 BOOST_AUTO_TEST_CASE(util_seed_insecure_rand) 509 SeedRandomForTest(SeedRand::ZEROS); 510 for (int mod=2;mod<11;mod++) 513 // Really rough binomial confidence approximation. 514 int err = 30*10000./mod*sqrt((1./mod*(1-1./mod))/10000.); 515 //mask is 2^ceil(log2(mod))-1 516 while(mask<mod-1)mask=(mask<<1)+1; 519 //How often does it get a zero from the uniform range [0,mod)? 520 for (int i = 0; i < 10000; i++) { 523 rval=m_rng.rand32()&mask; 524 }while(rval>=(uint32_t)mod); 527 BOOST_CHECK(count<=10000/mod+err); 528 BOOST_CHECK(count>=10000/mod-err); 532 BOOST_AUTO_TEST_CASE(util_TimingResistantEqual) 534 BOOST_CHECK(TimingResistantEqual(std::string(""), std::string(""))); 535 BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string(""))); 536 BOOST_CHECK(!TimingResistantEqual(std::string(""), std::string("abc"))); 537 BOOST_CHECK(!TimingResistantEqual(std::string("a"), std::string("aa"))); 538 BOOST_CHECK(!TimingResistantEqual(std::string("aa"), std::string("a"))); 539 BOOST_CHECK(TimingResistantEqual(std::string("abc"), std::string("abc"))); 540 BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string("aba"))); 543 /* Test strprintf formatting directives. 544 * Put a string before and after to ensure sanity of element sizes on stack. */ 545 #define B "check_prefix" 546 #define E "check_postfix" 547 BOOST_AUTO_TEST_CASE(strprintf_numbers) 549 int64_t s64t = -9223372036854775807LL; /* signed 64 bit test value */ 550 uint64_t u64t = 18446744073709551615ULL; /* unsigned 64 bit test value */ 551 BOOST_CHECK(strprintf("%s %d %s", B, s64t, E) == B" -9223372036854775807 " E); 552 BOOST_CHECK(strprintf("%s %u %s", B, u64t, E) == B" 18446744073709551615 " E); 553 BOOST_CHECK(strprintf("%s %x %s", B, u64t, E) == B" ffffffffffffffff " E); 555 size_t st = 12345678; /* unsigned size_t test value */ 556 ssize_t sst = -12345678; /* signed size_t test value */ 557 BOOST_CHECK(strprintf("%s %d %s", B, sst, E) == B" -12345678 " E); 558 BOOST_CHECK(strprintf("%s %u %s", B, st, E) == B" 12345678 " E); 559 BOOST_CHECK(strprintf("%s %x %s", B, st, E) == B" bc614e " E); 561 ptrdiff_t pt = 87654321; /* positive ptrdiff_t test value */ 562 ptrdiff_t spt = -87654321; /* negative ptrdiff_t test value */ 563 BOOST_CHECK(strprintf("%s %d %s", B, spt, E) == B" -87654321 " E); 564 BOOST_CHECK(strprintf("%s %u %s", B, pt, E) == B" 87654321 " E); 565 BOOST_CHECK(strprintf("%s %x %s", B, pt, E) == B" 5397fb1 " E); 570 BOOST_AUTO_TEST_CASE(util_time_GetTime) 573 // Check that mock time does not change after a sleep 574 for (const auto& num_sleep : {0ms, 1ms}) { 575 UninterruptibleSleep(num_sleep); 576 BOOST_CHECK_EQUAL(111, GetTime()); // Deprecated time getter 577 BOOST_CHECK_EQUAL(111, Now<NodeSeconds>().time_since_epoch().count()); 578 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now())); 579 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<SecondsDouble>(Now<NodeSeconds>())); 580 BOOST_CHECK_EQUAL(111, GetTime<std::chrono::seconds>().count()); 581 BOOST_CHECK_EQUAL(111000, GetTime<std::chrono::milliseconds>().count()); 582 BOOST_CHECK_EQUAL(111000, TicksSinceEpoch<std::chrono::milliseconds>(NodeClock::now())); 583 BOOST_CHECK_EQUAL(111000000, GetTime<std::chrono::microseconds>().count()); 587 // Check that steady time and system time changes after a sleep 588 const auto steady_ms_0 = Now<SteadyMilliseconds>(); 589 const auto steady_0 = std::chrono::steady_clock::now(); 590 const auto ms_0 = GetTime<std::chrono::milliseconds>(); 591 const auto us_0 = GetTime<std::chrono::microseconds>(); 592 UninterruptibleSleep(1ms); 593 BOOST_CHECK(steady_ms_0 < Now<SteadyMilliseconds>()); 594 BOOST_CHECK(steady_0 + 1ms <= std::chrono::steady_clock::now()); 595 BOOST_CHECK(ms_0 < GetTime<std::chrono::milliseconds>()); 596 BOOST_CHECK(us_0 < GetTime<std::chrono::microseconds>()); 599 BOOST_AUTO_TEST_CASE(test_IsDigit) 601 BOOST_CHECK_EQUAL(IsDigit('0
'), true); 602 BOOST_CHECK_EQUAL(IsDigit('1
'), true); 603 BOOST_CHECK_EQUAL(IsDigit('8
'), true); 604 BOOST_CHECK_EQUAL(IsDigit('9
'), true); 606 BOOST_CHECK_EQUAL(IsDigit('0
' - 1), false); 607 BOOST_CHECK_EQUAL(IsDigit('9
' + 1), false); 608 BOOST_CHECK_EQUAL(IsDigit(0), false); 609 BOOST_CHECK_EQUAL(IsDigit(1), false); 610 BOOST_CHECK_EQUAL(IsDigit(8), false); 611 BOOST_CHECK_EQUAL(IsDigit(9), false); 614 /* Check for overflow */ 615 template <typename T> 616 static void TestAddMatrixOverflow() 618 constexpr T MAXI{std::numeric_limits<T>::max()}; 619 BOOST_CHECK(!CheckedAdd(T{1}, MAXI)); 620 BOOST_CHECK(!CheckedAdd(MAXI, MAXI)); 621 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI)); 622 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(MAXI, MAXI)); 624 BOOST_CHECK_EQUAL(0, CheckedAdd(T{0}, T{0}).value()); 625 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{0}, MAXI).value()); 626 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{1}, MAXI - 1).value()); 627 BOOST_CHECK_EQUAL(MAXI - 1, CheckedAdd(T{1}, MAXI - 2).value()); 628 BOOST_CHECK_EQUAL(0, SaturatingAdd(T{0}, T{0})); 629 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{0}, MAXI)); 630 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI - 1)); 631 BOOST_CHECK_EQUAL(MAXI - 1, SaturatingAdd(T{1}, MAXI - 2)); 634 /* Check for overflow or underflow */ 635 template <typename T> 636 static void TestAddMatrix() 638 TestAddMatrixOverflow<T>(); 639 constexpr T MINI{std::numeric_limits<T>::min()}; 640 constexpr T MAXI{std::numeric_limits<T>::max()}; 641 BOOST_CHECK(!CheckedAdd(T{-1}, MINI)); 642 BOOST_CHECK(!CheckedAdd(MINI, MINI)); 643 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI)); 644 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(MINI, MINI)); 646 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{0}, MINI).value()); 647 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{-1}, MINI + 1).value()); 648 BOOST_CHECK_EQUAL(-1, CheckedAdd(MINI, MAXI).value()); 649 BOOST_CHECK_EQUAL(MINI + 1, CheckedAdd(T{-1}, MINI + 2).value()); 650 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{0}, MINI)); 651 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI + 1)); 652 BOOST_CHECK_EQUAL(MINI + 1, SaturatingAdd(T{-1}, MINI + 2)); 653 BOOST_CHECK_EQUAL(-1, SaturatingAdd(MINI, MAXI)); 656 BOOST_AUTO_TEST_CASE(util_overflow) 658 TestAddMatrixOverflow<unsigned>(); 659 TestAddMatrix<signed>(); 662 BOOST_AUTO_TEST_CASE(test_ParseInt32) 666 BOOST_CHECK(ParseInt32("1234", nullptr)); 667 BOOST_CHECK(ParseInt32("0", &n) && n == 0); 668 BOOST_CHECK(ParseInt32("1234", &n) && n == 1234); 669 BOOST_CHECK(ParseInt32("01234", &n) && n == 1234); // no octal 670 BOOST_CHECK(ParseInt32("2147483647", &n) && n == 2147483647); 671 BOOST_CHECK(ParseInt32("-2147483648", &n) && n == (-2147483647 - 1)); // (-2147483647 - 1) equals INT_MIN 672 BOOST_CHECK(ParseInt32("-1234", &n) && n == -1234); 673 BOOST_CHECK(ParseInt32("00000000000000001234", &n) && n == 1234); 674 BOOST_CHECK(ParseInt32("-00000000000000001234", &n) && n == -1234); 675 BOOST_CHECK(ParseInt32("00000000000000000000", &n) && n == 0); 676 BOOST_CHECK(ParseInt32("-00000000000000000000", &n) && n == 0); 678 BOOST_CHECK(!ParseInt32("", &n)); 679 BOOST_CHECK(!ParseInt32(" 1", &n)); // no padding inside 680 BOOST_CHECK(!ParseInt32("1 ", &n)); 681 BOOST_CHECK(!ParseInt32("++1", &n)); 682 BOOST_CHECK(!ParseInt32("+-1", &n)); 683 BOOST_CHECK(!ParseInt32("-+1", &n)); 684 BOOST_CHECK(!ParseInt32("--1", &n)); 685 BOOST_CHECK(!ParseInt32("1a", &n)); 686 BOOST_CHECK(!ParseInt32("aap", &n)); 687 BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex 688 BOOST_CHECK(!ParseInt32(STRING_WITH_EMBEDDED_NULL_CHAR, &n)); 689 // Overflow and underflow 690 BOOST_CHECK(!ParseInt32("-2147483649", nullptr)); 691 BOOST_CHECK(!ParseInt32("2147483648", nullptr)); 692 BOOST_CHECK(!ParseInt32("-32482348723847471234", nullptr)); 693 BOOST_CHECK(!ParseInt32("32482348723847471234", nullptr)); 696 template <typename T> 697 static void RunToIntegralTests() 699 BOOST_CHECK(!ToIntegral<T>(STRING_WITH_EMBEDDED_NULL_CHAR)); 700 BOOST_CHECK(!ToIntegral<T>(" 1")); 701 BOOST_CHECK(!ToIntegral<T>("1 ")); 702 BOOST_CHECK(!ToIntegral<T>("1a")); 703 BOOST_CHECK(!ToIntegral<T>("1.1")); 704 BOOST_CHECK(!ToIntegral<T>("1.9")); 705 BOOST_CHECK(!ToIntegral<T>("+01.9")); 706 BOOST_CHECK(!ToIntegral<T>("-")); 707 BOOST_CHECK(!ToIntegral<T>("+")); 708 BOOST_CHECK(!ToIntegral<T>(" -1")); 709 BOOST_CHECK(!ToIntegral<T>("-1 ")); 710 BOOST_CHECK(!ToIntegral<T>(" -1 ")); 711 BOOST_CHECK(!ToIntegral<T>("+1")); 712 BOOST_CHECK(!ToIntegral<T>(" +1")); 713 BOOST_CHECK(!ToIntegral<T>(" +1 ")); 714 BOOST_CHECK(!ToIntegral<T>("+-1")); 715 BOOST_CHECK(!ToIntegral<T>("-+1")); 716 BOOST_CHECK(!ToIntegral<T>("++1")); 717 BOOST_CHECK(!ToIntegral<T>("--1")); 718 BOOST_CHECK(!ToIntegral<T>("")); 719 BOOST_CHECK(!ToIntegral<T>("aap")); 720 BOOST_CHECK(!ToIntegral<T>("0x1")); 721 BOOST_CHECK(!ToIntegral<T>("-32482348723847471234")); 722 BOOST_CHECK(!ToIntegral<T>("32482348723847471234")); 725 BOOST_AUTO_TEST_CASE(test_ToIntegral) 727 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("1234").value(), 1'234);
730 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000001234").value(), 1'234);
732 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000000000").value(), 0); 733 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-00000000000000000000").value(), 0); 734 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1234").value(), -1'234);
737 RunToIntegralTests<uint64_t>();
738 RunToIntegralTests<int64_t>();
739 RunToIntegralTests<uint32_t>();
740 RunToIntegralTests<int32_t>();
741 RunToIntegralTests<uint16_t>();
742 RunToIntegralTests<int16_t>();
743 RunToIntegralTests<uint8_t>();
744 RunToIntegralTests<int8_t>();
746 BOOST_CHECK(!ToIntegral<int64_t>(
"-9223372036854775809"));
747 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"-9223372036854775808").value(), -9
'223'372
'036'854
'775'807LL - 1LL);
748 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"9223372036854775807").value(), 9
'223'372
'036'854
'775'807);
749 BOOST_CHECK(!ToIntegral<int64_t>(
"9223372036854775808"));
753 BOOST_CHECK_EQUAL(ToIntegral<uint64_t>(
"18446744073709551615").value(), 18
'446'744
'073'709
'551'615ULL);
754 BOOST_CHECK(!ToIntegral<uint64_t>(
"18446744073709551616"));
758 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("2147483647").value(), 2'147
'483'647);
764 BOOST_CHECK(!ToIntegral<uint32_t>("4294967296")); 766 BOOST_CHECK(!ToIntegral<int16_t>("-32769")); 767 BOOST_CHECK_EQUAL(ToIntegral<int16_t>("-32768").value(), -32'768);
769 BOOST_CHECK(!ToIntegral<int16_t>("32768")); 771 BOOST_CHECK(!ToIntegral<uint16_t>("-1")); 772 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("0").value(), 0U); 773 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("65535").value(), 65'535U);
789 return strtoll(str.c_str(),
nullptr, 10);
795 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0"), 0); 796 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("01234"), 1'234);
798 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" 1"), 1); 799 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1 "), 1); 800 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1a"), 1); 801 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.1"), 1); 802 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.9"), 1); 803 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+01.9"), 1); 804 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1"), -1); 805 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1"), -1); 806 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1 "), -1); 807 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1 "), -1); 808 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+1"), 1); 809 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1"), 1); 810 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1 "), 1); 812 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+-1"), 0); 813 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-+1"), 0); 814 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("++1"), 0); 815 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("--1"), 0); 816 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(""), 0); 817 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("aap"), 0); 818 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0x1"), 0); 819 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-32482348723847471234"), -2'147
'483'647 - 1);
820 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"32482348723847471234"), 2
'147'483
'647); 822 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775809"), -9'223
'372'036
'854'775
'807LL - 1LL); 823 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775808"), -9'223
'372'036
'854'775
'807LL - 1LL); 824 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775807"), 9'223
'372'036
'854'775
'807); 825 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775808"), 9'223
'372'036
'854'775
'807); 827 std::map<std::string, int64_t> atoi64_test_pairs = { 828 {"-9223372036854775809", std::numeric_limits<int64_t>::min()}, 829 {"-9223372036854775808", -9'223
'372'036
'854'775
'807LL - 1LL}, 830 {"9223372036854775807", 9'223
'372'036
'854'775
'807}, 831 {"9223372036854775808", std::numeric_limits<int64_t>::max()}, 838 for (const auto& pair : atoi64_test_pairs) { 839 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(pair.first), pair.second); 842 // Ensure legacy compatibility with previous versions of Bitcoin Core's atoi64
843 for (
const auto& pair : atoi64_test_pairs) {
849 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551615"), 18
'446'744
'073'709
'551'615ULL);
850 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551616"), 18
'446'744
'073'709
'551'615ULL);
852 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-2147483649"), -2
'147'483
'648LL); 853 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-2147483648"), -2'147
'483'648LL);
855 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("2147483648"), 2'147
'483'647);
859 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967295"), 4
'294'967
'295U); 860 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("4294967296"), 4'294
'967'295U);
863 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("-32768"), -32'768);
865 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("32768"), 32'767);
870 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("65536"), 65'535U);
1061 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");
1064 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");
1065 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");
1067 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");
1069 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.");
1070 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.");
1071 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.");
1072 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.");
1077 std::vector<std::string> comments;
1078 comments.emplace_back(
"comment1");
1079 std::vector<std::string> comments2;
1080 comments2.emplace_back(
"comment1");
1161 #ifndef WIN32 // Cannot do this test on WIN32 due to lack of fork() 1176 int rv = read(fd, &ch, 1);
1188 rv = write(fd, &ch, 1);
1194 rv = write(fd, &ch, 1);
1209 fs::path dirname = m_args.GetDataDirBase() /
"lock_dir";
1215 void (*old_handler)(int) = signal(SIGCHLD, SIG_DFL);
1295 signal(SIGCHLD, old_handler);
1300 fs::remove_all(dirname);
1340 return std::string(span.
begin(), span.
end());
1351 input =
"MilkToastHoney";
1353 success =
Const(
"", sp);
1357 success =
Const(
"Milk", sp);
1361 success =
Const(
"Bread", sp);
1364 success =
Const(
"Toast", sp);
1368 success =
Const(
"Honeybadger", sp);
1371 success =
Const(
"Honey", sp);
1376 input =
"Foo(Bar(xy,z()))";
1379 success =
Func(
"FooBar", sp);
1382 success =
Func(
"Foo(", sp);
1385 success =
Func(
"Foo", sp);
1389 success =
Func(
"Bar", sp);
1393 success =
Func(
"xy", sp);
1399 input =
"(n*(n-1))/2";
1411 input =
"(aaaaa,bbbbb()),c";
1423 input =
"((a),(b),(c)),xxx";
1430 std::vector<Span<const char>> results;
1433 results =
Split(input,
'x');
1440 input =
"one#two#three";
1441 results =
Split(input,
'-');
1445 input =
"one#two#three";
1446 results =
Split(input,
'#');
1452 input =
"*foo*bar*";
1453 results =
Split(input,
'*');
1511 using V = std::vector<std::string>;
1512 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;") == V({
"a",
"b.c:d",
"e"}));
1513 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;:.") == V({
"a",
"b",
"c",
"d",
"e"}));
1514 BOOST_TEST(
SplitString(
"a,b.c:d;e",
"") == V({
"a,b.c:d;e"}));
1515 BOOST_TEST(
SplitString(
"aaa",
"bcdefg") == V({
"aaa"}));
1516 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0"s) == V({
"x",
"a,b"}));
1517 BOOST_TEST(
SplitString(
"x\0a,b"s,
'\0') == V({
"x",
"a,b"}));
1518 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0,"s) == V({
"x",
"a",
"b"}));
1519 BOOST_TEST(
SplitString(
"abcdefg",
"bcd") == V({
"a",
"",
"",
"efg"}));
1532 const std::string NUL(
"O\x00O", 3);
1541 const Tracker* origin;
1545 Tracker() noexcept : origin(this) {}
1546 Tracker(
const Tracker& t) noexcept : origin(
t.origin), copies(
t.copies + 1) {}
1547 Tracker(Tracker&& t) noexcept : origin(
t.origin), copies(
t.copies) {}
1548 Tracker& operator=(
const Tracker& t) noexcept
1552 copies =
t.copies + 1;
1575 auto v2 =
Vector(std::move(t2));
1580 auto v3 =
Vector(t1, std::move(t2));
1587 auto v4 =
Vector(std::move(v3[0]), v3[1], std::move(t3));
1596 auto v5 =
Cat(v1, v4);
1607 auto v6 =
Cat(std::move(v1), v3);
1616 auto v7 =
Cat(v2, std::move(v4));
1627 auto v8 =
Cat(std::move(v2), std::move(v3));
1639 const std::array<unsigned char, 32> privkey_bytes = {
1642 0xD9, 0x7F, 0x51, 0x08, 0xF1, 0x1C, 0xDA, 0x6E,
1643 0xEE, 0xBA, 0xAA, 0x42, 0x0F, 0xEF, 0x07, 0x26,
1644 0xB1, 0xF8, 0x98, 0x06, 0x0B, 0x98, 0x48, 0x9F,
1645 0xA3, 0x09, 0x84, 0x63, 0xC0, 0x03, 0x28, 0x66
1648 const std::string message =
"Trust no one";
1650 const std::string expected_signature =
1651 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=";
1654 std::string generated_signature;
1656 BOOST_REQUIRE_MESSAGE(!privkey.
IsValid(),
1657 "Confirm the private key is invalid");
1659 BOOST_CHECK_MESSAGE(!
MessageSign(privkey, message, generated_signature),
1660 "Sign with an invalid private key");
1662 privkey.
Set(privkey_bytes.begin(), privkey_bytes.end(),
true);
1664 BOOST_REQUIRE_MESSAGE(privkey.
IsValid(),
1665 "Confirm the private key is valid");
1667 BOOST_CHECK_MESSAGE(
MessageSign(privkey, message, generated_signature),
1668 "Sign with a valid private key");
1678 "signature should be irrelevant",
1684 "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
1685 "signature should be irrelevant",
1691 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1692 "invalid signature, not in base64 encoding",
1693 "message should be irrelevant"),
1698 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1699 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
1700 "message should be irrelevant"),
1705 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1706 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1707 "I never signed this"),
1712 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1713 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1719 "11canuhp9X2NocwCq7xNrQYTmUgZAnLK3",
1720 "IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=",
1727 const std::string unsigned_tx =
"...";
1728 const std::string prefixed_message =
1731 std::string(1, (
char)unsigned_tx.length()) +
1735 const uint256 message_hash1 =
Hash(prefixed_message);
1739 BOOST_CHECK_NE(message_hash1, signature_hash);
1770 BOOST_CHECK_EQUAL(ParseByteUnits("3G", noop).value(), 3ULL << 30); 1772 BOOST_CHECK_EQUAL(ParseByteUnits("4t", noop).value(), 4'000
'000'000
'000ULL); 1773 BOOST_CHECK_EQUAL(ParseByteUnits("4T", noop).value(), 4ULL << 40); 1775 // check default multiplier 1776 BOOST_CHECK_EQUAL(ParseByteUnits("5", ByteUnit::K).value(), 5ULL << 10); 1779 BOOST_CHECK(!ParseByteUnits("", noop)); 1780 BOOST_CHECK(!ParseByteUnits("foo", noop)); 1783 BOOST_CHECK(!ParseByteUnits("123m ", noop)); 1784 BOOST_CHECK(!ParseByteUnits(" 123m", noop)); 1787 BOOST_CHECK(!ParseByteUnits("-123m", noop)); 1788 BOOST_CHECK(!ParseByteUnits("+123m", noop)); 1791 BOOST_CHECK_EQUAL(ParseByteUnits("020M", noop).value(), 20ULL << 20); 1793 // fractions not allowed 1794 BOOST_CHECK(!ParseByteUnits("0.5T", noop)); 1797 BOOST_CHECK(!ParseByteUnits("18446744073709551615g", noop)); 1800 BOOST_CHECK(!ParseByteUnits("1x", noop)); 1803 BOOST_AUTO_TEST_CASE(util_ReadBinaryFile) 1805 fs::path tmpfolder = m_args.GetDataDirBase(); 1806 fs::path tmpfile = tmpfolder / "read_binary.dat"; 1807 std::string expected_text; 1808 for (int i = 0; i < 30; i++) { 1809 expected_text += "0123456789"; 1812 std::ofstream file{tmpfile}; 1813 file << expected_text; 1816 // read all contents in file 1817 auto [valid, text] = ReadBinaryFile(tmpfile); 1819 BOOST_CHECK_EQUAL(text, expected_text); 1822 // read half contents in file 1823 auto [valid, text] = ReadBinaryFile(tmpfile, expected_text.size() / 2); 1825 BOOST_CHECK_EQUAL(text, expected_text.substr(0, expected_text.size() / 2)); 1828 // read from non-existent file 1829 fs::path invalid_file = tmpfolder / "invalid_binary.dat"; 1830 auto [valid, text] = ReadBinaryFile(invalid_file); 1831 BOOST_CHECK(!valid); 1832 BOOST_CHECK(text.empty()); 1836 BOOST_AUTO_TEST_CASE(util_WriteBinaryFile) 1838 fs::path tmpfolder = m_args.GetDataDirBase(); 1839 fs::path tmpfile = tmpfolder / "write_binary.dat"; 1840 std::string expected_text = "bitcoin"; 1841 auto valid = WriteBinaryFile(tmpfile, expected_text); 1842 std::string actual_text; 1843 std::ifstream file{tmpfile}; 1844 file >> actual_text; 1846 BOOST_CHECK_EQUAL(actual_text, expected_text); 1849 BOOST_AUTO_TEST_CASE(clearshrink_test) 1852 std::vector<uint8_t> v = {1, 2, 3}; 1854 BOOST_CHECK_EQUAL(v.size(), 0); 1855 BOOST_CHECK_EQUAL(v.capacity(), 0); 1859 std::vector<bool> v = {false, true, false, false, true, true}; 1861 BOOST_CHECK_EQUAL(v.size(), 0); 1862 BOOST_CHECK_EQUAL(v.capacity(), 0); 1866 std::deque<int> v = {1, 3, 3, 7}; 1868 BOOST_CHECK_EQUAL(v.size(), 0); 1869 // std::deque has no capacity() we can observe. 1873 template <typename T> 1874 void TestCheckedLeftShift() 1876 constexpr auto MAX{std::numeric_limits<T>::max()}; 1879 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(0, 1), 0); 1880 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(0, 127), 0); 1881 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(1, 1), 2); 1882 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(2, 2), 8); 1883 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(MAX >> 1, 1), MAX - 1); 1886 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1); 1889 BOOST_CHECK(!CheckedLeftShift<T>((MAX >> 1) + 1, 1)); 1890 BOOST_CHECK(!CheckedLeftShift<T>(MAX, 1)); 1891 BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits)); 1892 BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits + 1)); 1894 if constexpr (std::is_signed_v<T>) { 1895 constexpr auto MIN{std::numeric_limits<T>::min()}; 1897 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(-1, 1), -2); 1898 BOOST_CHECK_EQUAL(CheckedLeftShift<T>((MIN >> 2), 1), MIN / 2); 1899 BOOST_CHECK_EQUAL(CheckedLeftShift<T>((MIN >> 1) + 1, 1), MIN + 2); 1900 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(MIN >> 1, 1), MIN); 1901 // Overflow negative 1902 BOOST_CHECK(!CheckedLeftShift<T>((MIN >> 1) - 1, 1)); 1903 BOOST_CHECK(!CheckedLeftShift<T>(MIN >> 1, 2)); 1904 BOOST_CHECK(!CheckedLeftShift<T>(-1, 100)); 1908 template <typename T> 1909 void TestSaturatingLeftShift() 1911 constexpr auto MAX{std::numeric_limits<T>::max()}; 1914 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(0, 1), 0); 1915 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(0, 127), 0); 1916 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, 1), 2); 1917 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(2, 2), 8); 1918 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MAX >> 1, 1), MAX - 1); 1921 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1); 1924 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MAX >> 1) + 1, 1), MAX); 1925 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MAX, 1), MAX); 1926 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits), MAX); 1927 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits + 1), MAX); 1929 if constexpr (std::is_signed_v<T>) { 1930 constexpr auto MIN{std::numeric_limits<T>::min()}; 1932 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(-1, 1), -2); 1933 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 2), 1), MIN / 2); 1934 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 1) + 1, 1), MIN + 2); 1935 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MIN >> 1, 1), MIN); 1936 // Saturation negative 1937 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 1) - 1, 1), MIN); 1938 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MIN >> 1, 2), MIN); 1939 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(-1, 100), MIN); 1943 BOOST_AUTO_TEST_CASE(checked_left_shift_test) 1945 TestCheckedLeftShift<uint8_t>(); 1946 TestCheckedLeftShift<int8_t>(); 1947 TestCheckedLeftShift<size_t>(); 1948 TestCheckedLeftShift<uint64_t>(); 1949 TestCheckedLeftShift<int64_t>(); 1952 BOOST_AUTO_TEST_CASE(saturating_left_shift_test) 1954 TestSaturatingLeftShift<uint8_t>(); 1955 TestSaturatingLeftShift<int8_t>(); 1956 TestSaturatingLeftShift<size_t>(); 1957 TestSaturatingLeftShift<uint64_t>(); 1958 TestSaturatingLeftShift<int64_t>(); 1961 BOOST_AUTO_TEST_CASE(mib_string_literal_test) 1963 BOOST_CHECK_EQUAL(0_MiB, 0); 1964 BOOST_CHECK_EQUAL(1_MiB, 1024 * 1024); 1965 const auto max_mib{std::numeric_limits<size_t>::max() >> 20}; 1966 BOOST_CHECK_EXCEPTION(operator""_MiB(static_cast<unsigned long long>(max_mib) + 1), std::overflow_error, HasReason("MiB value too large for size_t byte conversion")); 1969 BOOST_AUTO_TEST_SUITE_END() void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
constexpr uint8_t HEX_PARSE_OUTPUT[]
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.
constexpr char HEX_PARSE_INPUT[]
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.
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.
consteval uint8_t ConstevalHexDigit(const char c)
consteval version of HexDigit() without the lookup table.
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
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
std::optional< int64_t > ParseISO8601DateTime(std::string_view str)
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.
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
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.