From bd57293911ae903bb025c75ce4aad8179b2e14e9 Mon Sep 17 00:00:00 2001 From: playX18 Date: Tue, 10 Mar 2026 14:32:51 +0700 Subject: [PATCH 1/3] test(ethexe): Add integration test for multiple validators with repeated ping --- ethexe/service/src/tests/mod.rs | 88 +++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/ethexe/service/src/tests/mod.rs b/ethexe/service/src/tests/mod.rs index 5c0e164485a..7d08e8bce33 100644 --- a/ethexe/service/src/tests/mod.rs +++ b/ethexe/service/src/tests/mod.rs @@ -1482,6 +1482,94 @@ async fn multiple_validators() { assert_eq!(res.payload, res.message_id.encode().as_slice()); } +#[tokio::test(flavor = "multi_thread")] +#[ntest::timeout(660_000)] +async fn many_validators_repeated_ping() { + init_logger(); + + const VALIDATORS_COUNT: usize = 32; + const PING_ROUNDS: usize = 176; + + log::info!( + "📗 Starting many_validators_repeated_ping with {VALIDATORS_COUNT} validators and {PING_ROUNDS} ping rounds" + ); + + let signer = Signer::memory(); + let validators: Vec<_> = (0..VALIDATORS_COUNT) + .map(|_| signer.generate().expect("must generate validator key")) + .collect(); + + let config = TestEnvConfig { + validators: ValidatorsConfig::ProvidedValidators(validators), + network: EnvNetworkConfig::Enabled, + signer: signer.clone(), + ..Default::default() + }; + let mut env = TestEnv::new(config).await.unwrap(); + + log::info!("📗 Top-up balances for all validator accounts"); + let validator_balance: U256 = (10_000 * ETHER).try_into().unwrap(); + for validator in &env.validators { + env.provider + .anvil_set_balance(validator.public_key.to_address().into(), validator_balance) + .await + .unwrap(); + } + + let mut running_validators = Vec::with_capacity(VALIDATORS_COUNT); + for (i, validator_cfg) in env.validators.clone().into_iter().enumerate() { + log::info!("📗 Starting validator-{i}"); + let mut node = env.new_node(NodeConfig::named(format!("validator-{i}")).validator(validator_cfg)); + node.start_service().await; + running_validators.push(node); + } + + log::info!("📗 Upload demo_ping code"); + let uploaded_code = env + .upload_code(demo_ping::WASM_BINARY) + .await + .unwrap() + .wait_for() + .await + .unwrap(); + assert!(uploaded_code.valid); + + log::info!("📗 Create demo_ping program"); + let program = env + .create_program(uploaded_code.code_id, 500_000_000_000_000) + .await + .unwrap() + .wait_for() + .await + .unwrap(); + + let ping_id = program.program_id; + for i in 0..PING_ROUNDS { + log::info!("📗 PING round {}/{}", i + 1, PING_ROUNDS); + let reply = env + .send_message(ping_id, b"PING") + .await + .unwrap() + .wait_for() + .await + .unwrap(); + + assert_eq!(reply.program_id, ping_id, "unexpected program for round {i}"); + assert_eq!( + reply.code, + ReplyCode::Success(SuccessReplyReason::Manual), + "unexpected reply code for round {i}" + ); + assert_eq!(reply.payload, b"PONG", "unexpected payload for round {i}"); + assert_eq!(reply.value, 0, "unexpected value for round {i}"); + } + + log::info!("📗 Completed all ping rounds successfully"); + + + assert_eq!(running_validators.len(), VALIDATORS_COUNT); +} + #[tokio::test(flavor = "multi_thread")] #[ntest::timeout(60_000)] async fn send_injected_tx() { From 35ed99bc7c1fa0b8ba786152a6f7cc1330bf5a3f Mon Sep 17 00:00:00 2001 From: playX18 Date: Tue, 10 Mar 2026 14:36:02 +0700 Subject: [PATCH 2/3] fmt --- ethexe/service/src/tests/mod.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ethexe/service/src/tests/mod.rs b/ethexe/service/src/tests/mod.rs index 7d08e8bce33..e131b28ea5b 100644 --- a/ethexe/service/src/tests/mod.rs +++ b/ethexe/service/src/tests/mod.rs @@ -1488,7 +1488,7 @@ async fn many_validators_repeated_ping() { init_logger(); const VALIDATORS_COUNT: usize = 32; - const PING_ROUNDS: usize = 176; + const PING_ROUNDS: usize = 512; log::info!( "📗 Starting many_validators_repeated_ping with {VALIDATORS_COUNT} validators and {PING_ROUNDS} ping rounds" @@ -1519,7 +1519,8 @@ async fn many_validators_repeated_ping() { let mut running_validators = Vec::with_capacity(VALIDATORS_COUNT); for (i, validator_cfg) in env.validators.clone().into_iter().enumerate() { log::info!("📗 Starting validator-{i}"); - let mut node = env.new_node(NodeConfig::named(format!("validator-{i}")).validator(validator_cfg)); + let mut node = + env.new_node(NodeConfig::named(format!("validator-{i}")).validator(validator_cfg)); node.start_service().await; running_validators.push(node); } @@ -1554,7 +1555,10 @@ async fn many_validators_repeated_ping() { .await .unwrap(); - assert_eq!(reply.program_id, ping_id, "unexpected program for round {i}"); + assert_eq!( + reply.program_id, ping_id, + "unexpected program for round {i}" + ); assert_eq!( reply.code, ReplyCode::Success(SuccessReplyReason::Manual), @@ -1566,7 +1570,6 @@ async fn many_validators_repeated_ping() { log::info!("📗 Completed all ping rounds successfully"); - assert_eq!(running_validators.len(), VALIDATORS_COUNT); } From 2e963958ab469f36cb79bae5258ba4c3eea9df5c Mon Sep 17 00:00:00 2001 From: playX18 Date: Tue, 24 Mar 2026 07:01:24 +0700 Subject: [PATCH 3/3] reduce runtime --- ethexe/service/src/tests/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ethexe/service/src/tests/mod.rs b/ethexe/service/src/tests/mod.rs index 324d8f5d4fb..8fd2e5c6fb1 100644 --- a/ethexe/service/src/tests/mod.rs +++ b/ethexe/service/src/tests/mod.rs @@ -1505,12 +1505,12 @@ async fn multiple_validators() { } #[tokio::test(flavor = "multi_thread")] -#[ntest::timeout(660_000)] +#[ntest::timeout(60_000)] async fn many_validators_repeated_ping() { init_logger(); - const VALIDATORS_COUNT: usize = 32; - const PING_ROUNDS: usize = 512; + const VALIDATORS_COUNT: usize = 16; + const PING_ROUNDS: usize = 92; log::info!( "📗 Starting many_validators_repeated_ping with {VALIDATORS_COUNT} validators and {PING_ROUNDS} ping rounds"