reth_e2e_test_utils/
lib.rs

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