Improve error messages for ef_tests

This commit is contained in:
Paul Hauner 2019-05-23 16:55:50 +10:00
parent d0ab1a0576
commit 92610b4fd3
No known key found for this signature in database
GPG Key ID: 5E2CFF9B75FA63DF
9 changed files with 43 additions and 16 deletions

View File

@ -153,7 +153,7 @@ fn test_cache_initialization<'a, T: EthSpec>(
.unwrap();
// Drop the cache.
state.drop_cache(relative_epoch);
state.drop_committee_cache(relative_epoch);
// Assert a call to a cache-using function fail.
assert_eq!(

View File

@ -13,10 +13,10 @@ pub struct CaseResult {
}
impl CaseResult {
pub fn new<T: Debug>(case_index: usize, case: &T, result: Result<(), Error>) -> Self {
pub fn new(case_index: usize, case: &impl Case, result: Result<(), Error>) -> Self {
CaseResult {
case_index,
desc: format!("{:?}", case),
desc: case.description(),
result,
}
}
@ -60,7 +60,7 @@ where
if !mismatching_fields.is_empty() {
Err(Error::NotEqual(format!(
"Fields not equal: {:#?}",
"Fields not equal (a = expected, b = result): {:#?}",
mismatching_fields
)))
} else {

View File

@ -25,7 +25,14 @@ pub use operations_transfer::*;
pub use ssz_generic::*;
pub use ssz_static::*;
pub trait Case {
pub trait Case: Debug {
/// An optional field for implementing a custom description.
///
/// Defaults to "no description".
fn description(&self) -> String {
"no description".to_string()
}
/// Execute a test and return the result.
///
/// `case_index` reports the index of the case in the set of test cases. It is not strictly

View File

@ -21,6 +21,10 @@ impl<E: EthSpec> YamlDecode for OperationsDeposit<E> {
}
impl<E: EthSpec> Case for OperationsDeposit<E> {
fn description(&self) -> String {
self.description.clone()
}
fn result(&self, _case_index: usize) -> Result<(), Error> {
let mut state = self.pre.clone();
let deposit = self.deposit.clone();

View File

@ -21,12 +21,16 @@ impl<E: EthSpec> YamlDecode for OperationsExit<E> {
}
impl<E: EthSpec> Case for OperationsExit<E> {
fn description(&self) -> String {
self.description.clone()
}
fn result(&self, _case_index: usize) -> Result<(), Error> {
let mut state = self.pre.clone();
let exit = self.voluntary_exit.clone();
let mut expected = self.post.clone();
// Epoch processing requires the epoch cache.
// Exit processing requires the epoch cache.
state.build_all_caches(&E::spec()).unwrap();
let result = process_exits(&mut state, &[exit], &E::spec());

View File

@ -21,12 +21,22 @@ impl<E: EthSpec> YamlDecode for OperationsTransfer<E> {
}
impl<E: EthSpec> Case for OperationsTransfer<E> {
fn description(&self) -> String {
self.description.clone()
}
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());
// Transfer processing requires the epoch cache.
state.build_all_caches(&E::spec()).unwrap();
let mut spec = E::spec();
spec.max_transfers = 1;
let result = process_transfers(&mut state, &[transfer], &spec);
let mut result = result.and_then(|_| Ok(state));

View File

@ -123,7 +123,12 @@ pub fn print_failures(doc: &Doc, results: &[CaseResult]) {
let error = failure.result.clone().unwrap_err();
println!("-------");
println!("case[{}] failed with {}:", failure.case_index, error.name());
println!(
"case[{}] ({}) failed with {}:",
failure.case_index,
failure.desc,
error.name()
);
println!("{}", error.message());
}
println!("");

View File

@ -1,6 +1,7 @@
use types::EthSpec;
pub use case_result::CaseResult;
pub use cases::Case;
pub use doc::Doc;
pub use error::Error;
pub use yaml_decode::YamlDecode;

View File

@ -33,9 +33,9 @@ fn yaml_files_in_test_dir(dir: &Path) -> Vec<PathBuf> {
})
.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.
// Reverse the file order. Assuming files come in lexicographical order, executing tests in
// reverse means we get the "minimal" tests before the "mainnet" tests. This makes life easier
// for debugging.
paths.reverse();
paths
}
@ -70,20 +70,16 @@ fn operations_deposit() {
});
}
// No transfers are permitted in phase 0.
/*
#[test]
#[cfg(not(feature = "fake_crypto"))]
fn operations_transfer() {
yaml_files_in_test_dir(&Path::new("operations").join("transfer"))
// .into_par_iter()
.into_iter()
.into_par_iter()
.rev()
.for_each(|file| {
Doc::assert_tests_pass(file);
});
}
*/
#[test]
#[cfg(not(feature = "fake_crypto"))]