use std::{
sync::{Arc, Mutex},
time::{Duration, Instant},
};
use crate::{meta_addr::MetaAddr, AddressBookPeers, PeerSocketAddr};
#[derive(Debug, Default, Clone)]
pub struct MockAddressBookPeers {
recently_live_peers: Vec<MetaAddr>,
}
impl MockAddressBookPeers {
pub fn new(recently_live_peers: Vec<MetaAddr>) -> Self {
Self {
recently_live_peers,
}
}
pub fn add_peer(&mut self, peer: PeerSocketAddr) -> bool {
let rtt = Duration::from_millis(100);
self.recently_live_peers.push(
MetaAddr::new_responded(peer, Some(rtt)).into_new_meta_addr(
Instant::now(),
chrono::Utc::now()
.try_into()
.expect("will succeed until 2038"),
),
);
true
}
}
impl AddressBookPeers for MockAddressBookPeers {
fn recently_live_peers(&self, now: chrono::DateTime<chrono::Utc>) -> Vec<MetaAddr> {
self.recently_live_peers
.iter()
.filter(|peer| peer.was_recently_live(now))
.cloned()
.collect()
}
fn add_peer(&mut self, peer: PeerSocketAddr) -> bool {
self.add_peer(peer)
}
}
pub struct SharedMockAddressBookPeers {
inner: Arc<Mutex<MockAddressBookPeers>>,
}
impl SharedMockAddressBookPeers {
pub fn new() -> Self {
Self {
inner: Arc::new(Mutex::new(MockAddressBookPeers::default())),
}
}
}
impl Default for SharedMockAddressBookPeers {
fn default() -> Self {
Self::new()
}
}
impl AddressBookPeers for SharedMockAddressBookPeers {
fn recently_live_peers(&self, now: chrono::DateTime<chrono::Utc>) -> Vec<MetaAddr> {
self.inner.lock().unwrap().recently_live_peers(now)
}
fn add_peer(&mut self, peer: PeerSocketAddr) -> bool {
self.inner.lock().unwrap().add_peer(peer)
}
}
impl Clone for SharedMockAddressBookPeers {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}