38 #include <sys/types.h>
45 #include <boost/test/unit_test.hpp>
47 using namespace std::literals;
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));
463 for (
int mod=2;mod<11;mod++)
467 int err = 30*10000./mod*sqrt((1./mod*(1-1./mod))/10000.);
469 while(mask<mod-1)mask=(mask<<1)+1;
473 for (
int i = 0; i < 10000; i++) {
477 }
while(rval>=(uint32_t)mod);
498 #define B "check_prefix"
499 #define E "check_postfix"
502 int64_t s64t = -9223372036854775807LL;
503 uint64_t u64t = 18446744073709551615ULL;
508 size_t st = 12345678;
509 ssize_t sst = -12345678;
514 ptrdiff_t pt = 87654321;
515 ptrdiff_t spt = -87654321;
535 for (
const auto& num_sleep : {0ms, 1ms}) {
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>();
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>());
576 template <
typename T>
579 constexpr
T MAXI{std::numeric_limits<T>::max()};
596 template <
typename T>
599 TestAddMatrixOverflow<T>();
600 constexpr
T MINI{std::numeric_limits<T>::min()};
601 constexpr
T MAXI{std::numeric_limits<T>::max()};
619 TestAddMatrixOverflow<unsigned>();
620 TestAddMatrix<signed>();
657 template <
typename T>
682 BOOST_CHECK(!ToIntegral<T>(
"-32482348723847471234"));
683 BOOST_CHECK(!ToIntegral<T>(
"32482348723847471234"));
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"));
750 return strtoll(str.c_str(),
nullptr, 10);
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) {
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);
820 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967295"), 4'294'967'295U);
821 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967296"), 4'294'967'295U);
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");
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);
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;
1784 auto [valid, text] =
ReadBinaryFile(tmpfile, expected_text.size() / 2);
1790 fs::path invalid_file = tmpfolder /
"invalid_binary.dat";
1799 fs::path tmpfolder = m_args.GetDataDirBase();
1800 fs::path tmpfile = tmpfolder /
"write_binary.dat";
1801 std::string expected_text =
"bitcoin";
1803 std::string actual_text;
1804 std::ifstream file{tmpfile};
1805 file >> actual_text;
1813 std::vector<uint8_t> v = {1, 2, 3};
1820 std::vector<bool> v = {
false,
true,
false,
false,
true,
true};
1827 std::deque<int> v = {1, 3, 3, 7};
int64_t CAmount
Amount in satoshis (Can be negative)
static constexpr CAmount COIN
The amount of satoshis in one BTC.
#define Assert(val)
Identity function.
#define Assume(val)
Assume is the identity function.
An encapsulated private key.
bool IsValid() const
Check whether this private key is valid.
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
A Span is an object that can refer to a contiguous sequence of objects.
constexpr C * end() const noexcept
constexpr C * begin() const noexcept
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
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...
uint256 MessageHash(const std::string &message)
Hashes a message for signing and verification in a manner that prevents inadvertently signing a trans...
bool MessageSign(const CKey &privkey, const std::string &message, std::string &signature)
Sign a message.
const std::string MESSAGE_MAGIC
Text used to signify that a signed message follows and to prevent inadvertently signing a transaction...
MessageVerificationResult MessageVerify(const std::string &address, const std::string &signature, const std::string &message)
Verify a signed message.
BOOST_AUTO_TEST_SUITE_END()
void ReleaseDirectoryLocks()
Release all directory locks.
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
#define T(expected, seed, data)
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
std::optional< CAmount > ParseMoney(const std::string &money_string)
Parse an amount denoted in full coins.
std::string LogEscapeMessage(std::string_view str)
Belts and suspenders: make sure outgoing log messages don't contain potentially suspicious characters...
static bool create_directories(const std::filesystem::path &p)
Create directory (and if necessary its parents), unless the leaf directory already exists or is a sym...
bool Const(const std::string &str, Span< const char > &sp)
Parse a constant.
Span< const char > Expr(Span< const char > &sp)
Extract the expression that sp begins with.
bool Func(const std::string &str, Span< const char > &sp)
Parse a function call.
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.
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
std::vector< std::string > SplitString(std::string_view str, char sep)
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
std::string TrimString(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
std::string RemovePrefix(std::string_view str, std::string_view prefix)
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
LockResult LockDirectory(const fs::path &directory, const fs::path &lockfile_name, bool probe_only)
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
std::optional< T > CheckedAdd(const T i, const T j) noexcept
T SaturatingAdd(const T i, const T j) noexcept
bool WriteBinaryFile(const fs::path &filename, const std::string &data)
Write contents of std::string to a file.
std::pair< bool, std::string > ReadBinaryFile(const fs::path &filename, size_t maxsize)
Read full contents of a file and return them in a std::string.
@ ERR_MALFORMED_SIGNATURE
The provided signature couldn't be parsed (maybe invalid base64).
@ ERR_INVALID_ADDRESS
The provided address is invalid.
@ ERR_ADDRESS_NO_KEY
The provided address is valid but does not refer to a public key.
@ ERR_NOT_SIGNED
The message was not signed with the private key of the provided address.
@ OK
The message verification was successful.
@ ERR_PUBKEY_NOT_RECOVERED
A public key could not be recovered from the provided signature and message.
constexpr auto MakeUCharSpan(V &&v) -> decltype(UCharSpanCast(Span{std::forward< V >(v)}))
Like the Span constructor, but for (const) unsigned char member types only.
Span< const std::byte > MakeByteSpan(V &&v) noexcept
Span< std::byte > MakeWritableByteSpan(V &&v) noexcept
constexpr bool IsDigit(char c)
Tests if the given character is a decimal digit.
bool TimingResistantEqual(const T &a, const T &b)
Timing-attack-resistant comparison.
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
@ SAFE_CHARS_UA_COMMENT
BIP-0014 subset.
static time_point now() noexcept
Return current system time or mocked time, if set.
#define TRY_LOCK(cs, name)
void SeedRandomForTest(SeedRand seedtype)
Seed the RNG for testing.
@ ZEROS
Seed with a compile time constant of zeros.
static uint32_t InsecureRand32()
void UninterruptibleSleep(const std::chrono::microseconds &n)
std::string FormatISO8601Date(int64_t nTime)
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
std::string FormatISO8601DateTime(int64_t nTime)
ISO 8601 formatting is preferred.
std::string Capitalize(std::string str)
Capitalizes the first character of the given string.
bool IsHexNumber(std::string_view str)
Return true if the string is a hex number, optionally prefixed with "0x".
bool ParseInt32(std::string_view str, int32_t *out)
Convert string to signed 32-bit integer with strict parse error feedback.
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::string ToUpper(std::string_view str)
Returns the uppercase equivalent of the given string.
bool ParseFixedPoint(std::string_view val, int decimals, int64_t *amount_out)
Parse number as fixed point according to JSON number syntax.
bool ParseInt64(std::string_view str, int64_t *out)
Convert string to signed 64-bit integer with strict parse error feedback.
bool ParseUInt8(std::string_view str, uint8_t *out)
Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
bool ParseUInt64(std::string_view str, uint64_t *out)
Convert decimal string to unsigned 64-bit integer with strict parse error feedback.
bool IsHex(std::string_view str)
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.
bool ParseUInt32(std::string_view str, uint32_t *out)
Convert decimal string to unsigned 32-bit integer with strict parse error feedback.
std::optional< std::vector< Byte > > TryParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).
std::string ToLower(std::string_view str)
Returns the lowercase equivalent of the given string.
std::string SanitizeString(std::string_view str, int rule)
Remove unsafe chars.
int64_t atoi64_legacy(const std::string &str)
static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
static constexpr char ExitCommand
static constexpr char UnlockCommand
static void TestAddMatrixOverflow()
static void TestAddMatrix()
BOOST_AUTO_TEST_CASE(util_check)
static const unsigned char ParseHex_expected[65]
static void RunToIntegralTests()
static const std::string STRING_WITH_EMBEDDED_NULL_CHAR
static constexpr char LockCommand
static std::string SpanToStr(const Span< const char > &span)
std::vector< typename std::common_type< Args... >::type > Vector(Args &&... args)
Construct a vector with the specified elements.
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.
void ClearShrink(V &v) noexcept
Clear a vector (or std::deque) and release its allocated memory.