diff --git a/crates/net/network/tests/it/session.rs b/crates/net/network/tests/it/session.rs index 53ab457eb0..5ab305e574 100644 --- a/crates/net/network/tests/it/session.rs +++ b/crates/net/network/tests/it/session.rs @@ -3,7 +3,7 @@ use futures::StreamExt; use reth_eth_wire::EthVersion; use reth_network::{ - test_utils::{PeerConfig, Testnet}, + test_utils::{NetworkEventStream, PeerConfig, Testnet}, NetworkEvent, NetworkEventListenerProvider, }; use reth_network_api::{ @@ -86,3 +86,40 @@ async fn test_session_established_with_different_capability() { 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; +}