use sn_messaging::node::Peer;
use std::net::SocketAddr;
use xor_name::{XorName, XOR_NAME_LEN};
pub trait PeerUtils {
fn new(name: XorName, addr: SocketAddr) -> Self;
fn set_reachable(&mut self, reachable: bool);
fn name(&self) -> &XorName;
fn addr(&self) -> &SocketAddr;
fn age(&self) -> u8;
fn is_reachable(&self) -> bool;
}
impl PeerUtils for Peer {
fn new(name: XorName, addr: SocketAddr) -> Self {
Self {
name,
addr,
reachable: false,
}
}
fn set_reachable(&mut self, reachable: bool) {
self.reachable = reachable;
}
fn name(&self) -> &XorName {
&self.name
}
fn addr(&self) -> &SocketAddr {
&self.addr
}
fn age(&self) -> u8 {
self.name[XOR_NAME_LEN - 1]
}
fn is_reachable(&self) -> bool {
self.reachable
}
}
#[cfg(test)]
pub(crate) mod test_utils {
use super::*;
use proptest::{collection::SizeRange, prelude::*};
use xor_name::XOR_NAME_LEN;
pub(crate) fn arbitrary_bytes() -> impl Strategy<Value = [u8; XOR_NAME_LEN]> {
any::<[u8; XOR_NAME_LEN]>()
}
pub(crate) fn arbitrary_unique_peers(
count: impl Into<SizeRange>,
age: impl Strategy<Value = u8>,
) -> impl Strategy<Value = Vec<Peer>> {
proptest::collection::btree_map(arbitrary_bytes(), (any::<SocketAddr>(), age), count)
.prop_map(|peers| {
peers
.into_iter()
.map(|(mut bytes, (addr, age))| {
bytes[XOR_NAME_LEN - 1] = age;
let name = XorName(bytes);
Peer::new(name, addr)
})
.collect()
})
}
}