Bitcoin Core  29.1.0
P2P Digital Currency
util_tests.cpp
Go to the documentation of this file.
1 // Copyright (c) 2011-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <clientversion.h>
6 #include <common/signmessage.h> // For MessageSign(), MessageVerify(), MESSAGE_MAGIC
7 #include <hash.h> // For Hash()
8 #include <key.h> // For CKey
9 #include <script/parsing.h>
10 #include <span.h>
11 #include <sync.h>
12 #include <test/util/random.h>
13 #include <test/util/setup_common.h>
14 #include <uint256.h>
15 #include <util/bitdeque.h>
16 #include <util/byte_units.h>
17 #include <util/fs.h>
18 #include <util/fs_helpers.h>
19 #include <util/moneystr.h>
20 #include <util/overflow.h>
21 #include <util/readwritefile.h>
22 #include <util/strencodings.h>
23 #include <util/string.h>
24 #include <util/time.h>
25 #include <util/vector.h>
26 
27 #include <array>
28 #include <cmath>
29 #include <fstream>
30 #include <limits>
31 #include <map>
32 #include <optional>
33 #include <stdint.h>
34 #include <string.h>
35 #include <thread>
36 #include <univalue.h>
37 #include <utility>
38 #include <vector>
39 
40 #include <sys/types.h>
41 
42 #ifndef WIN32
43 #include <signal.h>
44 #include <sys/wait.h>
45 #endif
46 
47 #include <boost/test/unit_test.hpp>
48 
49 using namespace std::literals;
50 using namespace util::hex_literals;
52 using util::Join;
53 using util::RemovePrefix;
55 using util::ReplaceAll;
56 using util::Split;
57 using util::SplitString;
58 using util::TrimString;
60 
61 static const std::string STRING_WITH_EMBEDDED_NULL_CHAR{"1"s "\0" "1"s};
62 
63 /* defined in logging.cpp */
64 namespace BCLog {
65  std::string LogEscapeMessage(std::string_view str);
66 }
67 
69 
70 namespace {
71 class NoCopyOrMove
72 {
73 public:
74  int i;
75  explicit NoCopyOrMove(int i) : i{i} { }
76 
77  NoCopyOrMove() = delete;
78  NoCopyOrMove(const NoCopyOrMove&) = delete;
79  NoCopyOrMove(NoCopyOrMove&&) = delete;
80  NoCopyOrMove& operator=(const NoCopyOrMove&) = delete;
81  NoCopyOrMove& operator=(NoCopyOrMove&&) = delete;
82 
83  operator bool() const { return i != 0; }
84 
85  int get_ip1() { return i + 1; }
86  bool test()
87  {
88  // Check that Assume can be used within a lambda and still call methods
89  [&]() { Assume(get_ip1()); }();
90  return Assume(get_ip1() != 5);
91  }
92 };
93 } // namespace
94 
96 {
97  // Check that Assert can forward
98  const std::unique_ptr<int> p_two = Assert(std::make_unique<int>(2));
99  // Check that Assert works on lvalues and rvalues
100  const int two = *Assert(p_two);
101  Assert(two == 2);
102  Assert(true);
103  // Check that Assume can be used as unary expression
104  const bool result{Assume(two == 2)};
105  Assert(result);
106 
107  // Check that Assert doesn't require copy/move
108  NoCopyOrMove x{9};
109  Assert(x).i += 3;
110  Assert(x).test();
111 
112  // Check nested Asserts
113  BOOST_CHECK_EQUAL(Assert((Assert(x).test() ? 3 : 0)), 3);
114 
115  // Check -Wdangling-gsl does not trigger when copying the int. (It would
116  // trigger on "const int&")
117  const int nine{*Assert(std::optional<int>{9})};
118  BOOST_CHECK_EQUAL(9, nine);
119 }
120 
121 BOOST_AUTO_TEST_CASE(util_criticalsection)
122 {
124 
125  do {
126  LOCK(cs);
127  break;
128 
129  BOOST_ERROR("break was swallowed!");
130  } while(0);
131 
132  do {
133  TRY_LOCK(cs, lockTest);
134  if (lockTest) {
135  BOOST_CHECK(true); // Needed to suppress "Test case [...] did not check any assertions"
136  break;
137  }
138 
139  BOOST_ERROR("break was swallowed!");
140  } while(0);
141 }
142 
143 constexpr char HEX_PARSE_INPUT[] = "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f";
144 constexpr uint8_t HEX_PARSE_OUTPUT[] = {
145  0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7,
146  0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde,
147  0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12,
148  0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d,
149  0x5f
150 };
151 static_assert((sizeof(HEX_PARSE_INPUT) - 1) == 2 * sizeof(HEX_PARSE_OUTPUT));
153 {
154  std::vector<unsigned char> result;
155 
156  // Basic test vector
157  std::vector<unsigned char> expected(std::begin(HEX_PARSE_OUTPUT), std::end(HEX_PARSE_OUTPUT));
158  constexpr std::array<std::byte, 65> hex_literal_array{operator""_hex<util::detail::Hex(HEX_PARSE_INPUT)>()};
159  auto hex_literal_span{MakeUCharSpan(hex_literal_array)};
160  BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
161 
162  const std::vector<std::byte> hex_literal_vector{operator""_hex_v<util::detail::Hex(HEX_PARSE_INPUT)>()};
163  hex_literal_span = MakeUCharSpan(hex_literal_vector);
164  BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_span.begin(), hex_literal_span.end(), expected.begin(), expected.end());
165 
166  constexpr std::array<uint8_t, 65> hex_literal_array_uint8{operator""_hex_u8<util::detail::Hex(HEX_PARSE_INPUT)>()};
167  BOOST_CHECK_EQUAL_COLLECTIONS(hex_literal_array_uint8.begin(), hex_literal_array_uint8.end(), expected.begin(), expected.end());
168 
169  result = operator""_hex_v_u8<util::detail::Hex(HEX_PARSE_INPUT)>();
170  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
171 
173  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
174 
175  result = TryParseHex<uint8_t>(HEX_PARSE_INPUT).value();
176  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
177 
178  // Spaces between bytes must be supported
179  expected = {0x12, 0x34, 0x56, 0x78};
180  result = ParseHex("12 34 56 78");
181  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
182  result = TryParseHex<uint8_t>("12 34 56 78").value();
183  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
184 
185  // Leading space must be supported (used in BerkeleyEnvironment::Salvage)
186  expected = {0x89, 0x34, 0x56, 0x78};
187  result = ParseHex(" 89 34 56 78");
188  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
189  result = TryParseHex<uint8_t>(" 89 34 56 78").value();
190  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
191 
192  // Mixed case and spaces are supported
193  expected = {0xff, 0xaa};
194  result = ParseHex(" Ff aA ");
195  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
196  result = TryParseHex<uint8_t>(" Ff aA ").value();
197  BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
198 
199  // Empty string is supported
200  static_assert(""_hex.empty());
201  static_assert(""_hex_u8.empty());
202  BOOST_CHECK_EQUAL(""_hex_v.size(), 0);
203  BOOST_CHECK_EQUAL(""_hex_v_u8.size(), 0);
204  BOOST_CHECK_EQUAL(ParseHex("").size(), 0);
205  BOOST_CHECK_EQUAL(TryParseHex<uint8_t>("").value().size(), 0);
206 
207  // Spaces between nibbles is treated as invalid
208  BOOST_CHECK_EQUAL(ParseHex("AAF F").size(), 0);
209  BOOST_CHECK(!TryParseHex("AAF F").has_value());
210 
211  // Embedded null is treated as invalid
212  const std::string with_embedded_null{" 11 "s
213  " \0 "
214  " 22 "s};
215  BOOST_CHECK_EQUAL(with_embedded_null.size(), 11);
216  BOOST_CHECK_EQUAL(ParseHex(with_embedded_null).size(), 0);
217  BOOST_CHECK(!TryParseHex(with_embedded_null).has_value());
218 
219  // Non-hex is treated as invalid
220  BOOST_CHECK_EQUAL(ParseHex("1234 invalid 1234").size(), 0);
221  BOOST_CHECK(!TryParseHex("1234 invalid 1234").has_value());
222 
223  // Truncated input is treated as invalid
224  BOOST_CHECK_EQUAL(ParseHex("12 3").size(), 0);
225  BOOST_CHECK(!TryParseHex("12 3").has_value());
226 }
227 
228 BOOST_AUTO_TEST_CASE(consteval_hex_digit)
229 {
234 }
235 
237 {
241 
242  {
243  constexpr std::string_view out_exp{"04678afdb0"};
244  constexpr std::span in_s{HEX_PARSE_OUTPUT, out_exp.size() / 2};
245  const Span<const uint8_t> in_u{MakeUCharSpan(in_s)};
246  const Span<const std::byte> in_b{MakeByteSpan(in_s)};
247 
248  BOOST_CHECK_EQUAL(HexStr(in_u), out_exp);
249  BOOST_CHECK_EQUAL(HexStr(in_s), out_exp);
250  BOOST_CHECK_EQUAL(HexStr(in_b), out_exp);
251  }
252 
253  {
254  auto input = std::string();
255  for (size_t i=0; i<256; ++i) {
256  input.push_back(static_cast<char>(i));
257  }
258 
259  auto hex = HexStr(input);
260  BOOST_TEST_REQUIRE(hex.size() == 512);
261  static constexpr auto hexmap = std::string_view("0123456789abcdef");
262  for (size_t i = 0; i < 256; ++i) {
263  auto upper = hexmap.find(hex[i * 2]);
264  auto lower = hexmap.find(hex[i * 2 + 1]);
265  BOOST_TEST_REQUIRE(upper != std::string_view::npos);
266  BOOST_TEST_REQUIRE(lower != std::string_view::npos);
267  BOOST_TEST_REQUIRE(i == upper*16 + lower);
268  }
269  }
270 }
271 
272 BOOST_AUTO_TEST_CASE(span_write_bytes)
273 {
274  std::array mut_arr{uint8_t{0xaa}, uint8_t{0xbb}};
275  const auto mut_bytes{MakeWritableByteSpan(mut_arr)};
276  mut_bytes[1] = std::byte{0x11};
277  BOOST_CHECK_EQUAL(mut_arr.at(0), 0xaa);
278  BOOST_CHECK_EQUAL(mut_arr.at(1), 0x11);
279 }
280 
282 {
283  // Normal version
284  BOOST_CHECK_EQUAL(Join(std::vector<std::string>{}, ", "), "");
285  BOOST_CHECK_EQUAL(Join(std::vector<std::string>{"foo"}, ", "), "foo");
286  BOOST_CHECK_EQUAL(Join(std::vector<std::string>{"foo", "bar"}, ", "), "foo, bar");
287 
288  // Version with unary operator
289  const auto op_upper = [](const std::string& s) { return ToUpper(s); };
290  BOOST_CHECK_EQUAL(Join(std::list<std::string>{}, ", ", op_upper), "");
291  BOOST_CHECK_EQUAL(Join(std::list<std::string>{"foo"}, ", ", op_upper), "FOO");
292  BOOST_CHECK_EQUAL(Join(std::list<std::string>{"foo", "bar"}, ", ", op_upper), "FOO, BAR");
293 }
294 
295 BOOST_AUTO_TEST_CASE(util_ReplaceAll)
296 {
297  const std::string original("A test \"%s\" string '%s'.");
298  auto test_replaceall = [&original](const std::string& search, const std::string& substitute, const std::string& expected) {
299  auto test = original;
300  ReplaceAll(test, search, substitute);
301  BOOST_CHECK_EQUAL(test, expected);
302  };
303 
304  test_replaceall("", "foo", original);
305  test_replaceall(original, "foo", "foo");
306  test_replaceall("%s", "foo", "A test \"foo\" string 'foo'.");
307  test_replaceall("\"", "foo", "A test foo%sfoo string '%s'.");
308  test_replaceall("'", "foo", "A test \"%s\" string foo%sfoo.");
309 }
310 
311 BOOST_AUTO_TEST_CASE(util_TrimString)
312 {
313  BOOST_CHECK_EQUAL(TrimString(" foo bar "), "foo bar");
314  BOOST_CHECK_EQUAL(TrimStringView("\t \n \n \f\n\r\t\v\tfoo \n \f\n\r\t\v\tbar\t \n \f\n\r\t\v\t\n "), "foo \n \f\n\r\t\v\tbar");
315  BOOST_CHECK_EQUAL(TrimString("\t \n foo \n\tbar\t \n "), "foo \n\tbar");
316  BOOST_CHECK_EQUAL(TrimStringView("\t \n foo \n\tbar\t \n ", "fobar"), "\t \n foo \n\tbar\t \n ");
317  BOOST_CHECK_EQUAL(TrimString("foo bar"), "foo bar");
318  BOOST_CHECK_EQUAL(TrimStringView("foo bar", "fobar"), " ");
319  BOOST_CHECK_EQUAL(TrimString(std::string("\0 foo \0 ", 8)), std::string("\0 foo \0", 7));
320  BOOST_CHECK_EQUAL(TrimStringView(std::string(" foo ", 5)), std::string("foo", 3));
321  BOOST_CHECK_EQUAL(TrimString(std::string("\t\t\0\0\n\n", 6)), std::string("\0\0", 2));
322  BOOST_CHECK_EQUAL(TrimStringView(std::string("\x05\x04\x03\x02\x01\x00", 6)), std::string("\x05\x04\x03\x02\x01\x00", 6));
323  BOOST_CHECK_EQUAL(TrimString(std::string("\x05\x04\x03\x02\x01\x00", 6), std::string("\x05\x04\x03\x02\x01", 5)), std::string("\0", 1));
324  BOOST_CHECK_EQUAL(TrimStringView(std::string("\x05\x04\x03\x02\x01\x00", 6), std::string("\x05\x04\x03\x02\x01\x00", 6)), "");
325 }
326 
327 BOOST_AUTO_TEST_CASE(util_ParseISO8601DateTime)
328 {
329  BOOST_CHECK_EQUAL(ParseISO8601DateTime("1969-12-31T23:59:59Z").value(), -1);
330  BOOST_CHECK_EQUAL(ParseISO8601DateTime("1970-01-01T00:00:00Z").value(), 0);
331  BOOST_CHECK_EQUAL(ParseISO8601DateTime("1970-01-01T00:00:01Z").value(), 1);
332  BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T00:00:01Z").value(), 946684801);
333  BOOST_CHECK_EQUAL(ParseISO8601DateTime("2011-09-30T23:36:17Z").value(), 1317425777);
334  BOOST_CHECK_EQUAL(ParseISO8601DateTime("2100-12-31T23:59:59Z").value(), 4133980799);
335  BOOST_CHECK_EQUAL(ParseISO8601DateTime("9999-12-31T23:59:59Z").value(), 253402300799);
336 
337  // Accept edge-cases, where the time overflows. They are not produced by
338  // FormatISO8601DateTime, so this can be changed in the future, if needed.
339  // For now, keep compatibility with the previous implementation.
340  BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T99:00:00Z").value(), 947041200);
341  BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T00:99:00Z").value(), 946690740);
342  BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T00:00:99Z").value(), 946684899);
343  BOOST_CHECK_EQUAL(ParseISO8601DateTime("2000-01-01T99:99:99Z").value(), 947047239);
344 
345  // Reject date overflows.
346  BOOST_CHECK(!ParseISO8601DateTime("2000-99-01T00:00:00Z"));
347  BOOST_CHECK(!ParseISO8601DateTime("2000-01-99T00:00:00Z"));
348 
349  // Reject out-of-range years
350  BOOST_CHECK(!ParseISO8601DateTime("32768-12-31T23:59:59Z"));
351  BOOST_CHECK(!ParseISO8601DateTime("32767-12-31T23:59:59Z"));
352  BOOST_CHECK(!ParseISO8601DateTime("32767-12-31T00:00:00Z"));
353  BOOST_CHECK(!ParseISO8601DateTime("999-12-31T00:00:00Z"));
354 
355  // Reject invalid format
356  const std::string valid{"2000-01-01T00:00:01Z"};
357  BOOST_CHECK(ParseISO8601DateTime(valid).has_value());
358  for (auto mut{0U}; mut < valid.size(); ++mut) {
359  std::string invalid{valid};
360  invalid[mut] = 'a';
362  }
363 }
364 
365 BOOST_AUTO_TEST_CASE(util_FormatISO8601DateTime)
366 {
367  BOOST_CHECK_EQUAL(FormatISO8601DateTime(971890963199), "32767-12-31T23:59:59Z");
368  BOOST_CHECK_EQUAL(FormatISO8601DateTime(971890876800), "32767-12-31T00:00:00Z");
369 
370  BOOST_CHECK_EQUAL(FormatISO8601DateTime(-1), "1969-12-31T23:59:59Z");
371  BOOST_CHECK_EQUAL(FormatISO8601DateTime(0), "1970-01-01T00:00:00Z");
372  BOOST_CHECK_EQUAL(FormatISO8601DateTime(1), "1970-01-01T00:00:01Z");
373  BOOST_CHECK_EQUAL(FormatISO8601DateTime(946684801), "2000-01-01T00:00:01Z");
374  BOOST_CHECK_EQUAL(FormatISO8601DateTime(1317425777), "2011-09-30T23:36:17Z");
375  BOOST_CHECK_EQUAL(FormatISO8601DateTime(4133980799), "2100-12-31T23:59:59Z");
376  BOOST_CHECK_EQUAL(FormatISO8601DateTime(253402300799), "9999-12-31T23:59:59Z");
377 }
378 
379 BOOST_AUTO_TEST_CASE(util_FormatISO8601Date)
380 {
381  BOOST_CHECK_EQUAL(FormatISO8601Date(971890963199), "32767-12-31");
382  BOOST_CHECK_EQUAL(FormatISO8601Date(971890876800), "32767-12-31");
383 
384  BOOST_CHECK_EQUAL(FormatISO8601Date(0), "1970-01-01");
385  BOOST_CHECK_EQUAL(FormatISO8601Date(1317425777), "2011-09-30");
386 }
387 
388 BOOST_AUTO_TEST_CASE(util_FormatMoney)
389 {
390  BOOST_CHECK_EQUAL(FormatMoney(0), "0.00");
391  BOOST_CHECK_EQUAL(FormatMoney((COIN/10000)*123456789), "12345.6789");
392  BOOST_CHECK_EQUAL(FormatMoney(-COIN), "-1.00");
393 
394  BOOST_CHECK_EQUAL(FormatMoney(COIN*100000000), "100000000.00");
395  BOOST_CHECK_EQUAL(FormatMoney(COIN*10000000), "10000000.00");
396  BOOST_CHECK_EQUAL(FormatMoney(COIN*1000000), "1000000.00");
397  BOOST_CHECK_EQUAL(FormatMoney(COIN*100000), "100000.00");
398  BOOST_CHECK_EQUAL(FormatMoney(COIN*10000), "10000.00");
399  BOOST_CHECK_EQUAL(FormatMoney(COIN*1000), "1000.00");
400  BOOST_CHECK_EQUAL(FormatMoney(COIN*100), "100.00");
401  BOOST_CHECK_EQUAL(FormatMoney(COIN*10), "10.00");
403  BOOST_CHECK_EQUAL(FormatMoney(COIN/10), "0.10");
404  BOOST_CHECK_EQUAL(FormatMoney(COIN/100), "0.01");
405  BOOST_CHECK_EQUAL(FormatMoney(COIN/1000), "0.001");
406  BOOST_CHECK_EQUAL(FormatMoney(COIN/10000), "0.0001");
407  BOOST_CHECK_EQUAL(FormatMoney(COIN/100000), "0.00001");
408  BOOST_CHECK_EQUAL(FormatMoney(COIN/1000000), "0.000001");
409  BOOST_CHECK_EQUAL(FormatMoney(COIN/10000000), "0.0000001");
410  BOOST_CHECK_EQUAL(FormatMoney(COIN/100000000), "0.00000001");
411 
412  BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::max()), "92233720368.54775807");
413  BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::max() - 1), "92233720368.54775806");
414  BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::max() - 2), "92233720368.54775805");
415  BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::max() - 3), "92233720368.54775804");
416  // ...
417  BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::min() + 3), "-92233720368.54775805");
418  BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::min() + 2), "-92233720368.54775806");
419  BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::min() + 1), "-92233720368.54775807");
420  BOOST_CHECK_EQUAL(FormatMoney(std::numeric_limits<CAmount>::min()), "-92233720368.54775808");
421 }
422 
423 BOOST_AUTO_TEST_CASE(util_ParseMoney)
424 {
425  BOOST_CHECK_EQUAL(ParseMoney("0.0").value(), 0);
426  BOOST_CHECK_EQUAL(ParseMoney(".").value(), 0);
427  BOOST_CHECK_EQUAL(ParseMoney("0.").value(), 0);
428  BOOST_CHECK_EQUAL(ParseMoney(".0").value(), 0);
429  BOOST_CHECK_EQUAL(ParseMoney(".6789").value(), 6789'0000);
430  BOOST_CHECK_EQUAL(ParseMoney("12345.").value(), COIN * 12345);
431 
432  BOOST_CHECK_EQUAL(ParseMoney("12345.6789").value(), (COIN/10000)*123456789);
433 
434  BOOST_CHECK_EQUAL(ParseMoney("10000000.00").value(), COIN*10000000);
435  BOOST_CHECK_EQUAL(ParseMoney("1000000.00").value(), COIN*1000000);
436  BOOST_CHECK_EQUAL(ParseMoney("100000.00").value(), COIN*100000);
437  BOOST_CHECK_EQUAL(ParseMoney("10000.00").value(), COIN*10000);
438  BOOST_CHECK_EQUAL(ParseMoney("1000.00").value(), COIN*1000);
439  BOOST_CHECK_EQUAL(ParseMoney("100.00").value(), COIN*100);
440  BOOST_CHECK_EQUAL(ParseMoney("10.00").value(), COIN*10);
441  BOOST_CHECK_EQUAL(ParseMoney("1.00").value(), COIN);
442  BOOST_CHECK_EQUAL(ParseMoney("1").value(), COIN);
443  BOOST_CHECK_EQUAL(ParseMoney(" 1").value(), COIN);
444  BOOST_CHECK_EQUAL(ParseMoney("1 ").value(), COIN);
445  BOOST_CHECK_EQUAL(ParseMoney(" 1 ").value(), COIN);
446  BOOST_CHECK_EQUAL(ParseMoney("0.1").value(), COIN/10);
447  BOOST_CHECK_EQUAL(ParseMoney("0.01").value(), COIN/100);
448  BOOST_CHECK_EQUAL(ParseMoney("0.001").value(), COIN/1000);
449  BOOST_CHECK_EQUAL(ParseMoney("0.0001").value(), COIN/10000);
450  BOOST_CHECK_EQUAL(ParseMoney("0.00001").value(), COIN/100000);
451  BOOST_CHECK_EQUAL(ParseMoney("0.000001").value(), COIN/1000000);
452  BOOST_CHECK_EQUAL(ParseMoney("0.0000001").value(), COIN/10000000);
453  BOOST_CHECK_EQUAL(ParseMoney("0.00000001").value(), COIN/100000000);
454  BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001 ").value(), COIN/100000000);
455  BOOST_CHECK_EQUAL(ParseMoney("0.00000001 ").value(), COIN/100000000);
456  BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001").value(), COIN/100000000);
457 
458  // Parsing amount that cannot be represented should fail
459  BOOST_CHECK(!ParseMoney("100000000.00"));
460  BOOST_CHECK(!ParseMoney("0.000000001"));
461 
462  // Parsing empty string should fail
463  BOOST_CHECK(!ParseMoney(""));
464  BOOST_CHECK(!ParseMoney(" "));
465  BOOST_CHECK(!ParseMoney(" "));
466 
467  // Parsing two numbers should fail
468  BOOST_CHECK(!ParseMoney(".."));
469  BOOST_CHECK(!ParseMoney("0..0"));
470  BOOST_CHECK(!ParseMoney("1 2"));
471  BOOST_CHECK(!ParseMoney(" 1 2 "));
472  BOOST_CHECK(!ParseMoney(" 1.2 3 "));
473  BOOST_CHECK(!ParseMoney(" 1 2.3 "));
474 
475  // Embedded whitespace should fail
476  BOOST_CHECK(!ParseMoney(" -1 .2 "));
477  BOOST_CHECK(!ParseMoney(" 1 .2 "));
478  BOOST_CHECK(!ParseMoney(" +1 .2 "));
479 
480  // Attempted 63 bit overflow should fail
481  BOOST_CHECK(!ParseMoney("92233720368.54775808"));
482 
483  // Parsing negative amounts must fail
484  BOOST_CHECK(!ParseMoney("-1"));
485 
486  // Parsing strings with embedded NUL characters should fail
487  BOOST_CHECK(!ParseMoney("\0-1"s));
488  BOOST_CHECK(!ParseMoney(STRING_WITH_EMBEDDED_NULL_CHAR));
489  BOOST_CHECK(!ParseMoney("1\0"s));
490 }
491 
492 BOOST_AUTO_TEST_CASE(util_IsHex)
493 {
494  BOOST_CHECK(IsHex("00"));
495  BOOST_CHECK(IsHex("00112233445566778899aabbccddeeffAABBCCDDEEFF"));
496  BOOST_CHECK(IsHex("ff"));
497  BOOST_CHECK(IsHex("FF"));
498 
499  BOOST_CHECK(!IsHex(""));
500  BOOST_CHECK(!IsHex("0"));
501  BOOST_CHECK(!IsHex("a"));
502  BOOST_CHECK(!IsHex("eleven"));
503  BOOST_CHECK(!IsHex("00xx00"));
504  BOOST_CHECK(!IsHex("0x0000"));
505 }
506 
507 BOOST_AUTO_TEST_CASE(util_seed_insecure_rand)
508 {
509  SeedRandomForTest(SeedRand::ZEROS);
510  for (int mod=2;mod<11;mod++)
511  {
512  int mask = 1;
513  // Really rough binomial confidence approximation.
514  int err = 30*10000./mod*sqrt((1./mod*(1-1./mod))/10000.);
515  //mask is 2^ceil(log2(mod))-1
516  while(mask<mod-1)mask=(mask<<1)+1;
517 
518  int count = 0;
519  //How often does it get a zero from the uniform range [0,mod)?
520  for (int i = 0; i < 10000; i++) {
521  uint32_t rval;
522  do{
523  rval=m_rng.rand32()&mask;
524  }while(rval>=(uint32_t)mod);
525  count += rval==0;
526  }
527  BOOST_CHECK(count<=10000/mod+err);
528  BOOST_CHECK(count>=10000/mod-err);
529  }
530 }
531 
532 BOOST_AUTO_TEST_CASE(util_TimingResistantEqual)
533 {
534  BOOST_CHECK(TimingResistantEqual(std::string(""), std::string("")));
535  BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string("")));
536  BOOST_CHECK(!TimingResistantEqual(std::string(""), std::string("abc")));
537  BOOST_CHECK(!TimingResistantEqual(std::string("a"), std::string("aa")));
538  BOOST_CHECK(!TimingResistantEqual(std::string("aa"), std::string("a")));
539  BOOST_CHECK(TimingResistantEqual(std::string("abc"), std::string("abc")));
540  BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string("aba")));
541 }
542 
543 /* Test strprintf formatting directives.
544  * Put a string before and after to ensure sanity of element sizes on stack. */
545 #define B "check_prefix"
546 #define E "check_postfix"
547 BOOST_AUTO_TEST_CASE(strprintf_numbers)
548 {
549  int64_t s64t = -9223372036854775807LL; /* signed 64 bit test value */
550  uint64_t u64t = 18446744073709551615ULL; /* unsigned 64 bit test value */
551  BOOST_CHECK(strprintf("%s %d %s", B, s64t, E) == B" -9223372036854775807 " E);
552  BOOST_CHECK(strprintf("%s %u %s", B, u64t, E) == B" 18446744073709551615 " E);
553  BOOST_CHECK(strprintf("%s %x %s", B, u64t, E) == B" ffffffffffffffff " E);
554 
555  size_t st = 12345678; /* unsigned size_t test value */
556  ssize_t sst = -12345678; /* signed size_t test value */
557  BOOST_CHECK(strprintf("%s %d %s", B, sst, E) == B" -12345678 " E);
558  BOOST_CHECK(strprintf("%s %u %s", B, st, E) == B" 12345678 " E);
559  BOOST_CHECK(strprintf("%s %x %s", B, st, E) == B" bc614e " E);
560 
561  ptrdiff_t pt = 87654321; /* positive ptrdiff_t test value */
562  ptrdiff_t spt = -87654321; /* negative ptrdiff_t test value */
563  BOOST_CHECK(strprintf("%s %d %s", B, spt, E) == B" -87654321 " E);
564  BOOST_CHECK(strprintf("%s %u %s", B, pt, E) == B" 87654321 " E);
565  BOOST_CHECK(strprintf("%s %x %s", B, pt, E) == B" 5397fb1 " E);
566 }
567 #undef B
568 #undef E
569 
570 BOOST_AUTO_TEST_CASE(util_time_GetTime)
571 {
572  SetMockTime(111);
573  // Check that mock time does not change after a sleep
574  for (const auto& num_sleep : {0ms, 1ms}) {
575  UninterruptibleSleep(num_sleep);
576  BOOST_CHECK_EQUAL(111, GetTime()); // Deprecated time getter
577  BOOST_CHECK_EQUAL(111, Now<NodeSeconds>().time_since_epoch().count());
578  BOOST_CHECK_EQUAL(111, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now()));
579  BOOST_CHECK_EQUAL(111, TicksSinceEpoch<SecondsDouble>(Now<NodeSeconds>()));
580  BOOST_CHECK_EQUAL(111, GetTime<std::chrono::seconds>().count());
581  BOOST_CHECK_EQUAL(111000, GetTime<std::chrono::milliseconds>().count());
582  BOOST_CHECK_EQUAL(111000, TicksSinceEpoch<std::chrono::milliseconds>(NodeClock::now()));
583  BOOST_CHECK_EQUAL(111000000, GetTime<std::chrono::microseconds>().count());
584  }
585 
586  SetMockTime(0);
587  // Check that steady time and system time changes after a sleep
588  const auto steady_ms_0 = Now<SteadyMilliseconds>();
589  const auto steady_0 = std::chrono::steady_clock::now();
590  const auto ms_0 = GetTime<std::chrono::milliseconds>();
591  const auto us_0 = GetTime<std::chrono::microseconds>();
592  UninterruptibleSleep(1ms);
593  BOOST_CHECK(steady_ms_0 < Now<SteadyMilliseconds>());
594  BOOST_CHECK(steady_0 + 1ms <= std::chrono::steady_clock::now());
595  BOOST_CHECK(ms_0 < GetTime<std::chrono::milliseconds>());
596  BOOST_CHECK(us_0 < GetTime<std::chrono::microseconds>());
597 }
598 
599 BOOST_AUTO_TEST_CASE(test_IsDigit)
600 {
601  BOOST_CHECK_EQUAL(IsDigit('0'), true);
602  BOOST_CHECK_EQUAL(IsDigit('1'), true);
603  BOOST_CHECK_EQUAL(IsDigit('8'), true);
604  BOOST_CHECK_EQUAL(IsDigit('9'), true);
605 
606  BOOST_CHECK_EQUAL(IsDigit('0' - 1), false);
607  BOOST_CHECK_EQUAL(IsDigit('9' + 1), false);
608  BOOST_CHECK_EQUAL(IsDigit(0), false);
609  BOOST_CHECK_EQUAL(IsDigit(1), false);
610  BOOST_CHECK_EQUAL(IsDigit(8), false);
611  BOOST_CHECK_EQUAL(IsDigit(9), false);
612 }
613 
614 /* Check for overflow */
615 template <typename T>
616 static void TestAddMatrixOverflow()
617 {
618  constexpr T MAXI{std::numeric_limits<T>::max()};
619  BOOST_CHECK(!CheckedAdd(T{1}, MAXI));
620  BOOST_CHECK(!CheckedAdd(MAXI, MAXI));
621  BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI));
622  BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(MAXI, MAXI));
623 
624  BOOST_CHECK_EQUAL(0, CheckedAdd(T{0}, T{0}).value());
625  BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{0}, MAXI).value());
626  BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{1}, MAXI - 1).value());
627  BOOST_CHECK_EQUAL(MAXI - 1, CheckedAdd(T{1}, MAXI - 2).value());
628  BOOST_CHECK_EQUAL(0, SaturatingAdd(T{0}, T{0}));
629  BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{0}, MAXI));
630  BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI - 1));
631  BOOST_CHECK_EQUAL(MAXI - 1, SaturatingAdd(T{1}, MAXI - 2));
632 }
633 
634 /* Check for overflow or underflow */
635 template <typename T>
636 static void TestAddMatrix()
637 {
638  TestAddMatrixOverflow<T>();
639  constexpr T MINI{std::numeric_limits<T>::min()};
640  constexpr T MAXI{std::numeric_limits<T>::max()};
641  BOOST_CHECK(!CheckedAdd(T{-1}, MINI));
642  BOOST_CHECK(!CheckedAdd(MINI, MINI));
643  BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI));
644  BOOST_CHECK_EQUAL(MINI, SaturatingAdd(MINI, MINI));
645 
646  BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{0}, MINI).value());
647  BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{-1}, MINI + 1).value());
648  BOOST_CHECK_EQUAL(-1, CheckedAdd(MINI, MAXI).value());
649  BOOST_CHECK_EQUAL(MINI + 1, CheckedAdd(T{-1}, MINI + 2).value());
650  BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{0}, MINI));
651  BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI + 1));
652  BOOST_CHECK_EQUAL(MINI + 1, SaturatingAdd(T{-1}, MINI + 2));
653  BOOST_CHECK_EQUAL(-1, SaturatingAdd(MINI, MAXI));
654 }
655 
656 BOOST_AUTO_TEST_CASE(util_overflow)
657 {
658  TestAddMatrixOverflow<unsigned>();
659  TestAddMatrix<signed>();
660 }
661 
662 BOOST_AUTO_TEST_CASE(test_ParseInt32)
663 {
664  int32_t n;
665  // Valid values
666  BOOST_CHECK(ParseInt32("1234", nullptr));
667  BOOST_CHECK(ParseInt32("0", &n) && n == 0);
668  BOOST_CHECK(ParseInt32("1234", &n) && n == 1234);
669  BOOST_CHECK(ParseInt32("01234", &n) && n == 1234); // no octal
670  BOOST_CHECK(ParseInt32("2147483647", &n) && n == 2147483647);
671  BOOST_CHECK(ParseInt32("-2147483648", &n) && n == (-2147483647 - 1)); // (-2147483647 - 1) equals INT_MIN
672  BOOST_CHECK(ParseInt32("-1234", &n) && n == -1234);
673  BOOST_CHECK(ParseInt32("00000000000000001234", &n) && n == 1234);
674  BOOST_CHECK(ParseInt32("-00000000000000001234", &n) && n == -1234);
675  BOOST_CHECK(ParseInt32("00000000000000000000", &n) && n == 0);
676  BOOST_CHECK(ParseInt32("-00000000000000000000", &n) && n == 0);
677  // Invalid values
678  BOOST_CHECK(!ParseInt32("", &n));
679  BOOST_CHECK(!ParseInt32(" 1", &n)); // no padding inside
680  BOOST_CHECK(!ParseInt32("1 ", &n));
681  BOOST_CHECK(!ParseInt32("++1", &n));
682  BOOST_CHECK(!ParseInt32("+-1", &n));
683  BOOST_CHECK(!ParseInt32("-+1", &n));
684  BOOST_CHECK(!ParseInt32("--1", &n));
685  BOOST_CHECK(!ParseInt32("1a", &n));
686  BOOST_CHECK(!ParseInt32("aap", &n));
687  BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex
688  BOOST_CHECK(!ParseInt32(STRING_WITH_EMBEDDED_NULL_CHAR, &n));
689  // Overflow and underflow
690  BOOST_CHECK(!ParseInt32("-2147483649", nullptr));
691  BOOST_CHECK(!ParseInt32("2147483648", nullptr));
692  BOOST_CHECK(!ParseInt32("-32482348723847471234", nullptr));
693  BOOST_CHECK(!ParseInt32("32482348723847471234", nullptr));
694 }
695 
696 template <typename T>
697 static void RunToIntegralTests()
698 {
699  BOOST_CHECK(!ToIntegral<T>(STRING_WITH_EMBEDDED_NULL_CHAR));
700  BOOST_CHECK(!ToIntegral<T>(" 1"));
701  BOOST_CHECK(!ToIntegral<T>("1 "));
702  BOOST_CHECK(!ToIntegral<T>("1a"));
703  BOOST_CHECK(!ToIntegral<T>("1.1"));
704  BOOST_CHECK(!ToIntegral<T>("1.9"));
705  BOOST_CHECK(!ToIntegral<T>("+01.9"));
706  BOOST_CHECK(!ToIntegral<T>("-"));
707  BOOST_CHECK(!ToIntegral<T>("+"));
708  BOOST_CHECK(!ToIntegral<T>(" -1"));
709  BOOST_CHECK(!ToIntegral<T>("-1 "));
710  BOOST_CHECK(!ToIntegral<T>(" -1 "));
711  BOOST_CHECK(!ToIntegral<T>("+1"));
712  BOOST_CHECK(!ToIntegral<T>(" +1"));
713  BOOST_CHECK(!ToIntegral<T>(" +1 "));
714  BOOST_CHECK(!ToIntegral<T>("+-1"));
715  BOOST_CHECK(!ToIntegral<T>("-+1"));
716  BOOST_CHECK(!ToIntegral<T>("++1"));
717  BOOST_CHECK(!ToIntegral<T>("--1"));
718  BOOST_CHECK(!ToIntegral<T>(""));
719  BOOST_CHECK(!ToIntegral<T>("aap"));
720  BOOST_CHECK(!ToIntegral<T>("0x1"));
721  BOOST_CHECK(!ToIntegral<T>("-32482348723847471234"));
722  BOOST_CHECK(!ToIntegral<T>("32482348723847471234"));
723 }
724 
725 BOOST_AUTO_TEST_CASE(test_ToIntegral)
726 {
727  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("1234").value(), 1'234);
728  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("0").value(), 0);
729  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("01234").value(), 1'234);
730  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000001234").value(), 1'234);
731  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-00000000000000001234").value(), -1'234);
732  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000000000").value(), 0);
733  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-00000000000000000000").value(), 0);
734  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1234").value(), -1'234);
735  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1").value(), -1);
736 
737  RunToIntegralTests<uint64_t>();
738  RunToIntegralTests<int64_t>();
739  RunToIntegralTests<uint32_t>();
740  RunToIntegralTests<int32_t>();
741  RunToIntegralTests<uint16_t>();
742  RunToIntegralTests<int16_t>();
743  RunToIntegralTests<uint8_t>();
744  RunToIntegralTests<int8_t>();
745 
746  BOOST_CHECK(!ToIntegral<int64_t>("-9223372036854775809"));
747  BOOST_CHECK_EQUAL(ToIntegral<int64_t>("-9223372036854775808").value(), -9'223'372'036'854'775'807LL - 1LL);
748  BOOST_CHECK_EQUAL(ToIntegral<int64_t>("9223372036854775807").value(), 9'223'372'036'854'775'807);
749  BOOST_CHECK(!ToIntegral<int64_t>("9223372036854775808"));
750 
751  BOOST_CHECK(!ToIntegral<uint64_t>("-1"));
752  BOOST_CHECK_EQUAL(ToIntegral<uint64_t>("0").value(), 0U);
753  BOOST_CHECK_EQUAL(ToIntegral<uint64_t>("18446744073709551615").value(), 18'446'744'073'709'551'615ULL);
754  BOOST_CHECK(!ToIntegral<uint64_t>("18446744073709551616"));
755 
756  BOOST_CHECK(!ToIntegral<int32_t>("-2147483649"));
757  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-2147483648").value(), -2'147'483'648LL);
758  BOOST_CHECK_EQUAL(ToIntegral<int32_t>("2147483647").value(), 2'147'483'647);
759  BOOST_CHECK(!ToIntegral<int32_t>("2147483648"));
760 
761  BOOST_CHECK(!ToIntegral<uint32_t>("-1"));
762  BOOST_CHECK_EQUAL(ToIntegral<uint32_t>("0").value(), 0U);
763  BOOST_CHECK_EQUAL(ToIntegral<uint32_t>("4294967295").value(), 4'294'967'295U);
764  BOOST_CHECK(!ToIntegral<uint32_t>("4294967296"));
765 
766  BOOST_CHECK(!ToIntegral<int16_t>("-32769"));
767  BOOST_CHECK_EQUAL(ToIntegral<int16_t>("-32768").value(), -32'768);
768  BOOST_CHECK_EQUAL(ToIntegral<int16_t>("32767").value(), 32'767);
769  BOOST_CHECK(!ToIntegral<int16_t>("32768"));
770 
771  BOOST_CHECK(!ToIntegral<uint16_t>("-1"));
772  BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("0").value(), 0U);
773  BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("65535").value(), 65'535U);
774  BOOST_CHECK(!ToIntegral<uint16_t>("65536"));
775 
776  BOOST_CHECK(!ToIntegral<int8_t>("-129"));
777  BOOST_CHECK_EQUAL(ToIntegral<int8_t>("-128").value(), -128);
778  BOOST_CHECK_EQUAL(ToIntegral<int8_t>("127").value(), 127);
779  BOOST_CHECK(!ToIntegral<int8_t>("128"));
780 
781  BOOST_CHECK(!ToIntegral<uint8_t>("-1"));
782  BOOST_CHECK_EQUAL(ToIntegral<uint8_t>("0").value(), 0U);
783  BOOST_CHECK_EQUAL(ToIntegral<uint8_t>("255").value(), 255U);
784  BOOST_CHECK(!ToIntegral<uint8_t>("256"));
785 }
786 
787 int64_t atoi64_legacy(const std::string& str)
788 {
789  return strtoll(str.c_str(), nullptr, 10);
790 }
791 
792 BOOST_AUTO_TEST_CASE(test_LocaleIndependentAtoi)
793 {
794  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1234"), 1'234);
795  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0"), 0);
796  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("01234"), 1'234);
797  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1234"), -1'234);
798  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" 1"), 1);
799  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1 "), 1);
800  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1a"), 1);
801  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.1"), 1);
802  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.9"), 1);
803  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+01.9"), 1);
804  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1"), -1);
805  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1"), -1);
806  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1 "), -1);
807  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1 "), -1);
808  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+1"), 1);
809  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1"), 1);
810  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1 "), 1);
811 
812  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+-1"), 0);
813  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-+1"), 0);
814  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("++1"), 0);
815  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("--1"), 0);
816  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(""), 0);
817  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("aap"), 0);
818  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0x1"), 0);
819  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-32482348723847471234"), -2'147'483'647 - 1);
820  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("32482348723847471234"), 2'147'483'647);
821 
822  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775809"), -9'223'372'036'854'775'807LL - 1LL);
823  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775808"), -9'223'372'036'854'775'807LL - 1LL);
824  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775807"), 9'223'372'036'854'775'807);
825  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775808"), 9'223'372'036'854'775'807);
826 
827  std::map<std::string, int64_t> atoi64_test_pairs = {
828  {"-9223372036854775809", std::numeric_limits<int64_t>::min()},
829  {"-9223372036854775808", -9'223'372'036'854'775'807LL - 1LL},
830  {"9223372036854775807", 9'223'372'036'854'775'807},
831  {"9223372036854775808", std::numeric_limits<int64_t>::max()},
832  {"+-", 0},
833  {"0x1", 0},
834  {"ox1", 0},
835  {"", 0},
836  };
837 
838  for (const auto& pair : atoi64_test_pairs) {
839  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(pair.first), pair.second);
840  }
841 
842  // Ensure legacy compatibility with previous versions of Bitcoin Core's atoi64
843  for (const auto& pair : atoi64_test_pairs) {
844  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(pair.first), atoi64_legacy(pair.first));
845  }
846 
847  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>("-1"), 0U);
848  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>("0"), 0U);
849  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>("18446744073709551615"), 18'446'744'073'709'551'615ULL);
850  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>("18446744073709551616"), 18'446'744'073'709'551'615ULL);
851 
852  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-2147483649"), -2'147'483'648LL);
853  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-2147483648"), -2'147'483'648LL);
854  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("2147483647"), 2'147'483'647);
855  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("2147483648"), 2'147'483'647);
856 
857  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("-1"), 0U);
858  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("0"), 0U);
859  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("4294967295"), 4'294'967'295U);
860  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("4294967296"), 4'294'967'295U);
861 
862  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("-32769"), -32'768);
863  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("-32768"), -32'768);
864  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("32767"), 32'767);
865  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("32768"), 32'767);
866 
867  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("-1"), 0U);
868  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("0"), 0U);
869  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("65535"), 65'535U);
870  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("65536"), 65'535U);
871 
872  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int8_t>("-129"), -128);
873  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int8_t>("-128"), -128);
874  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int8_t>("127"), 127);
875  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int8_t>("128"), 127);
876 
877  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint8_t>("-1"), 0U);
878  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint8_t>("0"), 0U);
879  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint8_t>("255"), 255U);
880  BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint8_t>("256"), 255U);
881 }
882 
883 BOOST_AUTO_TEST_CASE(test_ParseInt64)
884 {
885  int64_t n;
886  // Valid values
887  BOOST_CHECK(ParseInt64("1234", nullptr));
888  BOOST_CHECK(ParseInt64("0", &n) && n == 0LL);
889  BOOST_CHECK(ParseInt64("1234", &n) && n == 1234LL);
890  BOOST_CHECK(ParseInt64("01234", &n) && n == 1234LL); // no octal
891  BOOST_CHECK(ParseInt64("2147483647", &n) && n == 2147483647LL);
892  BOOST_CHECK(ParseInt64("-2147483648", &n) && n == -2147483648LL);
893  BOOST_CHECK(ParseInt64("9223372036854775807", &n) && n == int64_t{9223372036854775807});
894  BOOST_CHECK(ParseInt64("-9223372036854775808", &n) && n == int64_t{-9223372036854775807-1});
895  BOOST_CHECK(ParseInt64("-1234", &n) && n == -1234LL);
896  // Invalid values
897  BOOST_CHECK(!ParseInt64("", &n));
898  BOOST_CHECK(!ParseInt64(" 1", &n)); // no padding inside
899  BOOST_CHECK(!ParseInt64("1 ", &n));
900  BOOST_CHECK(!ParseInt64("1a", &n));
901  BOOST_CHECK(!ParseInt64("aap", &n));
902  BOOST_CHECK(!ParseInt64("0x1", &n)); // no hex
904  // Overflow and underflow
905  BOOST_CHECK(!ParseInt64("-9223372036854775809", nullptr));
906  BOOST_CHECK(!ParseInt64("9223372036854775808", nullptr));
907  BOOST_CHECK(!ParseInt64("-32482348723847471234", nullptr));
908  BOOST_CHECK(!ParseInt64("32482348723847471234", nullptr));
909 }
910 
911 BOOST_AUTO_TEST_CASE(test_ParseUInt8)
912 {
913  uint8_t n;
914  // Valid values
915  BOOST_CHECK(ParseUInt8("255", nullptr));
916  BOOST_CHECK(ParseUInt8("0", &n) && n == 0);
917  BOOST_CHECK(ParseUInt8("255", &n) && n == 255);
918  BOOST_CHECK(ParseUInt8("0255", &n) && n == 255); // no octal
919  BOOST_CHECK(ParseUInt8("255", &n) && n == static_cast<uint8_t>(255));
920  BOOST_CHECK(ParseUInt8("+255", &n) && n == 255);
921  BOOST_CHECK(ParseUInt8("00000000000000000012", &n) && n == 12);
922  BOOST_CHECK(ParseUInt8("00000000000000000000", &n) && n == 0);
923  // Invalid values
924  BOOST_CHECK(!ParseUInt8("-00000000000000000000", &n));
925  BOOST_CHECK(!ParseUInt8("", &n));
926  BOOST_CHECK(!ParseUInt8(" 1", &n)); // no padding inside
927  BOOST_CHECK(!ParseUInt8(" -1", &n));
928  BOOST_CHECK(!ParseUInt8("++1", &n));
929  BOOST_CHECK(!ParseUInt8("+-1", &n));
930  BOOST_CHECK(!ParseUInt8("-+1", &n));
931  BOOST_CHECK(!ParseUInt8("--1", &n));
932  BOOST_CHECK(!ParseUInt8("-1", &n));
933  BOOST_CHECK(!ParseUInt8("1 ", &n));
934  BOOST_CHECK(!ParseUInt8("1a", &n));
935  BOOST_CHECK(!ParseUInt8("aap", &n));
936  BOOST_CHECK(!ParseUInt8("0x1", &n)); // no hex
938  // Overflow and underflow
939  BOOST_CHECK(!ParseUInt8("-255", &n));
940  BOOST_CHECK(!ParseUInt8("256", &n));
941  BOOST_CHECK(!ParseUInt8("-123", &n));
942  BOOST_CHECK(!ParseUInt8("-123", nullptr));
943  BOOST_CHECK(!ParseUInt8("256", nullptr));
944 }
945 
946 BOOST_AUTO_TEST_CASE(test_ParseUInt16)
947 {
948  uint16_t n;
949  // Valid values
950  BOOST_CHECK(ParseUInt16("1234", nullptr));
951  BOOST_CHECK(ParseUInt16("0", &n) && n == 0);
952  BOOST_CHECK(ParseUInt16("1234", &n) && n == 1234);
953  BOOST_CHECK(ParseUInt16("01234", &n) && n == 1234); // no octal
954  BOOST_CHECK(ParseUInt16("65535", &n) && n == static_cast<uint16_t>(65535));
955  BOOST_CHECK(ParseUInt16("+65535", &n) && n == 65535);
956  BOOST_CHECK(ParseUInt16("00000000000000000012", &n) && n == 12);
957  BOOST_CHECK(ParseUInt16("00000000000000000000", &n) && n == 0);
958  // Invalid values
959  BOOST_CHECK(!ParseUInt16("-00000000000000000000", &n));
960  BOOST_CHECK(!ParseUInt16("", &n));
961  BOOST_CHECK(!ParseUInt16(" 1", &n)); // no padding inside
962  BOOST_CHECK(!ParseUInt16(" -1", &n));
963  BOOST_CHECK(!ParseUInt16("++1", &n));
964  BOOST_CHECK(!ParseUInt16("+-1", &n));
965  BOOST_CHECK(!ParseUInt16("-+1", &n));
966  BOOST_CHECK(!ParseUInt16("--1", &n));
967  BOOST_CHECK(!ParseUInt16("-1", &n));
968  BOOST_CHECK(!ParseUInt16("1 ", &n));
969  BOOST_CHECK(!ParseUInt16("1a", &n));
970  BOOST_CHECK(!ParseUInt16("aap", &n));
971  BOOST_CHECK(!ParseUInt16("0x1", &n)); // no hex
973  // Overflow and underflow
974  BOOST_CHECK(!ParseUInt16("-65535", &n));
975  BOOST_CHECK(!ParseUInt16("65536", &n));
976  BOOST_CHECK(!ParseUInt16("-123", &n));
977  BOOST_CHECK(!ParseUInt16("-123", nullptr));
978  BOOST_CHECK(!ParseUInt16("65536", nullptr));
979 }
980 
981 BOOST_AUTO_TEST_CASE(test_ParseUInt32)
982 {
983  uint32_t n;
984  // Valid values
985  BOOST_CHECK(ParseUInt32("1234", nullptr));
986  BOOST_CHECK(ParseUInt32("0", &n) && n == 0);
987  BOOST_CHECK(ParseUInt32("1234", &n) && n == 1234);
988  BOOST_CHECK(ParseUInt32("01234", &n) && n == 1234); // no octal
989  BOOST_CHECK(ParseUInt32("2147483647", &n) && n == 2147483647);
990  BOOST_CHECK(ParseUInt32("2147483648", &n) && n == uint32_t{2147483648});
991  BOOST_CHECK(ParseUInt32("4294967295", &n) && n == uint32_t{4294967295});
992  BOOST_CHECK(ParseUInt32("+1234", &n) && n == 1234);
993  BOOST_CHECK(ParseUInt32("00000000000000001234", &n) && n == 1234);
994  BOOST_CHECK(ParseUInt32("00000000000000000000", &n) && n == 0);
995  // Invalid values
996  BOOST_CHECK(!ParseUInt32("-00000000000000000000", &n));
997  BOOST_CHECK(!ParseUInt32("", &n));
998  BOOST_CHECK(!ParseUInt32(" 1", &n)); // no padding inside
999  BOOST_CHECK(!ParseUInt32(" -1", &n));
1000  BOOST_CHECK(!ParseUInt32("++1", &n));
1001  BOOST_CHECK(!ParseUInt32("+-1", &n));
1002  BOOST_CHECK(!ParseUInt32("-+1", &n));
1003  BOOST_CHECK(!ParseUInt32("--1", &n));
1004  BOOST_CHECK(!ParseUInt32("-1", &n));
1005  BOOST_CHECK(!ParseUInt32("1 ", &n));
1006  BOOST_CHECK(!ParseUInt32("1a", &n));
1007  BOOST_CHECK(!ParseUInt32("aap", &n));
1008  BOOST_CHECK(!ParseUInt32("0x1", &n)); // no hex
1010  // Overflow and underflow
1011  BOOST_CHECK(!ParseUInt32("-2147483648", &n));
1012  BOOST_CHECK(!ParseUInt32("4294967296", &n));
1013  BOOST_CHECK(!ParseUInt32("-1234", &n));
1014  BOOST_CHECK(!ParseUInt32("-32482348723847471234", nullptr));
1015  BOOST_CHECK(!ParseUInt32("32482348723847471234", nullptr));
1016 }
1017 
1018 BOOST_AUTO_TEST_CASE(test_ParseUInt64)
1019 {
1020  uint64_t n;
1021  // Valid values
1022  BOOST_CHECK(ParseUInt64("1234", nullptr));
1023  BOOST_CHECK(ParseUInt64("0", &n) && n == 0LL);
1024  BOOST_CHECK(ParseUInt64("1234", &n) && n == 1234LL);
1025  BOOST_CHECK(ParseUInt64("01234", &n) && n == 1234LL); // no octal
1026  BOOST_CHECK(ParseUInt64("2147483647", &n) && n == 2147483647LL);
1027  BOOST_CHECK(ParseUInt64("9223372036854775807", &n) && n == 9223372036854775807ULL);
1028  BOOST_CHECK(ParseUInt64("9223372036854775808", &n) && n == 9223372036854775808ULL);
1029  BOOST_CHECK(ParseUInt64("18446744073709551615", &n) && n == 18446744073709551615ULL);
1030  // Invalid values
1031  BOOST_CHECK(!ParseUInt64("", &n));
1032  BOOST_CHECK(!ParseUInt64(" 1", &n)); // no padding inside
1033  BOOST_CHECK(!ParseUInt64(" -1", &n));
1034  BOOST_CHECK(!ParseUInt64("1 ", &n));
1035  BOOST_CHECK(!ParseUInt64("1a", &n));
1036  BOOST_CHECK(!ParseUInt64("aap", &n));
1037  BOOST_CHECK(!ParseUInt64("0x1", &n)); // no hex
1039  // Overflow and underflow
1040  BOOST_CHECK(!ParseUInt64("-9223372036854775809", nullptr));
1041  BOOST_CHECK(!ParseUInt64("18446744073709551616", nullptr));
1042  BOOST_CHECK(!ParseUInt64("-32482348723847471234", nullptr));
1043  BOOST_CHECK(!ParseUInt64("-2147483648", &n));
1044  BOOST_CHECK(!ParseUInt64("-9223372036854775808", &n));
1045  BOOST_CHECK(!ParseUInt64("-1234", &n));
1046 }
1047 
1048 BOOST_AUTO_TEST_CASE(test_FormatParagraph)
1049 {
1050  BOOST_CHECK_EQUAL(FormatParagraph("", 79, 0), "");
1051  BOOST_CHECK_EQUAL(FormatParagraph("test", 79, 0), "test");
1052  BOOST_CHECK_EQUAL(FormatParagraph(" test", 79, 0), " test");
1053  BOOST_CHECK_EQUAL(FormatParagraph("test test", 79, 0), "test test");
1054  BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 0), "test\ntest");
1055  BOOST_CHECK_EQUAL(FormatParagraph("testerde test", 4, 0), "testerde\ntest");
1056  BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 4), "test\n test");
1057 
1058  // Make sure we don't indent a fully-new line following a too-long line ending
1059  BOOST_CHECK_EQUAL(FormatParagraph("test test\nabc", 4, 4), "test\n test\nabc");
1060 
1061  BOOST_CHECK_EQUAL(FormatParagraph("This_is_a_very_long_test_string_without_any_spaces_so_it_should_just_get_returned_as_is_despite_the_length until it gets here", 79), "This_is_a_very_long_test_string_without_any_spaces_so_it_should_just_get_returned_as_is_despite_the_length\nuntil it gets here");
1062 
1063  // Test wrap length is exact
1064  BOOST_CHECK_EQUAL(FormatParagraph("a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p", 79), "a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\nf g h i j k l m n o p");
1065  BOOST_CHECK_EQUAL(FormatParagraph("x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p", 79), "x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\nf g h i j k l m n o p");
1066  // Indent should be included in length of lines
1067  BOOST_CHECK_EQUAL(FormatParagraph("x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e fg h i j k", 79, 4), "x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\n f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e fg\n h i j k");
1068 
1069  BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string. This is a second sentence in the very long test string.", 79), "This is a very long test string. This is a second sentence in the very long\ntest string.");
1070  BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string.\nThis is a second sentence in the very long test string. This is a third sentence in the very long test string.", 79), "This is a very long test string.\nThis is a second sentence in the very long test string. This is a third\nsentence in the very long test string.");
1071  BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string.\n\nThis is a second sentence in the very long test string. This is a third sentence in the very long test string.", 79), "This is a very long test string.\n\nThis is a second sentence in the very long test string. This is a third\nsentence in the very long test string.");
1072  BOOST_CHECK_EQUAL(FormatParagraph("Testing that normal newlines do not get indented.\nLike here.", 79), "Testing that normal newlines do not get indented.\nLike here.");
1073 }
1074 
1075 BOOST_AUTO_TEST_CASE(test_FormatSubVersion)
1076 {
1077  std::vector<std::string> comments;
1078  comments.emplace_back("comment1");
1079  std::vector<std::string> comments2;
1080  comments2.emplace_back("comment1");
1081  comments2.push_back(SanitizeString(std::string("Comment2; .,_?@-; !\"#$%&'()*+/<=>[]\\^`{|}~"), SAFE_CHARS_UA_COMMENT)); // Semicolon is discouraged but not forbidden by BIP-0014
1082  BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99900, std::vector<std::string>()),std::string("/Test:9.99.0/"));
1083  BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99900, comments),std::string("/Test:9.99.0(comment1)/"));
1084  BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99900, comments2),std::string("/Test:9.99.0(comment1; Comment2; .,_?@-; )/"));
1085 }
1086 
1087 BOOST_AUTO_TEST_CASE(test_ParseFixedPoint)
1088 {
1089  int64_t amount = 0;
1090  BOOST_CHECK(ParseFixedPoint("0", 8, &amount));
1091  BOOST_CHECK_EQUAL(amount, 0LL);
1092  BOOST_CHECK(ParseFixedPoint("1", 8, &amount));
1093  BOOST_CHECK_EQUAL(amount, 100000000LL);
1094  BOOST_CHECK(ParseFixedPoint("0.0", 8, &amount));
1095  BOOST_CHECK_EQUAL(amount, 0LL);
1096  BOOST_CHECK(ParseFixedPoint("-0.1", 8, &amount));
1097  BOOST_CHECK_EQUAL(amount, -10000000LL);
1098  BOOST_CHECK(ParseFixedPoint("1.1", 8, &amount));
1099  BOOST_CHECK_EQUAL(amount, 110000000LL);
1100  BOOST_CHECK(ParseFixedPoint("1.10000000000000000", 8, &amount));
1101  BOOST_CHECK_EQUAL(amount, 110000000LL);
1102  BOOST_CHECK(ParseFixedPoint("1.1e1", 8, &amount));
1103  BOOST_CHECK_EQUAL(amount, 1100000000LL);
1104  BOOST_CHECK(ParseFixedPoint("1.1e-1", 8, &amount));
1105  BOOST_CHECK_EQUAL(amount, 11000000LL);
1106  BOOST_CHECK(ParseFixedPoint("1000", 8, &amount));
1107  BOOST_CHECK_EQUAL(amount, 100000000000LL);
1108  BOOST_CHECK(ParseFixedPoint("-1000", 8, &amount));
1109  BOOST_CHECK_EQUAL(amount, -100000000000LL);
1110  BOOST_CHECK(ParseFixedPoint("0.00000001", 8, &amount));
1111  BOOST_CHECK_EQUAL(amount, 1LL);
1112  BOOST_CHECK(ParseFixedPoint("0.0000000100000000", 8, &amount));
1113  BOOST_CHECK_EQUAL(amount, 1LL);
1114  BOOST_CHECK(ParseFixedPoint("-0.00000001", 8, &amount));
1115  BOOST_CHECK_EQUAL(amount, -1LL);
1116  BOOST_CHECK(ParseFixedPoint("1000000000.00000001", 8, &amount));
1117  BOOST_CHECK_EQUAL(amount, 100000000000000001LL);
1118  BOOST_CHECK(ParseFixedPoint("9999999999.99999999", 8, &amount));
1119  BOOST_CHECK_EQUAL(amount, 999999999999999999LL);
1120  BOOST_CHECK(ParseFixedPoint("-9999999999.99999999", 8, &amount));
1121  BOOST_CHECK_EQUAL(amount, -999999999999999999LL);
1122 
1123  BOOST_CHECK(!ParseFixedPoint("", 8, &amount));
1124  BOOST_CHECK(!ParseFixedPoint("-", 8, &amount));
1125  BOOST_CHECK(!ParseFixedPoint("a-1000", 8, &amount));
1126  BOOST_CHECK(!ParseFixedPoint("-a1000", 8, &amount));
1127  BOOST_CHECK(!ParseFixedPoint("-1000a", 8, &amount));
1128  BOOST_CHECK(!ParseFixedPoint("-01000", 8, &amount));
1129  BOOST_CHECK(!ParseFixedPoint("00.1", 8, &amount));
1130  BOOST_CHECK(!ParseFixedPoint(".1", 8, &amount));
1131  BOOST_CHECK(!ParseFixedPoint("--0.1", 8, &amount));
1132  BOOST_CHECK(!ParseFixedPoint("0.000000001", 8, &amount));
1133  BOOST_CHECK(!ParseFixedPoint("-0.000000001", 8, &amount));
1134  BOOST_CHECK(!ParseFixedPoint("0.00000001000000001", 8, &amount));
1135  BOOST_CHECK(!ParseFixedPoint("-10000000000.00000000", 8, &amount));
1136  BOOST_CHECK(!ParseFixedPoint("10000000000.00000000", 8, &amount));
1137  BOOST_CHECK(!ParseFixedPoint("-10000000000.00000001", 8, &amount));
1138  BOOST_CHECK(!ParseFixedPoint("10000000000.00000001", 8, &amount));
1139  BOOST_CHECK(!ParseFixedPoint("-10000000000.00000009", 8, &amount));
1140  BOOST_CHECK(!ParseFixedPoint("10000000000.00000009", 8, &amount));
1141  BOOST_CHECK(!ParseFixedPoint("-99999999999.99999999", 8, &amount));
1142  BOOST_CHECK(!ParseFixedPoint("99999909999.09999999", 8, &amount));
1143  BOOST_CHECK(!ParseFixedPoint("92233720368.54775807", 8, &amount));
1144  BOOST_CHECK(!ParseFixedPoint("92233720368.54775808", 8, &amount));
1145  BOOST_CHECK(!ParseFixedPoint("-92233720368.54775808", 8, &amount));
1146  BOOST_CHECK(!ParseFixedPoint("-92233720368.54775809", 8, &amount));
1147  BOOST_CHECK(!ParseFixedPoint("1.1e", 8, &amount));
1148  BOOST_CHECK(!ParseFixedPoint("1.1e-", 8, &amount));
1149  BOOST_CHECK(!ParseFixedPoint("1.", 8, &amount));
1150 
1151  // Test with 3 decimal places for fee rates in sat/vB.
1152  BOOST_CHECK(ParseFixedPoint("0.001", 3, &amount));
1153  BOOST_CHECK_EQUAL(amount, CAmount{1});
1154  BOOST_CHECK(!ParseFixedPoint("0.0009", 3, &amount));
1155  BOOST_CHECK(!ParseFixedPoint("31.00100001", 3, &amount));
1156  BOOST_CHECK(!ParseFixedPoint("31.0011", 3, &amount));
1157  BOOST_CHECK(!ParseFixedPoint("31.99999999", 3, &amount));
1158  BOOST_CHECK(!ParseFixedPoint("31.999999999999999999999", 3, &amount));
1159 }
1160 
1161 #ifndef WIN32 // Cannot do this test on WIN32 due to lack of fork()
1162 static constexpr char LockCommand = 'L';
1163 static constexpr char UnlockCommand = 'U';
1164 static constexpr char ExitCommand = 'X';
1165 enum : char {
1166  ResSuccess = 2, // Start with 2 to avoid accidental collision with common values 0 and 1
1170 };
1171 
1172 [[noreturn]] static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
1173 {
1174  char ch;
1175  while (true) {
1176  int rv = read(fd, &ch, 1); // Wait for command
1177  assert(rv == 1);
1178  switch (ch) {
1179  case LockCommand:
1180  ch = [&] {
1181  switch (util::LockDirectory(dirname, lockname)) {
1185  } // no default case, so the compiler can warn about missing cases
1186  assert(false);
1187  }();
1188  rv = write(fd, &ch, 1);
1189  assert(rv == 1);
1190  break;
1191  case UnlockCommand:
1193  ch = ResUnlockSuccess; // Always succeeds
1194  rv = write(fd, &ch, 1);
1195  assert(rv == 1);
1196  break;
1197  case ExitCommand:
1198  close(fd);
1199  exit(0);
1200  default:
1201  assert(0);
1202  }
1203  }
1204 }
1205 #endif
1206 
1207 BOOST_AUTO_TEST_CASE(test_LockDirectory)
1208 {
1209  fs::path dirname = m_args.GetDataDirBase() / "lock_dir";
1210  const fs::path lockname = ".lock";
1211 #ifndef WIN32
1212  // Revert SIGCHLD to default, otherwise boost.test will catch and fail on
1213  // it: there is BOOST_TEST_IGNORE_SIGCHLD but that only works when defined
1214  // at build-time of the boost library
1215  void (*old_handler)(int) = signal(SIGCHLD, SIG_DFL);
1216 
1217  // Fork another process for testing before creating the lock, so that we
1218  // won't fork while holding the lock (which might be undefined, and is not
1219  // relevant as test case as that is avoided with -daemonize).
1220  int fd[2];
1221  BOOST_CHECK_EQUAL(socketpair(AF_UNIX, SOCK_STREAM, 0, fd), 0);
1222  pid_t pid = fork();
1223  if (!pid) {
1224  BOOST_CHECK_EQUAL(close(fd[1]), 0); // Child: close parent end
1225  TestOtherProcess(dirname, lockname, fd[0]);
1226  }
1227  BOOST_CHECK_EQUAL(close(fd[0]), 0); // Parent: close child end
1228 
1229  char ch;
1230  // Lock on non-existent directory should fail
1231  BOOST_CHECK_EQUAL(write(fd[1], &LockCommand, 1), 1);
1232  BOOST_CHECK_EQUAL(read(fd[1], &ch, 1), 1);
1234 #endif
1235  // Lock on non-existent directory should fail
1237 
1238  fs::create_directories(dirname);
1239 
1240  // Probing lock on new directory should succeed
1242 
1243  // Persistent lock on new directory should succeed
1245 
1246  // Another lock on the directory from the same thread should succeed
1248 
1249  // Another lock on the directory from a different thread within the same process should succeed
1250  util::LockResult threadresult;
1251  std::thread thr([&] { threadresult = util::LockDirectory(dirname, lockname); });
1252  thr.join();
1254 #ifndef WIN32
1255  // Try to acquire lock in child process while we're holding it, this should fail.
1256  BOOST_CHECK_EQUAL(write(fd[1], &LockCommand, 1), 1);
1257  BOOST_CHECK_EQUAL(read(fd[1], &ch, 1), 1);
1259 
1260  // Give up our lock
1262  // Probing lock from our side now should succeed, but not hold on to the lock.
1264 
1265  // Try to acquire the lock in the child process, this should be successful.
1266  BOOST_CHECK_EQUAL(write(fd[1], &LockCommand, 1), 1);
1267  BOOST_CHECK_EQUAL(read(fd[1], &ch, 1), 1);
1269 
1270  // When we try to probe the lock now, it should fail.
1272 
1273  // Unlock the lock in the child process
1274  BOOST_CHECK_EQUAL(write(fd[1], &UnlockCommand, 1), 1);
1275  BOOST_CHECK_EQUAL(read(fd[1], &ch, 1), 1);
1277 
1278  // When we try to probe the lock now, it should succeed.
1280 
1281  // Re-lock the lock in the child process, then wait for it to exit, check
1282  // successful return. After that, we check that exiting the process
1283  // has released the lock as we would expect by probing it.
1284  int processstatus;
1285  BOOST_CHECK_EQUAL(write(fd[1], &LockCommand, 1), 1);
1286  // The following line invokes the ~CNetCleanup dtor without
1287  // a paired SetupNetworking call. This is acceptable as long as
1288  // ~CNetCleanup is a no-op for non-Windows platforms.
1289  BOOST_CHECK_EQUAL(write(fd[1], &ExitCommand, 1), 1);
1290  BOOST_CHECK_EQUAL(waitpid(pid, &processstatus, 0), pid);
1291  BOOST_CHECK_EQUAL(processstatus, 0);
1293 
1294  // Restore SIGCHLD
1295  signal(SIGCHLD, old_handler);
1296  BOOST_CHECK_EQUAL(close(fd[1]), 0); // Close our side of the socketpair
1297 #endif
1298  // Clean up
1300  fs::remove_all(dirname);
1301 }
1302 
1304 {
1305  BOOST_CHECK_EQUAL(ToLower('@'), '@');
1306  BOOST_CHECK_EQUAL(ToLower('A'), 'a');
1307  BOOST_CHECK_EQUAL(ToLower('Z'), 'z');
1308  BOOST_CHECK_EQUAL(ToLower('['), '[');
1309  BOOST_CHECK_EQUAL(ToLower(0), 0);
1310  BOOST_CHECK_EQUAL(ToLower('\xff'), '\xff');
1311 
1312  BOOST_CHECK_EQUAL(ToLower(""), "");
1313  BOOST_CHECK_EQUAL(ToLower("#HODL"), "#hodl");
1314  BOOST_CHECK_EQUAL(ToLower("\x00\xfe\xff"), "\x00\xfe\xff");
1315 }
1316 
1318 {
1319  BOOST_CHECK_EQUAL(ToUpper('`'), '`');
1320  BOOST_CHECK_EQUAL(ToUpper('a'), 'A');
1321  BOOST_CHECK_EQUAL(ToUpper('z'), 'Z');
1322  BOOST_CHECK_EQUAL(ToUpper('{'), '{');
1323  BOOST_CHECK_EQUAL(ToUpper(0), 0);
1324  BOOST_CHECK_EQUAL(ToUpper('\xff'), '\xff');
1325 
1326  BOOST_CHECK_EQUAL(ToUpper(""), "");
1327  BOOST_CHECK_EQUAL(ToUpper("#hodl"), "#HODL");
1328  BOOST_CHECK_EQUAL(ToUpper("\x00\xfe\xff"), "\x00\xfe\xff");
1329 }
1330 
1331 BOOST_AUTO_TEST_CASE(test_Capitalize)
1332 {
1333  BOOST_CHECK_EQUAL(Capitalize(""), "");
1334  BOOST_CHECK_EQUAL(Capitalize("bitcoin"), "Bitcoin");
1335  BOOST_CHECK_EQUAL(Capitalize("\x00\xfe\xff"), "\x00\xfe\xff");
1336 }
1337 
1338 static std::string SpanToStr(const Span<const char>& span)
1339 {
1340  return std::string(span.begin(), span.end());
1341 }
1342 
1343 BOOST_AUTO_TEST_CASE(test_script_parsing)
1344 {
1345  using namespace script;
1346  std::string input;
1347  Span<const char> sp;
1348  bool success;
1349 
1350  // Const(...): parse a constant, update span to skip it if successful
1351  input = "MilkToastHoney";
1352  sp = input;
1353  success = Const("", sp); // empty
1354  BOOST_CHECK(success);
1355  BOOST_CHECK_EQUAL(SpanToStr(sp), "MilkToastHoney");
1356 
1357  success = Const("Milk", sp);
1358  BOOST_CHECK(success);
1359  BOOST_CHECK_EQUAL(SpanToStr(sp), "ToastHoney");
1360 
1361  success = Const("Bread", sp);
1362  BOOST_CHECK(!success);
1363 
1364  success = Const("Toast", sp);
1365  BOOST_CHECK(success);
1366  BOOST_CHECK_EQUAL(SpanToStr(sp), "Honey");
1367 
1368  success = Const("Honeybadger", sp);
1369  BOOST_CHECK(!success);
1370 
1371  success = Const("Honey", sp);
1372  BOOST_CHECK(success);
1373  BOOST_CHECK_EQUAL(SpanToStr(sp), "");
1374 
1375  // Func(...): parse a function call, update span to argument if successful
1376  input = "Foo(Bar(xy,z()))";
1377  sp = input;
1378 
1379  success = Func("FooBar", sp);
1380  BOOST_CHECK(!success);
1381 
1382  success = Func("Foo(", sp);
1383  BOOST_CHECK(!success);
1384 
1385  success = Func("Foo", sp);
1386  BOOST_CHECK(success);
1387  BOOST_CHECK_EQUAL(SpanToStr(sp), "Bar(xy,z())");
1388 
1389  success = Func("Bar", sp);
1390  BOOST_CHECK(success);
1391  BOOST_CHECK_EQUAL(SpanToStr(sp), "xy,z()");
1392 
1393  success = Func("xy", sp);
1394  BOOST_CHECK(!success);
1395 
1396  // Expr(...): return expression that span begins with, update span to skip it
1398 
1399  input = "(n*(n-1))/2";
1400  sp = input;
1401  result = Expr(sp);
1402  BOOST_CHECK_EQUAL(SpanToStr(result), "(n*(n-1))/2");
1403  BOOST_CHECK_EQUAL(SpanToStr(sp), "");
1404 
1405  input = "foo,bar";
1406  sp = input;
1407  result = Expr(sp);
1409  BOOST_CHECK_EQUAL(SpanToStr(sp), ",bar");
1410 
1411  input = "(aaaaa,bbbbb()),c";
1412  sp = input;
1413  result = Expr(sp);
1414  BOOST_CHECK_EQUAL(SpanToStr(result), "(aaaaa,bbbbb())");
1415  BOOST_CHECK_EQUAL(SpanToStr(sp), ",c");
1416 
1417  input = "xyz)foo";
1418  sp = input;
1419  result = Expr(sp);
1421  BOOST_CHECK_EQUAL(SpanToStr(sp), ")foo");
1422 
1423  input = "((a),(b),(c)),xxx";
1424  sp = input;
1425  result = Expr(sp);
1426  BOOST_CHECK_EQUAL(SpanToStr(result), "((a),(b),(c))");
1427  BOOST_CHECK_EQUAL(SpanToStr(sp), ",xxx");
1428 
1429  // Split(...): split a string on every instance of sep, return vector
1430  std::vector<Span<const char>> results;
1431 
1432  input = "xxx";
1433  results = Split(input, 'x');
1434  BOOST_CHECK_EQUAL(results.size(), 4U);
1435  BOOST_CHECK_EQUAL(SpanToStr(results[0]), "");
1436  BOOST_CHECK_EQUAL(SpanToStr(results[1]), "");
1437  BOOST_CHECK_EQUAL(SpanToStr(results[2]), "");
1438  BOOST_CHECK_EQUAL(SpanToStr(results[3]), "");
1439 
1440  input = "one#two#three";
1441  results = Split(input, '-');
1442  BOOST_CHECK_EQUAL(results.size(), 1U);
1443  BOOST_CHECK_EQUAL(SpanToStr(results[0]), "one#two#three");
1444 
1445  input = "one#two#three";
1446  results = Split(input, '#');
1447  BOOST_CHECK_EQUAL(results.size(), 3U);
1448  BOOST_CHECK_EQUAL(SpanToStr(results[0]), "one");
1449  BOOST_CHECK_EQUAL(SpanToStr(results[1]), "two");
1450  BOOST_CHECK_EQUAL(SpanToStr(results[2]), "three");
1451 
1452  input = "*foo*bar*";
1453  results = Split(input, '*');
1454  BOOST_CHECK_EQUAL(results.size(), 4U);
1455  BOOST_CHECK_EQUAL(SpanToStr(results[0]), "");
1456  BOOST_CHECK_EQUAL(SpanToStr(results[1]), "foo");
1457  BOOST_CHECK_EQUAL(SpanToStr(results[2]), "bar");
1458  BOOST_CHECK_EQUAL(SpanToStr(results[3]), "");
1459 }
1460 
1461 BOOST_AUTO_TEST_CASE(test_SplitString)
1462 {
1463  // Empty string.
1464  {
1465  std::vector<std::string> result = SplitString("", '-');
1466  BOOST_CHECK_EQUAL(result.size(), 1);
1467  BOOST_CHECK_EQUAL(result[0], "");
1468  }
1469 
1470  // Empty items.
1471  {
1472  std::vector<std::string> result = SplitString("-", '-');
1473  BOOST_CHECK_EQUAL(result.size(), 2);
1474  BOOST_CHECK_EQUAL(result[0], "");
1475  BOOST_CHECK_EQUAL(result[1], "");
1476  }
1477 
1478  // More empty items.
1479  {
1480  std::vector<std::string> result = SplitString("--", '-');
1481  BOOST_CHECK_EQUAL(result.size(), 3);
1482  BOOST_CHECK_EQUAL(result[0], "");
1483  BOOST_CHECK_EQUAL(result[1], "");
1484  BOOST_CHECK_EQUAL(result[2], "");
1485  }
1486 
1487  // Separator is not present.
1488  {
1489  std::vector<std::string> result = SplitString("abc", '-');
1490  BOOST_CHECK_EQUAL(result.size(), 1);
1491  BOOST_CHECK_EQUAL(result[0], "abc");
1492  }
1493 
1494  // Basic behavior.
1495  {
1496  std::vector<std::string> result = SplitString("a-b", '-');
1497  BOOST_CHECK_EQUAL(result.size(), 2);
1498  BOOST_CHECK_EQUAL(result[0], "a");
1499  BOOST_CHECK_EQUAL(result[1], "b");
1500  }
1501 
1502  // Case-sensitivity of the separator.
1503  {
1504  std::vector<std::string> result = SplitString("AAA", 'a');
1505  BOOST_CHECK_EQUAL(result.size(), 1);
1506  BOOST_CHECK_EQUAL(result[0], "AAA");
1507  }
1508 
1509  // multiple split characters
1510  {
1511  using V = std::vector<std::string>;
1512  BOOST_TEST(SplitString("a,b.c:d;e", ",;") == V({"a", "b.c:d", "e"}));
1513  BOOST_TEST(SplitString("a,b.c:d;e", ",;:.") == V({"a", "b", "c", "d", "e"}));
1514  BOOST_TEST(SplitString("a,b.c:d;e", "") == V({"a,b.c:d;e"}));
1515  BOOST_TEST(SplitString("aaa", "bcdefg") == V({"aaa"}));
1516  BOOST_TEST(SplitString("x\0a,b"s, "\0"s) == V({"x", "a,b"}));
1517  BOOST_TEST(SplitString("x\0a,b"s, '\0') == V({"x", "a,b"}));
1518  BOOST_TEST(SplitString("x\0a,b"s, "\0,"s) == V({"x", "a", "b"}));
1519  BOOST_TEST(SplitString("abcdefg", "bcd") == V({"a", "", "", "efg"}));
1520  }
1521 }
1522 
1523 BOOST_AUTO_TEST_CASE(test_LogEscapeMessage)
1524 {
1525  // ASCII and UTF-8 must pass through unaltered.
1526  BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("Valid log message貓"), "Valid log message貓");
1527  // Newlines must pass through unaltered.
1528  BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("Message\n with newlines\n"), "Message\n with newlines\n");
1529  // Other control characters are escaped in C syntax.
1530  BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("\x01\x7f Corrupted log message\x0d"), R"(\x01\x7f Corrupted log message\x0d)");
1531  // Embedded NULL characters are escaped too.
1532  const std::string NUL("O\x00O", 3);
1533  BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage(NUL), R"(O\x00O)");
1534 }
1535 
1536 namespace {
1537 
1538 struct Tracker
1539 {
1541  const Tracker* origin;
1543  int copies{0};
1544 
1545  Tracker() noexcept : origin(this) {}
1546  Tracker(const Tracker& t) noexcept : origin(t.origin), copies(t.copies + 1) {}
1547  Tracker(Tracker&& t) noexcept : origin(t.origin), copies(t.copies) {}
1548  Tracker& operator=(const Tracker& t) noexcept
1549  {
1550  if (this != &t) {
1551  origin = t.origin;
1552  copies = t.copies + 1;
1553  }
1554  return *this;
1555  }
1556 };
1557 
1558 }
1559 
1560 BOOST_AUTO_TEST_CASE(test_tracked_vector)
1561 {
1562  Tracker t1;
1563  Tracker t2;
1564  Tracker t3;
1565 
1566  BOOST_CHECK(t1.origin == &t1);
1567  BOOST_CHECK(t2.origin == &t2);
1568  BOOST_CHECK(t3.origin == &t3);
1569 
1570  auto v1 = Vector(t1);
1571  BOOST_CHECK_EQUAL(v1.size(), 1U);
1572  BOOST_CHECK(v1[0].origin == &t1);
1573  BOOST_CHECK_EQUAL(v1[0].copies, 1);
1574 
1575  auto v2 = Vector(std::move(t2));
1576  BOOST_CHECK_EQUAL(v2.size(), 1U);
1577  BOOST_CHECK(v2[0].origin == &t2); // NOLINT(*-use-after-move)
1578  BOOST_CHECK_EQUAL(v2[0].copies, 0);
1579 
1580  auto v3 = Vector(t1, std::move(t2));
1581  BOOST_CHECK_EQUAL(v3.size(), 2U);
1582  BOOST_CHECK(v3[0].origin == &t1);
1583  BOOST_CHECK(v3[1].origin == &t2); // NOLINT(*-use-after-move)
1584  BOOST_CHECK_EQUAL(v3[0].copies, 1);
1585  BOOST_CHECK_EQUAL(v3[1].copies, 0);
1586 
1587  auto v4 = Vector(std::move(v3[0]), v3[1], std::move(t3));
1588  BOOST_CHECK_EQUAL(v4.size(), 3U);
1589  BOOST_CHECK(v4[0].origin == &t1);
1590  BOOST_CHECK(v4[1].origin == &t2);
1591  BOOST_CHECK(v4[2].origin == &t3); // NOLINT(*-use-after-move)
1592  BOOST_CHECK_EQUAL(v4[0].copies, 1);
1593  BOOST_CHECK_EQUAL(v4[1].copies, 1);
1594  BOOST_CHECK_EQUAL(v4[2].copies, 0);
1595 
1596  auto v5 = Cat(v1, v4);
1597  BOOST_CHECK_EQUAL(v5.size(), 4U);
1598  BOOST_CHECK(v5[0].origin == &t1);
1599  BOOST_CHECK(v5[1].origin == &t1);
1600  BOOST_CHECK(v5[2].origin == &t2);
1601  BOOST_CHECK(v5[3].origin == &t3);
1602  BOOST_CHECK_EQUAL(v5[0].copies, 2);
1603  BOOST_CHECK_EQUAL(v5[1].copies, 2);
1604  BOOST_CHECK_EQUAL(v5[2].copies, 2);
1605  BOOST_CHECK_EQUAL(v5[3].copies, 1);
1606 
1607  auto v6 = Cat(std::move(v1), v3);
1608  BOOST_CHECK_EQUAL(v6.size(), 3U);
1609  BOOST_CHECK(v6[0].origin == &t1);
1610  BOOST_CHECK(v6[1].origin == &t1);
1611  BOOST_CHECK(v6[2].origin == &t2);
1612  BOOST_CHECK_EQUAL(v6[0].copies, 1);
1613  BOOST_CHECK_EQUAL(v6[1].copies, 2);
1614  BOOST_CHECK_EQUAL(v6[2].copies, 1);
1615 
1616  auto v7 = Cat(v2, std::move(v4));
1617  BOOST_CHECK_EQUAL(v7.size(), 4U);
1618  BOOST_CHECK(v7[0].origin == &t2);
1619  BOOST_CHECK(v7[1].origin == &t1);
1620  BOOST_CHECK(v7[2].origin == &t2);
1621  BOOST_CHECK(v7[3].origin == &t3);
1622  BOOST_CHECK_EQUAL(v7[0].copies, 1);
1623  BOOST_CHECK_EQUAL(v7[1].copies, 1);
1624  BOOST_CHECK_EQUAL(v7[2].copies, 1);
1625  BOOST_CHECK_EQUAL(v7[3].copies, 0);
1626 
1627  auto v8 = Cat(std::move(v2), std::move(v3));
1628  BOOST_CHECK_EQUAL(v8.size(), 3U);
1629  BOOST_CHECK(v8[0].origin == &t2);
1630  BOOST_CHECK(v8[1].origin == &t1);
1631  BOOST_CHECK(v8[2].origin == &t2);
1632  BOOST_CHECK_EQUAL(v8[0].copies, 0);
1633  BOOST_CHECK_EQUAL(v8[1].copies, 1);
1634  BOOST_CHECK_EQUAL(v8[2].copies, 0);
1635 }
1636 
1638 {
1639  const std::array<unsigned char, 32> privkey_bytes = {
1640  // just some random data
1641  // derived address from this private key: 15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs
1642  0xD9, 0x7F, 0x51, 0x08, 0xF1, 0x1C, 0xDA, 0x6E,
1643  0xEE, 0xBA, 0xAA, 0x42, 0x0F, 0xEF, 0x07, 0x26,
1644  0xB1, 0xF8, 0x98, 0x06, 0x0B, 0x98, 0x48, 0x9F,
1645  0xA3, 0x09, 0x84, 0x63, 0xC0, 0x03, 0x28, 0x66
1646  };
1647 
1648  const std::string message = "Trust no one";
1649 
1650  const std::string expected_signature =
1651  "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=";
1652 
1653  CKey privkey;
1654  std::string generated_signature;
1655 
1656  BOOST_REQUIRE_MESSAGE(!privkey.IsValid(),
1657  "Confirm the private key is invalid");
1658 
1659  BOOST_CHECK_MESSAGE(!MessageSign(privkey, message, generated_signature),
1660  "Sign with an invalid private key");
1661 
1662  privkey.Set(privkey_bytes.begin(), privkey_bytes.end(), true);
1663 
1664  BOOST_REQUIRE_MESSAGE(privkey.IsValid(),
1665  "Confirm the private key is valid");
1666 
1667  BOOST_CHECK_MESSAGE(MessageSign(privkey, message, generated_signature),
1668  "Sign with a valid private key");
1669 
1670  BOOST_CHECK_EQUAL(expected_signature, generated_signature);
1671 }
1672 
1673 BOOST_AUTO_TEST_CASE(message_verify)
1674 {
1676  MessageVerify(
1677  "invalid address",
1678  "signature should be irrelevant",
1679  "message too"),
1681 
1683  MessageVerify(
1684  "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
1685  "signature should be irrelevant",
1686  "message too"),
1688 
1690  MessageVerify(
1691  "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1692  "invalid signature, not in base64 encoding",
1693  "message should be irrelevant"),
1695 
1697  MessageVerify(
1698  "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1699  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
1700  "message should be irrelevant"),
1702 
1704  MessageVerify(
1705  "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1706  "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1707  "I never signed this"),
1709 
1711  MessageVerify(
1712  "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1713  "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1714  "Trust no one"),
1716 
1718  MessageVerify(
1719  "11canuhp9X2NocwCq7xNrQYTmUgZAnLK3",
1720  "IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=",
1721  "Trust me"),
1723 }
1724 
1726 {
1727  const std::string unsigned_tx = "...";
1728  const std::string prefixed_message =
1729  std::string(1, (char)MESSAGE_MAGIC.length()) +
1730  MESSAGE_MAGIC +
1731  std::string(1, (char)unsigned_tx.length()) +
1732  unsigned_tx;
1733 
1734  const uint256 signature_hash = Hash(unsigned_tx);
1735  const uint256 message_hash1 = Hash(prefixed_message);
1736  const uint256 message_hash2 = MessageHash(unsigned_tx);
1737 
1738  BOOST_CHECK_EQUAL(message_hash1, message_hash2);
1739  BOOST_CHECK_NE(message_hash1, signature_hash);
1740 }
1741 
1742 BOOST_AUTO_TEST_CASE(remove_prefix)
1743 {
1744  BOOST_CHECK_EQUAL(RemovePrefix("./common/system.h", "./"), "common/system.h");
1745  BOOST_CHECK_EQUAL(RemovePrefixView("foo", "foo"), "");
1746  BOOST_CHECK_EQUAL(RemovePrefix("foo", "fo"), "o");
1747  BOOST_CHECK_EQUAL(RemovePrefixView("foo", "f"), "oo");
1748  BOOST_CHECK_EQUAL(RemovePrefix("foo", ""), "foo");
1749  BOOST_CHECK_EQUAL(RemovePrefixView("fo", "foo"), "fo");
1750  BOOST_CHECK_EQUAL(RemovePrefix("f", "foo"), "f");
1751  BOOST_CHECK_EQUAL(RemovePrefixView("", "foo"), "");
1752  BOOST_CHECK_EQUAL(RemovePrefix("", ""), "");
1753 }
1754 
1755 BOOST_AUTO_TEST_CASE(util_ParseByteUnits)
1756 {
1757  auto noop = ByteUnit::NOOP;
1758 
1759  // no multiplier
1760  BOOST_CHECK_EQUAL(ParseByteUnits("1", noop).value(), 1);
1761  BOOST_CHECK_EQUAL(ParseByteUnits("0", noop).value(), 0);
1762 
1763  BOOST_CHECK_EQUAL(ParseByteUnits("1k", noop).value(), 1000ULL);
1764  BOOST_CHECK_EQUAL(ParseByteUnits("1K", noop).value(), 1ULL << 10);
1765 
1766  BOOST_CHECK_EQUAL(ParseByteUnits("2m", noop).value(), 2'000'000ULL);
1767  BOOST_CHECK_EQUAL(ParseByteUnits("2M", noop).value(), 2ULL << 20);
1768 
1769  BOOST_CHECK_EQUAL(ParseByteUnits("3g", noop).value(), 3'000'000'000ULL);
1770  BOOST_CHECK_EQUAL(ParseByteUnits("3G", noop).value(), 3ULL << 30);
1771 
1772  BOOST_CHECK_EQUAL(ParseByteUnits("4t", noop).value(), 4'000'000'000'000ULL);
1773  BOOST_CHECK_EQUAL(ParseByteUnits("4T", noop).value(), 4ULL << 40);
1774 
1775  // check default multiplier
1776  BOOST_CHECK_EQUAL(ParseByteUnits("5", ByteUnit::K).value(), 5ULL << 10);
1777 
1778  // NaN
1779  BOOST_CHECK(!ParseByteUnits("", noop));
1780  BOOST_CHECK(!ParseByteUnits("foo", noop));
1781 
1782  // whitespace
1783  BOOST_CHECK(!ParseByteUnits("123m ", noop));
1784  BOOST_CHECK(!ParseByteUnits(" 123m", noop));
1785 
1786  // no +-
1787  BOOST_CHECK(!ParseByteUnits("-123m", noop));
1788  BOOST_CHECK(!ParseByteUnits("+123m", noop));
1789 
1790  // zero padding
1791  BOOST_CHECK_EQUAL(ParseByteUnits("020M", noop).value(), 20ULL << 20);
1792 
1793  // fractions not allowed
1794  BOOST_CHECK(!ParseByteUnits("0.5T", noop));
1795 
1796  // overflow
1797  BOOST_CHECK(!ParseByteUnits("18446744073709551615g", noop));
1798 
1799  // invalid unit
1800  BOOST_CHECK(!ParseByteUnits("1x", noop));
1801 }
1802 
1803 BOOST_AUTO_TEST_CASE(util_ReadBinaryFile)
1804 {
1805  fs::path tmpfolder = m_args.GetDataDirBase();
1806  fs::path tmpfile = tmpfolder / "read_binary.dat";
1807  std::string expected_text;
1808  for (int i = 0; i < 30; i++) {
1809  expected_text += "0123456789";
1810  }
1811  {
1812  std::ofstream file{tmpfile};
1813  file << expected_text;
1814  }
1815  {
1816  // read all contents in file
1817  auto [valid, text] = ReadBinaryFile(tmpfile);
1818  BOOST_CHECK(valid);
1819  BOOST_CHECK_EQUAL(text, expected_text);
1820  }
1821  {
1822  // read half contents in file
1823  auto [valid, text] = ReadBinaryFile(tmpfile, expected_text.size() / 2);
1824  BOOST_CHECK(valid);
1825  BOOST_CHECK_EQUAL(text, expected_text.substr(0, expected_text.size() / 2));
1826  }
1827  {
1828  // read from non-existent file
1829  fs::path invalid_file = tmpfolder / "invalid_binary.dat";
1830  auto [valid, text] = ReadBinaryFile(invalid_file);
1831  BOOST_CHECK(!valid);
1832  BOOST_CHECK(text.empty());
1833  }
1834 }
1835 
1836 BOOST_AUTO_TEST_CASE(util_WriteBinaryFile)
1837 {
1838  fs::path tmpfolder = m_args.GetDataDirBase();
1839  fs::path tmpfile = tmpfolder / "write_binary.dat";
1840  std::string expected_text = "bitcoin";
1841  auto valid = WriteBinaryFile(tmpfile, expected_text);
1842  std::string actual_text;
1843  std::ifstream file{tmpfile};
1844  file >> actual_text;
1845  BOOST_CHECK(valid);
1846  BOOST_CHECK_EQUAL(actual_text, expected_text);
1847 }
1848 
1849 BOOST_AUTO_TEST_CASE(clearshrink_test)
1850 {
1851  {
1852  std::vector<uint8_t> v = {1, 2, 3};
1853  ClearShrink(v);
1854  BOOST_CHECK_EQUAL(v.size(), 0);
1855  BOOST_CHECK_EQUAL(v.capacity(), 0);
1856  }
1857 
1858  {
1859  std::vector<bool> v = {false, true, false, false, true, true};
1860  ClearShrink(v);
1861  BOOST_CHECK_EQUAL(v.size(), 0);
1862  BOOST_CHECK_EQUAL(v.capacity(), 0);
1863  }
1864 
1865  {
1866  std::deque<int> v = {1, 3, 3, 7};
1867  ClearShrink(v);
1868  BOOST_CHECK_EQUAL(v.size(), 0);
1869  // std::deque has no capacity() we can observe.
1870  }
1871 }
1872 
1873 template <typename T>
1874 void TestCheckedLeftShift()
1875 {
1876  constexpr auto MAX{std::numeric_limits<T>::max()};
1877 
1878  // Basic operations
1879  BOOST_CHECK_EQUAL(CheckedLeftShift<T>(0, 1), 0);
1880  BOOST_CHECK_EQUAL(CheckedLeftShift<T>(0, 127), 0);
1881  BOOST_CHECK_EQUAL(CheckedLeftShift<T>(1, 1), 2);
1882  BOOST_CHECK_EQUAL(CheckedLeftShift<T>(2, 2), 8);
1883  BOOST_CHECK_EQUAL(CheckedLeftShift<T>(MAX >> 1, 1), MAX - 1);
1884 
1885  // Max left shift
1886  BOOST_CHECK_EQUAL(CheckedLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1);
1887 
1888  // Overflow cases
1889  BOOST_CHECK(!CheckedLeftShift<T>((MAX >> 1) + 1, 1));
1890  BOOST_CHECK(!CheckedLeftShift<T>(MAX, 1));
1891  BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits));
1892  BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits + 1));
1893 
1894  if constexpr (std::is_signed_v<T>) {
1895  constexpr auto MIN{std::numeric_limits<T>::min()};
1896  // Negative input
1897  BOOST_CHECK_EQUAL(CheckedLeftShift<T>(-1, 1), -2);
1898  BOOST_CHECK_EQUAL(CheckedLeftShift<T>((MIN >> 2), 1), MIN / 2);
1899  BOOST_CHECK_EQUAL(CheckedLeftShift<T>((MIN >> 1) + 1, 1), MIN + 2);
1900  BOOST_CHECK_EQUAL(CheckedLeftShift<T>(MIN >> 1, 1), MIN);
1901  // Overflow negative
1902  BOOST_CHECK(!CheckedLeftShift<T>((MIN >> 1) - 1, 1));
1903  BOOST_CHECK(!CheckedLeftShift<T>(MIN >> 1, 2));
1904  BOOST_CHECK(!CheckedLeftShift<T>(-1, 100));
1905  }
1906 }
1907 
1908 template <typename T>
1909 void TestSaturatingLeftShift()
1910 {
1911  constexpr auto MAX{std::numeric_limits<T>::max()};
1912 
1913  // Basic operations
1914  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(0, 1), 0);
1915  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(0, 127), 0);
1916  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, 1), 2);
1917  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(2, 2), 8);
1918  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MAX >> 1, 1), MAX - 1);
1919 
1920  // Max left shift
1921  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1);
1922 
1923  // Saturation cases
1924  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MAX >> 1) + 1, 1), MAX);
1925  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MAX, 1), MAX);
1926  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits), MAX);
1927  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits + 1), MAX);
1928 
1929  if constexpr (std::is_signed_v<T>) {
1930  constexpr auto MIN{std::numeric_limits<T>::min()};
1931  // Negative input
1932  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(-1, 1), -2);
1933  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 2), 1), MIN / 2);
1934  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 1) + 1, 1), MIN + 2);
1935  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MIN >> 1, 1), MIN);
1936  // Saturation negative
1937  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 1) - 1, 1), MIN);
1938  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MIN >> 1, 2), MIN);
1939  BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(-1, 100), MIN);
1940  }
1941 }
1942 
1943 BOOST_AUTO_TEST_CASE(checked_left_shift_test)
1944 {
1945  TestCheckedLeftShift<uint8_t>();
1946  TestCheckedLeftShift<int8_t>();
1947  TestCheckedLeftShift<size_t>();
1948  TestCheckedLeftShift<uint64_t>();
1949  TestCheckedLeftShift<int64_t>();
1950 }
1951 
1952 BOOST_AUTO_TEST_CASE(saturating_left_shift_test)
1953 {
1954  TestSaturatingLeftShift<uint8_t>();
1955  TestSaturatingLeftShift<int8_t>();
1956  TestSaturatingLeftShift<size_t>();
1957  TestSaturatingLeftShift<uint64_t>();
1958  TestSaturatingLeftShift<int64_t>();
1959 }
1960 
1961 BOOST_AUTO_TEST_CASE(mib_string_literal_test)
1962 {
1963  BOOST_CHECK_EQUAL(0_MiB, 0);
1964  BOOST_CHECK_EQUAL(1_MiB, 1024 * 1024);
1965  const auto max_mib{std::numeric_limits<size_t>::max() >> 20};
1966  BOOST_CHECK_EXCEPTION(operator""_MiB(static_cast<unsigned long long>(max_mib) + 1), std::overflow_error, HasReason("MiB value too large for size_t byte conversion"));
1967 }
1968 
1969 BOOST_AUTO_TEST_SUITE_END()
void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
Definition: string.cpp:11
constexpr uint8_t HEX_PARSE_OUTPUT[]
Definition: util_tests.cpp:144
std::vector< std::string > SplitString(std::string_view str, char sep)
Definition: string.h:136
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
Definition: strencodings.h:68
std::string TrimString(std::string_view str, std::string_view pattern=" \\\)
Definition: string.h:156
assert(!tx.IsCoinBase())
std::string FormatISO8601Date(int64_t nTime)
Definition: time.cpp:87
#define TRY_LOCK(cs, name)
Definition: sync.h:261
constexpr C * end() const noexcept
Definition: span.h:176
A public key could not be recovered from the provided signature and message.
Definition: timer.h:19
The message verification was successful.
The provided address is invalid.
The provided signature couldn&#39;t be parsed (maybe invalid base64).
bool MessageSign(const CKey &privkey, const std::string &message, std::string &signature)
Sign a message.
Definition: signmessage.cpp:57
Span< std::byte > MakeWritableByteSpan(V &&v) noexcept
Definition: span.h:274
Span< const char > Expr(Span< const char > &sp)
Extract the expression that sp begins with.
Definition: parsing.cpp:33
constexpr char HEX_PARSE_INPUT[]
Definition: util_tests.cpp:143
const std::string MESSAGE_MAGIC
Text used to signify that a signed message follows and to prevent inadvertently signing a transaction...
Definition: signmessage.cpp:24
std::string RemovePrefix(std::string_view str, std::string_view prefix)
Definition: string.h:177
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.
Definition: time.cpp:78
MessageVerificationResult MessageVerify(const std::string &address, const std::string &signature, const std::string &message)
Verify a signed message.
Definition: signmessage.cpp:26
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
Definition: string.h:169
int64_t atoi64_legacy(const std::string &str)
Definition: util_tests.cpp:787
bool Func(const std::string &str, Span< const char > &sp)
Parse a function call.
Definition: parsing.cpp:24
std::string LogEscapeMessage(std::string_view str)
Belts and suspenders: make sure outgoing log messages don&#39;t contain potentially suspicious characters...
Definition: logging.cpp:327
Basic testing setup.
Definition: setup_common.h:64
std::vector< typename std::common_type< Args... >::type > Vector(Args &&... args)
Construct a vector with the specified elements.
Definition: vector.h:23
BOOST_AUTO_TEST_CASE(util_check)
Definition: util_tests.cpp:95
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \\\)
Definition: string.h:146
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
std::string SanitizeString(std::string_view str, int rule)
Remove unsafe chars.
consteval uint8_t ConstevalHexDigit(const char c)
consteval version of HexDigit() without the lookup table.
Definition: strencodings.h:372
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
static void pool cs
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
std::optional< int64_t > ParseISO8601DateTime(std::string_view str)
Definition: time.cpp:95
#define LOCK(cs)
Definition: sync.h:257
static const std::string STRING_WITH_EMBEDDED_NULL_CHAR
Definition: util_tests.cpp:61
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.
Definition: moneystr.cpp:45
LockResult LockDirectory(const fs::path &directory, const fs::path &lockfile_name, bool probe_only)
Definition: fs_helpers.cpp:53
bool ParseUInt8(std::string_view str, uint8_t *out)
Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
bool Const(const std::string &str, Span< const char > &sp)
Parse a constant.
Definition: parsing.cpp:15
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
Definition: strencodings.h:427
void ReleaseDirectoryLocks()
Release all directory locks.
Definition: fs_helpers.cpp:87
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...
Definition: fs.h:190
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
Definition: key.h:103
#define Assume(val)
Assume is the identity function.
Definition: check.h:97
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.
Definition: string.h:107
bool ParseFixedPoint(std::string_view val, int decimals, int64_t *amount_out)
Parse number as fixed point according to JSON number syntax.
LockResult
Definition: fs_helpers.h:40
std::string ToLower(std::string_view str)
Returns the lowercase equivalent of the given string.
constexpr C * begin() const noexcept
Definition: span.h:175
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
Definition: moneystr.cpp:19
256-bit opaque blob.
Definition: uint256.h:201
auto result
Definition: common-types.h:74
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)
Definition: object.cpp:18
The message was not signed with the private key of the provided address.
Span< const std::byte > MakeByteSpan(V &&v) noexcept
Definition: span.h:269
std::string FormatSubVersion(const std::string &name, int nClientVersion, const std::vector< std::string > &comments)
Format the subversion field according to BIP 14 spec (https://github.com/bitcoin/bips/blob/master/bip...
The provided address is valid but does not refer to a public key.
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
Definition: hex_base.cpp:29
constexpr auto MakeUCharSpan(V &&v) -> decltype(UCharSpanCast(Span
Like the Span constructor, but for (const) unsigned char member types only.
Definition: span.h:296
static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
uint256 MessageHash(const std::string &message)
Hashes a message for signing and verification in a manner that prevents inadvertently signing a trans...
Definition: signmessage.cpp:73
std::optional< std::vector< Byte > > TryParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).
An encapsulated private key.
Definition: key.h:34
A Span is an object that can refer to a contiguous sequence of objects.
Definition: span.h:97
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
Definition: hash.h:75
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:32
static std::string SpanToStr(const Span< const char > &span)
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
Definition: string.h:192
static constexpr char UnlockCommand
BIP-0014 subset.
Definition: strencodings.h:33
#define Assert(val)
Identity function.
Definition: check.h:85
std::string Capitalize(std::string str)
Capitalizes the first character of the given string.
bool IsValid() const
Check whether this private key is valid.
Definition: key.h:123
#define BOOST_CHECK(expr)
Definition: object.cpp:17
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.
Definition: vector.h:34
static constexpr CAmount COIN
The amount of satoshis in one BTC.
Definition: amount.h:15
std::string ToUpper(std::string_view str)
Returns the uppercase equivalent of the given string.