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