use std::net::SocketAddr;
use super::super::MetaAddr;
use crate::{constants::TIMESTAMP_TRUNCATION_SECONDS, types::PeerServices};
pub(crate) fn sanitize_avoids_leaks(original: &MetaAddr, sanitized: &MetaAddr) {
assert_eq!(sanitized.last_attempt, None);
assert_eq!(sanitized.last_failure, None);
assert_eq!(sanitized.last_response, None);
assert_eq!(
sanitized.untrusted_last_seen.is_some(),
original
.last_response
.or(original.untrusted_last_seen)
.is_some()
);
assert_eq!(
original.last_seen(),
original.last_response.or(original.untrusted_last_seen)
);
if let Some(sanitized_last_seen) = sanitized.last_seen() {
assert_eq!(
sanitized_last_seen.timestamp() % TIMESTAMP_TRUNCATION_SECONDS,
0
);
let original_last_seen = original
.last_seen()
.expect("unexpected missing original last seen when sanitized last seen is Some");
let lowest_time = original_last_seen
.timestamp()
.checked_sub(TIMESTAMP_TRUNCATION_SECONDS);
let highest_time = original_last_seen
.timestamp()
.checked_add(TIMESTAMP_TRUNCATION_SECONDS);
if let Some(lowest_time) = lowest_time {
assert!(sanitized_last_seen.timestamp() > lowest_time);
}
if let Some(highest_time) = highest_time {
assert!(sanitized_last_seen.timestamp() < highest_time);
}
}
assert_eq!(sanitized.last_connection_state, Default::default());
let sanitized_peer_services =
original.services.unwrap_or(PeerServices::NODE_NETWORK) & PeerServices::all();
assert_eq!(sanitized.services, Some(sanitized_peer_services));
let sanitized_socket_addr = SocketAddr::new(original.addr.ip(), original.addr.port()).into();
assert_eq!(sanitized.addr.ip(), original.addr.ip());
assert_eq!(sanitized.addr.port(), original.addr.port());
assert_eq!(sanitized.addr, sanitized_socket_addr);
assert_eq!(
sanitized,
&MetaAddr::new_gossiped_meta_addr(
sanitized_socket_addr,
sanitized_peer_services,
sanitized
.last_seen()
.expect("unexpected missing last seen time in sanitized MetaAddr")
),
);
}