50#include <boost/test/unit_test.hpp>
52using namespace std::literals;
78 explicit NoCopyOrMove(
int i) : i{i} { }
80 NoCopyOrMove() =
delete;
81 NoCopyOrMove(
const NoCopyOrMove&) =
delete;
82 NoCopyOrMove(NoCopyOrMove&&) =
delete;
83 NoCopyOrMove& operator=(
const NoCopyOrMove&) =
delete;
84 NoCopyOrMove& operator=(NoCopyOrMove&&) =
delete;
86 operator bool()
const {
return i != 0; }
88 int get_ip1() {
return i + 1; }
92 [&]() {
Assume(get_ip1()); }();
93 return Assume(get_ip1() != 5);
101 const std::unique_ptr<int> p_two =
Assert(std::make_unique<int>(2));
103 const int two = *
Assert(p_two);
107 const bool result{
Assume(two == 2)};
120 const int nine{*
Assert(std::optional<int>{9})};
132 BOOST_ERROR(
"break was swallowed!");
142 BOOST_ERROR(
"break was swallowed!");
146constexpr char HEX_PARSE_INPUT[] =
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f";
148 0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
149 0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
150 0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
151 0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
157 std::vector<unsigned char> result;
161 constexpr std::array<std::byte, 65> hex_literal_array{
operator""_hex<util::detail::Hex(HEX_PARSE_INPUT)>()};
163 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
165 const std::vector<std::byte> hex_literal_vector{
operator""_hex_v<util::detail::Hex(HEX_PARSE_INPUT)>()};
166 auto hex_literal_vec_span =
MakeUCharSpan(hex_literal_vector);
167 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_vec_span.begin(), hex_literal_vec_span.end(), expected.begin(), expected.end());
169 constexpr std::array<uint8_t, 65> hex_literal_array_uint8{
operator""_hex_u8<util::detail::Hex(HEX_PARSE_INPUT)>()};
170 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_array_uint8.begin(), hex_literal_array_uint8.end(), expected.begin(), expected.end());
172 result =
operator""_hex_v_u8<util::detail::Hex(HEX_PARSE_INPUT)>();
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 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
182 expected = {0x12, 0x34, 0x56, 0x78};
184 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
185 result = TryParseHex<uint8_t>(
"12 34 56 78").value();
186 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
189 expected = {0x89, 0x34, 0x56, 0x78};
191 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
192 result = TryParseHex<uint8_t>(
" 89 34 56 78").value();
193 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
196 expected = {0xff, 0xaa};
198 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
199 result = TryParseHex<uint8_t>(
" Ff aA ").value();
200 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
203 static_assert(
""_hex.empty());
204 static_assert(
""_hex_u8.empty());
215 const std::string with_embedded_null{
" 11 "s
246 constexpr std::string_view out_exp{
"04678afdb0"};
249 const std::span<const std::byte> in_b{
MakeByteSpan(in_s)};
257 auto input = std::string();
258 for (
size_t i=0; i<256; ++i) {
259 input.push_back(
static_cast<char>(i));
263 BOOST_TEST_REQUIRE(hex.size() == 512);
264 static constexpr auto hexmap = std::string_view(
"0123456789abcdef");
265 for (
size_t i = 0; i < 256; ++i) {
266 auto upper = hexmap.find(hex[i * 2]);
267 auto lower = hexmap.find(hex[i * 2 + 1]);
268 BOOST_TEST_REQUIRE(upper != std::string_view::npos);
269 BOOST_TEST_REQUIRE(lower != std::string_view::npos);
270 BOOST_TEST_REQUIRE(i == upper*16 + lower);
277 std::array mut_arr{uint8_t{0xaa}, uint8_t{0xbb}};
279 mut_bytes[1] = std::byte{0x11};
292 const auto op_upper = [](
const std::string&
s) {
return ToUpper(
s); };
300 const std::string original(
"A test \"%s\" string '%s'.");
301 auto test_replaceall = [&original](
const std::string& search,
const std::string& substitute,
const std::string& expected) {
302 auto test = original;
307 test_replaceall(
"",
"foo", original);
308 test_replaceall(original,
"foo",
"foo");
309 test_replaceall(
"%s",
"foo",
"A test \"foo\" string 'foo'.");
310 test_replaceall(
"\"",
"foo",
"A test foo%sfoo string '%s'.");
311 test_replaceall(
"'",
"foo",
"A test \"%s\" string foo%sfoo.");
326 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));
359 const std::string valid{
"2000-01-01T00:00:01Z"};
361 for (
auto mut{0U}; mut < valid.size(); ++mut) {
362 std::string invalid{valid};
528 for (
int mod=2;mod<11;mod++)
532 int err = 30*10000./mod*sqrt((1./mod*(1-1./mod))/10000.);
534 while(mask<mod-1)mask=(mask<<1)+1;
538 for (
int i = 0; i < 10000; i++) {
541 rval=m_rng.rand32()&mask;
542 }
while(rval>=(uint32_t)mod);
563#define B "check_prefix"
564#define E "check_postfix"
567 int64_t s64t = -9223372036854775807LL;
568 uint64_t u64t = 18446744073709551615ULL;
573 size_t st = 12345678;
574 ssize_t sst = -12345678;
579 ptrdiff_t pt = 87654321;
580 ptrdiff_t spt = -87654321;
592 for (
const auto& num_sleep : {0ms, 1ms}) {
633 constexpr T MAXI{std::numeric_limits<T>::max()};
653 TestAddMatrixOverflow<T>();
654 constexpr T MINI{std::numeric_limits<T>::min()};
655 constexpr T MAXI{std::numeric_limits<T>::max()};
673 TestAddMatrixOverflow<unsigned>();
674 TestAddMatrix<signed>();
702 BOOST_CHECK(!ToIntegral<T>(
"-32482348723847471234"));
703 BOOST_CHECK(!ToIntegral<T>(
"32482348723847471234"));
718 RunToIntegralTests<uint64_t>();
719 RunToIntegralTests<int64_t>();
720 RunToIntegralTests<uint32_t>();
721 RunToIntegralTests<int32_t>();
722 RunToIntegralTests<uint16_t>();
723 RunToIntegralTests<int16_t>();
724 RunToIntegralTests<uint8_t>();
725 RunToIntegralTests<int8_t>();
727 BOOST_CHECK(!ToIntegral<int64_t>(
"-9223372036854775809"));
728 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"-9223372036854775808").value(), -9'223'372'036'854'775'807LL - 1LL);
729 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"9223372036854775807").value(), 9'223'372'036'854'775'807);
730 BOOST_CHECK(!ToIntegral<int64_t>(
"9223372036854775808"));
734 BOOST_CHECK_EQUAL(ToIntegral<uint64_t>(
"18446744073709551615").value(), 18'446'744'073'709'551'615ULL);
735 BOOST_CHECK(!ToIntegral<uint64_t>(
"18446744073709551616"));
770 return strtoll(str.c_str(),
nullptr, 10);
800 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-32482348723847471234"), -2'147'483'647 - 1);
801 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"32482348723847471234"), 2'147'483'647);
803 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(
"-9223372036854775809"), -9'223'372'036'854'775'807LL - 1LL);
804 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(
"-9223372036854775808"), -9'223'372'036'854'775'807LL - 1LL);
805 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(
"9223372036854775807"), 9'223'372'036'854'775'807);
806 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(
"9223372036854775808"), 9'223'372'036'854'775'807);
808 std::map<std::string, int64_t> atoi64_test_pairs = {
809 {
"-9223372036854775809", std::numeric_limits<int64_t>::min()},
810 {
"-9223372036854775808", -9'223'372'036'854'775'807LL - 1LL},
811 {
"9223372036854775807", 9'223'372'036'854'775'807},
812 {
"9223372036854775808", std::numeric_limits<int64_t>::max()},
819 for (
const auto& pair : atoi64_test_pairs) {
824 for (
const auto& pair : atoi64_test_pairs) {
830 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551615"), 18'446'744'073'709'551'615ULL);
831 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551616"), 18'446'744'073'709'551'615ULL);
833 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-2147483649"), -2'147'483'648LL);
834 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-2147483648"), -2'147'483'648LL);
840 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967295"), 4'294'967'295U);
841 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967296"), 4'294'967'295U);
866 std::optional<uint64_t> n;
868 n = ToIntegral<uint64_t>(
"1234", 16);
870 n = ToIntegral<uint64_t>(
"a", 16);
872 n = ToIntegral<uint64_t>(
"0000000a", 16);
874 n = ToIntegral<uint64_t>(
"100", 16);
876 n = ToIntegral<uint64_t>(
"DEADbeef", 16);
878 n = ToIntegral<uint64_t>(
"FfFfFfFf", 16);
880 n = ToIntegral<uint64_t>(
"123456789", 16);
882 n = ToIntegral<uint64_t>(
"0", 16);
884 n = ToIntegral<uint64_t>(
"FfFfFfFfFfFfFfFf", 16);
886 n = ToIntegral<int64_t>(
"-1", 16);
894 BOOST_CHECK(!ToIntegral<uint64_t>(
"FfFfFfFfFfFfFfFf0", 16));
910 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");
913 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");
914 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");
916 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");
918 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.");
919 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.");
920 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.");
921 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.");
926 std::vector<std::string> comments;
927 comments.emplace_back(
"comment1");
928 std::vector<std::string> comments2;
929 comments2.emplace_back(
"comment1");
1025 int rv = read(fd, &ch, 1);
1037 rv = write(fd, &ch, 1);
1043 rv = write(fd, &ch, 1);
1058 fs::path dirname = m_args.GetDataDirBase() /
"lock_dir";
1059 const fs::path lockname =
".lock";
1082 fs::create_directories(dirname);
1142 fs::remove(dirname / lockname);
1143 fs::remove(dirname);
1181static std::string
SpanToStr(
const std::span<const char>& span)
1183 return std::string(span.begin(), span.end());
1190 std::span<const char> sp;
1194 input =
"MilkToastHoney";
1196 success =
Const(
"", sp);
1200 success =
Const(
"Milk", sp,
false);
1204 success =
Const(
"Milk", sp);
1208 success =
Const(
"Bread", sp,
false);
1211 success =
Const(
"Bread", sp);
1214 success =
Const(
"Toast", sp,
false);
1218 success =
Const(
"Toast", sp);
1222 success =
Const(
"Honeybadger", sp);
1225 success =
Const(
"Honey", sp,
false);
1229 success =
Const(
"Honey", sp);
1233 input =
"Foo(Bar(xy,z()))";
1236 success =
Func(
"FooBar", sp);
1239 success =
Func(
"Foo(", sp);
1242 success =
Func(
"Foo", sp);
1246 success =
Func(
"Bar", sp);
1250 success =
Func(
"xy", sp);
1254 std::span<const char> result;
1256 input =
"(n*(n-1))/2";
1268 input =
"(aaaaa,bbbbb()),c";
1280 input =
"((a),(b),(c)),xxx";
1287 std::vector<std::span<const char>> results;
1290 results =
Split(input,
'x');
1297 input =
"one#two#three";
1298 results =
Split(input,
'-');
1302 input =
"one#two#three";
1303 results =
Split(input,
'#');
1309 results =
Split(input,
'#',
true);
1315 input =
"*foo*bar*";
1316 results =
Split(input,
'*');
1323 results =
Split(input,
'*',
true);
1335 std::vector<std::string> result =
SplitString(
"",
'-');
1342 std::vector<std::string> result =
SplitString(
"-",
'-');
1350 std::vector<std::string> result =
SplitString(
"--",
'-');
1359 std::vector<std::string> result =
SplitString(
"abc",
'-');
1366 std::vector<std::string> result =
SplitString(
"a-b",
'-');
1374 std::vector<std::string> result =
SplitString(
"AAA",
'a');
1381 using V = std::vector<std::string>;
1382 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;") == V({
"a",
"b.c:d",
"e"}));
1383 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;:.") == V({
"a",
"b",
"c",
"d",
"e"}));
1384 BOOST_TEST(
SplitString(
"a,b.c:d;e",
"") == V({
"a,b.c:d;e"}));
1385 BOOST_TEST(
SplitString(
"aaa",
"bcdefg") == V({
"aaa"}));
1386 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0"s) == V({
"x",
"a,b"}));
1387 BOOST_TEST(
SplitString(
"x\0a,b"s,
'\0') == V({
"x",
"a,b"}));
1388 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0,"s) == V({
"x",
"a",
"b"}));
1389 BOOST_TEST(
SplitString(
"abcdefg",
"bcd") == V({
"a",
"",
"",
"efg"}));
1402 const std::string NUL(
"O\x00O", 3);
1411 const Tracker* origin;
1415 Tracker() noexcept : origin(this) {}
1416 Tracker(
const Tracker&
t) noexcept : origin(
t.origin), copies(
t.copies + 1) {}
1417 Tracker(Tracker&&
t) noexcept : origin(
t.origin), copies(
t.copies) {}
1418 Tracker& operator=(
const Tracker&
t)
noexcept
1422 copies =
t.copies + 1;
1445 auto v2 =
Vector(std::move(t2));
1450 auto v3 =
Vector(t1, std::move(t2));
1457 auto v4 =
Vector(std::move(v3[0]), v3[1], std::move(t3));
1466 auto v5 =
Cat(v1, v4);
1477 auto v6 =
Cat(std::move(v1), v3);
1486 auto v7 =
Cat(v2, std::move(v4));
1497 auto v8 =
Cat(std::move(v2), std::move(v3));
1509 const std::array<unsigned char, 32> privkey_bytes = {
1512 0xD9, 0x7F, 0x51, 0x08, 0xF1, 0x1C, 0xDA, 0x6E,
1513 0xEE, 0xBA, 0xAA, 0x42, 0x0F, 0xEF, 0x07, 0x26,
1514 0xB1, 0xF8, 0x98, 0x06, 0x0B, 0x98, 0x48, 0x9F,
1515 0xA3, 0x09, 0x84, 0x63, 0xC0, 0x03, 0x28, 0x66
1518 const std::string message =
"Trust no one";
1520 const std::string expected_signature =
1521 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=";
1524 std::string generated_signature;
1526 BOOST_REQUIRE_MESSAGE(!privkey.
IsValid(),
1527 "Confirm the private key is invalid");
1529 BOOST_CHECK_MESSAGE(!
MessageSign(privkey, message, generated_signature),
1530 "Sign with an invalid private key");
1532 privkey.
Set(privkey_bytes.begin(), privkey_bytes.end(),
true);
1534 BOOST_REQUIRE_MESSAGE(privkey.
IsValid(),
1535 "Confirm the private key is valid");
1537 BOOST_CHECK_MESSAGE(
MessageSign(privkey, message, generated_signature),
1538 "Sign with a valid private key");
1548 "signature should be irrelevant",
1554 "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
1555 "signature should be irrelevant",
1561 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1562 "invalid signature, not in base64 encoding",
1563 "message should be irrelevant"),
1568 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1569 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
1570 "message should be irrelevant"),
1575 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1576 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1577 "I never signed this"),
1582 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1583 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1589 "11canuhp9X2NocwCq7xNrQYTmUgZAnLK3",
1590 "IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=",
1597 const std::string unsigned_tx =
"...";
1598 const std::string prefixed_message =
1601 std::string(1, (
char)unsigned_tx.length()) +
1605 const uint256 message_hash1 =
Hash(prefixed_message);
1609 BOOST_CHECK_NE(message_hash1, signature_hash);
1675 fs::path tmpfolder = m_args.GetDataDirBase();
1676 fs::path tmpfile = tmpfolder /
"read_binary.dat";
1677 std::string expected_text;
1678 for (
int i = 0; i < 30; i++) {
1679 expected_text +=
"0123456789";
1682 std::ofstream file{tmpfile.std_path()};
1683 file << expected_text;
1693 auto [valid, text] =
ReadBinaryFile(tmpfile, expected_text.size() / 2);
1699 fs::path invalid_file = tmpfolder /
"invalid_binary.dat";
1708 fs::path tmpfolder = m_args.GetDataDirBase();
1709 fs::path tmpfile = tmpfolder /
"write_binary.dat";
1710 std::string expected_text =
"bitcoin";
1712 std::string actual_text;
1713 std::ifstream file{tmpfile.std_path()};
1714 file >> actual_text;
1722 std::vector<uint8_t> v = {1, 2, 3};
1729 std::vector<bool> v = {
false,
true,
false,
false,
true,
true};
1736 std::deque<int> v = {1, 3, 3, 7};
1743template <
typename T>
1746 constexpr auto MAX{std::numeric_limits<T>::max()};
1756 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1);
1759 BOOST_CHECK(!CheckedLeftShift<T>((MAX >> 1) + 1, 1));
1761 BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits));
1762 BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits + 1));
1764 if constexpr (std::is_signed_v<T>) {
1765 constexpr auto MIN{std::numeric_limits<T>::min()};
1772 BOOST_CHECK(!CheckedLeftShift<T>((MIN >> 1) - 1, 1));
1778template <
typename T>
1781 constexpr auto MAX{std::numeric_limits<T>::max()};
1791 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1);
1796 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits), MAX);
1797 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits + 1), MAX);
1799 if constexpr (std::is_signed_v<T>) {
1800 constexpr auto MIN{std::numeric_limits<T>::min()};
1815 TestCheckedLeftShift<uint8_t>();
1816 TestCheckedLeftShift<int8_t>();
1817 TestCheckedLeftShift<size_t>();
1818 TestCheckedLeftShift<uint64_t>();
1819 TestCheckedLeftShift<int64_t>();
1824 TestSaturatingLeftShift<uint8_t>();
1825 TestSaturatingLeftShift<int8_t>();
1826 TestSaturatingLeftShift<size_t>();
1827 TestSaturatingLeftShift<uint64_t>();
1828 TestSaturatingLeftShift<int64_t>();
1831template <
class Int, auto
bytes>
1843 BOOST_CHECK_EQUAL((3_MiB + 123) /
double(1_MiB), (3_MiB + 123) / 1024.0 / 1024.0);
1887 constexpr int64_t
fee{12345};
1888 constexpr int32_t at_size{67};
1889 constexpr int32_t size{10};
1891 (uint64_t(
fee) * at_size + uint32_t(size) - 1) / uint32_t(size));
1894 constexpr unsigned bits{129};
1895 constexpr size_t digits{std::numeric_limits<size_t>::digits};
1912 BOOST_CHECK_EQUAL((1_GiB + 123) /
double(1_GiB), (1_GiB + 123) / 1024.0 / 1024.0 / 1024.0);
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.
Helper to initialize the global NodeClock, let a duration elapse, and reset it after use in a test.
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_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
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 std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
std::optional< CAmount > ParseMoney(const std::string &money_string)
Parse an amount denoted in full coins.
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
std::string LogEscapeMessage(std::string_view str)
Belts and suspenders: make sure outgoing log messages don't contain potentially suspicious characters...
std::span< const char > Expr(std::span< const char > &sp)
Extract the expression that sp begins with.
bool Func(const std::string &str, std::span< const char > &sp)
Parse a function call.
bool Const(const std::string &str, std::span< const char > &sp, bool skip)
Parse a constant.
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
std::vector< std::string > SplitString(std::string_view str, char sep)
consteval uint8_t ConstevalHexDigit(const char c)
consteval version of HexDigit() without the lookup table.
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
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)
std::vector< T > Split(const std::span< const char > &sp, std::string_view separators, bool include_sep=false)
Split a string on any char found in separators, returning a vector.
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
constexpr auto CeilDiv(const Dividend dividend, const Divisor divisor)
Integer ceiling division (for unsigned values).
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.
auto MakeByteSpan(const V &v) noexcept
constexpr auto MakeUCharSpan(const V &v) -> decltype(UCharSpanCast(std::span{v}))
Like the std::span constructor, but for (const) unsigned char member types only.
auto 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)
@ ZEROS
Seed with a compile time constant of zeros.
std::string Capitalize(std::string str)
Capitalizes the first character of the given string.
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 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.
std::optional< std::vector< Byte > > TryParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).
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 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.
void UninterruptibleSleep(const std::chrono::microseconds &n)
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
std::string FormatISO8601Date(int64_t nTime)
std::optional< int64_t > ParseISO8601DateTime(std::string_view str)
std::string FormatRFC1123DateTime(int64_t time)
RFC1123 formatting https://www.rfc-editor.org/rfc/rfc1123#section-5.2.14 Used in HTTP/1....
std::string FormatISO8601DateTime(int64_t nTime)
ISO 8601 formatting is preferred.
constexpr int64_t TicksSeconds(Duration d)
int64_t atoi64_legacy(const std::string &str)
constexpr uint8_t HEX_PARSE_OUTPUT[]
constexpr char HEX_PARSE_INPUT[]
static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
static constexpr char ExitCommand
static constexpr char UnlockCommand
static std::string SpanToStr(const std::span< const char > &span)
static void TestAddMatrixOverflow()
static void TestAddMatrix()
BOOST_AUTO_TEST_CASE(util_check)
static void RunToIntegralTests()
static const std::string STRING_WITH_EMBEDDED_NULL_CHAR
static constexpr char LockCommand
void TestCheckedLeftShift()
void TestSaturatingLeftShift()
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.
std::vector< std::common_type_t< Args... > > Vector(Args &&... args)
Construct a vector with the specified elements.
void ClearShrink(V &v) noexcept
Clear a vector (or std::deque) and release its allocated memory.