/ src / test / fuzz / connman.cpp
connman.cpp
  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  } // namespace
 24  
 25  void initialize_connman()
 26  {
 27      static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
 28      g_setup = testing_setup.get();
 29  }
 30  
 31  FUZZ_TARGET(connman, .init = initialize_connman)
 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  
 42      const uint64_t max_outbound_limit{fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
 43      CConnman::Options options;
 44      options.nMaxOutboundLimit = max_outbound_limit;
 45      connman.Init(options);
 46  
 47      CNetAddr random_netaddr;
 48      CNode random_node = ConsumeNode(fuzzed_data_provider);
 49      CSubNet random_subnet;
 50      std::string random_string;
 51  
 52      LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) {
 53          CNode& p2p_node{*ConsumeNodeAsUniquePtr(fuzzed_data_provider).release()};
 54          connman.AddTestNode(p2p_node);
 55      }
 56  
 57      LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
 58          CallOneOf(
 59              fuzzed_data_provider,
 60              [&] {
 61                  random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
 62              },
 63              [&] {
 64                  random_subnet = ConsumeSubNet(fuzzed_data_provider);
 65              },
 66              [&] {
 67                  random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
 68              },
 69              [&] {
 70                  connman.AddNode({random_string, fuzzed_data_provider.ConsumeBool()});
 71              },
 72              [&] {
 73                  connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
 74              },
 75              [&] {
 76                  connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
 77              },
 78              [&] {
 79                  connman.DisconnectNode(random_netaddr);
 80              },
 81              [&] {
 82                  connman.DisconnectNode(random_string);
 83              },
 84              [&] {
 85                  connman.DisconnectNode(random_subnet);
 86              },
 87              [&] {
 88                  connman.ForEachNode([](auto) {});
 89              },
 90              [&] {
 91                  (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
 92              },
 93              [&] {
 94                  (void)connman.GetAddresses(
 95                      /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
 96                      /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
 97                      /*network=*/std::nullopt,
 98                      /*filtered=*/fuzzed_data_provider.ConsumeBool());
 99              },
100              [&] {
101                  (void)connman.GetAddresses(
102                      /*requestor=*/random_node,
103                      /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
104                      /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
105              },
106              [&] {
107                  (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
108              },
109              [&] {
110                  (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
111              },
112              [&] {
113                  (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
114              },
115              [&] {
116                  CSerializedNetMsg serialized_net_msg;
117                  serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE);
118                  serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
119                  connman.PushMessage(&random_node, std::move(serialized_net_msg));
120              },
121              [&] {
122                  connman.RemoveAddedNode(random_string);
123              },
124              [&] {
125                  connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
126              },
127              [&] {
128                  connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
129              });
130      }
131      (void)connman.GetAddedNodeInfo(fuzzed_data_provider.ConsumeBool());
132      (void)connman.GetExtraFullOutboundCount();
133      (void)connman.GetLocalServices();
134      assert(connman.GetMaxOutboundTarget() == max_outbound_limit);
135      (void)connman.GetMaxOutboundTimeframe();
136      (void)connman.GetMaxOutboundTimeLeftInCycle();
137      (void)connman.GetNetworkActive();
138      std::vector<CNodeStats> stats;
139      connman.GetNodeStats(stats);
140      (void)connman.GetOutboundTargetBytesLeft();
141      (void)connman.GetTotalBytesRecv();
142      (void)connman.GetTotalBytesSent();
143      (void)connman.GetTryNewOutboundPeer();
144      (void)connman.GetUseAddrmanOutgoing();
145  
146      connman.ClearTestNodes();
147  }