49#include <boost/test/unit_test.hpp>
51using namespace std::literals;
77 explicit NoCopyOrMove(
int i) : i{i} { }
79 NoCopyOrMove() =
delete;
80 NoCopyOrMove(
const NoCopyOrMove&) =
delete;
81 NoCopyOrMove(NoCopyOrMove&&) =
delete;
82 NoCopyOrMove& operator=(
const NoCopyOrMove&) =
delete;
83 NoCopyOrMove& operator=(NoCopyOrMove&&) =
delete;
85 operator bool()
const {
return i != 0; }
87 int get_ip1() {
return i + 1; }
91 [&]() {
Assume(get_ip1()); }();
92 return Assume(get_ip1() != 5);
100 const std::unique_ptr<int> p_two =
Assert(std::make_unique<int>(2));
102 const int two = *
Assert(p_two);
106 const bool result{
Assume(two == 2)};
119 const int nine{*
Assert(std::optional<int>{9})};
131 BOOST_ERROR(
"break was swallowed!");
141 BOOST_ERROR(
"break was swallowed!");
145constexpr char HEX_PARSE_INPUT[] =
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f";
147 0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
148 0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
149 0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
150 0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
156 std::vector<unsigned char> result;
160 constexpr std::array<std::byte, 65> hex_literal_array{
operator""_hex<util::detail::Hex(HEX_PARSE_INPUT)>()};
162 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
164 const std::vector<std::byte> hex_literal_vector{
operator""_hex_v<util::detail::Hex(HEX_PARSE_INPUT)>()};
165 auto hex_literal_vec_span =
MakeUCharSpan(hex_literal_vector);
166 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_vec_span.begin(), hex_literal_vec_span.end(), expected.begin(), expected.end());
168 constexpr std::array<uint8_t, 65> hex_literal_array_uint8{
operator""_hex_u8<util::detail::Hex(HEX_PARSE_INPUT)>()};
169 BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_array_uint8.begin(), hex_literal_array_uint8.end(), expected.begin(), expected.end());
171 result =
operator""_hex_v_u8<util::detail::Hex(HEX_PARSE_INPUT)>();
172 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
175 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
178 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
181 expected = {0x12, 0x34, 0x56, 0x78};
183 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
184 result = TryParseHex<uint8_t>(
"12 34 56 78").value();
185 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
188 expected = {0x89, 0x34, 0x56, 0x78};
190 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
191 result = TryParseHex<uint8_t>(
" 89 34 56 78").value();
192 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
195 expected = {0xff, 0xaa};
197 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
198 result = TryParseHex<uint8_t>(
" Ff aA ").value();
199 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
202 static_assert(
""_hex.empty());
203 static_assert(
""_hex_u8.empty());
214 const std::string with_embedded_null{
" 11 "s
245 constexpr std::string_view out_exp{
"04678afdb0"};
248 const std::span<const std::byte> in_b{
MakeByteSpan(in_s)};
256 auto input = std::string();
257 for (
size_t i=0; i<256; ++i) {
258 input.push_back(
static_cast<char>(i));
262 BOOST_TEST_REQUIRE(hex.size() == 512);
263 static constexpr auto hexmap = std::string_view(
"0123456789abcdef");
264 for (
size_t i = 0; i < 256; ++i) {
265 auto upper = hexmap.find(hex[i * 2]);
266 auto lower = hexmap.find(hex[i * 2 + 1]);
267 BOOST_TEST_REQUIRE(upper != std::string_view::npos);
268 BOOST_TEST_REQUIRE(lower != std::string_view::npos);
269 BOOST_TEST_REQUIRE(i == upper*16 + lower);
276 std::array mut_arr{uint8_t{0xaa}, uint8_t{0xbb}};
278 mut_bytes[1] = std::byte{0x11};
291 const auto op_upper = [](
const std::string&
s) {
return ToUpper(
s); };
299 const std::string original(
"A test \"%s\" string '%s'.");
300 auto test_replaceall = [&original](
const std::string& search,
const std::string& substitute,
const std::string& expected) {
301 auto test = original;
306 test_replaceall(
"",
"foo", original);
307 test_replaceall(original,
"foo",
"foo");
308 test_replaceall(
"%s",
"foo",
"A test \"foo\" string 'foo'.");
309 test_replaceall(
"\"",
"foo",
"A test foo%sfoo string '%s'.");
310 test_replaceall(
"'",
"foo",
"A test \"%s\" string foo%sfoo.");
325 BOOST_CHECK_EQUAL(
TrimString(std::string(
"\x05\x04\x03\x02\x01\x00", 6), std::string(
"\x05\x04\x03\x02\x01", 5)), std::string(
"\0", 1));
358 const std::string valid{
"2000-01-01T00:00:01Z"};
360 for (
auto mut{0U}; mut < valid.size(); ++mut) {
361 std::string invalid{valid};
527 for (
int mod=2;mod<11;mod++)
531 int err = 30*10000./mod*sqrt((1./mod*(1-1./mod))/10000.);
533 while(mask<mod-1)mask=(mask<<1)+1;
537 for (
int i = 0; i < 10000; i++) {
540 rval=m_rng.rand32()&mask;
541 }
while(rval>=(uint32_t)mod);
562#define B "check_prefix"
563#define E "check_postfix"
566 int64_t s64t = -9223372036854775807LL;
567 uint64_t u64t = 18446744073709551615ULL;
572 size_t st = 12345678;
573 ssize_t sst = -12345678;
578 ptrdiff_t pt = 87654321;
579 ptrdiff_t spt = -87654321;
591 for (
const auto& num_sleep : {0ms, 1ms}) {
632 constexpr T MAXI{std::numeric_limits<T>::max()};
652 TestAddMatrixOverflow<T>();
653 constexpr T MINI{std::numeric_limits<T>::min()};
654 constexpr T MAXI{std::numeric_limits<T>::max()};
672 TestAddMatrixOverflow<unsigned>();
673 TestAddMatrix<signed>();
701 BOOST_CHECK(!ToIntegral<T>(
"-32482348723847471234"));
702 BOOST_CHECK(!ToIntegral<T>(
"32482348723847471234"));
717 RunToIntegralTests<uint64_t>();
718 RunToIntegralTests<int64_t>();
719 RunToIntegralTests<uint32_t>();
720 RunToIntegralTests<int32_t>();
721 RunToIntegralTests<uint16_t>();
722 RunToIntegralTests<int16_t>();
723 RunToIntegralTests<uint8_t>();
724 RunToIntegralTests<int8_t>();
726 BOOST_CHECK(!ToIntegral<int64_t>(
"-9223372036854775809"));
727 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"-9223372036854775808").value(), -9'223'372'036'854'775'807LL - 1LL);
728 BOOST_CHECK_EQUAL(ToIntegral<int64_t>(
"9223372036854775807").value(), 9'223'372'036'854'775'807);
729 BOOST_CHECK(!ToIntegral<int64_t>(
"9223372036854775808"));
733 BOOST_CHECK_EQUAL(ToIntegral<uint64_t>(
"18446744073709551615").value(), 18'446'744'073'709'551'615ULL);
734 BOOST_CHECK(!ToIntegral<uint64_t>(
"18446744073709551616"));
769 return strtoll(str.c_str(),
nullptr, 10);
799 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-32482348723847471234"), -2'147'483'647 - 1);
800 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"32482348723847471234"), 2'147'483'647);
802 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(
"-9223372036854775809"), -9'223'372'036'854'775'807LL - 1LL);
803 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(
"-9223372036854775808"), -9'223'372'036'854'775'807LL - 1LL);
804 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(
"9223372036854775807"), 9'223'372'036'854'775'807);
805 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(
"9223372036854775808"), 9'223'372'036'854'775'807);
807 std::map<std::string, int64_t> atoi64_test_pairs = {
808 {
"-9223372036854775809", std::numeric_limits<int64_t>::min()},
809 {
"-9223372036854775808", -9'223'372'036'854'775'807LL - 1LL},
810 {
"9223372036854775807", 9'223'372'036'854'775'807},
811 {
"9223372036854775808", std::numeric_limits<int64_t>::max()},
818 for (
const auto& pair : atoi64_test_pairs) {
823 for (
const auto& pair : atoi64_test_pairs) {
829 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551615"), 18'446'744'073'709'551'615ULL);
830 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>(
"18446744073709551616"), 18'446'744'073'709'551'615ULL);
832 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-2147483649"), -2'147'483'648LL);
833 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(
"-2147483648"), -2'147'483'648LL);
839 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967295"), 4'294'967'295U);
840 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>(
"4294967296"), 4'294'967'295U);
865 std::optional<uint64_t> n;
867 n = ToIntegral<uint64_t>(
"1234", 16);
869 n = ToIntegral<uint64_t>(
"a", 16);
871 n = ToIntegral<uint64_t>(
"0000000a", 16);
873 n = ToIntegral<uint64_t>(
"100", 16);
875 n = ToIntegral<uint64_t>(
"DEADbeef", 16);
877 n = ToIntegral<uint64_t>(
"FfFfFfFf", 16);
879 n = ToIntegral<uint64_t>(
"123456789", 16);
881 n = ToIntegral<uint64_t>(
"0", 16);
883 n = ToIntegral<uint64_t>(
"FfFfFfFfFfFfFfFf", 16);
885 n = ToIntegral<int64_t>(
"-1", 16);
893 BOOST_CHECK(!ToIntegral<uint64_t>(
"FfFfFfFfFfFfFfFf0", 16));
909 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");
912 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");
913 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");
915 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");
917 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.");
918 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.");
919 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.");
920 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.");
925 std::vector<std::string> comments;
926 comments.emplace_back(
"comment1");
927 std::vector<std::string> comments2;
928 comments2.emplace_back(
"comment1");
1024 int rv = read(fd, &ch, 1);
1036 rv = write(fd, &ch, 1);
1042 rv = write(fd, &ch, 1);
1057 fs::path dirname = m_args.GetDataDirBase() /
"lock_dir";
1058 const fs::path lockname =
".lock";
1081 fs::create_directories(dirname);
1141 fs::remove(dirname / lockname);
1142 fs::remove(dirname);
1180static std::string
SpanToStr(
const std::span<const char>& span)
1182 return std::string(span.begin(), span.end());
1189 std::span<const char> sp;
1193 input =
"MilkToastHoney";
1195 success =
Const(
"", sp);
1199 success =
Const(
"Milk", sp,
false);
1203 success =
Const(
"Milk", sp);
1207 success =
Const(
"Bread", sp,
false);
1210 success =
Const(
"Bread", sp);
1213 success =
Const(
"Toast", sp,
false);
1217 success =
Const(
"Toast", sp);
1221 success =
Const(
"Honeybadger", sp);
1224 success =
Const(
"Honey", sp,
false);
1228 success =
Const(
"Honey", sp);
1232 input =
"Foo(Bar(xy,z()))";
1235 success =
Func(
"FooBar", sp);
1238 success =
Func(
"Foo(", sp);
1241 success =
Func(
"Foo", sp);
1245 success =
Func(
"Bar", sp);
1249 success =
Func(
"xy", sp);
1253 std::span<const char> result;
1255 input =
"(n*(n-1))/2";
1267 input =
"(aaaaa,bbbbb()),c";
1279 input =
"((a),(b),(c)),xxx";
1286 std::vector<std::span<const char>> results;
1289 results =
Split(input,
'x');
1296 input =
"one#two#three";
1297 results =
Split(input,
'-');
1301 input =
"one#two#three";
1302 results =
Split(input,
'#');
1308 results =
Split(input,
'#',
true);
1314 input =
"*foo*bar*";
1315 results =
Split(input,
'*');
1322 results =
Split(input,
'*',
true);
1334 std::vector<std::string> result =
SplitString(
"",
'-');
1341 std::vector<std::string> result =
SplitString(
"-",
'-');
1349 std::vector<std::string> result =
SplitString(
"--",
'-');
1358 std::vector<std::string> result =
SplitString(
"abc",
'-');
1365 std::vector<std::string> result =
SplitString(
"a-b",
'-');
1373 std::vector<std::string> result =
SplitString(
"AAA",
'a');
1380 using V = std::vector<std::string>;
1381 BOOST_TEST(
SplitString(
"a,b.c:d;e",
",;") == V({
"a",
"b.c:d",
"e"}));
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(
"aaa",
"bcdefg") == V({
"aaa"}));
1385 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0"s) == V({
"x",
"a,b"}));
1386 BOOST_TEST(
SplitString(
"x\0a,b"s,
'\0') == V({
"x",
"a,b"}));
1387 BOOST_TEST(
SplitString(
"x\0a,b"s,
"\0,"s) == V({
"x",
"a",
"b"}));
1388 BOOST_TEST(
SplitString(
"abcdefg",
"bcd") == V({
"a",
"",
"",
"efg"}));
1401 const std::string NUL(
"O\x00O", 3);
1410 const Tracker* origin;
1414 Tracker() noexcept : origin(this) {}
1415 Tracker(
const Tracker&
t) noexcept : origin(
t.origin), copies(
t.copies + 1) {}
1416 Tracker(Tracker&&
t) noexcept : origin(
t.origin), copies(
t.copies) {}
1417 Tracker& operator=(
const Tracker&
t)
noexcept
1421 copies =
t.copies + 1;
1444 auto v2 =
Vector(std::move(t2));
1449 auto v3 =
Vector(t1, std::move(t2));
1456 auto v4 =
Vector(std::move(v3[0]), v3[1], std::move(t3));
1465 auto v5 =
Cat(v1, v4);
1476 auto v6 =
Cat(std::move(v1), v3);
1485 auto v7 =
Cat(v2, std::move(v4));
1496 auto v8 =
Cat(std::move(v2), std::move(v3));
1508 const std::array<unsigned char, 32> privkey_bytes = {
1511 0xD9, 0x7F, 0x51, 0x08, 0xF1, 0x1C, 0xDA, 0x6E,
1512 0xEE, 0xBA, 0xAA, 0x42, 0x0F, 0xEF, 0x07, 0x26,
1513 0xB1, 0xF8, 0x98, 0x06, 0x0B, 0x98, 0x48, 0x9F,
1514 0xA3, 0x09, 0x84, 0x63, 0xC0, 0x03, 0x28, 0x66
1517 const std::string message =
"Trust no one";
1519 const std::string expected_signature =
1520 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=";
1523 std::string generated_signature;
1525 BOOST_REQUIRE_MESSAGE(!privkey.
IsValid(),
1526 "Confirm the private key is invalid");
1528 BOOST_CHECK_MESSAGE(!
MessageSign(privkey, message, generated_signature),
1529 "Sign with an invalid private key");
1531 privkey.
Set(privkey_bytes.begin(), privkey_bytes.end(),
true);
1533 BOOST_REQUIRE_MESSAGE(privkey.
IsValid(),
1534 "Confirm the private key is valid");
1536 BOOST_CHECK_MESSAGE(
MessageSign(privkey, message, generated_signature),
1537 "Sign with a valid private key");
1547 "signature should be irrelevant",
1553 "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
1554 "signature should be irrelevant",
1560 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1561 "invalid signature, not in base64 encoding",
1562 "message should be irrelevant"),
1567 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1568 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
1569 "message should be irrelevant"),
1574 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1575 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1576 "I never signed this"),
1581 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1582 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1588 "11canuhp9X2NocwCq7xNrQYTmUgZAnLK3",
1589 "IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=",
1596 const std::string unsigned_tx =
"...";
1597 const std::string prefixed_message =
1600 std::string(1, (
char)unsigned_tx.length()) +
1604 const uint256 message_hash1 =
Hash(prefixed_message);
1608 BOOST_CHECK_NE(message_hash1, signature_hash);
1674 fs::path tmpfolder = m_args.GetDataDirBase();
1675 fs::path tmpfile = tmpfolder /
"read_binary.dat";
1676 std::string expected_text;
1677 for (
int i = 0; i < 30; i++) {
1678 expected_text +=
"0123456789";
1681 std::ofstream file{tmpfile.std_path()};
1682 file << expected_text;
1692 auto [valid, text] =
ReadBinaryFile(tmpfile, expected_text.size() / 2);
1698 fs::path invalid_file = tmpfolder /
"invalid_binary.dat";
1707 fs::path tmpfolder = m_args.GetDataDirBase();
1708 fs::path tmpfile = tmpfolder /
"write_binary.dat";
1709 std::string expected_text =
"bitcoin";
1711 std::string actual_text;
1712 std::ifstream file{tmpfile.std_path()};
1713 file >> actual_text;
1721 std::vector<uint8_t> v = {1, 2, 3};
1728 std::vector<bool> v = {
false,
true,
false,
false,
true,
true};
1735 std::deque<int> v = {1, 3, 3, 7};
1742template <
typename T>
1745 constexpr auto MAX{std::numeric_limits<T>::max()};
1755 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1);
1758 BOOST_CHECK(!CheckedLeftShift<T>((MAX >> 1) + 1, 1));
1760 BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits));
1761 BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits + 1));
1763 if constexpr (std::is_signed_v<T>) {
1764 constexpr auto MIN{std::numeric_limits<T>::min()};
1771 BOOST_CHECK(!CheckedLeftShift<T>((MIN >> 1) - 1, 1));
1777template <
typename T>
1780 constexpr auto MAX{std::numeric_limits<T>::max()};
1790 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1);
1795 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits), MAX);
1796 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits + 1), MAX);
1798 if constexpr (std::is_signed_v<T>) {
1799 constexpr auto MIN{std::numeric_limits<T>::min()};
1814 TestCheckedLeftShift<uint8_t>();
1815 TestCheckedLeftShift<int8_t>();
1816 TestCheckedLeftShift<size_t>();
1817 TestCheckedLeftShift<uint64_t>();
1818 TestCheckedLeftShift<int64_t>();
1823 TestSaturatingLeftShift<uint8_t>();
1824 TestSaturatingLeftShift<int8_t>();
1825 TestSaturatingLeftShift<size_t>();
1826 TestSaturatingLeftShift<uint64_t>();
1827 TestSaturatingLeftShift<int64_t>();
1834 const auto max_mib{std::numeric_limits<size_t>::max() >> 20};
1835 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"));
1860 constexpr int64_t
fee{12345};
1861 constexpr int32_t at_size{67};
1862 constexpr int32_t size{10};
1864 (uint64_t(
fee) * at_size + uint32_t(size) - 1) / uint32_t(size));
1867 constexpr unsigned bits{129};
1868 constexpr size_t digits{std::numeric_limits<size_t>::digits};
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.
BOOST_CHECK_EXCEPTION predicates to check the specific validation error.
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.