From 3f22278afb864565bca499245a32f070280cb5d4 Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Tue, 18 Nov 2025 09:27:09 +0100 Subject: [PATCH 1/3] Run all cheatcodes tests in pallet-revive --- crates/forge/tests/it/revive/cheats.rs | 66 ++++++++++++++++++++++++++ crates/forge/tests/it/revive/mod.rs | 1 + crates/forge/tests/it/test_helpers.rs | 6 +++ 3 files changed, 73 insertions(+) create mode 100644 crates/forge/tests/it/revive/cheats.rs diff --git a/crates/forge/tests/it/revive/cheats.rs b/crates/forge/tests/it/revive/cheats.rs new file mode 100644 index 0000000000000..45f67344644bb --- /dev/null +++ b/crates/forge/tests/it/revive/cheats.rs @@ -0,0 +1,66 @@ +//! Forge tests for cheatcodes on pallet-revive. +//! A copy of the original cheats.rs tests + +use crate::{config::*, test_helpers::TEST_DATA_REVIVE}; +use foundry_test_utils::Filter; +use revive_strategy::ReviveRuntimeMode; +use revm::primitives::hardfork::SpecId; +use rstest::rstest; + +/// Executes all cheat code tests on pallet-revive but not fork cheat codes or tests that +/// require isolation mode or specific seed. +#[rstest] +//#[case::pvm(ReviveRuntimeMode::Pvm)] +#[case::evm(ReviveRuntimeMode::Evm)] +#[tokio::test(flavor = "multi_thread")] +async fn test_revive_cheats_local(#[case] runtime_mode: ReviveRuntimeMode) { + let mut filter = Filter::new(".*", ".*", ".*/cheats/.*") + .exclude_paths("Fork") + .exclude_contracts("(Isolated|WithSeed)"); + + // Exclude FFI tests on Windows because no `echo`, and file tests that expect certain file paths + if cfg!(windows) { + filter = filter.exclude_tests("(Ffi|File|Line|Root)"); + } + + if cfg!(feature = "isolate-by-default") { + filter = filter.exclude_contracts("(LastCallGasDefaultTest|MockFunctionTest|WithSeed)"); + } + + let runner = TEST_DATA_REVIVE.runner_revive_with(runtime_mode, |config| { + use foundry_config::{fs_permissions::PathPermission, FsPermissions}; + + config.fs_permissions = FsPermissions::new(vec![PathPermission::read_write("./")]); + }); + + let runner = TEST_DATA_REVIVE.runner_revive(runtime_mode); + TestConfig::with_filter(runner, filter).spec_id(SpecId::PRAGUE).run().await; +} + +/// Executes subset of all cheat code tests in isolation mode on pallet-revive. +#[rstest] +//#[case::pvm(ReviveRuntimeMode::Pvm)] +#[case::evm(ReviveRuntimeMode::Evm)] +#[tokio::test(flavor = "multi_thread")] +async fn test_revive_cheats_local_isolated(#[case] runtime_mode: ReviveRuntimeMode) { + let filter = Filter::new(".*", ".*(Isolated)", ".*/cheats/.*"); + + let runner = TEST_DATA_REVIVE.runner_revive_with(runtime_mode, |config| { + config.isolate = true; + }); + TestConfig::with_filter(runner, filter).spec_id(SpecId::PRAGUE).run().await; +} + +/// Executes subset of all cheat code tests using a specific seed on pallet-revive. +#[rstest] +//#[case::pvm(ReviveRuntimeMode::Pvm)] +#[case::evm(ReviveRuntimeMode::Evm)] +#[tokio::test(flavor = "multi_thread")] +async fn test_revive_cheats_local_with_seed(#[case] runtime_mode: ReviveRuntimeMode) { + let filter = Filter::new(".*", ".*(WithSeed)", ".*/cheats/.*"); + + let runner = TEST_DATA_REVIVE.runner_revive_with(runtime_mode, |config| { + config.fuzz.seed = Some(alloy_primitives::U256::from(100)); + }); + TestConfig::with_filter(runner, filter).spec_id(SpecId::PRAGUE).run().await; +} diff --git a/crates/forge/tests/it/revive/mod.rs b/crates/forge/tests/it/revive/mod.rs index 2d929b8d534d8..1dbf5beda1a95 100644 --- a/crates/forge/tests/it/revive/mod.rs +++ b/crates/forge/tests/it/revive/mod.rs @@ -7,5 +7,6 @@ pub mod cheat_mock_calls; pub mod cheat_mock_functions; pub mod cheat_prank; pub mod cheat_store; +pub mod cheats; pub mod migration; pub mod tx_gas_price; diff --git a/crates/forge/tests/it/test_helpers.rs b/crates/forge/tests/it/test_helpers.rs index fc1e2b329c057..51ff433fbe4aa 100644 --- a/crates/forge/tests/it/test_helpers.rs +++ b/crates/forge/tests/it/test_helpers.rs @@ -327,7 +327,13 @@ impl ForgeTestData { /// Builds a runner with revive strategy for polkadot/substrate testing pub fn runner_revive(&self, runtime_mode: ReviveRuntimeMode) -> MultiContractRunner { + self.runner_revive_with(runtime_mode, |_| {}) + } + + pub fn runner_revive_with(&self, runtime_mode: ReviveRuntimeMode, modify: impl FnOnce(&mut Config) -> MultiContractRunner + { let mut config = (*self.config).clone(); + modify(&mut config); config.rpc_endpoints = rpc_endpoints(); config.allow_paths.push(manifest_root().to_path_buf()); if config.fs_permissions.is_empty() { From 5c2d0b65037e04093c4217ffc27de363334d632f Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Tue, 18 Nov 2025 11:12:23 +0100 Subject: [PATCH 2/3] Fmt --- crates/forge/tests/it/revive/cheats.rs | 2 +- crates/forge/tests/it/test_helpers.rs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/forge/tests/it/revive/cheats.rs b/crates/forge/tests/it/revive/cheats.rs index 45f67344644bb..4d7784d602a30 100644 --- a/crates/forge/tests/it/revive/cheats.rs +++ b/crates/forge/tests/it/revive/cheats.rs @@ -28,7 +28,7 @@ async fn test_revive_cheats_local(#[case] runtime_mode: ReviveRuntimeMode) { } let runner = TEST_DATA_REVIVE.runner_revive_with(runtime_mode, |config| { - use foundry_config::{fs_permissions::PathPermission, FsPermissions}; + use foundry_config::{FsPermissions, fs_permissions::PathPermission}; config.fs_permissions = FsPermissions::new(vec![PathPermission::read_write("./")]); }); diff --git a/crates/forge/tests/it/test_helpers.rs b/crates/forge/tests/it/test_helpers.rs index 51ff433fbe4aa..df312e71bd10f 100644 --- a/crates/forge/tests/it/test_helpers.rs +++ b/crates/forge/tests/it/test_helpers.rs @@ -330,8 +330,11 @@ impl ForgeTestData { self.runner_revive_with(runtime_mode, |_| {}) } - pub fn runner_revive_with(&self, runtime_mode: ReviveRuntimeMode, modify: impl FnOnce(&mut Config) -> MultiContractRunner - { + pub fn runner_revive_with( + &self, + runtime_mode: ReviveRuntimeMode, + modify: impl FnOnce(&mut Config), + ) -> MultiContractRunner { let mut config = (*self.config).clone(); modify(&mut config); config.rpc_endpoints = rpc_endpoints(); From 0aeb8b916b8155c96d4b5338b5bf1ca4b9381a1d Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Tue, 18 Nov 2025 22:27:01 +0100 Subject: [PATCH 3/3] Fix code duplication --- crates/forge/tests/it/revive/cheats.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/forge/tests/it/revive/cheats.rs b/crates/forge/tests/it/revive/cheats.rs index 4d7784d602a30..fd50b656dbeaf 100644 --- a/crates/forge/tests/it/revive/cheats.rs +++ b/crates/forge/tests/it/revive/cheats.rs @@ -32,8 +32,6 @@ async fn test_revive_cheats_local(#[case] runtime_mode: ReviveRuntimeMode) { config.fs_permissions = FsPermissions::new(vec![PathPermission::read_write("./")]); }); - - let runner = TEST_DATA_REVIVE.runner_revive(runtime_mode); TestConfig::with_filter(runner, filter).spec_id(SpecId::PRAGUE).run().await; }