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
570/* Check for mingw/wine issue #3494
571 * Remove this test before time.ctime(0xffffffff) == 'Sun Feb 7 07:28:15 2106'
572 */
574{
575 BOOST_CHECK((GetTime() & ~0xFFFFFFFFLL) == 0);
576}
577
578BOOST_AUTO_TEST_CASE(util_time_GetTime)
579{
580 SetMockTime(111);
581 // Check that mock time does not change after a sleep
582 for (const auto& num_sleep : {0ms, 1ms}) {
583 UninterruptibleSleep(num_sleep);
584 BOOST_CHECK_EQUAL(111, GetTime()); // Deprecated time getter
585 BOOST_CHECK_EQUAL(111, Now<NodeSeconds>().time_since_epoch().count());
586 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now()));
587 BOOST_CHECK_EQUAL(111, TicksSinceEpoch<SecondsDouble>(Now<NodeSeconds>()));
588 BOOST_CHECK_EQUAL(111, GetTime<std::chrono::seconds>().count());
589 BOOST_CHECK_EQUAL(111000, GetTime<std::chrono::milliseconds>().count());
590 BOOST_CHECK_EQUAL(111000, TicksSinceEpoch<std::chrono::milliseconds>(NodeClock::now()));
591 BOOST_CHECK_EQUAL(111000000, GetTime<std::chrono::microseconds>().count());
592 }
593
594 SetMockTime(0);
595 // Check that steady time and system time changes after a sleep
596 const auto steady_ms_0 = Now<SteadyMilliseconds>();
597 const auto steady_0 = std::chrono::steady_clock::now();
598 const auto ms_0 = GetTime<std::chrono::milliseconds>();
599 const auto us_0 = GetTime<std::chrono::microseconds>();
601 BOOST_CHECK(steady_ms_0 < Now<SteadyMilliseconds>());
602 BOOST_CHECK(steady_0 + 1ms <= std::chrono::steady_clock::now());
603 BOOST_CHECK(ms_0 < GetTime<std::chrono::milliseconds>());
604 BOOST_CHECK(us_0 < GetTime<std::chrono::microseconds>());
605}
606
608{
609 BOOST_CHECK_EQUAL(IsDigit('0'), true);
610 BOOST_CHECK_EQUAL(IsDigit('1'), true);
611 BOOST_CHECK_EQUAL(IsDigit('8'), true);
612 BOOST_CHECK_EQUAL(IsDigit('9'), true);
613
614 BOOST_CHECK_EQUAL(IsDigit('0' - 1), false);
615 BOOST_CHECK_EQUAL(IsDigit('9' + 1), false);
616 BOOST_CHECK_EQUAL(IsDigit(0), false);
617 BOOST_CHECK_EQUAL(IsDigit(1), false);
618 BOOST_CHECK_EQUAL(IsDigit(8), false);
619 BOOST_CHECK_EQUAL(IsDigit(9), false);
620}
621
622/* Check for overflow */
623template <typename T>
625{
626 constexpr T MAXI{std::numeric_limits<T>::max()};
627 BOOST_CHECK(!CheckedAdd(T{1}, MAXI));
628 BOOST_CHECK(!CheckedAdd(MAXI, MAXI));
629 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI));
630 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(MAXI, MAXI));
631
632 BOOST_CHECK_EQUAL(0, CheckedAdd(T{0}, T{0}).value());
633 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{0}, MAXI).value());
634 BOOST_CHECK_EQUAL(MAXI, CheckedAdd(T{1}, MAXI - 1).value());
635 BOOST_CHECK_EQUAL(MAXI - 1, CheckedAdd(T{1}, MAXI - 2).value());
637 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{0}, MAXI));
638 BOOST_CHECK_EQUAL(MAXI, SaturatingAdd(T{1}, MAXI - 1));
639 BOOST_CHECK_EQUAL(MAXI - 1, SaturatingAdd(T{1}, MAXI - 2));
640}
641
642/* Check for overflow or underflow */
643template <typename T>
644static void TestAddMatrix()
645{
646 TestAddMatrixOverflow<T>();
647 constexpr T MINI{std::numeric_limits<T>::min()};
648 constexpr T MAXI{std::numeric_limits<T>::max()};
649 BOOST_CHECK(!CheckedAdd(T{-1}, MINI));
650 BOOST_CHECK(!CheckedAdd(MINI, MINI));
651 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI));
652 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(MINI, MINI));
653
654 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{0}, MINI).value());
655 BOOST_CHECK_EQUAL(MINI, CheckedAdd(T{-1}, MINI + 1).value());
656 BOOST_CHECK_EQUAL(-1, CheckedAdd(MINI, MAXI).value());
657 BOOST_CHECK_EQUAL(MINI + 1, CheckedAdd(T{-1}, MINI + 2).value());
658 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{0}, MINI));
659 BOOST_CHECK_EQUAL(MINI, SaturatingAdd(T{-1}, MINI + 1));
660 BOOST_CHECK_EQUAL(MINI + 1, SaturatingAdd(T{-1}, MINI + 2));
661 BOOST_CHECK_EQUAL(-1, SaturatingAdd(MINI, MAXI));
662}
663
665{
666 TestAddMatrixOverflow<unsigned>();
667 TestAddMatrix<signed>();
668}
669
670BOOST_AUTO_TEST_CASE(test_ParseInt32)
671{
672 int32_t n;
673 // Valid values
674 BOOST_CHECK(ParseInt32("1234", nullptr));
675 BOOST_CHECK(ParseInt32("0", &n) && n == 0);
676 BOOST_CHECK(ParseInt32("1234", &n) && n == 1234);
677 BOOST_CHECK(ParseInt32("01234", &n) && n == 1234); // no octal
678 BOOST_CHECK(ParseInt32("2147483647", &n) && n == 2147483647);
679 BOOST_CHECK(ParseInt32("-2147483648", &n) && n == (-2147483647 - 1)); // (-2147483647 - 1) equals INT_MIN
680 BOOST_CHECK(ParseInt32("-1234", &n) && n == -1234);
681 BOOST_CHECK(ParseInt32("00000000000000001234", &n) && n == 1234);
682 BOOST_CHECK(ParseInt32("-00000000000000001234", &n) && n == -1234);
683 BOOST_CHECK(ParseInt32("00000000000000000000", &n) && n == 0);
684 BOOST_CHECK(ParseInt32("-00000000000000000000", &n) && n == 0);
685 // Invalid values
686 BOOST_CHECK(!ParseInt32("", &n));
687 BOOST_CHECK(!ParseInt32(" 1", &n)); // no padding inside
688 BOOST_CHECK(!ParseInt32("1 ", &n));
689 BOOST_CHECK(!ParseInt32("++1", &n));
690 BOOST_CHECK(!ParseInt32("+-1", &n));
691 BOOST_CHECK(!ParseInt32("-+1", &n));
692 BOOST_CHECK(!ParseInt32("--1", &n));
693 BOOST_CHECK(!ParseInt32("1a", &n));
694 BOOST_CHECK(!ParseInt32("aap", &n));
695 BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex
697 // Overflow and underflow
698 BOOST_CHECK(!ParseInt32("-2147483649", nullptr));
699 BOOST_CHECK(!ParseInt32("2147483648", nullptr));
700 BOOST_CHECK(!ParseInt32("-32482348723847471234", nullptr));
701 BOOST_CHECK(!ParseInt32("32482348723847471234", nullptr));
702}
703
704template <typename T>
706{
708 BOOST_CHECK(!ToIntegral<T>(" 1"));
709 BOOST_CHECK(!ToIntegral<T>("1 "));
710 BOOST_CHECK(!ToIntegral<T>("1a"));
711 BOOST_CHECK(!ToIntegral<T>("1.1"));
712 BOOST_CHECK(!ToIntegral<T>("1.9"));
713 BOOST_CHECK(!ToIntegral<T>("+01.9"));
714 BOOST_CHECK(!ToIntegral<T>("-"));
715 BOOST_CHECK(!ToIntegral<T>("+"));
716 BOOST_CHECK(!ToIntegral<T>(" -1"));
717 BOOST_CHECK(!ToIntegral<T>("-1 "));
718 BOOST_CHECK(!ToIntegral<T>(" -1 "));
719 BOOST_CHECK(!ToIntegral<T>("+1"));
720 BOOST_CHECK(!ToIntegral<T>(" +1"));
721 BOOST_CHECK(!ToIntegral<T>(" +1 "));
722 BOOST_CHECK(!ToIntegral<T>("+-1"));
723 BOOST_CHECK(!ToIntegral<T>("-+1"));
724 BOOST_CHECK(!ToIntegral<T>("++1"));
725 BOOST_CHECK(!ToIntegral<T>("--1"));
726 BOOST_CHECK(!ToIntegral<T>(""));
727 BOOST_CHECK(!ToIntegral<T>("aap"));
728 BOOST_CHECK(!ToIntegral<T>("0x1"));
729 BOOST_CHECK(!ToIntegral<T>("-32482348723847471234"));
730 BOOST_CHECK(!ToIntegral<T>("32482348723847471234"));
731}
732
733BOOST_AUTO_TEST_CASE(test_ToIntegral)
734{
735 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("1234").value(), 1'234);
736 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("0").value(), 0);
737 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("01234").value(), 1'234);
738 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000001234").value(), 1'234);
739 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-00000000000000001234").value(), -1'234);
740 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("00000000000000000000").value(), 0);
741 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-00000000000000000000").value(), 0);
742 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1234").value(), -1'234);
743 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-1").value(), -1);
744
745 RunToIntegralTests<uint64_t>();
746 RunToIntegralTests<int64_t>();
747 RunToIntegralTests<uint32_t>();
748 RunToIntegralTests<int32_t>();
749 RunToIntegralTests<uint16_t>();
750 RunToIntegralTests<int16_t>();
751 RunToIntegralTests<uint8_t>();
752 RunToIntegralTests<int8_t>();
753
754 BOOST_CHECK(!ToIntegral<int64_t>("-9223372036854775809"));
755 BOOST_CHECK_EQUAL(ToIntegral<int64_t>("-9223372036854775808").value(), -9'223'372'036'854'775'807LL - 1LL);
756 BOOST_CHECK_EQUAL(ToIntegral<int64_t>("9223372036854775807").value(), 9'223'372'036'854'775'807);
757 BOOST_CHECK(!ToIntegral<int64_t>("9223372036854775808"));
758
759 BOOST_CHECK(!ToIntegral<uint64_t>("-1"));
760 BOOST_CHECK_EQUAL(ToIntegral<uint64_t>("0").value(), 0U);
761 BOOST_CHECK_EQUAL(ToIntegral<uint64_t>("18446744073709551615").value(), 18'446'744'073'709'551'615ULL);
762 BOOST_CHECK(!ToIntegral<uint64_t>("18446744073709551616"));
763
764 BOOST_CHECK(!ToIntegral<int32_t>("-2147483649"));
765 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("-2147483648").value(), -2'147'483'648LL);
766 BOOST_CHECK_EQUAL(ToIntegral<int32_t>("2147483647").value(), 2'147'483'647);
767 BOOST_CHECK(!ToIntegral<int32_t>("2147483648"));
768
769 BOOST_CHECK(!ToIntegral<uint32_t>("-1"));
770 BOOST_CHECK_EQUAL(ToIntegral<uint32_t>("0").value(), 0U);
771 BOOST_CHECK_EQUAL(ToIntegral<uint32_t>("4294967295").value(), 4'294'967'295U);
772 BOOST_CHECK(!ToIntegral<uint32_t>("4294967296"));
773
774 BOOST_CHECK(!ToIntegral<int16_t>("-32769"));
775 BOOST_CHECK_EQUAL(ToIntegral<int16_t>("-32768").value(), -32'768);
776 BOOST_CHECK_EQUAL(ToIntegral<int16_t>("32767").value(), 32'767);
777 BOOST_CHECK(!ToIntegral<int16_t>("32768"));
778
779 BOOST_CHECK(!ToIntegral<uint16_t>("-1"));
780 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("0").value(), 0U);
781 BOOST_CHECK_EQUAL(ToIntegral<uint16_t>("65535").value(), 65'535U);
782 BOOST_CHECK(!ToIntegral<uint16_t>("65536"));
783
784 BOOST_CHECK(!ToIntegral<int8_t>("-129"));
785 BOOST_CHECK_EQUAL(ToIntegral<int8_t>("-128").value(), -128);
786 BOOST_CHECK_EQUAL(ToIntegral<int8_t>("127").value(), 127);
787 BOOST_CHECK(!ToIntegral<int8_t>("128"));
788
789 BOOST_CHECK(!ToIntegral<uint8_t>("-1"));
790 BOOST_CHECK_EQUAL(ToIntegral<uint8_t>("0").value(), 0U);
791 BOOST_CHECK_EQUAL(ToIntegral<uint8_t>("255").value(), 255U);
792 BOOST_CHECK(!ToIntegral<uint8_t>("256"));
793}
794
795int64_t atoi64_legacy(const std::string& str)
796{
797 return strtoll(str.c_str(), nullptr, 10);
798}
799
800BOOST_AUTO_TEST_CASE(test_LocaleIndependentAtoi)
801{
802 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1234"), 1'234);
803 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0"), 0);
804 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("01234"), 1'234);
805 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1234"), -1'234);
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>("1a"), 1);
809 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.1"), 1);
810 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("1.9"), 1);
811 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+01.9"), 1);
812 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1"), -1);
813 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1"), -1);
814 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-1 "), -1);
815 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" -1 "), -1);
816 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+1"), 1);
817 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1"), 1);
818 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(" +1 "), 1);
819
820 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("+-1"), 0);
821 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-+1"), 0);
822 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("++1"), 0);
823 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("--1"), 0);
824 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>(""), 0);
825 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("aap"), 0);
826 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("0x1"), 0);
827 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-32482348723847471234"), -2'147'483'647 - 1);
828 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("32482348723847471234"), 2'147'483'647);
829
830 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775809"), -9'223'372'036'854'775'807LL - 1LL);
831 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("-9223372036854775808"), -9'223'372'036'854'775'807LL - 1LL);
832 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775807"), 9'223'372'036'854'775'807);
833 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>("9223372036854775808"), 9'223'372'036'854'775'807);
834
835 std::map<std::string, int64_t> atoi64_test_pairs = {
836 {"-9223372036854775809", std::numeric_limits<int64_t>::min()},
837 {"-9223372036854775808", -9'223'372'036'854'775'807LL - 1LL},
838 {"9223372036854775807", 9'223'372'036'854'775'807},
839 {"9223372036854775808", std::numeric_limits<int64_t>::max()},
840 {"+-", 0},
841 {"0x1", 0},
842 {"ox1", 0},
843 {"", 0},
844 };
845
846 for (const auto& pair : atoi64_test_pairs) {
847 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(pair.first), pair.second);
848 }
849
850 // Ensure legacy compatibility with previous versions of Bitcoin Core's atoi64
851 for (const auto& pair : atoi64_test_pairs) {
852 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int64_t>(pair.first), atoi64_legacy(pair.first));
853 }
854
855 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>("-1"), 0U);
856 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>("0"), 0U);
857 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>("18446744073709551615"), 18'446'744'073'709'551'615ULL);
858 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint64_t>("18446744073709551616"), 18'446'744'073'709'551'615ULL);
859
860 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-2147483649"), -2'147'483'648LL);
861 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("-2147483648"), -2'147'483'648LL);
862 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("2147483647"), 2'147'483'647);
863 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int32_t>("2147483648"), 2'147'483'647);
864
865 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("-1"), 0U);
866 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("0"), 0U);
867 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("4294967295"), 4'294'967'295U);
868 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint32_t>("4294967296"), 4'294'967'295U);
869
870 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("-32769"), -32'768);
871 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("-32768"), -32'768);
872 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("32767"), 32'767);
873 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int16_t>("32768"), 32'767);
874
875 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("-1"), 0U);
876 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("0"), 0U);
877 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("65535"), 65'535U);
878 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint16_t>("65536"), 65'535U);
879
880 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int8_t>("-129"), -128);
881 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int8_t>("-128"), -128);
882 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int8_t>("127"), 127);
883 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<int8_t>("128"), 127);
884
885 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint8_t>("-1"), 0U);
886 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint8_t>("0"), 0U);
887 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint8_t>("255"), 255U);
888 BOOST_CHECK_EQUAL(LocaleIndependentAtoi<uint8_t>("256"), 255U);
889}
890
891BOOST_AUTO_TEST_CASE(test_ParseInt64)
892{
893 int64_t n;
894 // Valid values
895 BOOST_CHECK(ParseInt64("1234", nullptr));
896 BOOST_CHECK(ParseInt64("0", &n) && n == 0LL);
897 BOOST_CHECK(ParseInt64("1234", &n) && n == 1234LL);
898 BOOST_CHECK(ParseInt64("01234", &n) && n == 1234LL); // no octal
899 BOOST_CHECK(ParseInt64("2147483647", &n) && n == 2147483647LL);
900 BOOST_CHECK(ParseInt64("-2147483648", &n) && n == -2147483648LL);
901 BOOST_CHECK(ParseInt64("9223372036854775807", &n) && n == int64_t{9223372036854775807});
902 BOOST_CHECK(ParseInt64("-9223372036854775808", &n) && n == int64_t{-9223372036854775807-1});
903 BOOST_CHECK(ParseInt64("-1234", &n) && n == -1234LL);
904 // Invalid values
905 BOOST_CHECK(!ParseInt64("", &n));
906 BOOST_CHECK(!ParseInt64(" 1", &n)); // no padding inside
907 BOOST_CHECK(!ParseInt64("1 ", &n));
908 BOOST_CHECK(!ParseInt64("1a", &n));
909 BOOST_CHECK(!ParseInt64("aap", &n));
910 BOOST_CHECK(!ParseInt64("0x1", &n)); // no hex
912 // Overflow and underflow
913 BOOST_CHECK(!ParseInt64("-9223372036854775809", nullptr));
914 BOOST_CHECK(!ParseInt64("9223372036854775808", nullptr));
915 BOOST_CHECK(!ParseInt64("-32482348723847471234", nullptr));
916 BOOST_CHECK(!ParseInt64("32482348723847471234", nullptr));
917}
918
919BOOST_AUTO_TEST_CASE(test_ParseUInt8)
920{
921 uint8_t n;
922 // Valid values
923 BOOST_CHECK(ParseUInt8("255", nullptr));
924 BOOST_CHECK(ParseUInt8("0", &n) && n == 0);
925 BOOST_CHECK(ParseUInt8("255", &n) && n == 255);
926 BOOST_CHECK(ParseUInt8("0255", &n) && n == 255); // no octal
927 BOOST_CHECK(ParseUInt8("255", &n) && n == static_cast<uint8_t>(255));
928 BOOST_CHECK(ParseUInt8("+255", &n) && n == 255);
929 BOOST_CHECK(ParseUInt8("00000000000000000012", &n) && n == 12);
930 BOOST_CHECK(ParseUInt8("00000000000000000000", &n) && n == 0);
931 // Invalid values
932 BOOST_CHECK(!ParseUInt8("-00000000000000000000", &n));
933 BOOST_CHECK(!ParseUInt8("", &n));
934 BOOST_CHECK(!ParseUInt8(" 1", &n)); // no padding inside
935 BOOST_CHECK(!ParseUInt8(" -1", &n));
936 BOOST_CHECK(!ParseUInt8("++1", &n));
937 BOOST_CHECK(!ParseUInt8("+-1", &n));
938 BOOST_CHECK(!ParseUInt8("-+1", &n));
939 BOOST_CHECK(!ParseUInt8("--1", &n));
940 BOOST_CHECK(!ParseUInt8("-1", &n));
941 BOOST_CHECK(!ParseUInt8("1 ", &n));
942 BOOST_CHECK(!ParseUInt8("1a", &n));
943 BOOST_CHECK(!ParseUInt8("aap", &n));
944 BOOST_CHECK(!ParseUInt8("0x1", &n)); // no hex
946 // Overflow and underflow
947 BOOST_CHECK(!ParseUInt8("-255", &n));
948 BOOST_CHECK(!ParseUInt8("256", &n));
949 BOOST_CHECK(!ParseUInt8("-123", &n));
950 BOOST_CHECK(!ParseUInt8("-123", nullptr));
951 BOOST_CHECK(!ParseUInt8("256", nullptr));
952}
953
954BOOST_AUTO_TEST_CASE(test_ParseUInt16)
955{
956 uint16_t n;
957 // Valid values
958 BOOST_CHECK(ParseUInt16("1234", nullptr));
959 BOOST_CHECK(ParseUInt16("0", &n) && n == 0);
960 BOOST_CHECK(ParseUInt16("1234", &n) && n == 1234);
961 BOOST_CHECK(ParseUInt16("01234", &n) && n == 1234); // no octal
962 BOOST_CHECK(ParseUInt16("65535", &n) && n == static_cast<uint16_t>(65535));
963 BOOST_CHECK(ParseUInt16("+65535", &n) && n == 65535);
964 BOOST_CHECK(ParseUInt16("00000000000000000012", &n) && n == 12);
965 BOOST_CHECK(ParseUInt16("00000000000000000000", &n) && n == 0);
966 // Invalid values
967 BOOST_CHECK(!ParseUInt16("-00000000000000000000", &n));
968 BOOST_CHECK(!ParseUInt16("", &n));
969 BOOST_CHECK(!ParseUInt16(" 1", &n)); // no padding inside
970 BOOST_CHECK(!ParseUInt16(" -1", &n));
971 BOOST_CHECK(!ParseUInt16("++1", &n));
972 BOOST_CHECK(!ParseUInt16("+-1", &n));
973 BOOST_CHECK(!ParseUInt16("-+1", &n));
974 BOOST_CHECK(!ParseUInt16("--1", &n));
975 BOOST_CHECK(!ParseUInt16("-1", &n));
976 BOOST_CHECK(!ParseUInt16("1 ", &n));
977 BOOST_CHECK(!ParseUInt16("1a", &n));
978 BOOST_CHECK(!ParseUInt16("aap", &n));
979 BOOST_CHECK(!ParseUInt16("0x1", &n)); // no hex
981 // Overflow and underflow
982 BOOST_CHECK(!ParseUInt16("-65535", &n));
983 BOOST_CHECK(!ParseUInt16("65536", &n));
984 BOOST_CHECK(!ParseUInt16("-123", &n));
985 BOOST_CHECK(!ParseUInt16("-123", nullptr));
986 BOOST_CHECK(!ParseUInt16("65536", nullptr));
987}
988
989BOOST_AUTO_TEST_CASE(test_ParseUInt32)
990{
991 uint32_t n;
992 // Valid values
993 BOOST_CHECK(ParseUInt32("1234", nullptr));
994 BOOST_CHECK(ParseUInt32("0", &n) && n == 0);
995 BOOST_CHECK(ParseUInt32("1234", &n) && n == 1234);
996 BOOST_CHECK(ParseUInt32("01234", &n) && n == 1234); // no octal
997 BOOST_CHECK(ParseUInt32("2147483647", &n) && n == 2147483647);
998 BOOST_CHECK(ParseUInt32("2147483648", &n) && n == uint32_t{2147483648});
999 BOOST_CHECK(ParseUInt32("4294967295", &n) && n == uint32_t{4294967295});
1000 BOOST_CHECK(ParseUInt32("+1234", &n) && n == 1234);
1001 BOOST_CHECK(ParseUInt32("00000000000000001234", &n) && n == 1234);
1002 BOOST_CHECK(ParseUInt32("00000000000000000000", &n) && n == 0);
1003 // Invalid values
1004 BOOST_CHECK(!ParseUInt32("-00000000000000000000", &n));
1005 BOOST_CHECK(!ParseUInt32("", &n));
1006 BOOST_CHECK(!ParseUInt32(" 1", &n)); // no padding inside
1007 BOOST_CHECK(!ParseUInt32(" -1", &n));
1008 BOOST_CHECK(!ParseUInt32("++1", &n));
1009 BOOST_CHECK(!ParseUInt32("+-1", &n));
1010 BOOST_CHECK(!ParseUInt32("-+1", &n));
1011 BOOST_CHECK(!ParseUInt32("--1", &n));
1012 BOOST_CHECK(!ParseUInt32("-1", &n));
1013 BOOST_CHECK(!ParseUInt32("1 ", &n));
1014 BOOST_CHECK(!ParseUInt32("1a", &n));
1015 BOOST_CHECK(!ParseUInt32("aap", &n));
1016 BOOST_CHECK(!ParseUInt32("0x1", &n)); // no hex
1018 // Overflow and underflow
1019 BOOST_CHECK(!ParseUInt32("-2147483648", &n));
1020 BOOST_CHECK(!ParseUInt32("4294967296", &n));
1021 BOOST_CHECK(!ParseUInt32("-1234", &n));
1022 BOOST_CHECK(!ParseUInt32("-32482348723847471234", nullptr));
1023 BOOST_CHECK(!ParseUInt32("32482348723847471234", nullptr));
1024}
1025
1026BOOST_AUTO_TEST_CASE(test_ParseUInt64)
1027{
1028 uint64_t n;
1029 // Valid values
1030 BOOST_CHECK(ParseUInt64("1234", nullptr));
1031 BOOST_CHECK(ParseUInt64("0", &n) && n == 0LL);
1032 BOOST_CHECK(ParseUInt64("1234", &n) && n == 1234LL);
1033 BOOST_CHECK(ParseUInt64("01234", &n) && n == 1234LL); // no octal
1034 BOOST_CHECK(ParseUInt64("2147483647", &n) && n == 2147483647LL);
1035 BOOST_CHECK(ParseUInt64("9223372036854775807", &n) && n == 9223372036854775807ULL);
1036 BOOST_CHECK(ParseUInt64("9223372036854775808", &n) && n == 9223372036854775808ULL);
1037 BOOST_CHECK(ParseUInt64("18446744073709551615", &n) && n == 18446744073709551615ULL);
1038 // Invalid values
1039 BOOST_CHECK(!ParseUInt64("", &n));
1040 BOOST_CHECK(!ParseUInt64(" 1", &n)); // no padding inside
1041 BOOST_CHECK(!ParseUInt64(" -1", &n));
1042 BOOST_CHECK(!ParseUInt64("1 ", &n));
1043 BOOST_CHECK(!ParseUInt64("1a", &n));
1044 BOOST_CHECK(!ParseUInt64("aap", &n));
1045 BOOST_CHECK(!ParseUInt64("0x1", &n)); // no hex
1047 // Overflow and underflow
1048 BOOST_CHECK(!ParseUInt64("-9223372036854775809", nullptr));
1049 BOOST_CHECK(!ParseUInt64("18446744073709551616", nullptr));
1050 BOOST_CHECK(!ParseUInt64("-32482348723847471234", nullptr));
1051 BOOST_CHECK(!ParseUInt64("-2147483648", &n));
1052 BOOST_CHECK(!ParseUInt64("-9223372036854775808", &n));
1053 BOOST_CHECK(!ParseUInt64("-1234", &n));
1054}
1055
1056BOOST_AUTO_TEST_CASE(test_FormatParagraph)
1057{
1058 BOOST_CHECK_EQUAL(FormatParagraph("", 79, 0), "");
1059 BOOST_CHECK_EQUAL(FormatParagraph("test", 79, 0), "test");
1060 BOOST_CHECK_EQUAL(FormatParagraph(" test", 79, 0), " test");
1061 BOOST_CHECK_EQUAL(FormatParagraph("test test", 79, 0), "test test");
1062 BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 0), "test\ntest");
1063 BOOST_CHECK_EQUAL(FormatParagraph("testerde test", 4, 0), "testerde\ntest");
1064 BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 4), "test\n test");
1065
1066 // Make sure we don't indent a fully-new line following a too-long line ending
1067 BOOST_CHECK_EQUAL(FormatParagraph("test test\nabc", 4, 4), "test\n test\nabc");
1068
1069 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");
1070
1071 // Test wrap length is exact
1072 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");
1073 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");
1074 // Indent should be included in length of lines
1075 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");
1076
1077 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.");
1078 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.");
1079 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.");
1080 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.");
1081}
1082
1083BOOST_AUTO_TEST_CASE(test_FormatSubVersion)
1084{
1085 std::vector<std::string> comments;
1086 comments.emplace_back("comment1");
1087 std::vector<std::string> comments2;
1088 comments2.emplace_back("comment1");
1089 comments2.push_back(SanitizeString(std::string("Comment2; .,_?@-; !\"#$%&'()*+/<=>[]\\^`{|}~"), SAFE_CHARS_UA_COMMENT)); // Semicolon is discouraged but not forbidden by BIP-0014
1090 BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99900, std::vector<std::string>()),std::string("/Test:9.99.0/"));
1091 BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99900, comments),std::string("/Test:9.99.0(comment1)/"));
1092 BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99900, comments2),std::string("/Test:9.99.0(comment1; Comment2; .,_?@-; )/"));
1093}
1094
1095BOOST_AUTO_TEST_CASE(test_ParseFixedPoint)
1096{
1097 int64_t amount = 0;
1098 BOOST_CHECK(ParseFixedPoint("0", 8, &amount));
1099 BOOST_CHECK_EQUAL(amount, 0LL);
1100 BOOST_CHECK(ParseFixedPoint("1", 8, &amount));
1101 BOOST_CHECK_EQUAL(amount, 100000000LL);
1102 BOOST_CHECK(ParseFixedPoint("0.0", 8, &amount));
1103 BOOST_CHECK_EQUAL(amount, 0LL);
1104 BOOST_CHECK(ParseFixedPoint("-0.1", 8, &amount));
1105 BOOST_CHECK_EQUAL(amount, -10000000LL);
1106 BOOST_CHECK(ParseFixedPoint("1.1", 8, &amount));
1107 BOOST_CHECK_EQUAL(amount, 110000000LL);
1108 BOOST_CHECK(ParseFixedPoint("1.10000000000000000", 8, &amount));
1109 BOOST_CHECK_EQUAL(amount, 110000000LL);
1110 BOOST_CHECK(ParseFixedPoint("1.1e1", 8, &amount));
1111 BOOST_CHECK_EQUAL(amount, 1100000000LL);
1112 BOOST_CHECK(ParseFixedPoint("1.1e-1", 8, &amount));
1113 BOOST_CHECK_EQUAL(amount, 11000000LL);
1114 BOOST_CHECK(ParseFixedPoint("1000", 8, &amount));
1115 BOOST_CHECK_EQUAL(amount, 100000000000LL);
1116 BOOST_CHECK(ParseFixedPoint("-1000", 8, &amount));
1117 BOOST_CHECK_EQUAL(amount, -100000000000LL);
1118 BOOST_CHECK(ParseFixedPoint("0.00000001", 8, &amount));
1119 BOOST_CHECK_EQUAL(amount, 1LL);
1120 BOOST_CHECK(ParseFixedPoint("0.0000000100000000", 8, &amount));
1121 BOOST_CHECK_EQUAL(amount, 1LL);
1122 BOOST_CHECK(ParseFixedPoint("-0.00000001", 8, &amount));
1123 BOOST_CHECK_EQUAL(amount, -1LL);
1124 BOOST_CHECK(ParseFixedPoint("1000000000.00000001", 8, &amount));
1125 BOOST_CHECK_EQUAL(amount, 100000000000000001LL);
1126 BOOST_CHECK(ParseFixedPoint("9999999999.99999999", 8, &amount));
1127 BOOST_CHECK_EQUAL(amount, 999999999999999999LL);
1128 BOOST_CHECK(ParseFixedPoint("-9999999999.99999999", 8, &amount));
1129 BOOST_CHECK_EQUAL(amount, -999999999999999999LL);
1130
1131 BOOST_CHECK(!ParseFixedPoint("", 8, &amount));
1132 BOOST_CHECK(!ParseFixedPoint("-", 8, &amount));
1133 BOOST_CHECK(!ParseFixedPoint("a-1000", 8, &amount));
1134 BOOST_CHECK(!ParseFixedPoint("-a1000", 8, &amount));
1135 BOOST_CHECK(!ParseFixedPoint("-1000a", 8, &amount));
1136 BOOST_CHECK(!ParseFixedPoint("-01000", 8, &amount));
1137 BOOST_CHECK(!ParseFixedPoint("00.1", 8, &amount));
1138 BOOST_CHECK(!ParseFixedPoint(".1", 8, &amount));
1139 BOOST_CHECK(!ParseFixedPoint("--0.1", 8, &amount));
1140 BOOST_CHECK(!ParseFixedPoint("0.000000001", 8, &amount));
1141 BOOST_CHECK(!ParseFixedPoint("-0.000000001", 8, &amount));
1142 BOOST_CHECK(!ParseFixedPoint("0.00000001000000001", 8, &amount));
1143 BOOST_CHECK(!ParseFixedPoint("-10000000000.00000000", 8, &amount));
1144 BOOST_CHECK(!ParseFixedPoint("10000000000.00000000", 8, &amount));
1145 BOOST_CHECK(!ParseFixedPoint("-10000000000.00000001", 8, &amount));
1146 BOOST_CHECK(!ParseFixedPoint("10000000000.00000001", 8, &amount));
1147 BOOST_CHECK(!ParseFixedPoint("-10000000000.00000009", 8, &amount));
1148 BOOST_CHECK(!ParseFixedPoint("10000000000.00000009", 8, &amount));
1149 BOOST_CHECK(!ParseFixedPoint("-99999999999.99999999", 8, &amount));
1150 BOOST_CHECK(!ParseFixedPoint("99999909999.09999999", 8, &amount));
1151 BOOST_CHECK(!ParseFixedPoint("92233720368.54775807", 8, &amount));
1152 BOOST_CHECK(!ParseFixedPoint("92233720368.54775808", 8, &amount));
1153 BOOST_CHECK(!ParseFixedPoint("-92233720368.54775808", 8, &amount));
1154 BOOST_CHECK(!ParseFixedPoint("-92233720368.54775809", 8, &amount));
1155 BOOST_CHECK(!ParseFixedPoint("1.1e", 8, &amount));
1156 BOOST_CHECK(!ParseFixedPoint("1.1e-", 8, &amount));
1157 BOOST_CHECK(!ParseFixedPoint("1.", 8, &amount));
1158
1159 // Test with 3 decimal places for fee rates in sat/vB.
1160 BOOST_CHECK(ParseFixedPoint("0.001", 3, &amount));
1161 BOOST_CHECK_EQUAL(amount, CAmount{1});
1162 BOOST_CHECK(!ParseFixedPoint("0.0009", 3, &amount));
1163 BOOST_CHECK(!ParseFixedPoint("31.00100001", 3, &amount));
1164 BOOST_CHECK(!ParseFixedPoint("31.0011", 3, &amount));
1165 BOOST_CHECK(!ParseFixedPoint("31.99999999", 3, &amount));
1166 BOOST_CHECK(!ParseFixedPoint("31.999999999999999999999", 3, &amount));
1167}
1168
1169#ifndef WIN32 // Cannot do this test on WIN32 due to lack of fork()
1170static constexpr char LockCommand = 'L';
1171static constexpr char UnlockCommand = 'U';
1172static constexpr char ExitCommand = 'X';
1173enum : char {
1174 ResSuccess = 2, // Start with 2 to avoid accidental collision with common values 0 and 1
1178};
1179
1180[[noreturn]] static void TestOtherProcess(fs::path dirname, fs::path lockname, int fd)
1181{
1182 char ch;
1183 while (true) {
1184 int rv = read(fd, &ch, 1); // Wait for command
1185 assert(rv == 1);
1186 switch (ch) {
1187 case LockCommand:
1188 ch = [&] {
1189 switch (util::LockDirectory(dirname, lockname)) {
1193 } // no default case, so the compiler can warn about missing cases
1194 assert(false);
1195 }();
1196 rv = write(fd, &ch, 1);
1197 assert(rv == 1);
1198 break;
1199 case UnlockCommand:
1201 ch = ResUnlockSuccess; // Always succeeds
1202 rv = write(fd, &ch, 1);
1203 assert(rv == 1);
1204 break;
1205 case ExitCommand:
1206 close(fd);
1207 exit(0);
1208 default:
1209 assert(0);
1210 }
1211 }
1212}
1213#endif
1214
1215BOOST_AUTO_TEST_CASE(test_LockDirectory)
1216{
1217 fs::path dirname = m_args.GetDataDirBase() / "lock_dir";
1218 const fs::path lockname = ".lock";
1219#ifndef WIN32
1220 // Revert SIGCHLD to default, otherwise boost.test will catch and fail on
1221 // it: there is BOOST_TEST_IGNORE_SIGCHLD but that only works when defined
1222 // at build-time of the boost library
1223 void (*old_handler)(int) = signal(SIGCHLD, SIG_DFL);
1224
1225 // Fork another process for testing before creating the lock, so that we
1226 // won't fork while holding the lock (which might be undefined, and is not
1227 // relevant as test case as that is avoided with -daemonize).
1228 int fd[2];
1229 BOOST_CHECK_EQUAL(socketpair(AF_UNIX, SOCK_STREAM, 0, fd), 0);
1230 pid_t pid = fork();
1231 if (!pid) {
1232 BOOST_CHECK_EQUAL(close(fd[1]), 0); // Child: close parent end
1233 TestOtherProcess(dirname, lockname, fd[0]);
1234 }
1235 BOOST_CHECK_EQUAL(close(fd[0]), 0); // Parent: close child end
1236
1237 char ch;
1238 // Lock on non-existent directory should fail
1239 BOOST_CHECK_EQUAL(write(fd[1], &LockCommand, 1), 1);
1240 BOOST_CHECK_EQUAL(read(fd[1], &ch, 1), 1);
1242#endif
1243 // Lock on non-existent directory should fail
1245
1246 fs::create_directories(dirname);
1247
1248 // Probing lock on new directory should succeed
1250
1251 // Persistent lock on new directory should succeed
1253
1254 // Another lock on the directory from the same thread should succeed
1256
1257 // Another lock on the directory from a different thread within the same process should succeed
1258 util::LockResult threadresult;
1259 std::thread thr([&] { threadresult = util::LockDirectory(dirname, lockname); });
1260 thr.join();
1262#ifndef WIN32
1263 // Try to acquire lock in child process while we're holding it, this should fail.
1264 BOOST_CHECK_EQUAL(write(fd[1], &LockCommand, 1), 1);
1265 BOOST_CHECK_EQUAL(read(fd[1], &ch, 1), 1);
1267
1268 // Give up our lock
1270 // Probing lock from our side now should succeed, but not hold on to the lock.
1272
1273 // Try to acquire the lock in the child process, this should be successful.
1274 BOOST_CHECK_EQUAL(write(fd[1], &LockCommand, 1), 1);
1275 BOOST_CHECK_EQUAL(read(fd[1], &ch, 1), 1);
1277
1278 // When we try to probe the lock now, it should fail.
1280
1281 // Unlock the lock in the child process
1282 BOOST_CHECK_EQUAL(write(fd[1], &UnlockCommand, 1), 1);
1283 BOOST_CHECK_EQUAL(read(fd[1], &ch, 1), 1);
1285
1286 // When we try to probe the lock now, it should succeed.
1288
1289 // Re-lock the lock in the child process, then wait for it to exit, check
1290 // successful return. After that, we check that exiting the process
1291 // has released the lock as we would expect by probing it.
1292 int processstatus;
1293 BOOST_CHECK_EQUAL(write(fd[1], &LockCommand, 1), 1);
1294 // The following line invokes the ~CNetCleanup dtor without
1295 // a paired SetupNetworking call. This is acceptable as long as
1296 // ~CNetCleanup is a no-op for non-Windows platforms.
1297 BOOST_CHECK_EQUAL(write(fd[1], &ExitCommand, 1), 1);
1298 BOOST_CHECK_EQUAL(waitpid(pid, &processstatus, 0), pid);
1299 BOOST_CHECK_EQUAL(processstatus, 0);
1301
1302 // Restore SIGCHLD
1303 signal(SIGCHLD, old_handler);
1304 BOOST_CHECK_EQUAL(close(fd[1]), 0); // Close our side of the socketpair
1305#endif
1306 // Clean up
1308 fs::remove_all(dirname);
1309}
1310
1312{
1313 BOOST_CHECK_EQUAL(ToLower('@'), '@');
1314 BOOST_CHECK_EQUAL(ToLower('A'), 'a');
1315 BOOST_CHECK_EQUAL(ToLower('Z'), 'z');
1316 BOOST_CHECK_EQUAL(ToLower('['), '[');
1318 BOOST_CHECK_EQUAL(ToLower('\xff'), '\xff');
1319
1320 BOOST_CHECK_EQUAL(ToLower(""), "");
1321 BOOST_CHECK_EQUAL(ToLower("#HODL"), "#hodl");
1322 BOOST_CHECK_EQUAL(ToLower("\x00\xfe\xff"), "\x00\xfe\xff");
1323}
1324
1326{
1327 BOOST_CHECK_EQUAL(ToUpper('`'), '`');
1328 BOOST_CHECK_EQUAL(ToUpper('a'), 'A');
1329 BOOST_CHECK_EQUAL(ToUpper('z'), 'Z');
1330 BOOST_CHECK_EQUAL(ToUpper('{'), '{');
1332 BOOST_CHECK_EQUAL(ToUpper('\xff'), '\xff');
1333
1334 BOOST_CHECK_EQUAL(ToUpper(""), "");
1335 BOOST_CHECK_EQUAL(ToUpper("#hodl"), "#HODL");
1336 BOOST_CHECK_EQUAL(ToUpper("\x00\xfe\xff"), "\x00\xfe\xff");
1337}
1338
1339BOOST_AUTO_TEST_CASE(test_Capitalize)
1340{
1342 BOOST_CHECK_EQUAL(Capitalize("bitcoin"), "Bitcoin");
1343 BOOST_CHECK_EQUAL(Capitalize("\x00\xfe\xff"), "\x00\xfe\xff");
1344}
1345
1346static std::string SpanToStr(const Span<const char>& span)
1347{
1348 return std::string(span.begin(), span.end());
1349}
1350
1351BOOST_AUTO_TEST_CASE(test_script_parsing)
1352{
1353 using namespace script;
1354 std::string input;
1356 bool success;
1357
1358 // Const(...): parse a constant, update span to skip it if successful
1359 input = "MilkToastHoney";
1360 sp = input;
1361 success = Const("", sp); // empty
1362 BOOST_CHECK(success);
1363 BOOST_CHECK_EQUAL(SpanToStr(sp), "MilkToastHoney");
1364
1365 success = Const("Milk", sp);
1366 BOOST_CHECK(success);
1367 BOOST_CHECK_EQUAL(SpanToStr(sp), "ToastHoney");
1368
1369 success = Const("Bread", sp);
1370 BOOST_CHECK(!success);
1371
1372 success = Const("Toast", sp);
1373 BOOST_CHECK(success);
1374 BOOST_CHECK_EQUAL(SpanToStr(sp), "Honey");
1375
1376 success = Const("Honeybadger", sp);
1377 BOOST_CHECK(!success);
1378
1379 success = Const("Honey", sp);
1380 BOOST_CHECK(success);
1382
1383 // Func(...): parse a function call, update span to argument if successful
1384 input = "Foo(Bar(xy,z()))";
1385 sp = input;
1386
1387 success = Func("FooBar", sp);
1388 BOOST_CHECK(!success);
1389
1390 success = Func("Foo(", sp);
1391 BOOST_CHECK(!success);
1392
1393 success = Func("Foo", sp);
1394 BOOST_CHECK(success);
1395 BOOST_CHECK_EQUAL(SpanToStr(sp), "Bar(xy,z())");
1396
1397 success = Func("Bar", sp);
1398 BOOST_CHECK(success);
1399 BOOST_CHECK_EQUAL(SpanToStr(sp), "xy,z()");
1400
1401 success = Func("xy", sp);
1402 BOOST_CHECK(!success);
1403
1404 // Expr(...): return expression that span begins with, update span to skip it
1405 Span<const char> result;
1406
1407 input = "(n*(n-1))/2";
1408 sp = input;
1409 result = Expr(sp);
1410 BOOST_CHECK_EQUAL(SpanToStr(result), "(n*(n-1))/2");
1412
1413 input = "foo,bar";
1414 sp = input;
1415 result = Expr(sp);
1416 BOOST_CHECK_EQUAL(SpanToStr(result), "foo");
1417 BOOST_CHECK_EQUAL(SpanToStr(sp), ",bar");
1418
1419 input = "(aaaaa,bbbbb()),c";
1420 sp = input;
1421 result = Expr(sp);
1422 BOOST_CHECK_EQUAL(SpanToStr(result), "(aaaaa,bbbbb())");
1423 BOOST_CHECK_EQUAL(SpanToStr(sp), ",c");
1424
1425 input = "xyz)foo";
1426 sp = input;
1427 result = Expr(sp);
1428 BOOST_CHECK_EQUAL(SpanToStr(result), "xyz");
1429 BOOST_CHECK_EQUAL(SpanToStr(sp), ")foo");
1430
1431 input = "((a),(b),(c)),xxx";
1432 sp = input;
1433 result = Expr(sp);
1434 BOOST_CHECK_EQUAL(SpanToStr(result), "((a),(b),(c))");
1435 BOOST_CHECK_EQUAL(SpanToStr(sp), ",xxx");
1436
1437 // Split(...): split a string on every instance of sep, return vector
1438 std::vector<Span<const char>> results;
1439
1440 input = "xxx";
1441 results = Split(input, 'x');
1442 BOOST_CHECK_EQUAL(results.size(), 4U);
1443 BOOST_CHECK_EQUAL(SpanToStr(results[0]), "");
1444 BOOST_CHECK_EQUAL(SpanToStr(results[1]), "");
1445 BOOST_CHECK_EQUAL(SpanToStr(results[2]), "");
1446 BOOST_CHECK_EQUAL(SpanToStr(results[3]), "");
1447
1448 input = "one#two#three";
1449 results = Split(input, '-');
1450 BOOST_CHECK_EQUAL(results.size(), 1U);
1451 BOOST_CHECK_EQUAL(SpanToStr(results[0]), "one#two#three");
1452
1453 input = "one#two#three";
1454 results = Split(input, '#');
1455 BOOST_CHECK_EQUAL(results.size(), 3U);
1456 BOOST_CHECK_EQUAL(SpanToStr(results[0]), "one");
1457 BOOST_CHECK_EQUAL(SpanToStr(results[1]), "two");
1458 BOOST_CHECK_EQUAL(SpanToStr(results[2]), "three");
1459
1460 input = "*foo*bar*";
1461 results = Split(input, '*');
1462 BOOST_CHECK_EQUAL(results.size(), 4U);
1463 BOOST_CHECK_EQUAL(SpanToStr(results[0]), "");
1464 BOOST_CHECK_EQUAL(SpanToStr(results[1]), "foo");
1465 BOOST_CHECK_EQUAL(SpanToStr(results[2]), "bar");
1466 BOOST_CHECK_EQUAL(SpanToStr(results[3]), "");
1467}
1468
1469BOOST_AUTO_TEST_CASE(test_SplitString)
1470{
1471 // Empty string.
1472 {
1473 std::vector<std::string> result = SplitString("", '-');
1474 BOOST_CHECK_EQUAL(result.size(), 1);
1475 BOOST_CHECK_EQUAL(result[0], "");
1476 }
1477
1478 // Empty items.
1479 {
1480 std::vector<std::string> result = SplitString("-", '-');
1481 BOOST_CHECK_EQUAL(result.size(), 2);
1482 BOOST_CHECK_EQUAL(result[0], "");
1483 BOOST_CHECK_EQUAL(result[1], "");
1484 }
1485
1486 // More empty items.
1487 {
1488 std::vector<std::string> result = SplitString("--", '-');
1489 BOOST_CHECK_EQUAL(result.size(), 3);
1490 BOOST_CHECK_EQUAL(result[0], "");
1491 BOOST_CHECK_EQUAL(result[1], "");
1492 BOOST_CHECK_EQUAL(result[2], "");
1493 }
1494
1495 // Separator is not present.
1496 {
1497 std::vector<std::string> result = SplitString("abc", '-');
1498 BOOST_CHECK_EQUAL(result.size(), 1);
1499 BOOST_CHECK_EQUAL(result[0], "abc");
1500 }
1501
1502 // Basic behavior.
1503 {
1504 std::vector<std::string> result = SplitString("a-b", '-');
1505 BOOST_CHECK_EQUAL(result.size(), 2);
1506 BOOST_CHECK_EQUAL(result[0], "a");
1507 BOOST_CHECK_EQUAL(result[1], "b");
1508 }
1509
1510 // Case-sensitivity of the separator.
1511 {
1512 std::vector<std::string> result = SplitString("AAA", 'a');
1513 BOOST_CHECK_EQUAL(result.size(), 1);
1514 BOOST_CHECK_EQUAL(result[0], "AAA");
1515 }
1516
1517 // multiple split characters
1518 {
1519 using V = std::vector<std::string>;
1520 BOOST_TEST(SplitString("a,b.c:d;e", ",;") == V({"a", "b.c:d", "e"}));
1521 BOOST_TEST(SplitString("a,b.c:d;e", ",;:.") == V({"a", "b", "c", "d", "e"}));
1522 BOOST_TEST(SplitString("a,b.c:d;e", "") == V({"a,b.c:d;e"}));
1523 BOOST_TEST(SplitString("aaa", "bcdefg") == V({"aaa"}));
1524 BOOST_TEST(SplitString("x\0a,b"s, "\0"s) == V({"x", "a,b"}));
1525 BOOST_TEST(SplitString("x\0a,b"s, '\0') == V({"x", "a,b"}));
1526 BOOST_TEST(SplitString("x\0a,b"s, "\0,"s) == V({"x", "a", "b"}));
1527 BOOST_TEST(SplitString("abcdefg", "bcd") == V({"a", "", "", "efg"}));
1528 }
1529}
1530
1531BOOST_AUTO_TEST_CASE(test_LogEscapeMessage)
1532{
1533 // ASCII and UTF-8 must pass through unaltered.
1534 BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("Valid log message貓"), "Valid log message貓");
1535 // Newlines must pass through unaltered.
1536 BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("Message\n with newlines\n"), "Message\n with newlines\n");
1537 // Other control characters are escaped in C syntax.
1538 BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("\x01\x7f Corrupted log message\x0d"), R"(\x01\x7f Corrupted log message\x0d)");
1539 // Embedded NULL characters are escaped too.
1540 const std::string NUL("O\x00O", 3);
1541 BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage(NUL), R"(O\x00O)");
1542}
1543
1544namespace {
1545
1546struct Tracker
1547{
1549 const Tracker* origin;
1551 int copies{0};
1552
1553 Tracker() noexcept : origin(this) {}
1554 Tracker(const Tracker& t) noexcept : origin(t.origin), copies(t.copies + 1) {}
1555 Tracker(Tracker&& t) noexcept : origin(t.origin), copies(t.copies) {}
1556 Tracker& operator=(const Tracker& t) noexcept
1557 {
1558 if (this != &t) {
1559 origin = t.origin;
1560 copies = t.copies + 1;
1561 }
1562 return *this;
1563 }
1564};
1565
1566}
1567
1568BOOST_AUTO_TEST_CASE(test_tracked_vector)
1569{
1570 Tracker t1;
1571 Tracker t2;
1572 Tracker t3;
1573
1574 BOOST_CHECK(t1.origin == &t1);
1575 BOOST_CHECK(t2.origin == &t2);
1576 BOOST_CHECK(t3.origin == &t3);
1577
1578 auto v1 = Vector(t1);
1579 BOOST_CHECK_EQUAL(v1.size(), 1U);
1580 BOOST_CHECK(v1[0].origin == &t1);
1581 BOOST_CHECK_EQUAL(v1[0].copies, 1);
1582
1583 auto v2 = Vector(std::move(t2));
1584 BOOST_CHECK_EQUAL(v2.size(), 1U);
1585 BOOST_CHECK(v2[0].origin == &t2); // NOLINT(*-use-after-move)
1586 BOOST_CHECK_EQUAL(v2[0].copies, 0);
1587
1588 auto v3 = Vector(t1, std::move(t2));
1589 BOOST_CHECK_EQUAL(v3.size(), 2U);
1590 BOOST_CHECK(v3[0].origin == &t1);
1591 BOOST_CHECK(v3[1].origin == &t2); // NOLINT(*-use-after-move)
1592 BOOST_CHECK_EQUAL(v3[0].copies, 1);
1593 BOOST_CHECK_EQUAL(v3[1].copies, 0);
1594
1595 auto v4 = Vector(std::move(v3[0]), v3[1], std::move(t3));
1596 BOOST_CHECK_EQUAL(v4.size(), 3U);
1597 BOOST_CHECK(v4[0].origin == &t1);
1598 BOOST_CHECK(v4[1].origin == &t2);
1599 BOOST_CHECK(v4[2].origin == &t3); // NOLINT(*-use-after-move)
1600 BOOST_CHECK_EQUAL(v4[0].copies, 1);
1601 BOOST_CHECK_EQUAL(v4[1].copies, 1);
1602 BOOST_CHECK_EQUAL(v4[2].copies, 0);
1603
1604 auto v5 = Cat(v1, v4);
1605 BOOST_CHECK_EQUAL(v5.size(), 4U);
1606 BOOST_CHECK(v5[0].origin == &t1);
1607 BOOST_CHECK(v5[1].origin == &t1);
1608 BOOST_CHECK(v5[2].origin == &t2);
1609 BOOST_CHECK(v5[3].origin == &t3);
1610 BOOST_CHECK_EQUAL(v5[0].copies, 2);
1611 BOOST_CHECK_EQUAL(v5[1].copies, 2);
1612 BOOST_CHECK_EQUAL(v5[2].copies, 2);
1613 BOOST_CHECK_EQUAL(v5[3].copies, 1);
1614
1615 auto v6 = Cat(std::move(v1), v3);
1616 BOOST_CHECK_EQUAL(v6.size(), 3U);
1617 BOOST_CHECK(v6[0].origin == &t1);
1618 BOOST_CHECK(v6[1].origin == &t1);
1619 BOOST_CHECK(v6[2].origin == &t2);
1620 BOOST_CHECK_EQUAL(v6[0].copies, 1);
1621 BOOST_CHECK_EQUAL(v6[1].copies, 2);
1622 BOOST_CHECK_EQUAL(v6[2].copies, 1);
1623
1624 auto v7 = Cat(v2, std::move(v4));
1625 BOOST_CHECK_EQUAL(v7.size(), 4U);
1626 BOOST_CHECK(v7[0].origin == &t2);
1627 BOOST_CHECK(v7[1].origin == &t1);
1628 BOOST_CHECK(v7[2].origin == &t2);
1629 BOOST_CHECK(v7[3].origin == &t3);
1630 BOOST_CHECK_EQUAL(v7[0].copies, 1);
1631 BOOST_CHECK_EQUAL(v7[1].copies, 1);
1632 BOOST_CHECK_EQUAL(v7[2].copies, 1);
1633 BOOST_CHECK_EQUAL(v7[3].copies, 0);
1634
1635 auto v8 = Cat(std::move(v2), std::move(v3));
1636 BOOST_CHECK_EQUAL(v8.size(), 3U);
1637 BOOST_CHECK(v8[0].origin == &t2);
1638 BOOST_CHECK(v8[1].origin == &t1);
1639 BOOST_CHECK(v8[2].origin == &t2);
1640 BOOST_CHECK_EQUAL(v8[0].copies, 0);
1641 BOOST_CHECK_EQUAL(v8[1].copies, 1);
1642 BOOST_CHECK_EQUAL(v8[2].copies, 0);
1643}
1644
1646{
1647 const std::array<unsigned char, 32> privkey_bytes = {
1648 // just some random data
1649 // derived address from this private key: 15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs
1650 0xD9, 0x7F, 0x51, 0x08, 0xF1, 0x1C, 0xDA, 0x6E,
1651 0xEE, 0xBA, 0xAA, 0x42, 0x0F, 0xEF, 0x07, 0x26,
1652 0xB1, 0xF8, 0x98, 0x06, 0x0B, 0x98, 0x48, 0x9F,
1653 0xA3, 0x09, 0x84, 0x63, 0xC0, 0x03, 0x28, 0x66
1654 };
1655
1656 const std::string message = "Trust no one";
1657
1658 const std::string expected_signature =
1659 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=";
1660
1661 CKey privkey;
1662 std::string generated_signature;
1663
1664 BOOST_REQUIRE_MESSAGE(!privkey.IsValid(),
1665 "Confirm the private key is invalid");
1666
1667 BOOST_CHECK_MESSAGE(!MessageSign(privkey, message, generated_signature),
1668 "Sign with an invalid private key");
1669
1670 privkey.Set(privkey_bytes.begin(), privkey_bytes.end(), true);
1671
1672 BOOST_REQUIRE_MESSAGE(privkey.IsValid(),
1673 "Confirm the private key is valid");
1674
1675 BOOST_CHECK_MESSAGE(MessageSign(privkey, message, generated_signature),
1676 "Sign with a valid private key");
1677
1678 BOOST_CHECK_EQUAL(expected_signature, generated_signature);
1679}
1680
1682{
1685 "invalid address",
1686 "signature should be irrelevant",
1687 "message too"),
1689
1692 "3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV",
1693 "signature should be irrelevant",
1694 "message too"),
1696
1699 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1700 "invalid signature, not in base64 encoding",
1701 "message should be irrelevant"),
1703
1706 "1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm",
1707 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
1708 "message should be irrelevant"),
1710
1713 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1714 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1715 "I never signed this"),
1717
1720 "15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs",
1721 "IPojfrX2dfPnH26UegfbGQQLrdK844DlHq5157/P6h57WyuS/Qsl+h/WSVGDF4MUi4rWSswW38oimDYfNNUBUOk=",
1722 "Trust no one"),
1724
1727 "11canuhp9X2NocwCq7xNrQYTmUgZAnLK3",
1728 "IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=",
1729 "Trust me"),
1731}
1732
1734{
1735 const std::string unsigned_tx = "...";
1736 const std::string prefixed_message =
1737 std::string(1, (char)MESSAGE_MAGIC.length()) +
1739 std::string(1, (char)unsigned_tx.length()) +
1740 unsigned_tx;
1741
1742 const uint256 signature_hash = Hash(unsigned_tx);
1743 const uint256 message_hash1 = Hash(prefixed_message);
1744 const uint256 message_hash2 = MessageHash(unsigned_tx);
1745
1746 BOOST_CHECK_EQUAL(message_hash1, message_hash2);
1747 BOOST_CHECK_NE(message_hash1, signature_hash);
1748}
1749
1751{
1752 BOOST_CHECK_EQUAL(RemovePrefix("./common/system.h", "./"), "common/system.h");
1753 BOOST_CHECK_EQUAL(RemovePrefixView("foo", "foo"), "");
1754 BOOST_CHECK_EQUAL(RemovePrefix("foo", "fo"), "o");
1755 BOOST_CHECK_EQUAL(RemovePrefixView("foo", "f"), "oo");
1756 BOOST_CHECK_EQUAL(RemovePrefix("foo", ""), "foo");
1757 BOOST_CHECK_EQUAL(RemovePrefixView("fo", "foo"), "fo");
1758 BOOST_CHECK_EQUAL(RemovePrefix("f", "foo"), "f");
1759 BOOST_CHECK_EQUAL(RemovePrefixView("", "foo"), "");
1760 BOOST_CHECK_EQUAL(RemovePrefix("", ""), "");
1761}
1762
1763BOOST_AUTO_TEST_CASE(util_ParseByteUnits)
1764{
1765 auto noop = ByteUnit::NOOP;
1766
1767 // no multiplier
1768 BOOST_CHECK_EQUAL(ParseByteUnits("1", noop).value(), 1);
1769 BOOST_CHECK_EQUAL(ParseByteUnits("0", noop).value(), 0);
1770
1771 BOOST_CHECK_EQUAL(ParseByteUnits("1k", noop).value(), 1000ULL);
1772 BOOST_CHECK_EQUAL(ParseByteUnits("1K", noop).value(), 1ULL << 10);
1773
1774 BOOST_CHECK_EQUAL(ParseByteUnits("2m", noop).value(), 2'000'000ULL);
1775 BOOST_CHECK_EQUAL(ParseByteUnits("2M", noop).value(), 2ULL << 20);
1776
1777 BOOST_CHECK_EQUAL(ParseByteUnits("3g", noop).value(), 3'000'000'000ULL);
1778 BOOST_CHECK_EQUAL(ParseByteUnits("3G", noop).value(), 3ULL << 30);
1779
1780 BOOST_CHECK_EQUAL(ParseByteUnits("4t", noop).value(), 4'000'000'000'000ULL);
1781 BOOST_CHECK_EQUAL(ParseByteUnits("4T", noop).value(), 4ULL << 40);
1782
1783 // check default multiplier
1784 BOOST_CHECK_EQUAL(ParseByteUnits("5", ByteUnit::K).value(), 5ULL << 10);
1785
1786 // NaN
1787 BOOST_CHECK(!ParseByteUnits("", noop));
1788 BOOST_CHECK(!ParseByteUnits("foo", noop));
1789
1790 // whitespace
1791 BOOST_CHECK(!ParseByteUnits("123m ", noop));
1792 BOOST_CHECK(!ParseByteUnits(" 123m", noop));
1793
1794 // no +-
1795 BOOST_CHECK(!ParseByteUnits("-123m", noop));
1796 BOOST_CHECK(!ParseByteUnits("+123m", noop));
1797
1798 // zero padding
1799 BOOST_CHECK_EQUAL(ParseByteUnits("020M", noop).value(), 20ULL << 20);
1800
1801 // fractions not allowed
1802 BOOST_CHECK(!ParseByteUnits("0.5T", noop));
1803
1804 // overflow
1805 BOOST_CHECK(!ParseByteUnits("18446744073709551615g", noop));
1806
1807 // invalid unit
1808 BOOST_CHECK(!ParseByteUnits("1x", noop));
1809}
1810
1811BOOST_AUTO_TEST_CASE(util_ReadBinaryFile)
1812{
1813 fs::path tmpfolder = m_args.GetDataDirBase();
1814 fs::path tmpfile = tmpfolder / "read_binary.dat";
1815 std::string expected_text;
1816 for (int i = 0; i < 30; i++) {
1817 expected_text += "0123456789";
1818 }
1819 {
1820 std::ofstream file{tmpfile};
1821 file << expected_text;
1822 }
1823 {
1824 // read all contents in file
1825 auto [valid, text] = ReadBinaryFile(tmpfile);
1826 BOOST_CHECK(valid);
1827 BOOST_CHECK_EQUAL(text, expected_text);
1828 }
1829 {
1830 // read half contents in file
1831 auto [valid, text] = ReadBinaryFile(tmpfile, expected_text.size() / 2);
1832 BOOST_CHECK(valid);
1833 BOOST_CHECK_EQUAL(text, expected_text.substr(0, expected_text.size() / 2));
1834 }
1835 {
1836 // read from non-existent file
1837 fs::path invalid_file = tmpfolder / "invalid_binary.dat";
1838 auto [valid, text] = ReadBinaryFile(invalid_file);
1839 BOOST_CHECK(!valid);
1840 BOOST_CHECK(text.empty());
1841 }
1842}
1843
1844BOOST_AUTO_TEST_CASE(util_WriteBinaryFile)
1845{
1846 fs::path tmpfolder = m_args.GetDataDirBase();
1847 fs::path tmpfile = tmpfolder / "write_binary.dat";
1848 std::string expected_text = "bitcoin";
1849 auto valid = WriteBinaryFile(tmpfile, expected_text);
1850 std::string actual_text;
1851 std::ifstream file{tmpfile};
1852 file >> actual_text;
1853 BOOST_CHECK(valid);
1854 BOOST_CHECK_EQUAL(actual_text, expected_text);
1855}
1856
1857BOOST_AUTO_TEST_CASE(clearshrink_test)
1858{
1859 {
1860 std::vector<uint8_t> v = {1, 2, 3};
1861 ClearShrink(v);
1862 BOOST_CHECK_EQUAL(v.size(), 0);
1863 BOOST_CHECK_EQUAL(v.capacity(), 0);
1864 }
1865
1866 {
1867 std::vector<bool> v = {false, true, false, false, true, true};
1868 ClearShrink(v);
1869 BOOST_CHECK_EQUAL(v.size(), 0);
1870 BOOST_CHECK_EQUAL(v.capacity(), 0);
1871 }
1872
1873 {
1874 std::deque<int> v = {1, 3, 3, 7};
1875 ClearShrink(v);
1876 BOOST_CHECK_EQUAL(v.size(), 0);
1877 // std::deque has no capacity() we can observe.
1878 }
1879}
1880
1881template <typename T>
1883{
1884 constexpr auto MAX{std::numeric_limits<T>::max()};
1885
1886 // Basic operations
1887 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(0, 1), 0);
1888 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(0, 127), 0);
1889 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(1, 1), 2);
1890 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(2, 2), 8);
1891 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(MAX >> 1, 1), MAX - 1);
1892
1893 // Max left shift
1894 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1);
1895
1896 // Overflow cases
1897 BOOST_CHECK(!CheckedLeftShift<T>((MAX >> 1) + 1, 1));
1898 BOOST_CHECK(!CheckedLeftShift<T>(MAX, 1));
1899 BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits));
1900 BOOST_CHECK(!CheckedLeftShift<T>(1, std::numeric_limits<T>::digits + 1));
1901
1902 if constexpr (std::is_signed_v<T>) {
1903 constexpr auto MIN{std::numeric_limits<T>::min()};
1904 // Negative input
1905 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(-1, 1), -2);
1906 BOOST_CHECK_EQUAL(CheckedLeftShift<T>((MIN >> 2), 1), MIN / 2);
1907 BOOST_CHECK_EQUAL(CheckedLeftShift<T>((MIN >> 1) + 1, 1), MIN + 2);
1908 BOOST_CHECK_EQUAL(CheckedLeftShift<T>(MIN >> 1, 1), MIN);
1909 // Overflow negative
1910 BOOST_CHECK(!CheckedLeftShift<T>((MIN >> 1) - 1, 1));
1911 BOOST_CHECK(!CheckedLeftShift<T>(MIN >> 1, 2));
1912 BOOST_CHECK(!CheckedLeftShift<T>(-1, 100));
1913 }
1914}
1915
1916template <typename T>
1918{
1919 constexpr auto MAX{std::numeric_limits<T>::max()};
1920
1921 // Basic operations
1922 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(0, 1), 0);
1923 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(0, 127), 0);
1924 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, 1), 2);
1925 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(2, 2), 8);
1926 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MAX >> 1, 1), MAX - 1);
1927
1928 // Max left shift
1929 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits - 1), MAX / 2 + 1);
1930
1931 // Saturation cases
1932 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MAX >> 1) + 1, 1), MAX);
1933 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MAX, 1), MAX);
1934 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits), MAX);
1935 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(1, std::numeric_limits<T>::digits + 1), MAX);
1936
1937 if constexpr (std::is_signed_v<T>) {
1938 constexpr auto MIN{std::numeric_limits<T>::min()};
1939 // Negative input
1940 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(-1, 1), -2);
1941 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 2), 1), MIN / 2);
1942 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 1) + 1, 1), MIN + 2);
1943 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MIN >> 1, 1), MIN);
1944 // Saturation negative
1945 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>((MIN >> 1) - 1, 1), MIN);
1946 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(MIN >> 1, 2), MIN);
1947 BOOST_CHECK_EQUAL(SaturatingLeftShift<T>(-1, 100), MIN);
1948 }
1949}
1950
1951BOOST_AUTO_TEST_CASE(checked_left_shift_test)
1952{
1953 TestCheckedLeftShift<uint8_t>();
1954 TestCheckedLeftShift<int8_t>();
1955 TestCheckedLeftShift<size_t>();
1956 TestCheckedLeftShift<uint64_t>();
1957 TestCheckedLeftShift<int64_t>();
1958}
1959
1960BOOST_AUTO_TEST_CASE(saturating_left_shift_test)
1961{
1962 TestSaturatingLeftShift<uint8_t>();
1963 TestSaturatingLeftShift<int8_t>();
1964 TestSaturatingLeftShift<size_t>();
1965 TestSaturatingLeftShift<uint64_t>();
1966 TestSaturatingLeftShift<int64_t>();
1967}
1968
1969BOOST_AUTO_TEST_CASE(mib_string_literal_test)
1970{
1971 BOOST_CHECK_EQUAL(0_MiB, 0);
1972 BOOST_CHECK_EQUAL(1_MiB, 1024 * 1024);
1973 const auto max_mib{std::numeric_limits<size_t>::max() >> 20};
1974 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"));
1975}
1976
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:25
#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:51
std::string FormatISO8601Date(int64_t nTime)
Definition: time.cpp:62
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
Definition: time.cpp:39
std::optional< int64_t > ParseISO8601DateTime(std::string_view str)
Definition: time.cpp:70
std::string FormatISO8601DateTime(int64_t nTime)
ISO 8601 formatting is preferred.
Definition: time.cpp:53
#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:795
#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:624
static void TestAddMatrix()
Definition: util_tests.cpp:644
BOOST_AUTO_TEST_CASE(util_check)
Definition: util_tests.cpp:95
static void RunToIntegralTests()
Definition: util_tests.cpp:705
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