11// Copyright (C) Parity Technologies (UK) Ltd.
22// SPDX-License-Identifier: Apache-2.0
33
4- use std:: time:: Duration ;
5-
64use crate :: utils:: {
7- initialize_network, BEST_BLOCK_METRIC , DEFAULT_CHAIN_SPEC , DEFAULT_DB_SNAPSHOT_URL ,
5+ ensure_env_defaults, initialize_network, log_line_absent, log_line_at_least_once,
6+ resolve_db_snapshot_height, BEST_BLOCK_METRIC , CHAIN_SPEC_ENV , DB_SNAPSHOT_ENV ,
7+ DEFAULT_CHAIN_SPEC , DEFAULT_DB_SNAPSHOT_URL , DEFAULT_SUBSTRATE_IMAGE , FULLNODE_ROLE_VALUE ,
8+ INTEGRATION_IMAGE_ENV , NODE_ROLE_METRIC , PEER_COUNT_METRIC ,
89} ;
9- use anyhow:: { anyhow, Result } ;
10+ use anyhow:: { anyhow, Context , Result } ;
1011use env_logger:: Env ;
11- use zombienet_orchestrator:: network:: node:: LogLineCountOptions ;
1212use zombienet_sdk:: { NetworkConfig , NetworkConfigBuilder , NetworkNode } ;
1313
1414const BEST_BLOCK_THRESHOLD : f64 = 1.0 ;
1515const PEERS_THRESHOLD : f64 = 3.0 ;
16- const VALIDATOR_ROLE_VALUE : f64 = 1.0 ;
1716
1817const NETWORK_READY_TIMEOUT_SECS : u64 = 180 ;
1918const ROLE_TIMEOUT_SECS : u64 = 60 ;
@@ -22,35 +21,36 @@ const METRIC_TIMEOUT_SECS: u64 = 60;
2221const LOG_TIMEOUT_LONG_SECS : u64 = 60 ;
2322const LOG_TIMEOUT_SHORT_SECS : u64 = 10 ;
2423const LOG_ERROR_TIMEOUT_SECS : u64 = 10 ;
25- const NODE_ROLE_METRIC : & str = "node_roles" ;
26- const PEER_COUNT_METRIC : & str = "substrate_sub_libp2p_peers_count" ;
27- const NODE_NAMES : [ & str ; 4 ] = [ "alice" , "bob" , "charlie" , "dave" ] ;
2824const SNAPSHOT_NODES : [ & str ; 3 ] = [ "alice" , "bob" , "charlie" ] ;
29- const INTEGRATION_IMAGE_ENV : & str = "ZOMBIENET_INTEGRATION_TEST_IMAGE" ;
30- const DB_SNAPSHOT_ENV : & str = "DB_SNAPSHOT" ;
31- const CHAIN_SPEC_ENV : & str = "WARP_CHAIN_SPEC_PATH" ;
32- const DB_BLOCK_HEIGHT_ENV : & str = "DB_BLOCK_HEIGHT" ;
33- const DEFAULT_SUBSTRATE_IMAGE : & str = "docker.io/paritypr/substrate:latest" ;
34-
25+ const NODE_ROLE_EXPECTATIONS : [ ( & str , f64 ) ; 4 ] = [
26+ ( "alice" , FULLNODE_ROLE_VALUE ) ,
27+ ( "bob" , FULLNODE_ROLE_VALUE ) ,
28+ ( "charlie" , FULLNODE_ROLE_VALUE ) ,
29+ ( "dave" , FULLNODE_ROLE_VALUE ) ,
30+ ] ;
3531#[ tokio:: test( flavor = "multi_thread" ) ]
3632async fn basic_warp_sync ( ) -> Result < ( ) > {
3733 let _ = env_logger:: Builder :: from_env ( Env :: default ( ) . default_filter_or ( "info" ) ) . try_init ( ) ;
3834
39- ensure_env_defaults ( ) ;
35+ ensure_env_defaults ( & [
36+ ( INTEGRATION_IMAGE_ENV , DEFAULT_SUBSTRATE_IMAGE ) ,
37+ ( DB_SNAPSHOT_ENV , DEFAULT_DB_SNAPSHOT_URL ) ,
38+ ( CHAIN_SPEC_ENV , DEFAULT_CHAIN_SPEC ) ,
39+ ] ) ;
4040
4141 log:: info!( "Spawning network" ) ;
4242 let config = build_network_config ( ) ?;
4343 let network = initialize_network ( config) . await ?;
4444
4545 network. wait_until_is_up ( NETWORK_READY_TIMEOUT_SECS ) . await ?;
4646
47- for node_name in NODE_NAMES {
47+ for & ( node_name, expected_role ) in NODE_ROLE_EXPECTATIONS . iter ( ) {
4848 let node = network. get_node ( node_name) ?;
49- assert_node_roles ( node) . await ?;
49+ assert_node_roles ( expected_role , node) . await ?;
5050 assert_peers_count ( node) . await ?;
5151 }
5252
53- let db_snapshot_height = resolve_db_snapshot_height ( & network) . await ?;
53+ let db_snapshot_height = resolve_db_snapshot_height ( & network, "alice" ) . await ?;
5454
5555 for node_name in SNAPSHOT_NODES {
5656 network
@@ -85,36 +85,6 @@ async fn basic_warp_sync() -> Result<()> {
8585 Ok ( ( ) )
8686}
8787
88- fn ensure_env_defaults ( ) {
89- if std:: env:: var ( INTEGRATION_IMAGE_ENV ) . is_err ( ) {
90- std:: env:: set_var ( INTEGRATION_IMAGE_ENV , DEFAULT_SUBSTRATE_IMAGE ) ;
91- }
92- if std:: env:: var ( DB_SNAPSHOT_ENV ) . is_err ( ) {
93- std:: env:: set_var ( DB_SNAPSHOT_ENV , DEFAULT_DB_SNAPSHOT_URL ) ;
94- }
95- if std:: env:: var ( CHAIN_SPEC_ENV ) . is_err ( ) {
96- std:: env:: set_var ( CHAIN_SPEC_ENV , DEFAULT_CHAIN_SPEC ) ;
97- }
98- }
99-
100- fn db_snapshot_height_override ( ) -> Option < f64 > {
101- std:: env:: var ( DB_BLOCK_HEIGHT_ENV )
102- . ok ( )
103- . and_then ( |value| value. parse :: < f64 > ( ) . ok ( ) )
104- }
105-
106- async fn resolve_db_snapshot_height (
107- network : & zombienet_sdk:: Network < zombienet_sdk:: LocalFileSystem > ,
108- ) -> Result < f64 > {
109- if let Some ( override_height) = db_snapshot_height_override ( ) {
110- return Ok ( override_height) ;
111- }
112-
113- let alice = network. get_node ( "alice" ) ?;
114- let height = alice. reports ( BEST_BLOCK_METRIC ) . await ?;
115- Ok ( height)
116- }
117-
11888fn build_network_config ( ) -> Result < NetworkConfig > {
11989 let integration_image = std:: env:: var ( INTEGRATION_IMAGE_ENV )
12090 . unwrap_or_else ( |_| DEFAULT_SUBSTRATE_IMAGE . to_string ( ) ) ;
@@ -159,13 +129,20 @@ fn build_network_config() -> Result<NetworkConfig> {
159129 } )
160130}
161131
162- async fn assert_node_roles ( node : & NetworkNode ) -> Result < ( ) > {
132+ async fn assert_node_roles ( expected_role : f64 , node : & NetworkNode ) -> Result < ( ) > {
133+ let node_name = node. name ( ) ;
134+
163135 node. wait_metric_with_timeout (
164136 NODE_ROLE_METRIC ,
165- |role| ( role - VALIDATOR_ROLE_VALUE ) . abs ( ) < f64 :: EPSILON ,
137+ |role| role == expected_role ,
166138 ROLE_TIMEOUT_SECS ,
167139 )
168- . await ?;
140+ . await
141+ . with_context ( || {
142+ format ! (
143+ "node {node_name} did not expose expected role {expected_role} on metric {NODE_ROLE_METRIC}"
144+ )
145+ } ) ?;
169146
170147 Ok ( ( ) )
171148}
@@ -182,53 +159,41 @@ async fn assert_peers_count(node: &NetworkNode) -> Result<()> {
182159}
183160
184161async fn wait_for_warp_logs ( node : & NetworkNode ) -> Result < ( ) > {
185- let at_least_once = |timeout_secs| {
186- LogLineCountOptions :: new ( |count| count >= 1 , Duration :: from_secs ( timeout_secs) , false )
187- } ;
188-
189162 node. wait_log_line_count_with_timeout (
190163 "Warp sync is complete" ,
191164 false ,
192- at_least_once ( LOG_TIMEOUT_LONG_SECS ) ,
165+ log_line_at_least_once ( LOG_TIMEOUT_LONG_SECS ) ,
193166 )
194167 . await ?;
195168 node. wait_log_line_count_with_timeout (
196169 r"Checking for displaced leaves after finalization\. leaves=\[0xc5e7b4cfd23932bb930e859865430a35f6741b4732d677822d492ca64cc8d059\]" ,
197170 false ,
198- at_least_once ( LOG_TIMEOUT_SHORT_SECS ) ,
171+ log_line_at_least_once ( LOG_TIMEOUT_SHORT_SECS ) ,
199172 )
200173 . await ?;
201174 node. wait_log_line_count_with_timeout (
202175 "State sync is complete" ,
203176 false ,
204- at_least_once ( LOG_TIMEOUT_LONG_SECS ) ,
177+ log_line_at_least_once ( LOG_TIMEOUT_LONG_SECS ) ,
205178 )
206179 . await ?;
207180 node. wait_log_line_count_with_timeout (
208181 "Block history download is complete" ,
209182 false ,
210- at_least_once ( LOG_TIMEOUT_SHORT_SECS ) ,
183+ log_line_at_least_once ( LOG_TIMEOUT_SHORT_SECS ) ,
211184 )
212185 . await ?;
213186
214187 Ok ( ( ) )
215188}
216189
217190async fn wait_for_absence_of_errors ( node : & NetworkNode ) -> Result < ( ) > {
218- node. wait_log_line_count_with_timeout (
219- "error" ,
220- false ,
221- LogLineCountOptions :: no_occurences_within_timeout ( Duration :: from_secs (
222- LOG_ERROR_TIMEOUT_SECS ,
223- ) ) ,
224- )
225- . await ?;
191+ node. wait_log_line_count_with_timeout ( "error" , false , log_line_absent ( LOG_ERROR_TIMEOUT_SECS ) )
192+ . await ?;
226193 node. wait_log_line_count_with_timeout (
227194 "verification failed" ,
228195 false ,
229- LogLineCountOptions :: no_occurences_within_timeout ( Duration :: from_secs (
230- LOG_ERROR_TIMEOUT_SECS ,
231- ) ) ,
196+ log_line_absent ( LOG_ERROR_TIMEOUT_SECS ) ,
232197 )
233198 . await ?;
234199
0 commit comments