Bitcoin Core 28.99.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>
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
49using namespace std::literals;
50using namespace util::hex_literals;
52using util::Join;
56using util::Split;
60
61static const std::string STRING_WITH_EMBEDDED_NULL_CHAR{"1"s "\0" "1"s};
62
63/* defined in logging.cpp */
64namespace BCLog {
65 std::string LogEscapeMessage(std::string_view str);
66}
67
69
70namespace {
71class NoCopyOrMove
72{
73public:
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
121BOOST_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
143constexpr char HEX_PARSE_INPUT[] = "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f";
144constexpr 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};
151static_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
172 result = ParseHex(HEX_PARSE_INPUT);
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
228BOOST_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
272BOOST_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
295BOOST_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
311BOOST_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
327BOOST_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
365BOOST_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
379BOOST_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
388BOOST_AUTO_TEST_CASE(util_FormatMoney)
389{
390 BOOST_CHECK_EQUAL(FormatMoney(0), "0.00");
391 BOOST_CHECK_EQUAL(FormatMoney((COIN/10000)*123456789), "12345.6789");
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");
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
423BOOST_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
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));
489 BOOST_CHECK(!ParseMoney("1\0"s));
490}
491
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
507BOOST_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
532BOOST_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"
547BOOST_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
570BOOST_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>();
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
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 */
615template <typename T>
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());
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 */
635template <typename T>
636static 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
657{
658 TestAddMatrixOverflow<unsigned>();
659 TestAddMatrix<signed>();
660}
661
662BOOST_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
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
696template <typename T>
698{
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
725BOOST_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
787int64_t atoi64_legacy(const std::string& str)
788{
789 return strtoll(str.c_str(), nullptr, 10);
790}
791
792BOOST_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
883BOOST_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
911BOOST_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
946BOOST_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
981BOOST_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
1018BOOST_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
1048BOOST_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
1075BOOST_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
1087BOOST_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()
1162static constexpr char LockCommand = 'L';
1163static constexpr char UnlockCommand = 'U';
1164static constexpr char ExitCommand = 'X';
1165enum : 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
1207BOOST_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('['), '[');
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('{'), '{');
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
1331BOOST_AUTO_TEST_CASE(test_Capitalize)
1332{
1334 BOOST_CHECK_EQUAL(Capitalize("bitcoin"), "Bitcoin");
1335 BOOST_CHECK_EQUAL(Capitalize("\x00\xfe\xff"), "\x00\xfe\xff");
1336}
1337
1338static std::string SpanToStr(const Span<const char>& span)
1339{
1340 return std::string(span.begin(), span.end());
1341}
1342
1343BOOST_AUTO_TEST_CASE(test_script_parsing)
1344{
1345 using namespace script;
1346 std::string input;
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);
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
1397 Span<const char> result;
1398
1399 input = "(n*(n-1))/2";
1400 sp = input;
1401 result = Expr(sp);
1402 BOOST_CHECK_EQUAL(SpanToStr(result), "(n*(n-1))/2");
1404
1405 input = "foo,bar";
1406 sp = input;
1407 result = Expr(sp);
1408 BOOST_CHECK_EQUAL(SpanToStr(result), "foo");
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);
1420 BOOST_CHECK_EQUAL(SpanToStr(result), "xyz");
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
1461BOOST_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
1523BOOST_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
1536namespace {
1537
1538struct 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
1560BOOST_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
1674{
1677 "invalid address",
1678 "signature should be irrelevant",
1679 "message too"),
1681
1684 "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
1685 "signature should be irrelevant",
1686 "message too"),
1688
1691 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1692 "invalid signature, not in base64 encoding",
1693 "message should be irrelevant"),
1695
1698 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1699 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
1700 "message should be irrelevant"),
1702
1705 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1706 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1707 "I never signed this"),
1709
1712 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1713 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1714 "Trust no one"),
1716
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()) +
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
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
1755BOOST_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
1803BOOST_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
1836BOOST_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
1849BOOST_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
1873template <typename T>
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
1908template <typename T>
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
1943BOOST_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
1952BOOST_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
1961BOOST_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
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
static constexpr CAmount COIN
The amount of satoshis in one BTC.
Definition: amount.h:15
#define Assert(val)
Identity function.
Definition: check.h:85
#define Assume(val)
Assume is the identity function.
Definition: check.h:97
An encapsulated private key.
Definition: key.h:35
bool IsValid() const
Check whether this private key is valid.
Definition: key.h:123
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
Definition: key.h:103
BOOST_CHECK_EXCEPTION predicates to check the specific validation error.
Definition: setup_common.h:296
A Span is an object that can refer to a contiguous sequence of objects.
Definition: span.h:98
constexpr C * begin() const noexcept
Definition: span.h:175
constexpr C * end() const noexcept
Definition: span.h:176
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:33
256-bit opaque blob.
Definition: uint256.h:201
std::string FormatSubVersion(const std::string &name, int nClientVersion, const std::vector< std::string > &comments)
Format the subversion field according to BIP 14 spec (https://github.com/bitcoin/bips/blob/master/bip...
uint256 MessageHash(const std::string &message)
Hashes a message for signing and verification in a manner that prevents inadvertently signing a trans...
Definition: signmessage.cpp:73
bool MessageSign(const CKey &privkey, const std::string &message, std::string &signature)
Sign a message.
Definition: signmessage.cpp:57
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
MessageVerificationResult MessageVerify(const std::string &address, const std::string &signature, const std::string &message)
Verify a signed message.
Definition: signmessage.cpp:26
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
void ReleaseDirectoryLocks()
Release all directory locks.
Definition: fs_helpers.cpp:87
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
Definition: hash.h:75
#define T(expected, seed, data)
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
Definition: hex_base.cpp:29
static void pool cs
std::optional< CAmount > ParseMoney(const std::string &money_string)
Parse an amount denoted in full coins.
Definition: moneystr.cpp:45
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
Definition: moneystr.cpp:19
std::string LogEscapeMessage(std::string_view str)
Belts and suspenders: make sure outgoing log messages don't contain potentially suspicious characters...
Definition: logging.cpp:325
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
bool Const(const std::string &str, Span< const char > &sp)
Parse a constant.
Definition: parsing.cpp:15
Span< const char > Expr(Span< const char > &sp)
Extract the expression that sp begins with.
Definition: parsing.cpp:33
bool Func(const std::string &str, Span< const char > &sp)
Parse a function call.
Definition: parsing.cpp:24
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
Definition: strencodings.h:427
std::vector< std::string > SplitString(std::string_view str, char sep)
Definition: string.h:136
consteval uint8_t ConstevalHexDigit(const char c)
consteval version of HexDigit() without the lookup table.
Definition: strencodings.h:372
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
Definition: string.h:146
LockResult
Definition: fs_helpers.h:40
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
Definition: string.h:169
std::string TrimString(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
Definition: string.h:156
std::string RemovePrefix(std::string_view str, std::string_view prefix)
Definition: string.h:177
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
Definition: string.h:192
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
void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
Definition: string.cpp:11
LockResult LockDirectory(const fs::path &directory, const fs::path &lockfile_name, bool probe_only)
Definition: fs_helpers.cpp:53
#define BOOST_CHECK_EQUAL(v1, v2)
Definition: object.cpp:18
#define BOOST_CHECK(expr)
Definition: object.cpp:17
std::optional< T > CheckedAdd(const T i, const T j) noexcept
Definition: overflow.h:26
T SaturatingAdd(const T i, const T j) noexcept
Definition: overflow.h:35
bool WriteBinaryFile(const fs::path &filename, const std::string &data)
Write contents of std::string to a file.
std::pair< bool, std::string > ReadBinaryFile(const fs::path &filename, size_t maxsize)
Read full contents of a file and return them in a std::string.
@ ERR_MALFORMED_SIGNATURE
The provided signature couldn't be parsed (maybe invalid base64).
@ ERR_INVALID_ADDRESS
The provided address is invalid.
@ ERR_ADDRESS_NO_KEY
The provided address is valid but does not refer to a public key.
@ ERR_NOT_SIGNED
The message was not signed with the private key of the provided address.
@ OK
The message verification was successful.
@ ERR_PUBKEY_NOT_RECOVERED
A public key could not be recovered from the provided signature and message.
Span< const std::byte > MakeByteSpan(V &&v) noexcept
Definition: span.h:269
constexpr auto MakeUCharSpan(V &&v) -> decltype(UCharSpanCast(Span{std::forward< V >(v)}))
Like the Span constructor, but for (const) unsigned char member types only.
Definition: span.h:296
Span< std::byte > MakeWritableByteSpan(V &&v) noexcept
Definition: span.h:274
constexpr bool IsDigit(char c)
Tests if the given character is a decimal digit.
Definition: strencodings.h:150
bool TimingResistantEqual(const T &a, const T &b)
Timing-attack-resistant comparison.
Definition: strencodings.h:244
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
Definition: strencodings.h:68
@ SAFE_CHARS_UA_COMMENT
BIP-0014 subset.
Definition: strencodings.h:33
Basic testing setup.
Definition: setup_common.h:64
static time_point now() noexcept
Return current system time or mocked time, if set.
Definition: time.cpp:26
#define LOCK(cs)
Definition: sync.h:257
#define TRY_LOCK(cs, name)
Definition: sync.h:261
@ ZEROS
Seed with a compile time constant of zeros.
static int count
void UninterruptibleSleep(const std::chrono::microseconds &n)
Definition: time.cpp:20
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition: time.cpp:76
std::string FormatISO8601Date(int64_t nTime)
Definition: time.cpp:87
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
Definition: time.cpp:40
std::optional< int64_t > ParseISO8601DateTime(std::string_view str)
Definition: time.cpp:95
std::string FormatISO8601DateTime(int64_t nTime)
ISO 8601 formatting is preferred.
Definition: time.cpp:78
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1172
std::string Capitalize(std::string str)
Capitalizes the first character of the given string.
bool ParseInt32(std::string_view str, int32_t *out)
Convert string to signed 32-bit integer with strict parse error feedback.
bool ParseUInt16(std::string_view str, uint16_t *out)
Convert decimal string to unsigned 16-bit integer with strict parse error feedback.
std::string ToUpper(std::string_view str)
Returns the uppercase equivalent of the given string.
bool ParseFixedPoint(std::string_view val, int decimals, int64_t *amount_out)
Parse number as fixed point according to JSON number syntax.
bool ParseInt64(std::string_view str, int64_t *out)
Convert string to signed 64-bit integer with strict parse error feedback.
bool ParseUInt8(std::string_view str, uint8_t *out)
Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
bool ParseUInt64(std::string_view str, uint64_t *out)
Convert decimal string to unsigned 64-bit integer with strict parse error feedback.
bool IsHex(std::string_view str)
std::string FormatParagraph(std::string_view in, size_t width, size_t indent)
Format a paragraph of text to a fixed width, adding spaces for indentation to any added line.
bool ParseUInt32(std::string_view str, uint32_t *out)
Convert decimal string to unsigned 32-bit integer with strict parse error feedback.
std::optional< std::vector< Byte > > TryParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).
std::optional< uint64_t > ParseByteUnits(std::string_view str, ByteUnit default_multiplier)
Parse a string with suffix unit [k|K|m|M|g|G|t|T].
std::string ToLower(std::string_view str)
Returns the lowercase equivalent of the given string.
std::string SanitizeString(std::string_view str, int rule)
Remove unsafe chars.
int64_t atoi64_legacy(const std::string &str)
Definition: util_tests.cpp:787
#define E
Definition: util_tests.cpp:546
constexpr uint8_t HEX_PARSE_OUTPUT[]
Definition: util_tests.cpp:144
constexpr char HEX_PARSE_INPUT[]
Definition: util_tests.cpp:143
static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
#define B
Definition: util_tests.cpp:545
static constexpr char ExitCommand
static constexpr char UnlockCommand
@ ResErrorWrite
@ ResUnlockSuccess
@ ResSuccess
@ ResErrorLock
static void TestAddMatrixOverflow()
Definition: util_tests.cpp:616
static void TestAddMatrix()
Definition: util_tests.cpp:636
BOOST_AUTO_TEST_CASE(util_check)
Definition: util_tests.cpp:95
static void RunToIntegralTests()
Definition: util_tests.cpp:697
static const std::string STRING_WITH_EMBEDDED_NULL_CHAR
Definition: util_tests.cpp:61
static constexpr char LockCommand
static std::string SpanToStr(const Span< const char > &span)
void TestCheckedLeftShift()
void TestSaturatingLeftShift()
assert(!tx.IsCoinBase())
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.
Definition: vector.h:34
std::vector< typename std::common_type< Args... >::type > Vector(Args &&... args)
Construct a vector with the specified elements.
Definition: vector.h:23
void ClearShrink(V &v) noexcept
Clear a vector (or std::deque) and release its allocated memory.
Definition: vector.h:56