Coverage Report

Created: 2025-04-14 16:24

/Users/mcomp/contrib/bitcoin/src/test/fuzz/connman.cpp
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2020-2022 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 <addrman.h>
6
#include <chainparams.h>
7
#include <common/args.h>
8
#include <net.h>
9
#include <netaddress.h>
10
#include <protocol.h>
11
#include <test/fuzz/FuzzedDataProvider.h>
12
#include <test/fuzz/fuzz.h>
13
#include <test/fuzz/util.h>
14
#include <test/fuzz/util/net.h>
15
#include <test/util/setup_common.h>
16
#include <util/translation.h>
17
18
#include <cstdint>
19
#include <vector>
20
21
namespace {
22
const TestingSetup* g_setup;
23
24
int32_t GetCheckRatio()
25
0
{
26
0
    return std::clamp<int32_t>(g_setup->m_node.args->GetIntArg("-checkaddrman", 0), 0, 1000000);
27
0
}
28
29
} // namespace
30
31
void initialize_connman()
32
0
{
33
0
    static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
34
0
    g_setup = testing_setup.get();
35
0
}
36
37
FUZZ_TARGET(connman, .init = initialize_connman)
38
0
{
39
0
    SeedRandomStateForTest(SeedRand::ZEROS);
40
0
    FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
41
0
    SetMockTime(ConsumeTime(fuzzed_data_provider));
42
0
    auto netgroupman{ConsumeNetGroupManager(fuzzed_data_provider)};
43
0
    auto addr_man_ptr{std::make_unique<AddrManDeterministic>(netgroupman, fuzzed_data_provider, GetCheckRatio())};
44
0
    if (fuzzed_data_provider.ConsumeBool()) {
45
0
        const std::vector<uint8_t> serialized_data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
46
0
        DataStream ds{serialized_data};
47
0
        try {
48
0
            ds >> *addr_man_ptr;
49
0
        } catch (const std::ios_base::failure&) {
50
0
            addr_man_ptr = std::make_unique<AddrManDeterministic>(netgroupman, fuzzed_data_provider, GetCheckRatio());
51
0
        }
52
0
    }
53
0
    AddrManDeterministic& addr_man{*addr_man_ptr};
54
0
    ConnmanTestMsg connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
55
0
                     fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
56
0
                     addr_man,
57
0
                     netgroupman,
58
0
                     Params(),
59
0
                     fuzzed_data_provider.ConsumeBool()};
60
61
0
    const uint64_t max_outbound_limit{fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
62
0
    CConnman::Options options;
63
0
    options.nMaxOutboundLimit = max_outbound_limit;
64
0
    connman.Init(options);
65
66
0
    CNetAddr random_netaddr;
67
0
    CNode random_node = ConsumeNode(fuzzed_data_provider);
68
0
    CSubNet random_subnet;
69
0
    std::string random_string;
70
71
0
    LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) {
72
0
        CNode& p2p_node{*ConsumeNodeAsUniquePtr(fuzzed_data_provider).release()};
73
0
        connman.AddTestNode(p2p_node);
74
0
    }
75
76
0
    LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
77
0
        CallOneOf(
78
0
            fuzzed_data_provider,
79
0
            [&] {
80
0
                random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
81
0
            },
82
0
            [&] {
83
0
                random_subnet = ConsumeSubNet(fuzzed_data_provider);
84
0
            },
85
0
            [&] {
86
0
                random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
87
0
            },
88
0
            [&] {
89
0
                connman.AddNode({random_string, fuzzed_data_provider.ConsumeBool()});
90
0
            },
91
0
            [&] {
92
0
                connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
93
0
            },
94
0
            [&] {
95
0
                connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
96
0
            },
97
0
            [&] {
98
0
                connman.DisconnectNode(random_netaddr);
99
0
            },
100
0
            [&] {
101
0
                connman.DisconnectNode(random_string);
102
0
            },
103
0
            [&] {
104
0
                connman.DisconnectNode(random_subnet);
105
0
            },
106
0
            [&] {
107
0
                connman.ForEachNode([](auto) {});
108
0
            },
109
0
            [&] {
110
0
                (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
111
0
            },
112
0
            [&] {
113
0
                auto max_addresses = fuzzed_data_provider.ConsumeIntegral<size_t>();
114
0
                auto max_pct = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 100);
115
0
                auto filtered = fuzzed_data_provider.ConsumeBool();
116
0
                (void)connman.GetAddresses(max_addresses, max_pct, /*network=*/std::nullopt, filtered);
117
0
            },
118
0
            [&] {
119
0
                auto max_addresses = fuzzed_data_provider.ConsumeIntegral<size_t>();
120
0
                auto max_pct = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 100);
121
0
                (void)connman.GetAddresses(/*requestor=*/random_node, max_addresses, max_pct);
122
0
            },
123
0
            [&] {
124
0
                (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
125
0
            },
126
0
            [&] {
127
0
                (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
128
0
            },
129
0
            [&] {
130
0
                (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
131
0
            },
132
0
            [&] {
133
0
                CSerializedNetMsg serialized_net_msg;
134
0
                serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::MESSAGE_TYPE_SIZE);
135
0
                serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
136
0
                connman.PushMessage(&random_node, std::move(serialized_net_msg));
137
0
            },
138
0
            [&] {
139
0
                connman.RemoveAddedNode(random_string);
140
0
            },
141
0
            [&] {
142
0
                connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
143
0
            },
144
0
            [&] {
145
0
                connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
146
0
            });
147
0
    }
148
0
    (void)connman.GetAddedNodeInfo(fuzzed_data_provider.ConsumeBool());
149
0
    (void)connman.GetExtraFullOutboundCount();
150
0
    (void)connman.GetLocalServices();
151
0
    assert(connman.GetMaxOutboundTarget() == max_outbound_limit);
152
0
    (void)connman.GetMaxOutboundTimeframe();
153
0
    (void)connman.GetMaxOutboundTimeLeftInCycle();
154
0
    (void)connman.GetNetworkActive();
155
0
    std::vector<CNodeStats> stats;
156
0
    connman.GetNodeStats(stats);
157
0
    (void)connman.GetOutboundTargetBytesLeft();
158
0
    (void)connman.GetTotalBytesRecv();
159
0
    (void)connman.GetTotalBytesSent();
160
0
    (void)connman.GetTryNewOutboundPeer();
161
0
    (void)connman.GetUseAddrmanOutgoing();
162
0
    (void)connman.ASMapHealthCheck();
163
164
0
    connman.ClearTestNodes();
165
0
}