use std::net::SocketAddr; use proptest::{collection::vec, prelude::*}; use tracing::Span; use zebra_chain::serialization::Duration32; use super::super::AddressBook; use crate::{ constants::MAX_PEER_ACTIVE_FOR_GOSSIP, meta_addr::{arbitrary::MAX_META_ADDR, MetaAddr}, }; const TIME_ERROR_MARGIN: Duration32 = Duration32::from_seconds(1); proptest! { #[test] fn only_recently_reachable_are_gossiped( local_listener in any::(), addresses in vec(any::(), 0..MAX_META_ADDR), ) { zebra_test::init(); let address_book = AddressBook::new_with_addrs(local_listener, Span::none(), addresses); for gossiped_address in address_book.sanitized() { let duration_since_last_seen = gossiped_address .last_seen() .expect("Peer that was never seen before is being gossiped") .saturating_elapsed() .saturating_sub(TIME_ERROR_MARGIN); prop_assert!(duration_since_last_seen <= MAX_PEER_ACTIVE_FOR_GOSSIP); } } /// Test that only peers that are reachable are listed for reconnection attempts. #[test] fn only_reachable_addresses_are_attempted( local_listener in any::(), addresses in vec(any::(), 0..MAX_META_ADDR), ) { zebra_test::init(); let address_book = AddressBook::new_with_addrs(local_listener, Span::none(), addresses); for peer in address_book.reconnection_peers() { prop_assert!(peer.is_probably_reachable(), "peer: {:?}", peer); } } }