Skip to content

Commit cb2392c

Browse files
author
MarcoFalke
committed
Merge bitcoin/bitcoin#23496: fuzz: Add minisketch fuzz test
fa74d45 fuzz: Add minisketch fuzz test (MarcoFalke) Pull request description: ACKs for top commit: mjdietzx: re-ACK fa74d45 sipa: utACK fa74d45 Tree-SHA512: 3d30095c85032139c37c7a2811dd417441a5105cb70af8250000d7b56aeda1e8fab5e65e683fb49d513ef40a81da3967a8a9a70caf40f56cef1dd96c6d4a05f6
2 parents b869a78 + fa74d45 commit cb2392c

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

src/Makefile.test.include

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ FUZZ_SUITE_LD_COMMON = \
5151
$(BOOST_LIBS) \
5252
$(LIBMEMENV) \
5353
$(LIBSECP256K1) \
54+
$(MINISKETCH_LIBS) \
5455
$(EVENT_LIBS) \
5556
$(EVENT_PTHREADS_LIBS)
5657

@@ -259,6 +260,7 @@ test_fuzz_fuzz_SOURCES = \
259260
test/fuzz/locale.cpp \
260261
test/fuzz/merkleblock.cpp \
261262
test/fuzz/message.cpp \
263+
test/fuzz/minisketch.cpp \
262264
test/fuzz/muhash.cpp \
263265
test/fuzz/multiplication_overflow.cpp \
264266
test/fuzz/net.cpp \

src/test/fuzz/minisketch.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Copyright (c) 2021 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 <minisketch.h>
6+
#include <node/minisketchwrapper.h>
7+
#include <test/fuzz/FuzzedDataProvider.h>
8+
#include <test/fuzz/fuzz.h>
9+
#include <test/fuzz/util.h>
10+
#include <util/check.h>
11+
12+
#include <map>
13+
#include <numeric>
14+
15+
FUZZ_TARGET(minisketch)
16+
{
17+
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
18+
const auto capacity{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 200)};
19+
Minisketch sketch_a{Assert(MakeMinisketch32(capacity))};
20+
Minisketch sketch_b{Assert(MakeMinisketch32(capacity))};
21+
22+
// Fill two sets and keep the difference in a map
23+
std::map<uint32_t, bool> diff;
24+
LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000)
25+
{
26+
const auto entry{fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(1, std::numeric_limits<uint32_t>::max() - 1)};
27+
const auto KeepDiff{[&] {
28+
bool& mut{diff[entry]};
29+
mut = !mut;
30+
}};
31+
CallOneOf(
32+
fuzzed_data_provider,
33+
[&] {
34+
sketch_a.Add(entry);
35+
KeepDiff();
36+
},
37+
[&] {
38+
sketch_b.Add(entry);
39+
KeepDiff();
40+
},
41+
[&] {
42+
sketch_a.Add(entry);
43+
sketch_b.Add(entry);
44+
});
45+
}
46+
const auto num_diff{std::accumulate(diff.begin(), diff.end(), size_t{0}, [](auto n, const auto& e) { return n + e.second; })};
47+
48+
Minisketch sketch_ar{MakeMinisketch32(capacity)};
49+
Minisketch sketch_br{MakeMinisketch32(capacity)};
50+
sketch_ar.Deserialize(sketch_a.Serialize());
51+
sketch_br.Deserialize(sketch_b.Serialize());
52+
53+
Minisketch sketch_diff{std::move(fuzzed_data_provider.ConsumeBool() ? sketch_a : sketch_ar)};
54+
sketch_diff.Merge(fuzzed_data_provider.ConsumeBool() ? sketch_b : sketch_br);
55+
56+
if (capacity >= num_diff) {
57+
const auto max_elements{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(num_diff, capacity)};
58+
const auto dec{*Assert(sketch_diff.Decode(max_elements))};
59+
Assert(dec.size() == num_diff);
60+
for (auto d : dec) {
61+
Assert(diff.at(d));
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)