Line data Source code
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 <net.h> 6 : #include <protocol.h> 7 : #include <test/fuzz/FuzzedDataProvider.h> 8 : #include <test/fuzz/fuzz.h> 9 : #include <test/fuzz/util.h> 10 : #include <test/fuzz/util/net.h> 11 : 12 : #include <algorithm> 13 : #include <cassert> 14 : #include <cstdint> 15 : #include <optional> 16 : #include <vector> 17 2 : 18 6 : FUZZ_TARGET(node_eviction) 19 : { 20 0 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; 21 0 : std::vector<NodeEvictionCandidate> eviction_candidates; 22 0 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { 23 0 : eviction_candidates.push_back({ 24 0 : /*id=*/fuzzed_data_provider.ConsumeIntegral<NodeId>(), 25 2 : /*m_connected=*/std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()}, 26 0 : /*m_min_ping_time=*/std::chrono::microseconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()}, 27 0 : /*m_last_block_time=*/std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()}, 28 0 : /*m_last_tx_time=*/std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()}, 29 0 : /*fRelevantServices=*/fuzzed_data_provider.ConsumeBool(), 30 0 : /*m_relay_txs=*/fuzzed_data_provider.ConsumeBool(), 31 0 : /*fBloomFilter=*/fuzzed_data_provider.ConsumeBool(), 32 0 : /*nKeyedNetGroup=*/fuzzed_data_provider.ConsumeIntegral<uint64_t>(), 33 0 : /*prefer_evict=*/fuzzed_data_provider.ConsumeBool(), 34 0 : /*m_is_local=*/fuzzed_data_provider.ConsumeBool(), 35 0 : /*m_network=*/fuzzed_data_provider.PickValueInArray(ALL_NETWORKS), 36 0 : /*m_noban=*/fuzzed_data_provider.ConsumeBool(), 37 0 : /*m_conn_type=*/fuzzed_data_provider.PickValueInArray(ALL_CONNECTION_TYPES), 38 : }); 39 0 : } 40 : // Make a copy since eviction_candidates may be in some valid but otherwise 41 : // indeterminate state after the SelectNodeToEvict(&&) call. 42 0 : const std::vector<NodeEvictionCandidate> eviction_candidates_copy = eviction_candidates; 43 0 : const std::optional<NodeId> node_to_evict = SelectNodeToEvict(std::move(eviction_candidates)); 44 0 : if (node_to_evict) { 45 0 : assert(std::any_of(eviction_candidates_copy.begin(), eviction_candidates_copy.end(), [&node_to_evict](const NodeEvictionCandidate& eviction_candidate) { return *node_to_evict == eviction_candidate.id; })); 46 0 : } 47 0 : }