//! Fixed test vectors for the address book. use std::time::Instant; use chrono::Utc; use tracing::Span; use zebra_chain::serialization::{DateTime32, Duration32}; use crate::{meta_addr::MetaAddr, protocol::external::types::PeerServices, AddressBook}; /// Make sure an empty address book is actually empty. #[test] fn address_book_empty() { let address_book = AddressBook::new("0.0.0.0:0".parse().unwrap(), Span::current()); assert_eq!( address_book .reconnection_peers(Instant::now(), Utc::now()) .next(), None ); assert_eq!(address_book.len(), 0); } /// Make sure peers are attempted in priority order. #[test] fn address_book_peer_order() { let addr1 = "127.0.0.1:1".parse().unwrap(); let addr2 = "127.0.0.2:2".parse().unwrap(); let mut meta_addr1 = MetaAddr::new_gossiped_meta_addr(addr1, PeerServices::NODE_NETWORK, DateTime32::MIN); let mut meta_addr2 = MetaAddr::new_gossiped_meta_addr( addr2, PeerServices::NODE_NETWORK, DateTime32::MIN.saturating_add(Duration32::from_seconds(1)), ); // Regardless of the order of insertion, the most recent address should be chosen first let addrs = vec![meta_addr1, meta_addr2]; let address_book = AddressBook::new_with_addrs("0.0.0.0:0".parse().unwrap(), Span::current(), addrs); assert_eq!( address_book .reconnection_peers(Instant::now(), Utc::now()) .next(), Some(meta_addr2), ); // Reverse the order, check that we get the same result let addrs = vec![meta_addr2, meta_addr1]; let address_book = AddressBook::new_with_addrs("0.0.0.0:0".parse().unwrap(), Span::current(), addrs); assert_eq!( address_book .reconnection_peers(Instant::now(), Utc::now()) .next(), Some(meta_addr2), ); // Now check that the order depends on the time, not the address meta_addr1.addr = addr2; meta_addr2.addr = addr1; let addrs = vec![meta_addr1, meta_addr2]; let address_book = AddressBook::new_with_addrs("0.0.0.0:0".parse().unwrap(), Span::current(), addrs); assert_eq!( address_book .reconnection_peers(Instant::now(), Utc::now()) .next(), Some(meta_addr2), ); // Reverse the order, check that we get the same result let addrs = vec![meta_addr2, meta_addr1]; let address_book = AddressBook::new_with_addrs("0.0.0.0:0".parse().unwrap(), Span::current(), addrs); assert_eq!( address_book .reconnection_peers(Instant::now(), Utc::now()) .next(), Some(meta_addr2), ); }