mod common;
use common::*;
use snarkos_node_network::PeerPoolHandling;
use snarkos_node_tcp::{
ConnectError,
P2P,
protocols::{Disconnect, Handshake, OnConnect},
};
use snarkvm::prelude::TestRng;
use core::time::Duration;
use deadline::deadline;
#[tokio::test]
async fn test_connect_without_handshake() {
let mut rng = TestRng::default();
let node0 = validator(0, 2, &[], true, &mut rng).await;
let node1 = client(0, 2, &mut rng).await;
assert_eq!(node0.number_of_connected_peers(), 0);
assert_eq!(node1.number_of_connected_peers(), 0);
node0.tcp().enable_listener().await.unwrap();
node1.tcp().enable_listener().await.unwrap();
{
let _ = node0.connect(node1.local_ip());
tokio::time::sleep(Duration::from_millis(100)).await;
print_tcp!(node0);
print_tcp!(node1);
assert_eq!(node0.tcp().num_connected(), 1);
assert_eq!(node0.tcp().num_connecting(), 0);
assert_eq!(node1.tcp().num_connected(), 1);
assert_eq!(node1.tcp().num_connecting(), 0);
}
{
let _ = node0.connect(node1.local_ip());
tokio::time::sleep(Duration::from_millis(100)).await;
print_tcp!(node0);
print_tcp!(node1);
assert_eq!(node0.tcp().num_connected(), 1);
assert_eq!(node0.tcp().num_connecting(), 0);
assert_eq!(node1.tcp().num_connected(), 1);
assert_eq!(node1.tcp().num_connecting(), 0);
}
{
let _ = node1.connect(node0.local_ip());
tokio::time::sleep(Duration::from_millis(100)).await;
print_tcp!(node0);
print_tcp!(node1);
assert_eq!(node0.tcp().num_connected(), 2); assert_eq!(node0.tcp().num_connecting(), 0);
assert_eq!(node1.tcp().num_connected(), 2); assert_eq!(node1.tcp().num_connecting(), 0);
}
}
#[tokio::test]
async fn test_connect_with_handshake() {
let mut rng = TestRng::default();
let node0 = validator(0, 2, &[], true, &mut rng).await;
let node1 = client(0, 2, &mut rng).await;
assert_eq!(node0.number_of_connected_peers(), 0);
assert_eq!(node1.number_of_connected_peers(), 0);
node0.enable_handshake().await;
node1.enable_handshake().await;
node0.enable_on_connect().await;
node1.enable_on_connect().await;
node0.tcp().enable_listener().await.unwrap();
node1.tcp().enable_listener().await.unwrap();
{
let _ = node0.connect(node1.local_ip());
let node0_ip = node0.local_ip();
let node1_ = node1.clone();
deadline!(Duration::from_secs(5), move || { node1_.is_connected(node0_ip) });
print_tcp!(node0);
print_tcp!(node1);
assert_eq!(node0.tcp().num_connected(), 1);
assert_eq!(node0.tcp().num_connecting(), 0);
assert_eq!(node1.tcp().num_connected(), 1);
assert_eq!(node1.tcp().num_connecting(), 0);
assert_eq!(node0.number_of_connected_peers(), 1);
assert_eq!(node1.number_of_connected_peers(), 1);
}
{
let _ = node0.connect(node1.local_ip());
let node0_ip = node0.local_ip();
let node1_ = node1.clone();
deadline!(Duration::from_secs(5), move || { node1_.is_connected(node0_ip) });
print_tcp!(node0);
print_tcp!(node1);
assert_eq!(node0.tcp().num_connected(), 1);
assert_eq!(node0.tcp().num_connecting(), 0);
assert_eq!(node1.tcp().num_connected(), 1);
assert_eq!(node1.tcp().num_connecting(), 0);
assert_eq!(node0.number_of_connected_peers(), 1);
assert_eq!(node1.number_of_connected_peers(), 1);
}
{
let _ = node1.connect(node0.local_ip());
let node1_ip = node1.local_ip();
let node0_ = node0.clone();
deadline!(Duration::from_secs(5), move || { node0_.is_connected(node1_ip) });
print_tcp!(node0);
print_tcp!(node1);
assert_eq!(node0.tcp().num_connected(), 1);
assert_eq!(node0.tcp().num_connecting(), 0);
assert_eq!(node1.tcp().num_connected(), 1);
assert_eq!(node1.tcp().num_connecting(), 0);
assert_eq!(node0.number_of_connected_peers(), 1);
assert_eq!(node1.number_of_connected_peers(), 1);
}
}
#[tokio::test]
async fn test_validator_connection() {
let mut rng = TestRng::default();
let node0 = validator(0, 2, &[], false, &mut rng).await;
assert_eq!(node0.number_of_connected_peers(), 0);
node0.enable_handshake().await;
node0.enable_on_connect().await;
node0.enable_disconnect().await;
node0.tcp().enable_listener().await.unwrap();
let addr0 = node0.local_ip();
let node1 = validator(0, 2, &[addr0], false, &mut rng).await;
assert_eq!(node1.number_of_connected_peers(), 0);
node1.enable_handshake().await;
node1.enable_on_connect().await;
node1.enable_disconnect().await;
node1.tcp().enable_listener().await.unwrap();
{
let _ = node0.connect(node1.local_ip());
let node0_ip = node0.local_ip();
let node1_ = node1.clone();
deadline!(Duration::from_secs(5), move || { node1_.is_connected(node0_ip) });
print_tcp!(node0);
print_tcp!(node1);
assert_eq!(node0.tcp().num_connected(), 1);
assert_eq!(node1.tcp().num_connected(), 1);
assert_eq!(node0.number_of_connected_peers(), 1);
assert_eq!(node1.number_of_connected_peers(), 1);
node0.disconnect(node1.local_ip());
node1.disconnect(node0.local_ip());
let node1_ = node1.clone();
let node0_ = node0.clone();
deadline!(Duration::from_secs(5), move || {
!node1_.is_connected(node0_.local_ip()) && !node0_.is_connected(node1_.local_ip())
});
let res = node1.connect(node0.local_ip()).unwrap().await.unwrap();
assert!(
matches!(res, Err(ConnectError::Other { .. })),
"Connection was accepted or incorrect error was returned"
);
assert!(res.unwrap_err().to_string().contains("no external peers allowed"));
assert_eq!(node0.tcp().num_connected(), 0);
assert_eq!(node1.tcp().num_connected(), 0);
assert_eq!(node0.number_of_connected_peers(), 0);
assert_eq!(node1.number_of_connected_peers(), 0);
}
}
#[ignore]
#[tokio::test]
async fn test_connect_simultaneously_with_handshake() {
let mut rng = TestRng::default();
let node0 = validator(0, 2, &[], true, &mut rng).await;
let node1 = client(0, 2, &mut rng).await;
assert_eq!(node0.number_of_connected_peers(), 0);
assert_eq!(node1.number_of_connected_peers(), 0);
node0.enable_handshake().await;
node1.enable_handshake().await;
{
let _ = node0.connect(node1.local_ip());
let _ = node1.connect(node0.local_ip());
tokio::time::sleep(Duration::from_millis(100)).await;
print_tcp!(node0);
print_tcp!(node1);
assert_eq!(node0.tcp().num_connected(), 1);
assert_eq!(node0.tcp().num_connecting(), 0);
assert_eq!(node1.tcp().num_connected(), 1);
assert_eq!(node1.tcp().num_connecting(), 0);
assert_eq!(node0.number_of_connected_peers(), 1);
assert_eq!(node1.number_of_connected_peers(), 1);
}
}