reth_downloaders/test_utils/
mod.rs1#![allow(dead_code)]
4
5#[cfg(any(test, feature = "file-client"))]
6use crate::{bodies::test_utils::create_raw_bodies, file_codec::BlockFileCodec};
7use alloy_primitives::B256;
8use reth_ethereum_primitives::BlockBody;
9use reth_testing_utils::generators::{self, random_block_range, BlockRangeParams};
10use std::{collections::HashMap, ops::RangeInclusive};
11
12mod bodies_client;
13pub use bodies_client::TestBodiesClient;
14use reth_primitives_traits::SealedHeader;
15
16pub(crate) const TEST_SCOPE: &str = "downloaders.test";
18
19pub(crate) fn generate_bodies(
21 range: RangeInclusive<u64>,
22) -> (Vec<SealedHeader>, HashMap<B256, BlockBody>) {
23 let mut rng = generators::rng();
24 let blocks = random_block_range(
25 &mut rng,
26 range,
27 BlockRangeParams { parent: Some(B256::ZERO), tx_count: 0..2, ..Default::default() },
28 );
29
30 let headers = blocks.iter().map(|block| block.clone_sealed_header()).collect();
31 let bodies = blocks.into_iter().map(|block| (block.hash(), block.into_body())).collect();
32
33 (headers, bodies)
34}
35
36#[cfg(any(test, feature = "file-client"))]
39pub(crate) async fn generate_bodies_file(
40 range: RangeInclusive<u64>,
41) -> (tokio::fs::File, Vec<SealedHeader>, HashMap<B256, BlockBody>) {
42 use futures::SinkExt;
43 use std::io::SeekFrom;
44 use tokio::{fs::File, io::AsyncSeekExt};
45 use tokio_util::codec::FramedWrite;
46
47 let (headers, bodies) = generate_bodies(range);
48 let raw_block_bodies = create_raw_bodies(headers.iter().cloned(), &mut bodies.clone());
49
50 let file: File = tempfile::tempfile().unwrap().into();
51 let mut writer = FramedWrite::new(file, BlockFileCodec::default());
52
53 for block in raw_block_bodies {
55 writer.feed(block).await.unwrap();
56 }
57 writer.flush().await.unwrap();
58
59 let mut file: File = writer.into_inner();
61 file.seek(SeekFrom::Start(0)).await.unwrap();
62 (file, headers, bodies)
63}