38 #include <sys/types.h> 45 #include <boost/test/unit_test.hpp> 62 explicit NoCopyOrMove(
int i) : i{i} { }
64 NoCopyOrMove() =
delete;
65 NoCopyOrMove(
const NoCopyOrMove&) =
delete;
66 NoCopyOrMove(NoCopyOrMove&&) =
delete;
67 NoCopyOrMove& operator=(
const NoCopyOrMove&) =
delete;
68 NoCopyOrMove& operator=(NoCopyOrMove&&) =
delete;
70 operator bool()
const {
return i != 0; }
72 int get_ip1() {
return i + 1; }
76 [&]() {
Assume(get_ip1()); }();
77 return Assume(get_ip1() != 5);
85 const std::unique_ptr<int> p_two =
Assert(std::make_unique<int>(2));
87 const int two = *
Assert(p_two);
91 const bool result{
Assume(two == 2)};
104 const int nine{*
Assert(std::optional<int>{9})};
116 BOOST_ERROR(
"break was swallowed!");
126 BOOST_ERROR(
"break was swallowed!");
131 0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
132 0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
133 0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
134 0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
139 std::vector<unsigned char> result;
142 result =
ParseHex(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
143 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
144 result = TryParseHex<uint8_t>(
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f").value();
145 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
149 BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
150 result = TryParseHex<uint8_t>(
"12 34 56 78").value();
151 BOOST_CHECK(result.size() == 4 && result[0] == 0x12 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
155 BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
156 result = TryParseHex<uint8_t>(
" 89 34 56 78").value();
157 BOOST_CHECK(result.size() == 4 && result[0] == 0x89 && result[1] == 0x34 && result[2] == 0x56 && result[3] == 0x78);
161 BOOST_CHECK(result.size() == 2 && result[0] == 0xff && result[1] == 0xaa);
162 result = TryParseHex<uint8_t>(
" Ff aA ").value();
163 BOOST_CHECK(result.size() == 2 && result[0] == 0xff && result[1] == 0xaa);
168 result = TryParseHex<uint8_t>(
"").value();
176 const std::string with_embedded_null{
" 11 "s
196 "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");
210 const std::string out_exp{
"04678afdb0"};
218 auto input = std::string();
219 for (
size_t i=0; i<256; ++i) {
220 input.push_back(static_cast<char>(i));
224 BOOST_TEST_REQUIRE(hex.size() == 512);
225 static constexpr
auto hexmap = std::string_view(
"0123456789abcdef");
226 for (
size_t i = 0; i < 256; ++i) {
227 auto upper = hexmap.find(hex[i * 2]);
228 auto lower = hexmap.find(hex[i * 2 + 1]);
229 BOOST_TEST_REQUIRE(upper != std::string_view::npos);
230 BOOST_TEST_REQUIRE(lower != std::string_view::npos);
231 BOOST_TEST_REQUIRE(i == upper*16 + lower);
238 std::array mut_arr{uint8_t{0xaa}, uint8_t{0xbb}};
240 mut_bytes[1] = std::byte{0x11};
253 const auto op_upper = [](
const std::string& s) {
return ToUpper(s); };
261 const std::string original(
"A test \"%s\" string '%s'.");
262 auto test_replaceall = [&original](
const std::string& search,
const std::string& substitute,
const std::string& expected) {
263 auto test = original;
268 test_replaceall(
"",
"foo", original);
269 test_replaceall(original,
"foo",
"foo");
270 test_replaceall(
"%s",
"foo",
"A test \"foo\" string 'foo'.");
271 test_replaceall(
"\"",
"foo",
"A test foo%sfoo string '%s'.");
272 test_replaceall(
"'",
"foo",
"A test \"%s\" string foo%sfoo.");
287 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));
344 BOOST_CHECK_EQUAL(ParseMoney("12345.").value(), COIN * 12345); 346 BOOST_CHECK_EQUAL(ParseMoney("12345.6789").value(), (COIN/10000)*123456789); 348 BOOST_CHECK_EQUAL(ParseMoney("10000000.00").value(), COIN*10000000); 349 BOOST_CHECK_EQUAL(ParseMoney("1000000.00").value(), COIN*1000000); 350 BOOST_CHECK_EQUAL(ParseMoney("100000.00").value(), COIN*100000); 351 BOOST_CHECK_EQUAL(ParseMoney("10000.00").value(), COIN*10000); 352 BOOST_CHECK_EQUAL(ParseMoney("1000.00").value(), COIN*1000); 353 BOOST_CHECK_EQUAL(ParseMoney("100.00").value(), COIN*100); 354 BOOST_CHECK_EQUAL(ParseMoney("10.00").value(), COIN*10); 355 BOOST_CHECK_EQUAL(ParseMoney("1.00").value(), COIN); 356 BOOST_CHECK_EQUAL(ParseMoney("1").value(), COIN); 357 BOOST_CHECK_EQUAL(ParseMoney(" 1").value(), COIN); 358 BOOST_CHECK_EQUAL(ParseMoney("1 ").value(), COIN); 359 BOOST_CHECK_EQUAL(ParseMoney(" 1 ").value(), COIN); 360 BOOST_CHECK_EQUAL(ParseMoney("0.1").value(), COIN/10); 361 BOOST_CHECK_EQUAL(ParseMoney("0.01").value(), COIN/100); 362 BOOST_CHECK_EQUAL(ParseMoney("0.001").value(), COIN/1000); 363 BOOST_CHECK_EQUAL(ParseMoney("0.0001").value(), COIN/10000); 364 BOOST_CHECK_EQUAL(ParseMoney("0.00001").value(), COIN/100000); 365 BOOST_CHECK_EQUAL(ParseMoney("0.000001").value(), COIN/1000000); 366 BOOST_CHECK_EQUAL(ParseMoney("0.0000001").value(), COIN/10000000); 367 BOOST_CHECK_EQUAL(ParseMoney("0.00000001").value(), COIN/100000000); 368 BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001 ").value(), COIN/100000000); 369 BOOST_CHECK_EQUAL(ParseMoney("0.00000001 ").value(), COIN/100000000); 370 BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001").value(), COIN/100000000); 372 // Parsing amount that cannot be represented should fail 373 BOOST_CHECK(!ParseMoney("100000000.00")); 374 BOOST_CHECK(!ParseMoney("0.000000001")); 376 // Parsing empty string should fail 377 BOOST_CHECK(!ParseMoney("")); 378 BOOST_CHECK(!ParseMoney(" ")); 379 BOOST_CHECK(!ParseMoney(" ")); 381 // Parsing two numbers should fail 382 BOOST_CHECK(!ParseMoney("..")); 383 BOOST_CHECK(!ParseMoney("0..0")); 384 BOOST_CHECK(!ParseMoney("1 2")); 385 BOOST_CHECK(!ParseMoney(" 1 2 ")); 386 BOOST_CHECK(!ParseMoney(" 1.2 3 ")); 387 BOOST_CHECK(!ParseMoney(" 1 2.3 ")); 389 // Embedded whitespace should fail 390 BOOST_CHECK(!ParseMoney(" -1 .2 ")); 391 BOOST_CHECK(!ParseMoney(" 1 .2 ")); 392 BOOST_CHECK(!ParseMoney(" +1 .2 ")); 394 // Attempted 63 bit overflow should fail 395 BOOST_CHECK(!ParseMoney("92233720368.54775808")); 397 // Parsing negative amounts must fail 398 BOOST_CHECK(!ParseMoney("-1")); 400 // Parsing strings with embedded NUL characters should fail 401 BOOST_CHECK(!ParseMoney("\0-1"s)); 402 BOOST_CHECK(!ParseMoney(STRING_WITH_EMBEDDED_NULL_CHAR)); 403 BOOST_CHECK(!ParseMoney("1\0"s)); 406 BOOST_AUTO_TEST_CASE(util_IsHex) 408 BOOST_CHECK(IsHex("00")); 409 BOOST_CHECK(IsHex("00112233445566778899aabbccddeeffAABBCCDDEEFF")); 410 BOOST_CHECK(IsHex("ff")); 411 BOOST_CHECK(IsHex("FF")); 413 BOOST_CHECK(!IsHex("")); 414 BOOST_CHECK(!IsHex("0")); 415 BOOST_CHECK(!IsHex("a")); 416 BOOST_CHECK(!IsHex("eleven")); 417 BOOST_CHECK(!IsHex("00xx00")); 418 BOOST_CHECK(!IsHex("0x0000")); 421 BOOST_AUTO_TEST_CASE(util_IsHexNumber) 423 BOOST_CHECK(IsHexNumber("0x0")); 424 BOOST_CHECK(IsHexNumber("0")); 425 BOOST_CHECK(IsHexNumber("0x10")); 426 BOOST_CHECK(IsHexNumber("10")); 427 BOOST_CHECK(IsHexNumber("0xff")); 428 BOOST_CHECK(IsHexNumber("ff")); 429 BOOST_CHECK(IsHexNumber("0xFfa")); 430 BOOST_CHECK(IsHexNumber("Ffa")); 431 BOOST_CHECK(IsHexNumber("0x00112233445566778899aabbccddeeffAABBCCDDEEFF")); 432 BOOST_CHECK(IsHexNumber("00112233445566778899aabbccddeeffAABBCCDDEEFF")); 434 BOOST_CHECK(!IsHexNumber("")); // empty string not allowed 435 BOOST_CHECK(!IsHexNumber("0x")); // empty string after prefix not allowed 436 BOOST_CHECK(!IsHexNumber("0x0 ")); // no spaces at end, 437 BOOST_CHECK(!IsHexNumber(" 0x0")); // or beginning, 438 BOOST_CHECK(!IsHexNumber("0x 0")); // or middle, 439 BOOST_CHECK(!IsHexNumber(" ")); // etc. 440 BOOST_CHECK(!IsHexNumber("0x0ga")); // invalid character 441 BOOST_CHECK(!IsHexNumber("x0")); // broken prefix 442 BOOST_CHECK(!IsHexNumber("0x0x00")); // two prefixes not allowed 446 BOOST_AUTO_TEST_CASE(util_seed_insecure_rand) 448 SeedInsecureRand(SeedRand::ZEROS); 449 for (int mod=2;mod<11;mod++) 452 // Really rough binomial confidence approximation. 453 int err = 30*10000./mod*sqrt((1./mod*(1-1./mod))/10000.); 454 //mask is 2^ceil(log2(mod))-1 455 while(mask<mod-1)mask=(mask<<1)+1; 458 //How often does it get a zero from the uniform range [0,mod)? 459 for (int i = 0; i < 10000; i++) { 462 rval=InsecureRand32()&mask; 463 }while(rval>=(uint32_t)mod); 466 BOOST_CHECK(count<=10000/mod+err); 467 BOOST_CHECK(count>=10000/mod-err); 471 BOOST_AUTO_TEST_CASE(util_TimingResistantEqual) 473 BOOST_CHECK(TimingResistantEqual(std::string(""), std::string(""))); 474 BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string(""))); 475 BOOST_CHECK(!TimingResistantEqual(std::string(""), std::string("abc"))); 476 BOOST_CHECK(!TimingResistantEqual(std::string("a"), std::string("aa"))); 477 BOOST_CHECK(!TimingResistantEqual(std::string("aa"), std::string("a"))); 478 BOOST_CHECK(TimingResistantEqual(std::string("abc"), std::string("abc"))); 479 BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string("aba"))); 482 /* Test strprintf formatting directives. 483 * Put a string before and after to ensure sanity of element sizes on stack. */ 484 #define B "check_prefix" 485 #define E "check_postfix" 486 BOOST_AUTO_TEST_CASE(strprintf_numbers) 488 int64_t s64t = -9223372036854775807LL; /* signed 64 bit test value */ 489 uint64_t u64t = 18446744073709551615ULL; /* unsigned 64 bit test value */ 490 BOOST_CHECK(strprintf("%s %d %s", B, s64t, E) == B" -9223372036854775807 " E); 491 BOOST_CHECK(strprintf("%s %u %s", B, u64t, E) == B" 18446744073709551615 " E); 492 BOOST_CHECK(strprintf("%s %x %s", B, u64t, E) == B" ffffffffffffffff " E); 494 size_t st = 12345678; /* unsigned size_t test value */ 495 ssize_t sst = -12345678; /* signed size_t test value */ 496 BOOST_CHECK(strprintf("%s %d %s", B, sst, E) == B" -12345678 " E); 497 BOOST_CHECK(strprintf("%s %u %s", B, st, E) == B" 12345678 " E); 498 BOOST_CHECK(strprintf("%s %x %s", B, st, E) == B" bc614e " E); 500 ptrdiff_t pt = 87654321; /* positive ptrdiff_t test value */ 501 ptrdiff_t spt = -87654321; /* negative ptrdiff_t test value */ 502 BOOST_CHECK(strprintf("%s %d %s", B, spt, E) == B" -87654321 " E); 503 BOOST_CHECK(strprintf("%s %u %s", B, pt, E) == B" 87654321 " E); 504 BOOST_CHECK(strprintf("%s %x %s", B, pt, E) == B" 5397fb1 " E); 509 /* Check for mingw/wine issue #3494 510 * Remove this test before time.ctime(0xffffffff) == 'Sun Feb 7 07:28:15 2106
' 512 BOOST_AUTO_TEST_CASE(gettime) 514 BOOST_CHECK((GetTime() & ~0xFFFFFFFFLL) == 0); 517 BOOST_AUTO_TEST_CASE(util_time_GetTime) 520 // Check that mock time does not change after a sleep 521 for (const auto& num_sleep : {0ms, 1ms}) { 522 UninterruptibleSleep(num_sleep); 523 BOOST_CHECK_EQUAL(111, GetTime()); // Deprecated time getter 524 BOOST_CHECK_EQUAL(111, Now<NodeSeconds>().time_since_epoch().count()); 525 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now())); 526 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<SecondsDouble>(Now<NodeSeconds>())); 527 BOOST_CHECK_EQUAL(111, GetTime<std::chrono::seconds>().count()); 528 BOOST_CHECK_EQUAL(111000, GetTime<std::chrono::milliseconds>().count()); 529 BOOST_CHECK_EQUAL(111000, TicksSinceEpoch<std::chrono::milliseconds>(NodeClock::now())); 530 BOOST_CHECK_EQUAL(111000000, GetTime<std::chrono::microseconds>().count()); 534 // Check that steady time and system time changes after a sleep 535 const auto steady_ms_0 = Now<SteadyMilliseconds>(); 536 const auto steady_0 = std::chrono::steady_clock::now(); 537 const auto ms_0 = GetTime<std::chrono::milliseconds>(); 538 const auto us_0 = GetTime<std::chrono::microseconds>(); 539 UninterruptibleSleep(1ms); 540 BOOST_CHECK(steady_ms_0 < Now<SteadyMilliseconds>()); 541 BOOST_CHECK(steady_0 + 1ms <= std::chrono::steady_clock::now()); 542 BOOST_CHECK(ms_0 < GetTime<std::chrono::milliseconds>()); 543 BOOST_CHECK(us_0 < GetTime<std::chrono::microseconds>()); 546 BOOST_AUTO_TEST_CASE(test_IsDigit) 548 BOOST_CHECK_EQUAL(IsDigit('0
'), true); 549 BOOST_CHECK_EQUAL(IsDigit('1
'), true); 550 BOOST_CHECK_EQUAL(IsDigit('8
'), true); 551 BOOST_CHECK_EQUAL(IsDigit('9
'), true); 553 BOOST_CHECK_EQUAL(IsDigit('0
' - 1), false); 554 BOOST_CHECK_EQUAL(IsDigit('9
' + 1), false); 555 BOOST_CHECK_EQUAL(IsDigit(0), false); 556 BOOST_CHECK_EQUAL(IsDigit(1), false); 557 BOOST_CHECK_EQUAL(IsDigit(8), false); 558 BOOST_CHECK_EQUAL(IsDigit(9), false); 561 /* Check for overflow */ 562 template <typename T> 563 static void TestAddMatrixOverflow() 565 constexpr T MAXI{std::numeric_limits<T>::max()}; 566 BOOST_CHECK(!CheckedAdd(T{1}, MAXI)); 567 BOOST_CHECK(!CheckedAdd(MAXI, MAXI)); 568 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI)); 569 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(MAXI, MAXI)); 571 BOOST_CHECK_EQUAL(0, CheckedAdd(T{0}, T{0}).value()); 572 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{0}, MAXI).value()); 573 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{1}, MAXI - 1).value()); 574 BOOST_CHECK_EQUAL(MAXI - 1, CheckedAdd(T{1}, MAXI - 2).value()); 575 BOOST_CHECK_EQUAL(0, SaturatingAdd(T{0}, T{0})); 576 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{0}, MAXI)); 577 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI - 1)); 578 BOOST_CHECK_EQUAL(MAXI - 1, SaturatingAdd(T{1}, MAXI - 2)); 581 /* Check for overflow or underflow */ 582 template <typename T> 583 static void TestAddMatrix() 585 TestAddMatrixOverflow<T>(); 586 constexpr T MINI{std::numeric_limits<T>::min()}; 587 constexpr T MAXI{std::numeric_limits<T>::max()}; 588 BOOST_CHECK(!CheckedAdd(T{-1}, MINI)); 589 BOOST_CHECK(!CheckedAdd(MINI, MINI)); 590 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI)); 591 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(MINI, MINI)); 593 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{0}, MINI).value()); 594 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{-1}, MINI + 1).value()); 595 BOOST_CHECK_EQUAL(-1, CheckedAdd(MINI, MAXI).value()); 596 BOOST_CHECK_EQUAL(MINI + 1, CheckedAdd(T{-1}, MINI + 2).value()); 597 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{0}, MINI)); 598 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI + 1)); 599 BOOST_CHECK_EQUAL(MINI + 1, SaturatingAdd(T{-1}, MINI + 2)); 600 BOOST_CHECK_EQUAL(-1, SaturatingAdd(MINI, MAXI)); 603 BOOST_AUTO_TEST_CASE(util_overflow) 605 TestAddMatrixOverflow<unsigned>(); 606 TestAddMatrix<signed>(); 609 BOOST_AUTO_TEST_CASE(test_ParseInt32) 613 BOOST_CHECK(ParseInt32("1234", nullptr)); 614 BOOST_CHECK(ParseInt32("0", &n) && n == 0); 615 BOOST_CHECK(ParseInt32("1234", &n) && n == 1234); 616 BOOST_CHECK(ParseInt32("01234", &n) && n == 1234); // no octal 617 BOOST_CHECK(ParseInt32("2147483647", &n) && n == 2147483647); 618 BOOST_CHECK(ParseInt32("-2147483648", &n) && n == (-2147483647 - 1)); // (-2147483647 - 1) equals INT_MIN 619 BOOST_CHECK(ParseInt32("-1234", &n) && n == -1234); 620 BOOST_CHECK(ParseInt32("00000000000000001234", &n) && n == 1234); 621 BOOST_CHECK(ParseInt32("-00000000000000001234", &n) && n == -1234); 622 BOOST_CHECK(ParseInt32("00000000000000000000", &n) && n == 0); 623 BOOST_CHECK(ParseInt32("-00000000000000000000", &n) && n == 0); 625 BOOST_CHECK(!ParseInt32("", &n)); 626 BOOST_CHECK(!ParseInt32(" 1", &n)); // no padding inside 627 BOOST_CHECK(!ParseInt32("1 ", &n)); 628 BOOST_CHECK(!ParseInt32("++1", &n)); 629 BOOST_CHECK(!ParseInt32("+-1", &n)); 630 BOOST_CHECK(!ParseInt32("-+1", &n)); 631 BOOST_CHECK(!ParseInt32("--1", &n)); 632 BOOST_CHECK(!ParseInt32("1a", &n)); 633 BOOST_CHECK(!ParseInt32("aap", &n)); 634 BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex 635 BOOST_CHECK(!ParseInt32(STRING_WITH_EMBEDDED_NULL_CHAR, &n)); 636 // Overflow and underflow 637 BOOST_CHECK(!ParseInt32("-2147483649", nullptr)); 638 BOOST_CHECK(!ParseInt32("2147483648", nullptr)); 639 BOOST_CHECK(!ParseInt32("-32482348723847471234", nullptr)); 640 BOOST_CHECK(!ParseInt32("32482348723847471234", nullptr)); 643 template <typename T> 644 static void RunToIntegralTests() 646 BOOST_CHECK(!ToIntegral<T>(STRING_WITH_EMBEDDED_NULL_CHAR)); 647 BOOST_CHECK(!ToIntegral<T>(" 1")); 648 BOOST_CHECK(!ToIntegral<T>("1 ")); 649 BOOST_CHECK(!ToIntegral<T>("1a")); 650 BOOST_CHECK(!ToIntegral<T>("1.1")); 651 BOOST_CHECK(!ToIntegral<T>("1.9")); 652 BOOST_CHECK(!ToIntegral<T>("+01.9")); 653 BOOST_CHECK(!ToIntegral<T>("-")); 654 BOOST_CHECK(!ToIntegral<T>("+")); 655 BOOST_CHECK(!ToIntegral<T>(" -1")); 656 BOOST_CHECK(!ToIntegral<T>("-1 ")); 657 BOOST_CHECK(!ToIntegral<T>(" -1 ")); 658 BOOST_CHECK(!ToIntegral<T>("+1")); 659 BOOST_CHECK(!ToIntegral<T>(" +1")); 660 BOOST_CHECK(!ToIntegral<T>(" +1 ")); 661 BOOST_CHECK(!ToIntegral<T>("+-1")); 662 BOOST_CHECK(!ToIntegral<T>("-+1")); 663 BOOST_CHECK(!ToIntegral<T>("++1")); 664 BOOST_CHECK(!ToIntegral<T>("--1")); 665 BOOST_CHECK(!ToIntegral<T>("")); 666 BOOST_CHECK(!ToIntegral<T>("aap")); 667 BOOST_CHECK(!ToIntegral<T>("0x1")); 668 BOOST_CHECK(!ToIntegral<T>("-32482348723847471234")); 669 BOOST_CHECK(!ToIntegral<T>("32482348723847471234")); 672 BOOST_AUTO_TEST_CASE(test_ToIntegral) 674 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("1234").value(), 1'234);
677 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000001234").value(), 1'234);
679 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000000000").value(), 0); 680 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-00000000000000000000").value(), 0); 681 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1234").value(), -1'234);
684 RunToIntegralTests<uint64_t>();
685 RunToIntegralTests<int64_t>();
686 RunToIntegralTests<uint32_t>();
687 RunToIntegralTests<int32_t>();
688 RunToIntegralTests<uint16_t>();
689 RunToIntegralTests<int16_t>();
690 RunToIntegralTests<uint8_t>();
691 RunToIntegralTests<int8_t>();
693 BOOST_CHECK(!ToIntegral<int64_t>(
"-9223372036854775809"));
694 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"-9223372036854775808").value(), -9
'223'372
'036'854
'775'807LL - 1LL);
695 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"9223372036854775807").value(), 9
'223'372
'036'854
'775'807);
696 BOOST_CHECK(!ToIntegral<int64_t>(
"9223372036854775808"));
700 BOOST_CHECK_EQUAL(ToIntegral<uint64_t>(
"18446744073709551615").value(), 18
'446'744
'073'709
'551'615ULL);
701 BOOST_CHECK(!ToIntegral<uint64_t>(
"18446744073709551616"));
705 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("2147483647").value(), 2'147
'483'647);
711 BOOST_CHECK(!ToIntegral<uint32_t>("4294967296")); 713 BOOST_CHECK(!ToIntegral<int16_t>("-32769")); 714 BOOST_CHECK_EQUAL(ToIntegral<int16_t>("-32768").value(), -32'768);
716 BOOST_CHECK(!ToIntegral<int16_t>("32768")); 718 BOOST_CHECK(!ToIntegral<uint16_t>("-1")); 719 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("0").value(), 0U); 720 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("65535").value(), 65'535U);
736 return strtoll(str.c_str(),
nullptr, 10);
742 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0"), 0); 743 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("01234"), 1'234);
745 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" 1"), 1); 746 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1 "), 1); 747 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1a"), 1); 748 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.1"), 1); 749 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.9"), 1); 750 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+01.9"), 1); 751 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1"), -1); 752 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1"), -1); 753 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1 "), -1); 754 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1 "), -1); 755 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+1"), 1); 756 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1"), 1); 757 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1 "), 1); 759 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+-1"), 0); 760 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-+1"), 0); 761 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("++1"), 0); 762 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("--1"), 0); 763 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(""), 0); 764 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("aap"), 0); 765 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0x1"), 0); 766 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-32482348723847471234"), -2'147
'483'647 - 1);
767 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"32482348723847471234"), 2
'147'483
'647); 769 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775809"), -9'223
'372'036
'854'775
'807LL - 1LL); 770 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775808"), -9'223
'372'036
'854'775
'807LL - 1LL); 771 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775807"), 9'223
'372'036
'854'775
'807); 772 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775808"), 9'223
'372'036
'854'775
'807); 774 std::map<std::string, int64_t> atoi64_test_pairs = { 775 {"-9223372036854775809", std::numeric_limits<int64_t>::min()}, 776 {"-9223372036854775808", -9'223
'372'036
'854'775
'807LL - 1LL}, 777 {"9223372036854775807", 9'223
'372'036
'854'775
'807}, 778 {"9223372036854775808", std::numeric_limits<int64_t>::max()}, 785 for (const auto& pair : atoi64_test_pairs) { 786 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(pair.first), pair.second); 789 // Ensure legacy compatibility with previous versions of Bitcoin Core's atoi64
790 for (
const auto& pair : atoi64_test_pairs) {
796 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551615"), 18
'446'744
'073'709
'551'615ULL);
797 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551616"), 18
'446'744
'073'709
'551'615ULL);
799 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-2147483649"), -2
'147'483
'648LL); 800 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-2147483648"), -2'147
'483'648LL);
802 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("2147483648"), 2'147
'483'647);
806 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967295"), 4
'294'967
'295U); 807 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("4294967296"), 4'294
'967'295U);
810 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("-32768"), -32'768);
812 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("32768"), 32'767);
817 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("65536"), 65'535U);
1008 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");
1011 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");
1012 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");
1014 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");
1016 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.");
1017 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.");
1018 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.");
1019 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.");
1024 std::vector<std::string> comments;
1025 comments.emplace_back(
"comment1");
1026 std::vector<std::string> comments2;
1027 comments2.emplace_back(
"comment1");
1108 #ifndef WIN32 // Cannot do this test on WIN32 due to lack of fork() 1123 int rv = read(fd, &ch, 1);
1135 rv = write(fd, &ch, 1);
1141 rv = write(fd, &ch, 1);
1156 fs::path dirname = m_args.GetDataDirBase() /
"lock_dir";
1162 void (*old_handler)(int) = signal(SIGCHLD, SIG_DFL);
1242 signal(SIGCHLD, old_handler);
1247 fs::remove_all(dirname);
1287 return std::string(span.
begin(), span.
end());
1298 input =
"MilkToastHoney";
1300 success =
Const(
"", sp);
1304 success =
Const(
"Milk", sp);
1308 success =
Const(
"Bread", sp);
1311 success =
Const(
"Toast", sp);
1315 success =
Const(
"Honeybadger", sp);
1318 success =
Const(
"Honey", sp);
1323 input =
"Foo(Bar(xy,z()))";
1326 success =
Func(
"FooBar", sp);
1329 success =
Func(
"Foo(", sp);
1332 success =
Func(
"Foo", sp);
1336 success =
Func(
"Bar", sp);
1340 success =
Func(
"xy", sp);
1346 input =
"(n*(n-1))/2";
1358 input =
"(aaaaa,bbbbb()),c";
1370 input =
"((a),(b),(c)),xxx";
1377 std::vector<Span<const char>> results;
1380 results =
Split(input,
'x');
1387 input =
"one#two#three";
1388 results =
Split(input,
'-');
1392 input =
"one#two#three";
1393 results =
Split(input,
'#');
1399 input =
"*foo*bar*";
1400 results =
Split(input,
'*');
1412 std::vector<std::string> result =
SplitString(
"",
'-');
1419 std::vector<std::string> result =
SplitString(
"-",
'-');
1427 std::vector<std::string> result =
SplitString(
"--",
'-');
1436 std::vector<std::string> result =
SplitString(
"abc",
'-');
1443 std::vector<std::string> result =
SplitString(
"a-b",
'-');
1451 std::vector<std::string> result =
SplitString(
"AAA",
'a');
1458 using V = std::vector<std::string>;
1459 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;") == V({
"a",
"b.c:d",
"e"}));
1460 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;:.") == V({
"a",
"b",
"c",
"d",
"e"}));
1461 BOOST_TEST(
SplitString(
"a,b.c:d;e",
"") == V({
"a,b.c:d;e"}));
1462 BOOST_TEST(
SplitString(
"aaa",
"bcdefg") == V({
"aaa"}));
1463 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0"s) == V({
"x",
"a,b"}));
1464 BOOST_TEST(
SplitString(
"x\0a,b"s,
'\0') == V({
"x",
"a,b"}));
1465 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0,"s) == V({
"x",
"a",
"b"}));
1466 BOOST_TEST(
SplitString(
"abcdefg",
"bcd") == V({
"a",
"",
"",
"efg"}));
1479 const std::string NUL(
"O\x00O", 3);
1488 const Tracker* origin;
1492 Tracker() noexcept : origin(this) {}
1493 Tracker(
const Tracker& t) noexcept : origin(
t.origin), copies(
t.copies + 1) {}
1494 Tracker(Tracker&& t) noexcept : origin(
t.origin), copies(
t.copies) {}
1495 Tracker& operator=(
const Tracker& t) noexcept
1498 copies =
t.copies + 1;
1520 auto v2 =
Vector(std::move(t2));
1525 auto v3 =
Vector(t1, std::move(t2));
1532 auto v4 =
Vector(std::move(v3[0]), v3[1], std::move(t3));
1541 auto v5 =
Cat(v1, v4);
1552 auto v6 =
Cat(std::move(v1), v3);
1561 auto v7 =
Cat(v2, std::move(v4));
1572 auto v8 =
Cat(std::move(v2), std::move(v3));
1584 const std::array<unsigned char, 32> privkey_bytes = {
1587 0xD9, 0x7F, 0x51, 0x08, 0xF1, 0x1C, 0xDA, 0x6E,
1588 0xEE, 0xBA, 0xAA, 0x42, 0x0F, 0xEF, 0x07, 0x26,
1589 0xB1, 0xF8, 0x98, 0x06, 0x0B, 0x98, 0x48, 0x9F,
1590 0xA3, 0x09, 0x84, 0x63, 0xC0, 0x03, 0x28, 0x66
1593 const std::string message =
"Trust no one";
1595 const std::string expected_signature =
1596 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=";
1599 std::string generated_signature;
1601 BOOST_REQUIRE_MESSAGE(!privkey.
IsValid(),
1602 "Confirm the private key is invalid");
1604 BOOST_CHECK_MESSAGE(!
MessageSign(privkey, message, generated_signature),
1605 "Sign with an invalid private key");
1607 privkey.
Set(privkey_bytes.begin(), privkey_bytes.end(),
true);
1609 BOOST_REQUIRE_MESSAGE(privkey.
IsValid(),
1610 "Confirm the private key is valid");
1612 BOOST_CHECK_MESSAGE(
MessageSign(privkey, message, generated_signature),
1613 "Sign with a valid private key");
1623 "signature should be irrelevant",
1629 "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
1630 "signature should be irrelevant",
1636 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1637 "invalid signature, not in base64 encoding",
1638 "message should be irrelevant"),
1643 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1644 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
1645 "message should be irrelevant"),
1650 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1651 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1652 "I never signed this"),
1657 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1658 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1664 "11canuhp9X2NocwCq7xNrQYTmUgZAnLK3",
1665 "IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=",
1672 const std::string unsigned_tx =
"...";
1673 const std::string prefixed_message =
1676 std::string(1, (
char)unsigned_tx.length()) +
1680 const uint256 message_hash1 =
Hash(prefixed_message);
1684 BOOST_CHECK_NE(message_hash1, signature_hash);
1715 BOOST_CHECK_EQUAL(ParseByteUnits("3G", noop).value(), 3ULL << 30); 1717 BOOST_CHECK_EQUAL(ParseByteUnits("4t", noop).value(), 4'000
'000'000
'000ULL); 1718 BOOST_CHECK_EQUAL(ParseByteUnits("4T", noop).value(), 4ULL << 40); 1720 // check default multiplier 1721 BOOST_CHECK_EQUAL(ParseByteUnits("5", ByteUnit::K).value(), 5ULL << 10); 1724 BOOST_CHECK(!ParseByteUnits("", noop)); 1725 BOOST_CHECK(!ParseByteUnits("foo", noop)); 1728 BOOST_CHECK(!ParseByteUnits("123m ", noop)); 1729 BOOST_CHECK(!ParseByteUnits(" 123m", noop)); 1732 BOOST_CHECK(!ParseByteUnits("-123m", noop)); 1733 BOOST_CHECK(!ParseByteUnits("+123m", noop)); 1736 BOOST_CHECK_EQUAL(ParseByteUnits("020M", noop).value(), 20ULL << 20); 1738 // fractions not allowed 1739 BOOST_CHECK(!ParseByteUnits("0.5T", noop)); 1742 BOOST_CHECK(!ParseByteUnits("18446744073709551615g", noop)); 1745 BOOST_CHECK(!ParseByteUnits("1x", noop)); 1748 BOOST_AUTO_TEST_CASE(util_ReadBinaryFile) 1750 fs::path tmpfolder = m_args.GetDataDirBase(); 1751 fs::path tmpfile = tmpfolder / "read_binary.dat"; 1752 std::string expected_text; 1753 for (int i = 0; i < 30; i++) { 1754 expected_text += "0123456789"; 1757 std::ofstream file{tmpfile}; 1758 file << expected_text; 1761 // read all contents in file 1762 auto [valid, text] = ReadBinaryFile(tmpfile); 1764 BOOST_CHECK_EQUAL(text, expected_text); 1767 // read half contents in file 1768 auto [valid, text] = ReadBinaryFile(tmpfile, expected_text.size() / 2); 1770 BOOST_CHECK_EQUAL(text, expected_text.substr(0, expected_text.size() / 2)); 1773 // read from non-existent file 1774 fs::path invalid_file = tmpfolder / "invalid_binary.dat"; 1775 auto [valid, text] = ReadBinaryFile(invalid_file); 1776 BOOST_CHECK(!valid); 1777 BOOST_CHECK(text.empty()); 1781 BOOST_AUTO_TEST_CASE(util_WriteBinaryFile) 1783 fs::path tmpfolder = m_args.GetDataDirBase(); 1784 fs::path tmpfile = tmpfolder / "write_binary.dat"; 1785 std::string expected_text = "bitcoin"; 1786 auto valid = WriteBinaryFile(tmpfile, expected_text); 1787 std::string actual_text; 1788 std::ifstream file{tmpfile}; 1789 file >> actual_text; 1791 BOOST_CHECK_EQUAL(actual_text, expected_text); 1794 BOOST_AUTO_TEST_CASE(clearshrink_test) 1797 std::vector<uint8_t> v = {1, 2, 3}; 1799 BOOST_CHECK_EQUAL(v.size(), 0); 1800 BOOST_CHECK_EQUAL(v.capacity(), 0); 1804 std::vector<bool> v = {false, true, false, false, true, true}; 1806 BOOST_CHECK_EQUAL(v.size(), 0); 1807 BOOST_CHECK_EQUAL(v.capacity(), 0); 1811 std::deque<int> v = {1, 3, 3, 7}; 1813 BOOST_CHECK_EQUAL(v.size(), 0); 1814 // std::deque has no capacity() we can observe. 1818 BOOST_AUTO_TEST_SUITE_END()
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
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 Func(const std::string &str, Span< const char > &sp)
Parse a function call.
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).
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=" \\\)
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.
The message verification was successful.
std::vector< std::string > SplitString(std::string_view str, char sep)
static const unsigned char ParseHex_expected[65]
int64_t atoi64_legacy(const std::string &str)
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.
BOOST_AUTO_TEST_CASE(util_check)
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
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
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.
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)
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.
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 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.
The provided address is invalid.
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...
constexpr auto MakeUCharSpan(V &&v) -> decltype(UCharSpanCast(Span
Like the Span constructor, but for (const) unsigned char member types only.
std::string RemovePrefix(std::string_view str, std::string_view prefix)
static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
std::optional< std::vector< Byte > > TryParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).
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.
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.
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:...
static std::string SpanToStr(const Span< const char > &span)
static constexpr char UnlockCommand
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.
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.