Skip to main content

reth_e2e_test_utils/
lib.rs

1//! Utilities for end-to-end tests.
2
3use alloy_rpc_types_engine::PayloadAttributes;
4use node::NodeTestContext;
5use reth_chainspec::ChainSpec;
6use reth_db::{test_utils::TempDatabase, DatabaseEnv};
7use reth_network_api::test_utils::PeersHandleProvider;
8use reth_node_builder::{
9    components::NodeComponentsBuilder,
10    rpc::{EngineValidatorAddOn, RethRpcAddOns},
11    FullNodeTypesAdapter, Node, NodeAdapter, NodeComponents, NodeTypes, NodeTypesWithDBAdapter,
12    PayloadTypes,
13};
14use reth_provider::providers::{BlockchainProvider, NodeTypesForProvider};
15use std::sync::Arc;
16use wallet::Wallet;
17
18/// Wrapper type to create test nodes
19pub mod node;
20pub mod testsuite;
21
22/// Helper for transaction operations
23pub mod transaction;
24
25/// Helper type to yield accounts from mnemonic
26pub mod wallet;
27
28/// Helper for payload operations
29mod payload;
30
31/// Helper for setting up nodes with pre-imported chain data
32pub mod setup_import;
33
34/// Helper for network operations
35mod network;
36
37/// Helper for rpc operations
38mod rpc;
39
40/// Utilities for creating and writing RLP test data
41pub mod test_rlp_utils;
42
43/// Builder for configuring test node setups
44mod setup_builder;
45pub use setup_builder::E2ETestSetupBuilder;
46
47/// Creates the initial setup with `num_nodes` started and interconnected.
48pub async fn setup<N>(
49    num_nodes: usize,
50    chain_spec: Arc<N::ChainSpec>,
51    is_dev: bool,
52    attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadAttributes
53        + Send
54        + Sync
55        + Copy
56        + 'static,
57) -> eyre::Result<(Vec<NodeHelperType<N>>, Wallet)>
58where
59    N: NodeBuilderHelper,
60{
61    E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
62        .with_node_config_modifier(move |config| config.set_dev(is_dev))
63        .build()
64        .await
65}
66
67/// Creates the initial setup with `num_nodes` started and interconnected.
68pub async fn setup_engine<N>(
69    num_nodes: usize,
70    chain_spec: Arc<N::ChainSpec>,
71    is_dev: bool,
72    tree_config: reth_node_api::TreeConfig,
73    attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadAttributes
74        + Send
75        + Sync
76        + Copy
77        + 'static,
78) -> eyre::Result<(
79    Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
80    Wallet,
81)>
82where
83    N: NodeBuilderHelper,
84{
85    setup_engine_with_connection::<N>(
86        num_nodes,
87        chain_spec,
88        is_dev,
89        tree_config,
90        attributes_generator,
91        true,
92    )
93    .await
94}
95
96/// Creates the initial setup with `num_nodes` started and optionally interconnected.
97pub async fn setup_engine_with_connection<N>(
98    num_nodes: usize,
99    chain_spec: Arc<N::ChainSpec>,
100    is_dev: bool,
101    tree_config: reth_node_api::TreeConfig,
102    attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadAttributes
103        + Send
104        + Sync
105        + Copy
106        + 'static,
107    connect_nodes: bool,
108) -> eyre::Result<(
109    Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
110    Wallet,
111)>
112where
113    N: NodeBuilderHelper,
114{
115    E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
116        .with_tree_config_modifier(move |base| {
117            // Apply caller's tree_config but preserve the small cache size from base
118            tree_config.clone().with_cross_block_cache_size(base.cross_block_cache_size())
119        })
120        .with_node_config_modifier(move |config| config.set_dev(is_dev))
121        .with_connect_nodes(connect_nodes)
122        .build()
123        .await
124}
125
126// Type aliases
127
128/// Testing database
129pub type TmpDB = Arc<TempDatabase<DatabaseEnv>>;
130type TmpNodeAdapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
131    FullNodeTypesAdapter<N, TmpDB, Provider>;
132
133/// Type alias for a `NodeAdapter`
134pub type Adapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> = NodeAdapter<
135    TmpNodeAdapter<N, Provider>,
136    <<N as Node<TmpNodeAdapter<N, Provider>>>::ComponentsBuilder as NodeComponentsBuilder<
137        TmpNodeAdapter<N, Provider>,
138    >>::Components,
139>;
140
141/// Type alias for a type of `NodeHelper`
142pub type NodeHelperType<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
143    NodeTestContext<Adapter<N, Provider>, <N as Node<TmpNodeAdapter<N, Provider>>>::AddOns>;
144
145/// Helper trait to simplify bounds when calling setup functions.
146pub trait NodeBuilderHelper
147where
148    Self: Default
149        + NodeTypesForProvider<Payload: PayloadTypes<PayloadAttributes: From<PayloadAttributes>>>
150        + Node<
151            TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
152            ComponentsBuilder: NodeComponentsBuilder<
153                TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
154                Components: NodeComponents<
155                    TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
156                    Network: PeersHandleProvider,
157                >,
158            >,
159            AddOns: RethRpcAddOns<
160                Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
161            > + EngineValidatorAddOn<
162                Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
163            >,
164            ChainSpec: From<ChainSpec> + Clone,
165        >,
166{
167}
168
169impl<T> NodeBuilderHelper for T where
170    Self: Default
171        + NodeTypesForProvider<Payload: PayloadTypes<PayloadAttributes: From<PayloadAttributes>>>
172        + Node<
173            TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
174            ComponentsBuilder: NodeComponentsBuilder<
175                TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
176                Components: NodeComponents<
177                    TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
178                    Network: PeersHandleProvider,
179                >,
180            >,
181            AddOns: RethRpcAddOns<
182                Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
183            > + EngineValidatorAddOn<
184                Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
185            >,
186            ChainSpec: From<ChainSpec> + Clone,
187        >
188{
189}