Bitcoin Core  26.1.0
P2P Digital Currency
connman.cpp
Go to the documentation of this file.
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>
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 } // namespace
24 
26 {
27  static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
28  g_setup = testing_setup.get();
29 }
30 
32 {
33  FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
34  SetMockTime(ConsumeTime(fuzzed_data_provider));
35  ConnmanTestMsg connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
36  fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
37  *g_setup->m_node.addrman,
38  *g_setup->m_node.netgroupman,
39  Params(),
40  fuzzed_data_provider.ConsumeBool()};
41  CNetAddr random_netaddr;
42  CNode random_node = ConsumeNode(fuzzed_data_provider);
43  CSubNet random_subnet;
44  std::string random_string;
45 
46  LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) {
47  CNode& p2p_node{*ConsumeNodeAsUniquePtr(fuzzed_data_provider).release()};
48  connman.AddTestNode(p2p_node);
49  }
50 
51  LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
52  CallOneOf(
53  fuzzed_data_provider,
54  [&] {
55  random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
56  },
57  [&] {
58  random_subnet = ConsumeSubNet(fuzzed_data_provider);
59  },
60  [&] {
61  random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
62  },
63  [&] {
64  connman.AddNode({random_string, fuzzed_data_provider.ConsumeBool()});
65  },
66  [&] {
67  connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
68  },
69  [&] {
70  connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
71  },
72  [&] {
73  connman.DisconnectNode(random_netaddr);
74  },
75  [&] {
76  connman.DisconnectNode(random_string);
77  },
78  [&] {
79  connman.DisconnectNode(random_subnet);
80  },
81  [&] {
82  connman.ForEachNode([](auto) {});
83  },
84  [&] {
85  (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
86  },
87  [&] {
88  (void)connman.GetAddresses(
89  /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
90  /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
91  /*network=*/std::nullopt);
92  },
93  [&] {
94  (void)connman.GetAddresses(
95  /*requestor=*/random_node,
96  /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
97  /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
98  },
99  [&] {
100  (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
101  },
102  [&] {
103  (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
104  },
105  [&] {
106  (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
107  },
108  [&] {
109  CSerializedNetMsg serialized_net_msg;
110  serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE);
111  serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
112  connman.PushMessage(&random_node, std::move(serialized_net_msg));
113  },
114  [&] {
115  connman.RemoveAddedNode(random_string);
116  },
117  [&] {
118  connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
119  },
120  [&] {
121  connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
122  });
123  }
124  (void)connman.GetAddedNodeInfo();
125  (void)connman.GetExtraFullOutboundCount();
126  (void)connman.GetLocalServices();
127  (void)connman.GetMaxOutboundTarget();
128  (void)connman.GetMaxOutboundTimeframe();
129  (void)connman.GetMaxOutboundTimeLeftInCycle();
130  (void)connman.GetNetworkActive();
131  std::vector<CNodeStats> stats;
132  connman.GetNodeStats(stats);
133  (void)connman.GetOutboundTargetBytesLeft();
134  (void)connman.GetTotalBytesRecv();
135  (void)connman.GetTotalBytesSent();
136  (void)connman.GetTryNewOutboundPeer();
137  (void)connman.GetUseAddrmanOutgoing();
138 
139  connman.ClearTestNodes();
140 }
std::string m_type
Definition: net.h:133
std::vector< unsigned char > data
Definition: net.h:132
std::unique_ptr< CNode > ConsumeNodeAsUniquePtr(FuzzedDataProvider &fdp, const std::optional< NodeId > &node_id_in=std::nullopt)
Definition: net.h:137
CNetAddr ConsumeNetAddr(FuzzedDataProvider &fuzzed_data_provider) noexcept
Definition: net.cpp:28
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
Definition: fuzz.h:18
auto ConsumeNode(FuzzedDataProvider &fuzzed_data_provider, const std::optional< NodeId > &node_id_in=std::nullopt) noexcept
Definition: net.h:101
std::vector< B > ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
Definition: util.h:58
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
Definition: time.cpp:81
static constexpr size_t COMMAND_SIZE
Definition: protocol.h:31
int64_t NodeId
Definition: net.h:99
Network address.
Definition: netaddress.h:115
int64_t ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
Definition: util.cpp:35
const CChainParams & Params()
Return the currently selected parameters.
FUZZ_TARGET(connman,.init=initialize_connman)
Definition: connman.cpp:31
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
Definition: util.h:36
Information about a peer.
Definition: net.h:683
void initialize_connman()
Definition: connman.cpp:25
Testing setup that configures a complete environment.
Definition: setup_common.h:77
CSubNet ConsumeSubNet(FuzzedDataProvider &fuzzed_data_provider) noexcept
Definition: net.h:88