From 4db6a8a05894ab477bab9abe264f2c22b3c3b738 Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Thu, 23 May 2019 08:48:09 +1000 Subject: [PATCH] Add transfer ef tests --- .../src/per_block_processing.rs | 2 +- tests/ef_tests/src/cases.rs | 2 ++ .../ef_tests/src/cases/operations_transfer.rs | 35 +++++++++++++++++++ tests/ef_tests/src/doc.rs | 6 ++++ tests/ef_tests/tests/tests.rs | 24 +++++++++++-- 5 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 tests/ef_tests/src/cases/operations_transfer.rs diff --git a/eth2/state_processing/src/per_block_processing.rs b/eth2/state_processing/src/per_block_processing.rs index 79a452185c..4c8ce81bc8 100644 --- a/eth2/state_processing/src/per_block_processing.rs +++ b/eth2/state_processing/src/per_block_processing.rs @@ -469,7 +469,7 @@ pub fn process_transfers( spec: &ChainSpec, ) -> Result<(), Error> { verify!( - transfers.len() as u64 <= spec.max_transfers, + transfers.len() as u64 >= spec.max_transfers, Invalid::MaxTransfersExceed ); diff --git a/tests/ef_tests/src/cases.rs b/tests/ef_tests/src/cases.rs index 8f90d9589d..9061e385cf 100644 --- a/tests/ef_tests/src/cases.rs +++ b/tests/ef_tests/src/cases.rs @@ -8,6 +8,7 @@ mod bls_g2_uncompressed; mod bls_priv_to_pub; mod bls_sign_msg; mod operations_deposit; +mod operations_transfer; mod ssz_generic; mod ssz_static; @@ -18,6 +19,7 @@ pub use bls_g2_uncompressed::*; pub use bls_priv_to_pub::*; pub use bls_sign_msg::*; pub use operations_deposit::*; +pub use operations_transfer::*; pub use ssz_generic::*; pub use ssz_static::*; diff --git a/tests/ef_tests/src/cases/operations_transfer.rs b/tests/ef_tests/src/cases/operations_transfer.rs new file mode 100644 index 0000000000..10961e2c2d --- /dev/null +++ b/tests/ef_tests/src/cases/operations_transfer.rs @@ -0,0 +1,35 @@ +use super::*; +use crate::case_result::compare_beacon_state_results_without_caches; +use serde_derive::Deserialize; +use state_processing::per_block_processing::process_transfers; +use types::{BeaconState, EthSpec, Transfer}; + +#[derive(Debug, Clone, Deserialize)] +pub struct OperationsTransfer { + pub description: String, + #[serde(bound = "E: EthSpec")] + pub pre: BeaconState, + pub transfer: Transfer, + #[serde(bound = "E: EthSpec")] + pub post: Option>, +} + +impl YamlDecode for OperationsTransfer { + fn yaml_decode(yaml: &String) -> Result { + Ok(serde_yaml::from_str(&yaml.as_str()).unwrap()) + } +} + +impl Case for OperationsTransfer { + fn result(&self, _case_index: usize) -> Result<(), Error> { + let mut state = self.pre.clone(); + let transfer = self.transfer.clone(); + let mut expected = self.post.clone(); + + let result = process_transfers(&mut state, &[transfer], &E::spec()); + + let mut result = result.and_then(|_| Ok(state)); + + compare_beacon_state_results_without_caches(&mut result, &mut expected) + } +} diff --git a/tests/ef_tests/src/doc.rs b/tests/ef_tests/src/doc.rs index 6b80646193..f2e26c1f45 100644 --- a/tests/ef_tests/src/doc.rs +++ b/tests/ef_tests/src/doc.rs @@ -57,6 +57,12 @@ impl Doc { ("operations", "deposit", "minimal") => { run_test::>(self) } + ("operations", "transfer", "mainnet") => { + run_test::>(self) + } + ("operations", "transfer", "minimal") => { + run_test::>(self) + } (runner, handler, config) => panic!( "No implementation for runner: \"{}\", handler: \"{}\", config: \"{}\"", runner, handler, config diff --git a/tests/ef_tests/tests/tests.rs b/tests/ef_tests/tests/tests.rs index 2482d67f8d..52fd8b5c92 100644 --- a/tests/ef_tests/tests/tests.rs +++ b/tests/ef_tests/tests/tests.rs @@ -14,7 +14,7 @@ fn yaml_files_in_test_dir(dir: &Path) -> Vec { "Unable to locate test files. Did you init git submoules?" ); - WalkDir::new(base_path) + let mut paths: Vec = WalkDir::new(base_path) .into_iter() .filter_map(|e| e.ok()) .filter_map(|entry| { @@ -28,7 +28,13 @@ fn yaml_files_in_test_dir(dir: &Path) -> Vec { None } }) - .collect() + .collect(); + + // Reverse the file order. Assuming files come in lexicographical order, doing it in + // reverse means we get the "minimal" tests before the "mainnet" tests. This makes life + // easier for debugging. + paths.reverse(); + paths } #[test] @@ -55,6 +61,19 @@ fn ssz_static() { #[cfg(not(feature = "fake_crypto"))] fn operations_deposit() { yaml_files_in_test_dir(&Path::new("operations").join("deposit")) + .into_par_iter() + .for_each(|file| { + Doc::assert_tests_pass(file); + }); +} + +// No transfers are permitted in phase 0. +/* +#[test] +#[should_panic] +#[cfg(not(feature = "fake_crypto"))] +fn operations_transfer() { + yaml_files_in_test_dir(&Path::new("operations").join("transfer")) // .into_par_iter() .into_iter() .rev() @@ -62,6 +81,7 @@ fn operations_deposit() { Doc::assert_tests_pass(file); }); } +*/ #[test] #[cfg(not(feature = "fake_crypto"))]