/ src / test / fuzz / torcontrol.cpp
torcontrol.cpp
 1  // Copyright (c) 2020-present 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 <test/fuzz/FuzzedDataProvider.h>
 6  #include <test/fuzz/fuzz.h>
 7  #include <test/fuzz/util.h>
 8  #include <test/util/setup_common.h>
 9  #include <torcontrol.h>
10  
11  #include <cstdint>
12  #include <string>
13  #include <vector>
14  
15  class DummyTorControlConnection : public TorControlConnection
16  {
17  public:
18      DummyTorControlConnection() : TorControlConnection{nullptr}
19      {
20      }
21  
22      bool Connect(const std::string&, const ConnectionCB&, const ConnectionCB&)
23      {
24          return true;
25      }
26  
27      void Disconnect()
28      {
29      }
30  
31      bool Command(const std::string&, const ReplyHandlerCB&)
32      {
33          return true;
34      }
35  };
36  
37  void initialize_torcontrol()
38  {
39      static const auto testing_setup = MakeNoLogFileContext<>();
40  }
41  
42  FUZZ_TARGET(torcontrol, .init = initialize_torcontrol)
43  {
44      FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
45  
46      TorController tor_controller;
47      LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
48          TorControlReply tor_control_reply;
49          CallOneOf(
50              fuzzed_data_provider,
51              [&] {
52                  tor_control_reply.code = 250;
53              },
54              [&] {
55                  tor_control_reply.code = 510;
56              },
57              [&] {
58                  tor_control_reply.code = fuzzed_data_provider.ConsumeIntegral<int>();
59              });
60          tor_control_reply.lines = ConsumeRandomLengthStringVector(fuzzed_data_provider);
61          if (tor_control_reply.lines.empty()) {
62              break;
63          }
64          DummyTorControlConnection dummy_tor_control_connection;
65          CallOneOf(
66              fuzzed_data_provider,
67              [&] {
68                  tor_controller.add_onion_cb(dummy_tor_control_connection, tor_control_reply);
69              },
70              [&] {
71                  tor_controller.auth_cb(dummy_tor_control_connection, tor_control_reply);
72              },
73              [&] {
74                  tor_controller.authchallenge_cb(dummy_tor_control_connection, tor_control_reply);
75              },
76              [&] {
77                  tor_controller.protocolinfo_cb(dummy_tor_control_connection, tor_control_reply);
78              });
79      }
80  }