Branch data 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 [ + - ][ + - ]: 8 : 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 : }