diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 40a02f9b1..b93096c74 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -36,4 +36,5 @@ jobs: - name: Run tests run: | cargo run --release --verbose -p jsontests -- \ - jsontests/res/ethtests/GeneralStateTests/stExample/add11.json + jsontests/res/ethtests/GeneralStateTests/stExample/add11.json \ + jsontests/res/ethtests/GeneralStateTests/stSLoadTest/ diff --git a/jsontests/src/error.rs b/jsontests/src/error.rs index 80b93aac0..32d6346bc 100644 --- a/jsontests/src/error.rs +++ b/jsontests/src/error.rs @@ -16,6 +16,8 @@ pub enum Error { EVM(#[from] evm::ExitError), #[error("unsupported fork")] UnsupportedFork, + #[error("non-utf8 filename")] + NonUtf8Filename, #[error("test error")] Test(#[from] TestError), } diff --git a/jsontests/src/main.rs b/jsontests/src/main.rs index 2b0c573bf..38d2fe8e0 100644 --- a/jsontests/src/main.rs +++ b/jsontests/src/main.rs @@ -7,32 +7,61 @@ use crate::error::Error; use crate::types::*; use clap::Parser; use std::collections::BTreeMap; -use std::fs::File; +use std::fs::{self, File}; use std::io::BufReader; #[derive(Parser)] #[command(author, version, about, long_about = None)] struct Cli { - filename: String, + filenames: Vec, } -fn main() -> Result<(), Error> { - let cli = Cli::parse(); - +fn run_file(filename: &str) -> Result<(), Error> { let test_multi: BTreeMap = - serde_json::from_reader(BufReader::new(File::open(cli.filename)?))?; + serde_json::from_reader(BufReader::new(File::open(filename)?))?; for (test_name, test_multi) in test_multi { let tests = test_multi.tests(); for test in tests { - match crate::run::run_test(&test_name, test) { - Ok(()) => println!("succeed"), + print!( + "{}/{}/{:?}/{}: ", + filename, test_name, test.fork, test.index + ); + match crate::run::run_test(filename, &test_name, test) { + Ok(()) => println!("okay"), Err(Error::UnsupportedFork) => println!("skipped"), - Err(err) => Err(err)?, + Err(err) => { + println!("err {:?}", err); + return Err(err); + } } } } Ok(()) } + +fn run_single(filename: &str) -> Result<(), Error> { + if fs::metadata(&filename)?.is_dir() { + for filename in fs::read_dir(&filename)? { + let filepath = filename?.path(); + let filename = filepath.to_str().ok_or(Error::NonUtf8Filename)?; + run_file(filename)?; + } + } else { + run_file(&filename)?; + } + + Ok(()) +} + +fn main() -> Result<(), Error> { + let cli = Cli::parse(); + + for filename in cli.filenames { + run_single(&filename)?; + } + + Ok(()) +} diff --git a/jsontests/src/run.rs b/jsontests/src/run.rs index 4b2c4304b..7d4044b72 100644 --- a/jsontests/src/run.rs +++ b/jsontests/src/run.rs @@ -8,12 +8,7 @@ use evm::utils::u256_to_h256; use primitive_types::U256; use std::collections::{BTreeMap, BTreeSet}; -pub fn run_test(test_name: &str, test: Test) -> Result<(), Error> { - println!( - "test name: {}, fork: {:?}, index: {}", - test_name, test.fork, test.index - ); - +pub fn run_test(_filename: &str, _test_name: &str, test: Test) -> Result<(), Error> { let config = match test.fork { Fork::Berlin => Config::berlin(), _ => return Err(Error::UnsupportedFork), @@ -67,7 +62,7 @@ pub fn run_test(test_name: &str, test: Test) -> Result<(), Error> { let etable = Etable::runtime(); let invoker = Invoker::new(&config); - let result = invoker.transact_call( + let _result = invoker.transact_call( test.transaction.sender, test.transaction.to, test.transaction.value, @@ -81,9 +76,6 @@ pub fn run_test(test_name: &str, test: Test) -> Result<(), Error> { let state_root = crate::hash::state_root(&backend); - println!("result: {:?}", result); - println!("state root: {:?}", state_root); - if state_root != test.post.hash { return Err(TestError::StateMismatch.into()); } diff --git a/jsontests/src/types.rs b/jsontests/src/types.rs index ad70c79e4..d8863f05b 100644 --- a/jsontests/src/types.rs +++ b/jsontests/src/types.rs @@ -33,7 +33,7 @@ impl TestMulti { transaction: TestTransaction { data: self.transaction.data[post_state.indexes.data].0.clone(), gas_limit: self.transaction.gas_limit[post_state.indexes.gas], - gas_price: self.transaction.gas_price, + gas_price: self.transaction.gas_price.unwrap_or(U256::zero()), nonce: self.transaction.nonce, secret_key: self.transaction.secret_key, sender: self.transaction.sender, @@ -96,6 +96,14 @@ pub enum Fork { London, Merge, Shanghai, + Byzantium, + Constantinople, + ConstantinopleFix, + EIP150, + EIP158, + Frontier, + Homestead, + Istanbul, } #[derive(Clone, Debug, Eq, PartialEq, Deserialize)] @@ -126,7 +134,9 @@ pub struct TestPreState { pub struct TestMultiTransaction { pub data: Vec, pub gas_limit: Vec, - pub gas_price: U256, + pub gas_price: Option, + pub max_fee_per_gas: Option, + pub max_priority_fee_per_gas: Option, pub nonce: U256, pub secret_key: H256, pub sender: H160,