#[allow(dead_code)]
mod common;
use common::test_peer::TestPeer;
use snarkos_node_network::PeerPoolHandling;
use snarkos_node_router::messages::{Message, PeerResponse};
use snarkos_node_tcp::P2P;
use deadline::deadline;
use paste::paste;
use pea2pea::{Pea2Pea, protocols::Writing};
use std::time::Duration;
macro_rules! test_reject_unsolicited_peer_response {
($($node_type:ident),*) => {
$(
paste! {
#[tokio::test]
async fn [<$node_type _rejects_unsolicited_peer_response>]() {
let node = $crate::common::node::$node_type().await;
let peer = TestPeer::validator().await;
let peer_addr = peer.node().listening_addr().unwrap();
node.router().connect(peer_addr).unwrap().await.unwrap().unwrap();
let node_clone = node.clone();
deadline!(Duration::from_secs(5), move || node_clone.router().number_of_connected_peers() == 1);
let node_clone = node.clone();
deadline!(Duration::from_secs(5), move || node_clone.tcp().num_connected() == 1);
let peer_clone = peer.clone();
deadline!(Duration::from_secs(5), move || peer_clone.node().num_connected() == 1);
assert_eq!(node.router().number_of_candidate_peers(), 0);
let peers = vec![
("1.1.1.1:1111".parse().unwrap(), None),
("2.2.2.2:2222".parse().unwrap(), None),
];
assert!(
peer.unicast(
*peer.node().connected_addrs().first().unwrap(),
Message::PeerResponse(PeerResponse { peers: peers.clone() })
)
.is_ok()
);
let node_clone = node.clone();
deadline!(Duration::from_secs(5), move || node_clone.router().number_of_connected_peers() == 0);
let candidate_peer_addrs = node.router().get_candidate_peers().into_iter().map(|peer| peer.listener_addr).collect::<Vec<_>>();
for (peer, _) in peers {
assert!(!candidate_peer_addrs.contains(&peer));
}
}
}
)*
};
}
test_reject_unsolicited_peer_response!(client, prover, validator);