|
22 | 22 | #include <streams.h>
|
23 | 23 | #include <test/fuzz/FuzzedDataProvider.h>
|
24 | 24 | #include <test/fuzz/fuzz.h>
|
| 25 | +#include <test/util/net.h> |
25 | 26 | #include <test/util/setup_common.h>
|
26 | 27 | #include <txmempool.h>
|
27 | 28 | #include <uint256.h>
|
@@ -86,6 +87,14 @@ template <typename T>
|
86 | 87 | return obj;
|
87 | 88 | }
|
88 | 89 |
|
| 90 | +template <typename WeakEnumType, size_t size> |
| 91 | +[[nodiscard]] WeakEnumType ConsumeWeakEnum(FuzzedDataProvider& fuzzed_data_provider, const WeakEnumType (&all_types)[size]) noexcept |
| 92 | +{ |
| 93 | + return fuzzed_data_provider.ConsumeBool() ? |
| 94 | + fuzzed_data_provider.PickValueInArray<WeakEnumType>(all_types) : |
| 95 | + WeakEnumType(fuzzed_data_provider.ConsumeIntegral<typename std::underlying_type<WeakEnumType>::type>()); |
| 96 | +} |
| 97 | + |
89 | 98 | [[nodiscard]] inline opcodetype ConsumeOpcodeType(FuzzedDataProvider& fuzzed_data_provider) noexcept
|
90 | 99 | {
|
91 | 100 | return static_cast<opcodetype>(fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0, MAX_OPCODE));
|
@@ -283,23 +292,29 @@ inline CService ConsumeService(FuzzedDataProvider& fuzzed_data_provider) noexcep
|
283 | 292 |
|
284 | 293 | inline CAddress ConsumeAddress(FuzzedDataProvider& fuzzed_data_provider) noexcept
|
285 | 294 | {
|
286 |
| - return {ConsumeService(fuzzed_data_provider), static_cast<ServiceFlags>(fuzzed_data_provider.ConsumeIntegral<uint64_t>()), fuzzed_data_provider.ConsumeIntegral<uint32_t>()}; |
| 295 | + return {ConsumeService(fuzzed_data_provider), ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS), fuzzed_data_provider.ConsumeIntegral<uint32_t>()}; |
287 | 296 | }
|
288 | 297 |
|
289 |
| -inline CNode ConsumeNode(FuzzedDataProvider& fuzzed_data_provider) noexcept |
| 298 | +template <bool ReturnUniquePtr = false> |
| 299 | +auto ConsumeNode(FuzzedDataProvider& fuzzed_data_provider, const std::optional<NodeId>& node_id_in = nullopt) noexcept |
290 | 300 | {
|
291 |
| - const NodeId node_id = fuzzed_data_provider.ConsumeIntegral<NodeId>(); |
292 |
| - const ServiceFlags local_services = static_cast<ServiceFlags>(fuzzed_data_provider.ConsumeIntegral<uint64_t>()); |
| 301 | + const NodeId node_id = node_id_in.value_or(fuzzed_data_provider.ConsumeIntegral<NodeId>()); |
| 302 | + const ServiceFlags local_services = ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS); |
293 | 303 | const SOCKET socket = INVALID_SOCKET;
|
294 | 304 | const CAddress address = ConsumeAddress(fuzzed_data_provider);
|
295 | 305 | const uint64_t keyed_net_group = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
|
296 | 306 | const uint64_t local_host_nonce = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
|
297 | 307 | const CAddress addr_bind = ConsumeAddress(fuzzed_data_provider);
|
298 | 308 | const std::string addr_name = fuzzed_data_provider.ConsumeRandomLengthString(64);
|
299 |
| - const ConnectionType conn_type = fuzzed_data_provider.PickValueInArray({ConnectionType::INBOUND, ConnectionType::OUTBOUND_FULL_RELAY, ConnectionType::MANUAL, ConnectionType::FEELER, ConnectionType::BLOCK_RELAY, ConnectionType::ADDR_FETCH}); |
| 309 | + const ConnectionType conn_type = fuzzed_data_provider.PickValueInArray(ALL_CONNECTION_TYPES); |
300 | 310 | const bool inbound_onion{conn_type == ConnectionType::INBOUND ? fuzzed_data_provider.ConsumeBool() : false};
|
301 |
| - return {node_id, local_services, socket, address, keyed_net_group, local_host_nonce, addr_bind, addr_name, conn_type, inbound_onion}; |
| 311 | + if constexpr (ReturnUniquePtr) { |
| 312 | + return std::make_unique<CNode>(node_id, local_services, socket, address, keyed_net_group, local_host_nonce, addr_bind, addr_name, conn_type, inbound_onion); |
| 313 | + } else { |
| 314 | + return CNode{node_id, local_services, socket, address, keyed_net_group, local_host_nonce, addr_bind, addr_name, conn_type, inbound_onion}; |
| 315 | + } |
302 | 316 | }
|
| 317 | +inline std::unique_ptr<CNode> ConsumeNodeAsUniquePtr(FuzzedDataProvider& fdp, const std::optional<NodeId>& node_id_in = nullopt) { return ConsumeNode<true>(fdp, node_id_in); } |
303 | 318 |
|
304 | 319 | inline void InitializeFuzzingContext(const std::string& chain_name = CBaseChainParams::REGTEST)
|
305 | 320 | {
|
|
0 commit comments