From 34d5db0de657fa8e1e4888d17b70494cf77c19a2 Mon Sep 17 00:00:00 2001 From: Nikolay Volf <nikvolf@gmail.com> Date: Sun, 3 May 2020 16:30:42 +0300 Subject: [PATCH] Another state machine test (#5875) * another state machine test * add more asserts and remove 'remov_then_append' --- substrate/primitives/state-machine/src/lib.rs | 108 +++++++++++++++--- 1 file changed, 89 insertions(+), 19 deletions(-) diff --git a/substrate/primitives/state-machine/src/lib.rs b/substrate/primitives/state-machine/src/lib.rs index 0577afea004..a023f21d733 100644 --- a/substrate/primitives/state-machine/src/lib.rs +++ b/substrate/primitives/state-machine/src/lib.rs @@ -1127,29 +1127,99 @@ mod tests { } #[test] - fn remove_then_append() { - let key = b"key".to_vec(); + fn remove_with_append_then_rollback_appended_then_append_again() { + + #[derive(codec::Encode, codec::Decode)] + enum Item { InitializationItem, DiscardedItem, CommitedItem } + + let key = b"events".to_vec(); + let mut cache = StorageTransactionCache::default(); let mut state = new_in_mem::<BlakeTwo256>(); let backend = state.as_trie_backend().unwrap(); - let mut overlay = OverlayedChanges::default(); let mut offchain_overlay = OffchainOverlayedChanges::default(); - let mut cache = StorageTransactionCache::default(); - - let mut ext = Ext::new( - &mut overlay, - &mut offchain_overlay, - &mut cache, - backend, - changes_trie::disabled_state::<_, u64>(), - None, - ); + let mut overlay = OverlayedChanges::default(); - ext.clear_storage(key.as_slice()); - ext.storage_append(key.clone(), b"Item".to_vec().encode()); - assert_eq!( - ext.storage(key.as_slice()), - Some(vec![b"Item".to_vec()].encode()), - ); + // For example, block initialization with event. + { + let mut ext = Ext::new( + &mut overlay, + &mut offchain_overlay, + &mut cache, + backend, + changes_trie::disabled_state::<_, u64>(), + None, + ); + ext.clear_storage(key.as_slice()); + ext.storage_append(key.clone(), Item::InitializationItem.encode()); + } + overlay.commit_prospective(); + + // For example, first transaction resulted in panic during block building + { + let mut ext = Ext::new( + &mut overlay, + &mut offchain_overlay, + &mut cache, + backend, + changes_trie::disabled_state::<_, u64>(), + None, + ); + + assert_eq!( + ext.storage(key.as_slice()), + Some(vec![Item::InitializationItem].encode()), + ); + + ext.storage_append(key.clone(), Item::DiscardedItem.encode()); + + assert_eq!( + ext.storage(key.as_slice()), + Some(vec![Item::InitializationItem, Item::DiscardedItem].encode()), + ); + } + overlay.discard_prospective(); + + // Then we apply next transaction which is valid this time. + { + let mut ext = Ext::new( + &mut overlay, + &mut offchain_overlay, + &mut cache, + backend, + changes_trie::disabled_state::<_, u64>(), + None, + ); + + assert_eq!( + ext.storage(key.as_slice()), + Some(vec![Item::InitializationItem].encode()), + ); + + ext.storage_append(key.clone(), Item::CommitedItem.encode()); + + assert_eq!( + ext.storage(key.as_slice()), + Some(vec![Item::InitializationItem, Item::CommitedItem].encode()), + ); + + } + overlay.commit_prospective(); + + // Then only initlaization item and second (commited) item should persist. + { + let ext = Ext::new( + &mut overlay, + &mut offchain_overlay, + &mut cache, + backend, + changes_trie::disabled_state::<_, u64>(), + None, + ); + assert_eq!( + ext.storage(key.as_slice()), + Some(vec![Item::InitializationItem, Item::CommitedItem].encode()), + ); + } } #[test] -- GitLab