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_network_api::test_utils::PeersHandleProvider;
7use reth_node_builder::{
8    components::NodeComponentsBuilder,
9    rpc::{EngineValidatorAddOn, RethRpcAddOns},
10    FullNodeTypesAdapter, Node, NodeAdapter, NodeComponents, NodeTypes, NodeTypesWithDBAdapter,
11    PayloadTypes,
12};
13use reth_provider::providers::{BlockchainProvider, NodeTypesForProvider};
14use reth_tasks::TaskManager;
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>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
53) -> eyre::Result<(Vec<NodeHelperType<N>>, TaskManager, Wallet)>
54where
55    N: NodeBuilderHelper,
56{
57    E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
58        .with_node_config_modifier(move |config| config.set_dev(is_dev))
59        .build()
60        .await
61}
62
63/// Creates the initial setup with `num_nodes` started and interconnected.
64pub async fn setup_engine<N>(
65    num_nodes: usize,
66    chain_spec: Arc<N::ChainSpec>,
67    is_dev: bool,
68    tree_config: reth_node_api::TreeConfig,
69    attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
70) -> eyre::Result<(
71    Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
72    TaskManager,
73    Wallet,
74)>
75where
76    N: NodeBuilderHelper,
77{
78    setup_engine_with_connection::<N>(
79        num_nodes,
80        chain_spec,
81        is_dev,
82        tree_config,
83        attributes_generator,
84        true,
85    )
86    .await
87}
88
89/// Creates the initial setup with `num_nodes` started and optionally interconnected.
90pub async fn setup_engine_with_connection<N>(
91    num_nodes: usize,
92    chain_spec: Arc<N::ChainSpec>,
93    is_dev: bool,
94    tree_config: reth_node_api::TreeConfig,
95    attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
96    connect_nodes: bool,
97) -> eyre::Result<(
98    Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
99    TaskManager,
100    Wallet,
101)>
102where
103    N: NodeBuilderHelper,
104{
105    E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
106        .with_tree_config_modifier(move |_| tree_config.clone())
107        .with_node_config_modifier(move |config| config.set_dev(is_dev))
108        .with_connect_nodes(connect_nodes)
109        .build()
110        .await
111}
112
113// Type aliases
114
115/// Testing database
116pub type TmpDB = Arc<TempDatabase<DatabaseEnv>>;
117type TmpNodeAdapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
118    FullNodeTypesAdapter<N, TmpDB, Provider>;
119
120/// Type alias for a `NodeAdapter`
121pub type Adapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> = NodeAdapter<
122    TmpNodeAdapter<N, Provider>,
123    <<N as Node<TmpNodeAdapter<N, Provider>>>::ComponentsBuilder as NodeComponentsBuilder<
124        TmpNodeAdapter<N, Provider>,
125    >>::Components,
126>;
127
128/// Type alias for a type of `NodeHelper`
129pub type NodeHelperType<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
130    NodeTestContext<Adapter<N, Provider>, <N as Node<TmpNodeAdapter<N, Provider>>>::AddOns>;
131
132/// Helper trait to simplify bounds when calling setup functions.
133pub trait NodeBuilderHelper
134where
135    Self: Default
136        + NodeTypesForProvider<
137            Payload: PayloadTypes<
138                PayloadBuilderAttributes: From<reth_payload_builder::EthPayloadBuilderAttributes>,
139            >,
140        > + Node<
141            TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
142            ComponentsBuilder: NodeComponentsBuilder<
143                TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
144                Components: NodeComponents<
145                    TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
146                    Network: PeersHandleProvider,
147                >,
148            >,
149            AddOns: RethRpcAddOns<
150                Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
151            > + EngineValidatorAddOn<
152                Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
153            >,
154            ChainSpec: From<ChainSpec> + Clone,
155        >,
156{
157}
158
159impl<T> NodeBuilderHelper for T where
160    Self: Default
161        + NodeTypesForProvider<
162            Payload: PayloadTypes<
163                PayloadBuilderAttributes: From<reth_payload_builder::EthPayloadBuilderAttributes>,
164            >,
165        > + Node<
166            TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
167            ComponentsBuilder: NodeComponentsBuilder<
168                TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
169                Components: NodeComponents<
170                    TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
171                    Network: PeersHandleProvider,
172                >,
173            >,
174            AddOns: RethRpcAddOns<
175                Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
176            > + EngineValidatorAddOn<
177                Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
178            >,
179            ChainSpec: From<ChainSpec> + Clone,
180        >
181{
182}