From df6e3143c3bf3b7d46a185ff6fa950b69f429c08 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 7 Feb 2023 16:37:33 +0100 Subject: [PATCH] feat(net): add test-utils and NoopNetwork (#1204) --- crates/net/network-api/Cargo.toml | 3 ++ crates/net/network-api/src/lib.rs | 10 ++-- crates/net/network-api/src/test_utils.rs | 60 ++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 crates/net/network-api/src/test_utils.rs diff --git a/crates/net/network-api/Cargo.toml b/crates/net/network-api/Cargo.toml index 2f8abda1b..19234970e 100644 --- a/crates/net/network-api/Cargo.toml +++ b/crates/net/network-api/Cargo.toml @@ -19,3 +19,6 @@ serde = { version = "1.0", features = ["derive"] } async-trait = "0.1" thiserror = "1.0.37" tokio = { version = "1.21.2", features = ["sync"] } + +[features] +test-utils = [] \ No newline at end of file diff --git a/crates/net/network-api/src/lib.rs b/crates/net/network-api/src/lib.rs index 708544c9d..ce62ebf17 100644 --- a/crates/net/network-api/src/lib.rs +++ b/crates/net/network-api/src/lib.rs @@ -10,18 +10,22 @@ //! Provides abstractions for the reth-network crate. use async_trait::async_trait; +use reth_eth_wire::DisconnectReason; use reth_primitives::{NodeRecord, PeerId, H256, U256}; use serde::{Deserialize, Serialize}; use std::net::SocketAddr; +pub use error::NetworkError; +pub use reputation::{Reputation, ReputationChangeKind}; + /// Network Error pub mod error; /// Reputation score pub mod reputation; -pub use error::NetworkError; -pub use reputation::{Reputation, ReputationChangeKind}; -use reth_eth_wire::DisconnectReason; +#[cfg(feature = "test-utils")] +/// Implementation of network traits for testing purposes. +pub mod test_utils; /// Provides general purpose information about the network. #[async_trait] diff --git a/crates/net/network-api/src/test_utils.rs b/crates/net/network-api/src/test_utils.rs new file mode 100644 index 000000000..14c5f4c64 --- /dev/null +++ b/crates/net/network-api/src/test_utils.rs @@ -0,0 +1,60 @@ +use crate::{ + EthProtocolInfo, NetworkError, NetworkInfo, NetworkStatus, PeerKind, Peers, PeersInfo, + ReputationChangeKind, +}; +use async_trait::async_trait; +use reth_eth_wire::{DisconnectReason, ProtocolVersion}; +use reth_primitives::{rpc::Chain::Mainnet, NodeRecord, PeerId}; +use std::net::{IpAddr, SocketAddr}; + +/// A type that implements all network trait that does nothing. +/// +/// Intended for testing purposes where network is not used. +#[derive(Debug, Clone, Default)] +pub struct NoopNetwork; + +#[async_trait] +impl NetworkInfo for NoopNetwork { + fn local_addr(&self) -> SocketAddr { + (IpAddr::from(std::net::Ipv4Addr::UNSPECIFIED), 30303).into() + } + + async fn network_status(&self) -> Result { + Ok(NetworkStatus { + client_version: "reth-test".to_string(), + protocol_version: ProtocolVersion::V5 as u64, + eth_protocol_info: EthProtocolInfo { + difficulty: Default::default(), + head: Default::default(), + network: 1, + genesis: Default::default(), + }, + }) + } + + fn chain_id(&self) -> u64 { + Mainnet.into() + } +} + +impl PeersInfo for NoopNetwork { + fn num_connected_peers(&self) -> usize { + 0 + } + + fn local_node_record(&self) -> NodeRecord { + NodeRecord::new(self.local_addr(), PeerId::random()) + } +} + +impl Peers for NoopNetwork { + fn add_peer_kind(&self, _peer: PeerId, _kind: PeerKind, _addr: SocketAddr) {} + + fn remove_peer(&self, _peer: PeerId, _kind: PeerKind) {} + + fn disconnect_peer(&self, _peer: PeerId) {} + + fn disconnect_peer_with_reason(&self, _peer: PeerId, _reason: DisconnectReason) {} + + fn reputation_change(&self, _peer_id: PeerId, _kind: ReputationChangeKind) {} +}