Skip to content

Commit 3b408d2

Browse files
committed
Merge #21438: test: add ParseUInt8() test coverage
76782e5 refactor: reuse test string with embedded null char in util_tests (Jon Atack) 24c6546 test: add ParseUInt8() unit and fuzz test coverage (Jon Atack) Pull request description: We have unit test and fuzzer coverage for - `ParseInt64()` - `ParseInt32()` - `ParseUInt64()` - `ParseUInt32()` but not `ParseUInt8()`, so this pull adds it. I was tempted to add a commit that applies clang formatting to the file, or one that updates the C-style casts to named casts, but resisted the temptation unless reviewers request it. ACKs for top commit: laanwj: Code review ACK 76782e5 MarcoFalke: cr ACK 76782e5 Tree-SHA512: 1d7948b3385632094a3b0f0e38f87dccddabf74002e68aa055a51408866b057828ffa15c4b22aa9adde458155fbb5e443b66a9dbf3d7713358fc98a14d64bdcf
2 parents af6ee17 + 76782e5 commit 3b408d2

File tree

2 files changed

+46
-16
lines changed

2 files changed

+46
-16
lines changed

src/test/fuzz/parse_numbers.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ FUZZ_TARGET(parse_numbers)
1818
double d;
1919
(void)ParseDouble(random_string, &d);
2020

21+
uint8_t u8;
22+
(void)ParseUInt8(random_string, &u8);
23+
2124
int32_t i32;
2225
(void)ParseInt32(random_string, &i32);
2326
(void)atoi(random_string);

src/test/util_tests.cpp

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <boost/test/unit_test.hpp>
3939

4040
using namespace std::literals;
41+
static const std::string STRING_WITH_EMBEDDED_NULL_CHAR{"1"s "\0" "1"s};
4142

4243
/* defined in logging.cpp */
4344
namespace BCLog {
@@ -1272,7 +1273,7 @@ BOOST_AUTO_TEST_CASE(util_ParseMoney)
12721273

12731274
// Parsing strings with embedded NUL characters should fail
12741275
BOOST_CHECK(!ParseMoney("\0-1"s, ret));
1275-
BOOST_CHECK(!ParseMoney("\0" "1"s, ret));
1276+
BOOST_CHECK(!ParseMoney(STRING_WITH_EMBEDDED_NULL_CHAR, ret));
12761277
BOOST_CHECK(!ParseMoney("1\0"s, ret));
12771278
}
12781279

@@ -1450,9 +1451,7 @@ BOOST_AUTO_TEST_CASE(test_ParseInt32)
14501451
BOOST_CHECK(!ParseInt32("aap", &n));
14511452
BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex
14521453
BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex
1453-
const char test_bytes[] = {'1', 0, '1'};
1454-
std::string teststr(test_bytes, sizeof(test_bytes));
1455-
BOOST_CHECK(!ParseInt32(teststr, &n)); // no embedded NULs
1454+
BOOST_CHECK(!ParseInt32(STRING_WITH_EMBEDDED_NULL_CHAR, &n));
14561455
// Overflow and underflow
14571456
BOOST_CHECK(!ParseInt32("-2147483649", nullptr));
14581457
BOOST_CHECK(!ParseInt32("2147483648", nullptr));
@@ -1480,16 +1479,50 @@ BOOST_AUTO_TEST_CASE(test_ParseInt64)
14801479
BOOST_CHECK(!ParseInt64("1a", &n));
14811480
BOOST_CHECK(!ParseInt64("aap", &n));
14821481
BOOST_CHECK(!ParseInt64("0x1", &n)); // no hex
1483-
const char test_bytes[] = {'1', 0, '1'};
1484-
std::string teststr(test_bytes, sizeof(test_bytes));
1485-
BOOST_CHECK(!ParseInt64(teststr, &n)); // no embedded NULs
1482+
BOOST_CHECK(!ParseInt64(STRING_WITH_EMBEDDED_NULL_CHAR, &n));
14861483
// Overflow and underflow
14871484
BOOST_CHECK(!ParseInt64("-9223372036854775809", nullptr));
14881485
BOOST_CHECK(!ParseInt64("9223372036854775808", nullptr));
14891486
BOOST_CHECK(!ParseInt64("-32482348723847471234", nullptr));
14901487
BOOST_CHECK(!ParseInt64("32482348723847471234", nullptr));
14911488
}
14921489

1490+
BOOST_AUTO_TEST_CASE(test_ParseUInt8)
1491+
{
1492+
uint8_t n;
1493+
// Valid values
1494+
BOOST_CHECK(ParseUInt8("255", nullptr));
1495+
BOOST_CHECK(ParseUInt8("0", &n) && n == 0);
1496+
BOOST_CHECK(ParseUInt8("255", &n) && n == 255);
1497+
BOOST_CHECK(ParseUInt8("0255", &n) && n == 255); // no octal
1498+
BOOST_CHECK(ParseUInt8("255", &n) && n == static_cast<uint8_t>(255));
1499+
BOOST_CHECK(ParseUInt8("+255", &n) && n == 255);
1500+
BOOST_CHECK(ParseUInt8("00000000000000000012", &n) && n == 12);
1501+
BOOST_CHECK(ParseUInt8("00000000000000000000", &n) && n == 0);
1502+
// Invalid values
1503+
BOOST_CHECK(!ParseUInt8("-00000000000000000000", &n));
1504+
BOOST_CHECK(!ParseUInt8("", &n));
1505+
BOOST_CHECK(!ParseUInt8(" 1", &n)); // no padding inside
1506+
BOOST_CHECK(!ParseUInt8(" -1", &n));
1507+
BOOST_CHECK(!ParseUInt8("++1", &n));
1508+
BOOST_CHECK(!ParseUInt8("+-1", &n));
1509+
BOOST_CHECK(!ParseUInt8("-+1", &n));
1510+
BOOST_CHECK(!ParseUInt8("--1", &n));
1511+
BOOST_CHECK(!ParseUInt8("-1", &n));
1512+
BOOST_CHECK(!ParseUInt8("1 ", &n));
1513+
BOOST_CHECK(!ParseUInt8("1a", &n));
1514+
BOOST_CHECK(!ParseUInt8("aap", &n));
1515+
BOOST_CHECK(!ParseUInt8("0x1", &n)); // no hex
1516+
BOOST_CHECK(!ParseUInt8("0x1", &n)); // no hex
1517+
BOOST_CHECK(!ParseUInt8(STRING_WITH_EMBEDDED_NULL_CHAR, &n));
1518+
// Overflow and underflow
1519+
BOOST_CHECK(!ParseUInt8("-255", &n));
1520+
BOOST_CHECK(!ParseUInt8("256", &n));
1521+
BOOST_CHECK(!ParseUInt8("-123", &n));
1522+
BOOST_CHECK(!ParseUInt8("-123", nullptr));
1523+
BOOST_CHECK(!ParseUInt8("256", nullptr));
1524+
}
1525+
14931526
BOOST_AUTO_TEST_CASE(test_ParseUInt32)
14941527
{
14951528
uint32_t n;
@@ -1519,9 +1552,7 @@ BOOST_AUTO_TEST_CASE(test_ParseUInt32)
15191552
BOOST_CHECK(!ParseUInt32("aap", &n));
15201553
BOOST_CHECK(!ParseUInt32("0x1", &n)); // no hex
15211554
BOOST_CHECK(!ParseUInt32("0x1", &n)); // no hex
1522-
const char test_bytes[] = {'1', 0, '1'};
1523-
std::string teststr(test_bytes, sizeof(test_bytes));
1524-
BOOST_CHECK(!ParseUInt32(teststr, &n)); // no embedded NULs
1555+
BOOST_CHECK(!ParseUInt32(STRING_WITH_EMBEDDED_NULL_CHAR, &n));
15251556
// Overflow and underflow
15261557
BOOST_CHECK(!ParseUInt32("-2147483648", &n));
15271558
BOOST_CHECK(!ParseUInt32("4294967296", &n));
@@ -1550,9 +1581,7 @@ BOOST_AUTO_TEST_CASE(test_ParseUInt64)
15501581
BOOST_CHECK(!ParseUInt64("1a", &n));
15511582
BOOST_CHECK(!ParseUInt64("aap", &n));
15521583
BOOST_CHECK(!ParseUInt64("0x1", &n)); // no hex
1553-
const char test_bytes[] = {'1', 0, '1'};
1554-
std::string teststr(test_bytes, sizeof(test_bytes));
1555-
BOOST_CHECK(!ParseUInt64(teststr, &n)); // no embedded NULs
1584+
BOOST_CHECK(!ParseUInt64(STRING_WITH_EMBEDDED_NULL_CHAR, &n));
15561585
// Overflow and underflow
15571586
BOOST_CHECK(!ParseUInt64("-9223372036854775809", nullptr));
15581587
BOOST_CHECK(!ParseUInt64("18446744073709551616", nullptr));
@@ -1582,9 +1611,7 @@ BOOST_AUTO_TEST_CASE(test_ParseDouble)
15821611
BOOST_CHECK(!ParseDouble("1a", &n));
15831612
BOOST_CHECK(!ParseDouble("aap", &n));
15841613
BOOST_CHECK(!ParseDouble("0x1", &n)); // no hex
1585-
const char test_bytes[] = {'1', 0, '1'};
1586-
std::string teststr(test_bytes, sizeof(test_bytes));
1587-
BOOST_CHECK(!ParseDouble(teststr, &n)); // no embedded NULs
1614+
BOOST_CHECK(!ParseDouble(STRING_WITH_EMBEDDED_NULL_CHAR, &n));
15881615
// Overflow and underflow
15891616
BOOST_CHECK(!ParseDouble("-1e10000", nullptr));
15901617
BOOST_CHECK(!ParseDouble("1e10000", nullptr));

0 commit comments

Comments
 (0)