Skip to content

Commit 57890b2

Browse files
tests: Add fuzzing harness for classes/functions in checkqueue.h
1 parent 2df5701 commit 57890b2

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

src/Makefile.test.include

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ FUZZ_TARGETS = \
2828
test/fuzz/bloom_filter \
2929
test/fuzz/bloomfilter_deserialize \
3030
test/fuzz/chain \
31+
test/fuzz/checkqueue \
3132
test/fuzz/coins_deserialize \
3233
test/fuzz/decode_tx \
3334
test/fuzz/descriptor_parse \
@@ -431,6 +432,12 @@ test_fuzz_chain_LDADD = $(FUZZ_SUITE_LD_COMMON)
431432
test_fuzz_chain_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
432433
test_fuzz_chain_SOURCES = test/fuzz/chain.cpp
433434

435+
test_fuzz_checkqueue_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
436+
test_fuzz_checkqueue_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
437+
test_fuzz_checkqueue_LDADD = $(FUZZ_SUITE_LD_COMMON)
438+
test_fuzz_checkqueue_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
439+
test_fuzz_checkqueue_SOURCES = test/fuzz/checkqueue.cpp
440+
434441
test_fuzz_coins_deserialize_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -DCOINS_DESERIALIZE=1
435442
test_fuzz_coins_deserialize_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
436443
test_fuzz_coins_deserialize_LDADD = $(FUZZ_SUITE_LD_COMMON)

src/test/fuzz/checkqueue.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) 2020 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 <checkqueue.h>
6+
#include <optional.h>
7+
#include <test/fuzz/FuzzedDataProvider.h>
8+
#include <test/fuzz/fuzz.h>
9+
#include <test/fuzz/util.h>
10+
11+
#include <cstdint>
12+
#include <string>
13+
#include <vector>
14+
15+
namespace {
16+
struct DumbCheck {
17+
const bool result = false;
18+
19+
DumbCheck() = default;
20+
21+
explicit DumbCheck(const bool _result) : result(_result)
22+
{
23+
}
24+
25+
bool operator()() const
26+
{
27+
return result;
28+
}
29+
30+
void swap(DumbCheck& x)
31+
{
32+
}
33+
};
34+
} // namespace
35+
36+
void test_one_input(const std::vector<uint8_t>& buffer)
37+
{
38+
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
39+
40+
const unsigned int batch_size = fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, 1024);
41+
CCheckQueue<DumbCheck> check_queue_1{batch_size};
42+
CCheckQueue<DumbCheck> check_queue_2{batch_size};
43+
std::vector<DumbCheck> checks_1;
44+
std::vector<DumbCheck> checks_2;
45+
const int size = fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 1024);
46+
for (int i = 0; i < size; ++i) {
47+
const bool result = fuzzed_data_provider.ConsumeBool();
48+
checks_1.emplace_back(result);
49+
checks_2.emplace_back(result);
50+
}
51+
if (fuzzed_data_provider.ConsumeBool()) {
52+
check_queue_1.Add(checks_1);
53+
}
54+
if (fuzzed_data_provider.ConsumeBool()) {
55+
(void)check_queue_1.Wait();
56+
}
57+
58+
CCheckQueueControl<DumbCheck> check_queue_control{&check_queue_2};
59+
if (fuzzed_data_provider.ConsumeBool()) {
60+
check_queue_control.Add(checks_2);
61+
}
62+
if (fuzzed_data_provider.ConsumeBool()) {
63+
(void)check_queue_control.Wait();
64+
}
65+
}

0 commit comments

Comments
 (0)