Skip to content

Commit 3a70ddc

Browse files
authored
refactor: replace some test helpers with test-utils dummy helpers (#389)
1 parent 0530c9b commit 3a70ddc

File tree

2 files changed

+18
-82
lines changed

2 files changed

+18
-82
lines changed

dash-spv/tests/edge_case_filter_sync_test.rs

Lines changed: 13 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,14 @@ use dash_spv::{
1010
};
1111
use dashcore::{
1212
block::Header as BlockHeader, hash_types::FilterHeader, network::message::NetworkMessage,
13-
BlockHash, Network,
13+
Network,
1414
};
15-
use dashcore_hashes::Hash;
1615
use std::collections::HashSet;
1716
use std::sync::Arc;
1817
use tempfile::TempDir;
1918
use tokio::sync::mpsc::UnboundedReceiver;
2019
use tokio::sync::Mutex;
2120

22-
/// Create a mock block header
23-
fn create_mock_header(height: u32, prev_hash: BlockHash) -> BlockHeader {
24-
BlockHeader {
25-
version: dashcore::block::Version::ONE,
26-
prev_blockhash: prev_hash,
27-
merkle_root: dashcore::hash_types::TxMerkleNode::all_zeros(),
28-
time: 1234567890 + height,
29-
bits: dashcore::pow::CompactTarget::from_consensus(0x1d00ffff),
30-
nonce: height,
31-
}
32-
}
33-
34-
/// Create a mock filter header
35-
fn create_mock_filter_header(height: u32) -> FilterHeader {
36-
FilterHeader::from_slice(&[height as u8; 32]).unwrap()
37-
}
38-
3921
/// Mock network manager that captures sent messages
4022
struct MockNetworkManager {
4123
sent_messages: Arc<Mutex<Vec<NetworkMessage>>>,
@@ -114,26 +96,18 @@ async fn test_filter_sync_at_tip_edge_case() {
11496
let mut network = MockNetworkManager::new();
11597

11698
// Set up storage with headers and filter headers at the same height (tip)
117-
let height = 100;
118-
let mut headers = Vec::new();
119-
let mut filter_headers = Vec::new();
120-
let mut prev_hash = BlockHash::all_zeros();
121-
122-
for i in 1..=height {
123-
let header = create_mock_header(i, prev_hash);
124-
prev_hash = header.block_hash();
125-
headers.push(header);
126-
filter_headers.push(create_mock_filter_header(i));
127-
}
99+
const TIP_HEIGHT: u32 = 100;
100+
let headers = BlockHeader::dummy_batch(0..TIP_HEIGHT + 1);
101+
let filter_headers = FilterHeader::dummy_batch(0..TIP_HEIGHT + 1);
128102

129103
storage.store_headers(&headers).await.unwrap();
130104
storage.store_filter_headers(&filter_headers).await.unwrap();
131105

132106
// Verify initial state
133107
let tip_height = storage.get_tip_height().await.unwrap();
134108
let filter_tip_height = storage.get_filter_tip_height().await.unwrap().unwrap();
135-
assert_eq!(tip_height, height - 1); // 0-indexed
136-
assert_eq!(filter_tip_height, height - 1); // 0-indexed
109+
assert_eq!(tip_height, TIP_HEIGHT); // 0-indexed
110+
assert_eq!(filter_tip_height, TIP_HEIGHT); // 0-indexed
137111

138112
// Try to start filter sync when already at tip
139113
let result = filter_sync.start_sync_headers(&mut network, &mut storage).await;
@@ -157,23 +131,11 @@ async fn test_no_invalid_getcfheaders_at_tip() {
157131
.expect("Failed to create tmp storage");
158132
let mut network = MockNetworkManager::new();
159133

160-
// Create a scenario where we're one block behind
161-
let height = 100;
162-
let mut headers = Vec::new();
163-
let mut filter_headers = Vec::new();
164-
let mut prev_hash = BlockHash::all_zeros();
165-
166-
// Store headers up to height
167-
for i in 1..=height {
168-
let header = create_mock_header(i, prev_hash);
169-
prev_hash = header.block_hash();
170-
headers.push(header);
171-
}
172-
173-
// Store filter headers up to height - 1
174-
for i in 1..=(height - 1) {
175-
filter_headers.push(create_mock_filter_header(i));
176-
}
134+
// Create a scenario where we're one filter header behind
135+
// FilterHeader at TIP_HEIGHT is the one missing
136+
const TIP_HEIGHT: u32 = 99;
137+
let headers = BlockHeader::dummy_batch(0..TIP_HEIGHT + 1);
138+
let filter_headers = FilterHeader::dummy_batch(0..TIP_HEIGHT);
177139

178140
storage.store_headers(&headers).await.unwrap();
179141
storage.store_filter_headers(&filter_headers).await.unwrap();
@@ -191,10 +153,9 @@ async fn test_no_invalid_getcfheaders_at_tip() {
191153
NetworkMessage::GetCFHeaders(get_cf_headers) => {
192154
// The critical check: start_height must be <= height of stop_hash
193155
assert_eq!(
194-
get_cf_headers.start_height,
195-
height - 1,
156+
get_cf_headers.start_height, TIP_HEIGHT,
196157
"Start height should be {}",
197-
height - 1
158+
TIP_HEIGHT
198159
);
199160
// We can't easily verify the stop_hash height here, but the request should be valid
200161
println!(

dash-spv/tests/filter_header_verification_test.rs

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use dash_spv::{
1717
sync::legacy::filters::FilterSyncManager,
1818
};
1919
use dashcore::{
20-
block::{Header as BlockHeader, Version},
20+
block::Header as BlockHeader,
2121
hash_types::{FilterHash, FilterHeader},
2222
network::message::NetworkMessage,
2323
network::message_filter::CFHeaders,
@@ -97,31 +97,6 @@ impl NetworkManager for MockNetworkManager {
9797
}
9898
}
9999

100-
/// Create test headers for a given range
101-
fn create_test_headers_range(start_height: u32, count: u32) -> Vec<BlockHeader> {
102-
let mut headers = Vec::new();
103-
104-
for i in 0..count {
105-
let height = start_height + i;
106-
let header = BlockHeader {
107-
version: Version::from_consensus(1),
108-
prev_blockhash: if height == 0 {
109-
BlockHash::all_zeros()
110-
} else {
111-
// Create a deterministic previous hash
112-
BlockHash::from_byte_array([((height - 1) % 256) as u8; 32])
113-
},
114-
merkle_root: dashcore::TxMerkleNode::from_byte_array([(height % 256) as u8; 32]),
115-
time: 1234567890 + height,
116-
bits: dashcore::CompactTarget::from_consensus(0x1d00ffff),
117-
nonce: height,
118-
};
119-
headers.push(header);
120-
}
121-
122-
headers
123-
}
124-
125100
/// Create test filter headers with proper chain linkage
126101
fn create_test_cfheaders_message(
127102
start_height: u32,
@@ -181,7 +156,7 @@ async fn test_filter_header_verification_failure_reproduction() {
181156

182157
// Step 1: Store initial headers to simulate having a synced header chain
183158
println!("Step 1: Setting up initial header chain...");
184-
let initial_headers = create_test_headers_range(1000, 5000); // Headers 1000-4999
159+
let initial_headers = BlockHeader::dummy_batch(1000..5000); // Headers 1000-4999
185160
storage.store_headers(&initial_headers).await.expect("Failed to store initial headers");
186161

187162
let tip_height = storage.get_tip_height().await.unwrap();
@@ -345,7 +320,7 @@ async fn test_overlapping_batches_from_different_peers() {
345320

346321
// Step 1: Set up headers for the full range we'll need
347322
println!("Step 1: Setting up header chain (heights 1-3000)...");
348-
let initial_headers = create_test_headers_range(1, 3000); // Headers 1-2999
323+
let initial_headers = BlockHeader::dummy_batch(1..3000); // Headers 1-2999
349324
storage.store_headers(&initial_headers).await.expect("Failed to store initial headers");
350325

351326
let tip_height = storage.get_tip_height().await.unwrap();
@@ -520,7 +495,7 @@ async fn test_filter_header_verification_overlapping_batches() {
520495
FilterSyncManager::new(&config, received_heights);
521496

522497
// Set up initial headers - start from 1 for proper sync
523-
let initial_headers = create_test_headers_range(1, 2000);
498+
let initial_headers = BlockHeader::dummy_batch(1..2000);
524499
storage.store_headers(&initial_headers).await.expect("Failed to store initial headers");
525500

526501
// Start filter sync first (required for message processing)
@@ -618,7 +593,7 @@ async fn test_filter_header_verification_race_condition_simulation() {
618593
FilterSyncManager::new(&config, received_heights);
619594

620595
// Set up headers - need enough for batch B (up to height 3000)
621-
let initial_headers = create_test_headers_range(1, 3001);
596+
let initial_headers = BlockHeader::dummy_batch(1..3001);
622597
storage.store_headers(&initial_headers).await.expect("Failed to store initial headers");
623598

624599
// Simulate: Start sync, send request for batch A

0 commit comments

Comments
 (0)