Fix chunk index bug with structs

This commit is contained in:
Paul Hauner 2019-04-26 17:39:38 +10:00
parent d3309b9f7e
commit a425beb42a
No known key found for this signature in database
GPG Key ID: D362883A9218FCC6
4 changed files with 44 additions and 5 deletions

View File

@ -44,16 +44,14 @@ macro_rules! cached_tree_hash_tests {
let mut rng = XorShiftRng::from_seed([42; 16]);
// Test the original hash
let original = $type::random_for_test(&mut rng);
let mut hasher = cached_tree_hash::CachedTreeHasher::new(&original).unwrap();
assert_eq!(hasher.tree_hash_root().unwrap(), original.tree_hash_root());
// Test the updated hash
let modified = $type::random_for_test(&mut rng);
hasher.update(&modified).unwrap();
assert_eq!(hasher.tree_hash_root().unwrap(), modified.tree_hash_root());
}
};

View File

@ -28,7 +28,7 @@ pub trait CachedTreeHash<Item>: TreeHash {
#[derive(Debug, PartialEq)]
pub struct CachedTreeHasher {
cache: TreeHashCache,
pub cache: TreeHashCache,
}
impl CachedTreeHasher {

View File

@ -423,6 +423,45 @@ fn test_struct_with_two_vecs() {
}
}
#[derive(Clone, Debug, TreeHash, CachedTreeHash)]
pub struct U64AndTwoStructs {
pub a: u64,
pub b: Inner,
pub c: Inner,
}
#[test]
fn test_u64_and_two_structs() {
let inners = get_inners();
let variants = vec![
U64AndTwoStructs {
a: 99,
b: inners[0].clone(),
c: inners[1].clone(),
},
U64AndTwoStructs {
a: 10,
b: inners[2].clone(),
c: inners[3].clone(),
},
U64AndTwoStructs {
a: 0,
b: inners[1].clone(),
c: inners[1].clone(),
},
U64AndTwoStructs {
a: 0,
b: inners[1].clone(),
c: inners[1].clone(),
},
];
for v in &variants {
test_routine(v.clone(), variants.clone());
}
}
#[derive(Clone, Debug, TreeHash, CachedTreeHash)]
pub struct Inner {
pub a: u64,

View File

@ -102,6 +102,8 @@ pub fn subtree_derive(input: TokenStream) -> TokenStream {
// Iterate through the internal nodes, updating them if their children have changed.
cache.update_internal_nodes(&overlay)?;
cache.chunk_index = overlay.next_node();
Ok(())
}
}