Skip to main content

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 std::sync::Arc;
15use wallet::Wallet;
16
17/// Wrapper type to create test nodes
18pub mod node;
19pub mod testsuite;
20
21/// Helper for transaction operations
22pub mod transaction;
23
24/// Helper type to yield accounts from mnemonic
25pub mod wallet;
26
27/// Helper for payload operations
28mod payload;
29
30/// Helper for setting up nodes with pre-imported chain data
31pub mod setup_import;
32
33/// Helper for network operations
34mod network;
35
36/// Helper for rpc operations
37mod rpc;
38
39/// Utilities for creating and writing RLP test data
40pub mod test_rlp_utils;
41
42/// Builder for configuring test node setups
43mod setup_builder;
44pub use setup_builder::E2ETestSetupBuilder;
45
46/// Creates the initial setup with `num_nodes` started and interconnected.
47pub async fn setup<N>(
48    num_nodes: usize,
49    chain_spec: Arc<N::ChainSpec>,
50    is_dev: bool,
51    attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
52) -> eyre::Result<(Vec<NodeHelperType<N>>, Wallet)>
53where
54    N: NodeBuilderHelper,
55{
56    E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
57        .with_node_config_modifier(move |config| config.set_dev(is_dev))
58        .build()
59        .await
60}
61
62/// Creates the initial setup with `num_nodes` started and interconnected.
63pub async fn setup_engine<N>(
64    num_nodes: usize,
65    chain_spec: Arc<N::ChainSpec>,
66    is_dev: bool,
67    tree_config: reth_node_api::TreeConfig,
68    attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
69) -> eyre::Result<(
70    Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
71    Wallet,
72)>
73where
74    N: NodeBuilderHelper,
75{
76    setup_engine_with_connection::<N>(
77        num_nodes,
78        chain_spec,
79        is_dev,
80        tree_config,
81        attributes_generator,
82        true,
83    )
84    .await
85}
86
87/// Creates the initial setup with `num_nodes` started and optionally interconnected.
88pub async fn setup_engine_with_connection<N>(
89    num_nodes: usize,
90    chain_spec: Arc<N::ChainSpec>,
91    is_dev: bool,
92    tree_config: reth_node_api::TreeConfig,
93    attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
94    connect_nodes: bool,
95) -> eyre::Result<(
96    Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
97    Wallet,
98)>
99where
100    N: NodeBuilderHelper,
101{
102    E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
103        .with_tree_config_modifier(move |base| {
104            // Apply caller's tree_config but preserve the small cache size from base
105            tree_config.clone().with_cross_block_cache_size(base.cross_block_cache_size())
106        })
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}