Skip to content

Commit 4fcf5e4

Browse files
authored
refactor: unify all MockNetworkManager into one (#388)
1 parent 3a70ddc commit 4fcf5e4

File tree

3 files changed

+13
-143
lines changed

3 files changed

+13
-143
lines changed

dash-spv/src/test_utils/network.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub struct MockNetworkManager {
2020
connected_peer: SocketAddr,
2121
headers_chain: Vec<BlockHeader>,
2222
message_dispatcher: MessageDispatcher,
23+
sent_messages: Vec<NetworkMessage>,
2324
}
2425

2526
impl MockNetworkManager {
@@ -30,6 +31,7 @@ impl MockNetworkManager {
3031
connected_peer: SocketAddr::new(std::net::Ipv4Addr::LOCALHOST.into(), 9999),
3132
headers_chain: Vec::new(),
3233
message_dispatcher: MessageDispatcher::default(),
34+
sent_messages: Vec::new(),
3335
}
3436
}
3537

@@ -87,6 +89,10 @@ impl MockNetworkManager {
8789
Vec::new()
8890
}
8991
}
92+
93+
pub fn sent_messages(&self) -> &Vec<NetworkMessage> {
94+
&self.sent_messages
95+
}
9096
}
9197

9298
impl Default for MockNetworkManager {
@@ -129,6 +135,8 @@ impl NetworkManager for MockNetworkManager {
129135
}
130136
}
131137

138+
self.sent_messages.push(message);
139+
132140
Ok(())
133141
}
134142

dash-spv/tests/edge_case_filter_sync_test.rs

Lines changed: 3 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
//! Tests for edge case handling in filter header sync, particularly at the tip.
22
3-
use dash_spv::network::{Message, MessageDispatcher, MessageType};
3+
use dash_spv::test_utils::MockNetworkManager;
44
use dash_spv::{
55
client::ClientConfig,
6-
error::NetworkResult,
7-
network::NetworkManager,
86
storage::{BlockHeaderStorage, DiskStorageManager, FilterHeaderStorage},
97
sync::legacy::filters::FilterSyncManager,
108
};
@@ -15,74 +13,8 @@ use dashcore::{
1513
use std::collections::HashSet;
1614
use std::sync::Arc;
1715
use tempfile::TempDir;
18-
use tokio::sync::mpsc::UnboundedReceiver;
1916
use tokio::sync::Mutex;
2017

21-
/// Mock network manager that captures sent messages
22-
struct MockNetworkManager {
23-
sent_messages: Arc<Mutex<Vec<NetworkMessage>>>,
24-
message_dispatcher: MessageDispatcher,
25-
}
26-
27-
impl MockNetworkManager {
28-
fn new() -> Self {
29-
Self {
30-
sent_messages: Arc::new(Mutex::new(Vec::new())),
31-
message_dispatcher: MessageDispatcher::default(),
32-
}
33-
}
34-
35-
async fn get_sent_messages(&self) -> Vec<NetworkMessage> {
36-
self.sent_messages.lock().await.clone()
37-
}
38-
}
39-
40-
#[async_trait::async_trait]
41-
impl NetworkManager for MockNetworkManager {
42-
fn as_any(&self) -> &dyn std::any::Any {
43-
self
44-
}
45-
46-
async fn message_receiver(
47-
&mut self,
48-
message_types: &[MessageType],
49-
) -> UnboundedReceiver<Message> {
50-
self.message_dispatcher.message_receiver(message_types)
51-
}
52-
53-
async fn connect(&mut self) -> NetworkResult<()> {
54-
Ok(())
55-
}
56-
57-
async fn disconnect(&mut self) -> NetworkResult<()> {
58-
Ok(())
59-
}
60-
61-
async fn send_message(&mut self, message: NetworkMessage) -> NetworkResult<()> {
62-
self.sent_messages.lock().await.push(message);
63-
Ok(())
64-
}
65-
66-
fn is_connected(&self) -> bool {
67-
true
68-
}
69-
70-
fn peer_count(&self) -> usize {
71-
1
72-
}
73-
74-
async fn get_peer_best_height(&self) -> dash_spv::error::NetworkResult<Option<u32>> {
75-
Ok(Some(100))
76-
}
77-
78-
async fn has_peer_with_service(
79-
&self,
80-
_service_flags: dashcore::network::constants::ServiceFlags,
81-
) -> bool {
82-
true
83-
}
84-
}
85-
8618
#[tokio::test]
8719
async fn test_filter_sync_at_tip_edge_case() {
8820
let config = ClientConfig::new(Network::Dash);
@@ -115,7 +47,7 @@ async fn test_filter_sync_at_tip_edge_case() {
11547
assert!(!result.unwrap(), "Should not start sync when already at tip");
11648

11749
// Verify no messages were sent
118-
let sent_messages = network.get_sent_messages().await;
50+
let sent_messages = network.sent_messages();
11951
assert_eq!(sent_messages.len(), 0, "Should not send any messages when at tip");
12052
}
12153

@@ -146,7 +78,7 @@ async fn test_no_invalid_getcfheaders_at_tip() {
14678
assert!(result.unwrap(), "Should start sync when behind by 1 block");
14779

14880
// Check the sent message
149-
let sent_messages = network.get_sent_messages().await;
81+
let sent_messages = network.sent_messages();
15082
assert_eq!(sent_messages.len(), 1, "Should send exactly one message");
15183

15284
match &sent_messages[0] {

dash-spv/tests/filter_header_verification_test.rs

Lines changed: 2 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -8,95 +8,25 @@
88
//! The failure indicates a race condition or inconsistency in how filter headers
99
//! are calculated, stored, or verified across multiple batches.
1010
11-
use dash_spv::network::{Message, MessageDispatcher};
11+
use dash_spv::test_utils::MockNetworkManager;
1212
use dash_spv::{
1313
client::ClientConfig,
14-
error::{NetworkError, SyncError},
15-
network::{MessageType, NetworkManager},
14+
error::SyncError,
1615
storage::{BlockHeaderStorage, DiskStorageManager, FilterHeaderStorage},
1716
sync::legacy::filters::FilterSyncManager,
1817
};
1918
use dashcore::{
2019
block::Header as BlockHeader,
2120
hash_types::{FilterHash, FilterHeader},
22-
network::message::NetworkMessage,
2321
network::message_filter::CFHeaders,
2422
BlockHash, Network,
2523
};
2624
use dashcore_hashes::{sha256d, Hash};
2725
use std::collections::HashSet;
2826
use std::sync::Arc;
2927
use tempfile::TempDir;
30-
use tokio::sync::mpsc::UnboundedReceiver;
3128
use tokio::sync::Mutex;
3229

33-
/// Mock network manager for testing filter sync
34-
#[derive(Debug)]
35-
struct MockNetworkManager {
36-
sent_messages: Vec<NetworkMessage>,
37-
message_dispatcher: MessageDispatcher,
38-
}
39-
40-
impl MockNetworkManager {
41-
fn new() -> Self {
42-
Self {
43-
sent_messages: Vec::new(),
44-
message_dispatcher: MessageDispatcher::default(),
45-
}
46-
}
47-
48-
#[allow(dead_code)]
49-
fn clear_sent_messages(&mut self) {
50-
self.sent_messages.clear();
51-
}
52-
}
53-
54-
#[async_trait::async_trait]
55-
impl NetworkManager for MockNetworkManager {
56-
async fn connect(&mut self) -> Result<(), NetworkError> {
57-
Ok(())
58-
}
59-
60-
async fn disconnect(&mut self) -> Result<(), NetworkError> {
61-
Ok(())
62-
}
63-
64-
async fn send_message(&mut self, message: NetworkMessage) -> Result<(), NetworkError> {
65-
self.sent_messages.push(message);
66-
Ok(())
67-
}
68-
69-
fn is_connected(&self) -> bool {
70-
true
71-
}
72-
73-
fn peer_count(&self) -> usize {
74-
1
75-
}
76-
77-
fn as_any(&self) -> &dyn std::any::Any {
78-
self
79-
}
80-
81-
async fn message_receiver(
82-
&mut self,
83-
message_types: &[MessageType],
84-
) -> UnboundedReceiver<Message> {
85-
self.message_dispatcher.message_receiver(message_types)
86-
}
87-
88-
async fn get_peer_best_height(&self) -> dash_spv::error::NetworkResult<Option<u32>> {
89-
Ok(Some(100))
90-
}
91-
92-
async fn has_peer_with_service(
93-
&self,
94-
_service_flags: dashcore::network::constants::ServiceFlags,
95-
) -> bool {
96-
true
97-
}
98-
}
99-
10030
/// Create test filter headers with proper chain linkage
10131
fn create_test_cfheaders_message(
10232
start_height: u32,

0 commit comments

Comments
 (0)