Skip to content

Commit 76323b7

Browse files
authored
fix: move Halt and resume full nodes to be ChainDriver components (#636)
* Move Halt and resume full nodes to be ChainDriver components * Add ResumeFullNodeOptions * Fix misbehaviour test * Add logs when failing to submit misbehaviour
1 parent ddab1b0 commit 76323b7

File tree

11 files changed

+106
-80
lines changed

11 files changed

+106
-80
lines changed

crates/cosmos/cosmos-integration-tests/src/contexts/binary_channel/test_driver.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ use hermes_core::test_components::driver::traits::{
1111
};
1212
use hermes_core::test_components::setup::traits::{
1313
CreateClientMessageOptionsGetterAtComponent, CreateClientPayloadOptionsGetterAtComponent,
14-
FullNodeForkerComponent, FullNodeHalterComponent, PortIdGetterAtComponent,
15-
RecoverClientPayloadOptionsGetterAtComponent,
14+
FullNodeForkerComponent, PortIdGetterAtComponent, RecoverClientPayloadOptionsGetterAtComponent,
1615
};
1716
use hermes_core::test_components::test_case::traits::recover_client::RecoverClientHandlerComponent;
1817
use hermes_cosmos_core::chain_components::impls::CosmosRecoverClientPayload;
@@ -70,7 +69,6 @@ delegate_components! {
7069
RecoverClientWithProposals,
7170
[
7271
FullNodeForkerComponent,
73-
FullNodeHalterComponent,
7472
]:
7573
ForkSecondFullNode,
7674
ChainDriverGetterAtComponent<Index<0>>:

crates/cosmos/cosmos-integration-tests/src/contexts/chain_driver.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use hermes_core::test_components::chain_driver::traits::{
1919
StakingDenom, TransferDenom, UserWallet, ValidatorWallet, WalletGetterComponent,
2020
WalletsGetterComponent,
2121
};
22+
use hermes_core::test_components::test_case::traits::node::FullNodeHalterComponent;
2223
use hermes_core::test_components::test_case::traits::upgrade_client::{
2324
SetupUpgradeClientTestHandlerComponent, UpgradeClientHandlerComponent,
2425
};
@@ -49,6 +50,8 @@ use hermes_runtime::types::runtime::HermesRuntime;
4950
use tokio::process::Child;
5051
use toml::to_string_pretty;
5152

53+
use crate::impls::HaltCosmosFullNode;
54+
5255
/**
5356
A chain driver for adding test functionalities to a Cosmos chain.
5457
*/
@@ -84,6 +87,8 @@ delegate_components! {
8487
CosmosHandleUpgradeClient,
8588
SetupUpgradeClientTestHandlerComponent:
8689
SetupCosmosUpgradeClientTest,
90+
FullNodeHalterComponent:
91+
HaltCosmosFullNode,
8792
LoggerComponent:
8893
TracingLogger,
8994
WalletsGetterComponent:

crates/cosmos/cosmos-integration-tests/src/impls/fork.rs

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
use alloc::sync::Arc;
22
use core::str::FromStr;
3-
use std::path::PathBuf;
43

54
use cgp::extra::runtime::HasRuntime;
6-
use eyre::eyre;
7-
use hermes_core::runtime_components::traits::{CanCreateDir, CanExecCommand, CanSleep};
8-
use hermes_core::test_components::setup::traits::{
9-
FullNodeForker, FullNodeForkerComponent, FullNodeHalter, FullNodeHalterComponent,
10-
};
5+
use hermes_core::runtime_components::traits::{CanCreateDir, CanSleep};
6+
use hermes_core::test_components::setup::traits::{FullNodeForker, FullNodeForkerComponent};
117
use hermes_cosmos_core::test_components::bootstrap::traits::CanStartChainFullNodes;
128
use hermes_cosmos_relayer::contexts::{CosmosBuilder, CosmosChain};
139
use hermes_error::HermesError;
@@ -21,47 +17,6 @@ use crate::impls::copy_dir_recursive;
2117

2218
pub struct ForkSecondFullNode;
2319

24-
#[cgp_provider(FullNodeHalterComponent)]
25-
impl FullNodeHalter<CosmosBinaryChannelTestDriver> for ForkSecondFullNode {
26-
async fn halt_full_node(
27-
driver: &CosmosBinaryChannelTestDriver,
28-
chain_id: String,
29-
) -> Result<(), HermesError> {
30-
let runtime = driver.chain_driver_a.chain.runtime.clone();
31-
let node_pid = if chain_id == driver.chain_driver_a.chain.chain_id.to_string() {
32-
driver
33-
.chain_driver_a
34-
.chain_processes
35-
.first()
36-
.expect("Failed to retrieve Chain Driver A chain process")
37-
.id()
38-
.expect("failed to retrieve Chain Driver A chain process ID")
39-
} else if chain_id == driver.chain_driver_b.chain.chain_id.to_string() {
40-
driver
41-
.chain_driver_b
42-
.chain_processes
43-
.first()
44-
.expect("Failed to retrieve Chain Driver B chain process")
45-
.id()
46-
.expect("failed to retrieve Chain Driver B chain process ID")
47-
} else {
48-
return Err(eyre!("Unknown chain ID: {chain_id}").into());
49-
};
50-
51-
// Stop full node
52-
// `kill` is used here instead of `Child::kill()` as the `kill()` method requires
53-
// the child process to be mutable.
54-
runtime
55-
.exec_command(
56-
&PathBuf::from("kill".to_string()),
57-
&["-s", "KILL", &node_pid.to_string()],
58-
)
59-
.await?;
60-
61-
Ok(())
62-
}
63-
}
64-
6520
#[cgp_provider(FullNodeForkerComponent)]
6621
impl FullNodeForker<CosmosBinaryChannelTestDriver> for ForkSecondFullNode {
6722
async fn fork_full_node(

crates/cosmos/cosmos-integration-tests/src/impls/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ pub use fork::*;
1010
mod init_channel_options;
1111
pub use init_channel_options::*;
1212

13+
mod node;
14+
pub use node::*;
15+
1316
mod test_driver;
1417
pub use test_driver::*;
1518

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use std::path::PathBuf;
2+
3+
use hermes_core::runtime_components::traits::CanExecCommand;
4+
use hermes_core::test_components::test_case::traits::node::{
5+
FullNodeHalter, FullNodeHalterComponent,
6+
};
7+
use hermes_error::HermesError;
8+
use hermes_prelude::*;
9+
10+
use crate::contexts::CosmosChainDriver;
11+
12+
#[cgp_new_provider(FullNodeHalterComponent)]
13+
impl FullNodeHalter<CosmosChainDriver> for HaltCosmosFullNode {
14+
async fn halt_full_node(chain_driver: &CosmosChainDriver) -> Result<(), HermesError> {
15+
let runtime = chain_driver.chain.runtime.clone();
16+
let node_pid = chain_driver
17+
.chain_processes
18+
.first()
19+
.expect("Failed to retrieve Chain Driver A chain process")
20+
.id()
21+
.expect("failed to retrieve Chain Driver A chain process ID");
22+
23+
// Stop full node
24+
// `kill` is used here instead of `Child::kill()` as the `kill()` method requires
25+
// the child process to be mutable.
26+
runtime
27+
.exec_command(
28+
&PathBuf::from("kill".to_string()),
29+
&["-s", "KILL", &node_pid.to_string()],
30+
)
31+
.await?;
32+
33+
Ok(())
34+
}
35+
}

crates/relayer/relayer-components/src/relay/impls/event_relayers/packet_event.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,25 @@ where
110110
.await
111111
.map_err(Relay::raise_error)?;
112112

113-
src_chain
113+
if let Err(e) = src_chain
114114
.send_message(msg)
115115
.await
116-
.map_err(Relay::raise_error)?;
116+
.map_err(Relay::raise_error)
117+
{
118+
relay
119+
.log(
120+
&format!("Failed to submit misbeahviour message: {e:?}"),
121+
&LevelWarn,
122+
)
123+
.await;
124+
} else {
125+
relay
126+
.log(
127+
&format!("Successfully submitted misbehaviour message for client {src_client_id}"),
128+
&LevelDebug,
129+
)
130+
.await;
131+
}
117132
}
118133
Ok(None) => {
119134
relay.log("no misbehaviour detected", &LevelDebug).await;

crates/test/test-components/src/setup/traits/node.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,3 @@ use hermes_prelude::*;
1010
pub trait CanForkFullNode: HasAsyncErrorType + Async + Sized {
1111
async fn fork_full_node(&self, chain_id: String) -> Result<Self, Self::Error>;
1212
}
13-
14-
#[cgp_component {
15-
provider: FullNodeHalter,
16-
context: Driver,
17-
}]
18-
#[async_trait]
19-
pub trait CanHaltFullNode: HasAsyncErrorType + Async + Sized {
20-
async fn halt_full_node(&self, chain_id: String) -> Result<(), Self::Error>;
21-
}
22-
23-
#[cgp_component {
24-
provider: FullNodeResumer,
25-
context: Driver,
26-
}]
27-
#[async_trait]
28-
pub trait CanResumeFullNode: HasAsyncErrorType + Async + Sized {
29-
async fn resume_full_node(&self, chain_id: String) -> Result<Self, Self::Error>;
30-
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod node;
12
pub mod recover_client;
23
pub mod test_case;
34
pub mod upgrade_client;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use hermes_prelude::*;
2+
3+
#[cgp_component {
4+
provider: FullNodeHalter,
5+
context: ChainDriver,
6+
}]
7+
#[async_trait]
8+
pub trait CanHaltFullNode: HasAsyncErrorType {
9+
async fn halt_full_node(&self) -> Result<(), Self::Error>;
10+
}
11+
12+
#[cgp_component {
13+
provider: FullNodeResumer,
14+
context: ChainDriver,
15+
}]
16+
#[async_trait]
17+
pub trait CanResumeFullNode: HasResumeFullNodeOptionsType + HasAsyncErrorType + Sized {
18+
async fn resume_full_node(
19+
&self,
20+
options: &Self::ResumeFullNodeOptions,
21+
) -> Result<Self, Self::Error>;
22+
}
23+
24+
#[cgp_type]
25+
pub trait HasResumeFullNodeOptionsType {
26+
type ResumeFullNodeOptions: Async;
27+
}

crates/test/test-suite/src/tests/misebehaviour.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use hermes_chain_components::traits::{
99
};
1010
use hermes_prelude::*;
1111
use hermes_test_components::relay_driver::run::CanRunRelayerInBackground;
12-
use hermes_test_components::setup::traits::{CanForkFullNode, CanHaltFullNode};
12+
use hermes_test_components::setup::traits::CanForkFullNode;
13+
use hermes_test_components::test_case::traits::node::CanHaltFullNode;
1314
use hermes_test_components::test_case::traits::test_case::TestCase;
1415

1516
use crate::traits::CanUseBinaryTestDriverMethods;
@@ -24,16 +25,16 @@ impl<A, B> Default for TestMisbehaviourDetection<A, B> {
2425

2526
impl<Driver, A, B> TestCase<Driver> for TestMisbehaviourDetection<A, B>
2627
where
27-
Driver: CanUseBinaryTestDriverMethods<A, B>
28-
+ CanForkFullNode
29-
+ CanHaltFullNode
30-
+ CanRaiseAsyncError<&'static str>,
28+
Driver:
29+
CanUseBinaryTestDriverMethods<A, B> + CanForkFullNode + CanRaiseAsyncError<&'static str>,
3130
A: Async,
3231
B: Async,
3332
{
3433
async fn run_test(&self, driver: &Driver) -> Result<(), Driver::Error> {
3534
let relay_driver = driver.relay_driver();
3635

36+
let chain_driver_b = driver.chain_driver_b();
37+
3738
let chain_a = driver.chain_a();
3839

3940
let client_id_a = driver.client_id_a();
@@ -44,9 +45,10 @@ where
4445

4546
tokio::time::sleep(Duration::from_secs(10)).await;
4647

47-
driver
48-
.halt_full_node(driver.chain_b().chain_id().to_string())
49-
.await?;
48+
chain_driver_b
49+
.halt_full_node()
50+
.await
51+
.map_err(Driver::raise_error)?;
5052

5153
let forked_setup = driver
5254
.fork_full_node(driver.chain_b().chain_id().to_string())

0 commit comments

Comments
 (0)