11//! Utilities for end-to-end tests.
22
33use node:: NodeTestContext ;
4- use reth_chainspec:: { ChainSpec , EthChainSpec } ;
4+ use reth_chainspec:: ChainSpec ;
55use reth_db:: { test_utils:: TempDatabase , DatabaseEnv } ;
66use reth_engine_local:: LocalPayloadAttributesBuilder ;
77use reth_network_api:: test_utils:: PeersHandleProvider ;
88use reth_node_builder:: {
99 components:: NodeComponentsBuilder ,
1010 rpc:: { EngineValidatorAddOn , RethRpcAddOns } ,
11- EngineNodeLauncher , FullNodeTypesAdapter , Node , NodeAdapter , NodeBuilder , NodeComponents ,
12- NodeConfig , NodeHandle , NodePrimitives , NodeTypes , NodeTypesWithDBAdapter ,
13- PayloadAttributesBuilder , PayloadTypes ,
11+ FullNodeTypesAdapter , Node , NodeAdapter , NodeComponents , NodePrimitives , NodeTypes ,
12+ NodeTypesWithDBAdapter , PayloadAttributesBuilder , PayloadTypes ,
1413} ;
15- use reth_node_core:: args:: { DiscoveryArgs , NetworkArgs , RpcServerArgs } ;
1614use reth_provider:: providers:: { BlockchainProvider , NodeTypesForProvider } ;
17- use reth_rpc_server_types:: RpcModuleSelection ;
1815use reth_tasks:: TaskManager ;
1916use std:: sync:: Arc ;
20- use tracing:: { span, Level } ;
2117use wallet:: Wallet ;
2218
2319/// Wrapper type to create test nodes
@@ -45,6 +41,10 @@ mod rpc;
4541/// Utilities for creating and writing RLP test data
4642pub mod test_rlp_utils;
4743
44+ /// Builder for configuring test node setups
45+ mod setup_builder;
46+ pub use setup_builder:: E2ETestSetupBuilder ;
47+
4848/// Creates the initial setup with `num_nodes` started and interconnected.
4949pub async fn setup < N > (
5050 num_nodes : usize ,
@@ -53,60 +53,14 @@ pub async fn setup<N>(
5353 attributes_generator : impl Fn ( u64 ) -> <<N as NodeTypes >:: Payload as PayloadTypes >:: PayloadBuilderAttributes + Send + Sync + Copy + ' static ,
5454) -> eyre:: Result < ( Vec < NodeHelperType < N > > , TaskManager , Wallet ) >
5555where
56- N : Default + Node < TmpNodeAdapter < N > > + NodeTypesForProvider ,
57- N :: ComponentsBuilder : NodeComponentsBuilder <
58- TmpNodeAdapter < N > ,
59- Components : NodeComponents < TmpNodeAdapter < N > , Network : PeersHandleProvider > ,
60- > ,
61- N :: AddOns : RethRpcAddOns < Adapter < N > > + EngineValidatorAddOn < Adapter < N > > ,
56+ N : NodeBuilderHelper ,
6257 LocalPayloadAttributesBuilder < N :: ChainSpec > :
6358 PayloadAttributesBuilder < <<N as NodeTypes >:: Payload as PayloadTypes >:: PayloadAttributes > ,
6459{
65- let tasks = TaskManager :: current ( ) ;
66- let exec = tasks. executor ( ) ;
67-
68- let network_config = NetworkArgs {
69- discovery : DiscoveryArgs { disable_discovery : true , ..DiscoveryArgs :: default ( ) } ,
70- ..NetworkArgs :: default ( )
71- } ;
72-
73- // Create nodes and peer them
74- let mut nodes: Vec < NodeTestContext < _ , _ > > = Vec :: with_capacity ( num_nodes) ;
75-
76- for idx in 0 ..num_nodes {
77- let node_config = NodeConfig :: new ( chain_spec. clone ( ) )
78- . with_network ( network_config. clone ( ) )
79- . with_unused_ports ( )
80- . with_rpc ( RpcServerArgs :: default ( ) . with_unused_ports ( ) . with_http ( ) )
81- . set_dev ( is_dev) ;
82-
83- let span = span ! ( Level :: INFO , "node" , idx) ;
84- let _enter = span. enter ( ) ;
85- let NodeHandle { node, node_exit_future : _ } = NodeBuilder :: new ( node_config. clone ( ) )
86- . testing_node ( exec. clone ( ) )
87- . node ( Default :: default ( ) )
88- . launch ( )
89- . await ?;
90-
91- let mut node = NodeTestContext :: new ( node, attributes_generator) . await ?;
92-
93- // Connect each node in a chain.
94- if let Some ( previous_node) = nodes. last_mut ( ) {
95- previous_node. connect ( & mut node) . await ;
96- }
97-
98- // Connect last node with the first if there are more than two
99- if idx + 1 == num_nodes &&
100- num_nodes > 2 &&
101- let Some ( first_node) = nodes. first_mut ( )
102- {
103- node. connect ( first_node) . await ;
104- }
105-
106- nodes. push ( node) ;
107- }
108-
109- Ok ( ( nodes, tasks, Wallet :: default ( ) . with_chain_id ( chain_spec. chain ( ) . into ( ) ) ) )
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
11064}
11165
11266/// Creates the initial setup with `num_nodes` started and interconnected.
@@ -155,71 +109,12 @@ where
155109 LocalPayloadAttributesBuilder < N :: ChainSpec > :
156110 PayloadAttributesBuilder < <N :: Payload as PayloadTypes >:: PayloadAttributes > ,
157111{
158- let tasks = TaskManager :: current ( ) ;
159- let exec = tasks. executor ( ) ;
160-
161- let network_config = NetworkArgs {
162- discovery : DiscoveryArgs { disable_discovery : true , ..DiscoveryArgs :: default ( ) } ,
163- ..NetworkArgs :: default ( )
164- } ;
165-
166- // Create nodes and peer them
167- let mut nodes: Vec < NodeTestContext < _ , _ > > = Vec :: with_capacity ( num_nodes) ;
168-
169- for idx in 0 ..num_nodes {
170- let node_config = NodeConfig :: new ( chain_spec. clone ( ) )
171- . with_network ( network_config. clone ( ) )
172- . with_unused_ports ( )
173- . with_rpc (
174- RpcServerArgs :: default ( )
175- . with_unused_ports ( )
176- . with_http ( )
177- . with_http_api ( RpcModuleSelection :: All ) ,
178- )
179- . set_dev ( is_dev) ;
180-
181- let span = span ! ( Level :: INFO , "node" , idx) ;
182- let _enter = span. enter ( ) ;
183- let node = N :: default ( ) ;
184- let NodeHandle { node, node_exit_future : _ } = NodeBuilder :: new ( node_config. clone ( ) )
185- . testing_node ( exec. clone ( ) )
186- . with_types_and_provider :: < N , BlockchainProvider < _ > > ( )
187- . with_components ( node. components_builder ( ) )
188- . with_add_ons ( node. add_ons ( ) )
189- . launch_with_fn ( |builder| {
190- let launcher = EngineNodeLauncher :: new (
191- builder. task_executor ( ) . clone ( ) ,
192- builder. config ( ) . datadir ( ) ,
193- tree_config. clone ( ) ,
194- ) ;
195- builder. launch_with ( launcher)
196- } )
197- . await ?;
198-
199- let mut node = NodeTestContext :: new ( node, attributes_generator) . await ?;
200-
201- let genesis = node. block_hash ( 0 ) ;
202- node. update_forkchoice ( genesis, genesis) . await ?;
203-
204- // Connect each node in a chain if requested.
205- if connect_nodes {
206- if let Some ( previous_node) = nodes. last_mut ( ) {
207- previous_node. connect ( & mut node) . await ;
208- }
209-
210- // Connect last node with the first if there are more than two
211- if idx + 1 == num_nodes &&
212- num_nodes > 2 &&
213- let Some ( first_node) = nodes. first_mut ( )
214- {
215- node. connect ( first_node) . await ;
216- }
217- }
218-
219- nodes. push ( node) ;
220- }
221-
222- Ok ( ( nodes, tasks, Wallet :: default ( ) . with_chain_id ( chain_spec. chain ( ) . into ( ) ) ) )
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
223118}
224119
225120// Type aliases
0 commit comments