From 5626ee69d807a1625e9389891759d35a412639ff Mon Sep 17 00:00:00 2001 From: antoniolocascio Date: Tue, 14 Jan 2025 14:52:56 +0100 Subject: [PATCH 1/2] Tester: add cli arg for specifying label --- evm_tester/src/evm_tester/arguments.rs | 4 ++++ evm_tester/src/evm_tester/main.rs | 3 ++- evm_tester/src/filters.rs | 16 +++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/evm_tester/src/evm_tester/arguments.rs b/evm_tester/src/evm_tester/arguments.rs index 26d47ff..fcb92f2 100644 --- a/evm_tester/src/evm_tester/arguments.rs +++ b/evm_tester/src/evm_tester/arguments.rs @@ -26,6 +26,10 @@ pub struct Arguments { #[structopt(short = "g", long = "group")] pub groups: Vec, + /// Runs only tests with the specified labels. + #[structopt(short = "l", long = "label")] + pub labels: Vec, + /// Sets the number of threads, which execute the tests concurrently. #[structopt(short = "t", long = "threads")] pub threads: Option, diff --git a/evm_tester/src/evm_tester/main.rs b/evm_tester/src/evm_tester/main.rs index 938c1a6..c1ea3d2 100644 --- a/evm_tester/src/evm_tester/main.rs +++ b/evm_tester/src/evm_tester/main.rs @@ -42,7 +42,7 @@ fn main_inner(arguments: Arguments) -> anyhow::Result<()> { let summary = evm_tester::Summary::new(arguments.verbosity, arguments.quiet).wrap(); - let filters = evm_tester::Filters::new(arguments.paths, arguments.groups); + let filters = evm_tester::Filters::new(arguments.paths, arguments.groups, arguments.labels); let evm_tester = evm_tester::EvmTester::new(summary.clone(), filters, arguments.workflow)?; @@ -102,6 +102,7 @@ mod tests { quiet: false, paths: vec!["tests/solidity/simple/default.sol".to_owned()], groups: vec![], + labels: vec![], threads: Some(1), environment: None, workflow: evm_tester::Workflow::BuildAndRun, diff --git a/evm_tester/src/filters.rs b/evm_tester/src/filters.rs index 1815533..a4c31c5 100644 --- a/evm_tester/src/filters.rs +++ b/evm_tester/src/filters.rs @@ -13,16 +13,23 @@ pub struct Filters { path_filters: HashSet, /// The group filters. group_filters: HashSet, + /// The label filters. + label_filters: HashSet, } impl Filters { /// /// A shortcut constructor. /// - pub fn new(path_filters: Vec, group_filters: Vec) -> Self { + pub fn new( + path_filters: Vec, + group_filters: Vec, + label_filters: Vec, + ) -> Self { Self { path_filters: path_filters.into_iter().collect(), group_filters: group_filters.into_iter().collect(), + label_filters: label_filters.into_iter().collect(), } } @@ -46,6 +53,13 @@ impl Filters { self.path_filters.is_empty() || self.path_filters.iter().any(|filter| path.contains(filter)) } + /// + /// Check if the test case label is compatible with the filters. + /// + pub fn check_case_label(&self, label: &str) -> bool { + self.label_filters.is_empty() || self.label_filters.contains(label) + } + /// /// Check if the test group is compatible with the filters. /// From b340da7901c68e50eb4ae4cf763ad1347a86847d Mon Sep 17 00:00:00 2001 From: antoniolocascio Date: Tue, 14 Jan 2025 14:53:25 +0100 Subject: [PATCH 2/2] Tester: filter test cases using label filter --- evm_tester/src/test/case/mod.rs | 15 +++++++++++++-- evm_tester/src/test/mod.rs | 4 +++- .../src/test_suits/ethereum_general_state/mod.rs | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/evm_tester/src/test/case/mod.rs b/evm_tester/src/test/case/mod.rs index 136f947..d606f87 100644 --- a/evm_tester/src/test/case/mod.rs +++ b/evm_tester/src/test/case/mod.rs @@ -17,7 +17,7 @@ use crate::{ eravm::system_context::SystemContext, zk_ee::{ZkOS, ZkOsEVMContext}, }, - EraVM, EraVMDeployer, Summary, + EraVM, EraVMDeployer, Filters, Summary, }; use super::{ @@ -86,6 +86,7 @@ impl Case { pub fn from_ethereum_test( test_definition: &TestStructure, test_filler: &FillerStructure, + filters: &Filters, ) -> Vec { let mut cases = vec![]; @@ -158,6 +159,16 @@ impl Case { None }; + // If label is not preset, we use the index + let final_label = label.clone().unwrap_or(case_idx.to_string()); + + // Apply label-based filter + if !Filters::check_case_label(filters, final_label.as_str()) { + case_counter += 1; + + continue; + } + let prestate = test_definition.pre.clone(); let transaction = Transaction { @@ -202,7 +213,7 @@ impl Case { let (expected_state, expect_exception) = &expected_results_states[index]; cases.push(Case { - label: label.unwrap_or(case_idx.to_string()), + label: final_label, prestate, transaction, post_state: None, diff --git a/evm_tester/src/test/mod.rs b/evm_tester/src/test/mod.rs index d4dda92..fe55588 100644 --- a/evm_tester/src/test/mod.rs +++ b/evm_tester/src/test/mod.rs @@ -19,6 +19,7 @@ use crate::summary::Summary; use crate::test::case::Case; use crate::vm::eravm::deployers::EraVMDeployer; use crate::vm::eravm::EraVM; +use crate::Filters; use crate::ZkOS; fn wrap_numbers_in_quotes(input: &str) -> String { @@ -81,6 +82,7 @@ impl Test { is_json: bool, skipped_calldatas: Option>, skipped_cases: Option>, + filters: &Filters, ) -> Self { let cleaned_str = str.replace("0x:bigint ", ""); let test_structure: HashMap = @@ -100,7 +102,7 @@ impl Test { let test_definition = test_structure.get(keys[0]).expect("Always exists"); let test_filler = test_filler_structure.get(keys[0]).expect("Always exists"); - let cases = Case::from_ethereum_test(test_definition, test_filler); + let cases = Case::from_ethereum_test(test_definition, test_filler, filters); Self { name: test_name.clone(), diff --git a/evm_tester/src/test_suits/ethereum_general_state/mod.rs b/evm_tester/src/test_suits/ethereum_general_state/mod.rs index 6b58006..8ec8523 100644 --- a/evm_tester/src/test_suits/ethereum_general_state/mod.rs +++ b/evm_tester/src/test_suits/ethereum_general_state/mod.rs @@ -96,6 +96,7 @@ impl Collection for EthereumGeneralStateTestsDirectory { is_json, test.skip_calldatas, test.skip_cases, + filters, )) }) .collect())