mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
126 lines
3.9 KiB
Rust
126 lines
3.9 KiB
Rust
//! Session tests
|
|
|
|
use futures::StreamExt;
|
|
use reth_eth_wire::EthVersion;
|
|
use reth_network::{
|
|
test_utils::{NetworkEventStream, PeerConfig, Testnet},
|
|
NetworkEvent, NetworkEventListenerProvider,
|
|
};
|
|
use reth_network_api::{
|
|
events::{PeerEvent, SessionInfo},
|
|
NetworkInfo, Peers,
|
|
};
|
|
use reth_storage_api::noop::NoopProvider;
|
|
|
|
#[tokio::test(flavor = "multi_thread")]
|
|
async fn test_session_established_with_highest_version() {
|
|
reth_tracing::init_test_tracing();
|
|
|
|
let net = Testnet::create(2).await;
|
|
net.for_each(|peer| assert_eq!(0, peer.num_peers()));
|
|
|
|
let mut handles = net.handles();
|
|
let handle0 = handles.next().unwrap();
|
|
let handle1 = handles.next().unwrap();
|
|
drop(handles);
|
|
|
|
let handle = net.spawn();
|
|
|
|
let mut events = handle0.event_listener().take(2);
|
|
handle0.add_peer(*handle1.peer_id(), handle1.local_addr());
|
|
|
|
while let Some(event) = events.next().await {
|
|
match event {
|
|
NetworkEvent::Peer(PeerEvent::PeerAdded(peer_id)) => {
|
|
assert_eq!(handle1.peer_id(), &peer_id);
|
|
}
|
|
NetworkEvent::ActivePeerSession { info, .. } => {
|
|
let SessionInfo { peer_id, status, .. } = info;
|
|
assert_eq!(handle1.peer_id(), &peer_id);
|
|
assert_eq!(status.version, EthVersion::Eth68);
|
|
}
|
|
ev => {
|
|
panic!("unexpected event {ev:?}")
|
|
}
|
|
}
|
|
}
|
|
handle.terminate().await;
|
|
}
|
|
|
|
#[tokio::test(flavor = "multi_thread")]
|
|
async fn test_session_established_with_different_capability() {
|
|
reth_tracing::init_test_tracing();
|
|
|
|
let mut net = Testnet::create(1).await;
|
|
|
|
let p1 = PeerConfig::with_protocols(NoopProvider::default(), Some(EthVersion::Eth66.into()));
|
|
net.add_peer_with_config(p1).await.unwrap();
|
|
|
|
net.for_each(|peer| assert_eq!(0, peer.num_peers()));
|
|
|
|
let mut handles = net.handles();
|
|
let handle0 = handles.next().unwrap();
|
|
let handle1 = handles.next().unwrap();
|
|
drop(handles);
|
|
|
|
let handle = net.spawn();
|
|
|
|
let mut events = handle0.event_listener().take(2);
|
|
handle0.add_peer(*handle1.peer_id(), handle1.local_addr());
|
|
|
|
while let Some(event) = events.next().await {
|
|
match event {
|
|
NetworkEvent::Peer(PeerEvent::PeerAdded(peer_id)) => {
|
|
assert_eq!(handle1.peer_id(), &peer_id);
|
|
}
|
|
NetworkEvent::ActivePeerSession { info, .. } => {
|
|
let SessionInfo { peer_id, status, .. } = info;
|
|
assert_eq!(handle1.peer_id(), &peer_id);
|
|
assert_eq!(status.version, EthVersion::Eth66);
|
|
}
|
|
ev => {
|
|
panic!("unexpected event: {ev:?}")
|
|
}
|
|
}
|
|
}
|
|
|
|
handle.terminate().await;
|
|
}
|
|
|
|
#[tokio::test(flavor = "multi_thread")]
|
|
async fn test_capability_version_mismatch() {
|
|
reth_tracing::init_test_tracing();
|
|
|
|
let mut net = Testnet::create(0).await;
|
|
|
|
let p0 = PeerConfig::with_protocols(NoopProvider::default(), Some(EthVersion::Eth66.into()));
|
|
net.add_peer_with_config(p0).await.unwrap();
|
|
|
|
let p1 = PeerConfig::with_protocols(NoopProvider::default(), Some(EthVersion::Eth67.into()));
|
|
net.add_peer_with_config(p1).await.unwrap();
|
|
|
|
net.for_each(|peer| assert_eq!(0, peer.num_peers()));
|
|
|
|
let mut handles = net.handles();
|
|
let handle0 = handles.next().unwrap();
|
|
let handle1 = handles.next().unwrap();
|
|
drop(handles);
|
|
|
|
let handle = net.spawn();
|
|
|
|
let events = handle0.event_listener();
|
|
|
|
let mut event_stream = NetworkEventStream::new(events);
|
|
|
|
handle0.add_peer(*handle1.peer_id(), handle1.local_addr());
|
|
|
|
let added_peer_id = event_stream.peer_added().await.unwrap();
|
|
assert_eq!(added_peer_id, *handle1.peer_id());
|
|
|
|
// peer with mismatched capability version should fail to connect and be removed.
|
|
let removed_peer_id = event_stream.peer_removed().await.unwrap();
|
|
assert_eq!(removed_peer_id, *handle1.peer_id());
|
|
|
|
handle.terminate().await;
|
|
}
|