Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 58ea722

Browse files
committed
trie tests
1 parent 8ce75ce commit 58ea722

File tree

3 files changed

+134
-0
lines changed

3 files changed

+134
-0
lines changed

substrate/state-machine/src/lib.rs

+39
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,22 @@ mod tests {
248248
use super::backend::InMemory;
249249
use super::ext::Ext;
250250

251+
struct DummyCodeExecutor;
252+
253+
impl CodeExecutor for DummyCodeExecutor {
254+
type Error = u8;
255+
256+
fn call<E: Externalities>(
257+
&self,
258+
ext: &mut E,
259+
_code: &[u8],
260+
_method: &str,
261+
_data: &[u8],
262+
) -> Result<Vec<u8>, Self::Error> {
263+
Ok(vec![ext.storage(b"value1").unwrap()[0] + ext.storage(b"value2").unwrap()[0]])
264+
}
265+
}
266+
251267
#[test]
252268
fn overlayed_storage_works() {
253269
let mut overlayed = OverlayedChanges::default();
@@ -306,4 +322,27 @@ mod tests {
306322
const ROOT: [u8; 32] = hex!("8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3");
307323
assert_eq!(ext.storage_root(), ROOT);
308324
}
325+
326+
#[test]
327+
fn execute_works() {
328+
assert_eq!(execute(&trie_backend::tests::test_trie(),
329+
&mut Default::default(), &DummyCodeExecutor, "test", &[]).unwrap().0, vec![66]);
330+
}
331+
332+
#[test]
333+
fn prove_and_proof_check_works() {
334+
// fetch execution proof from 'remote' full node
335+
let remote_backend = trie_backend::tests::test_trie();
336+
let remote_root = remote_backend.storage_root(::std::iter::empty()).0;
337+
let (remote_result, remote_proof, _) = prove(remote_backend,
338+
&mut Default::default(), &DummyCodeExecutor, "test", &[]).unwrap();
339+
340+
// check proof locally
341+
let (local_result, _) = proof_check(remote_root, remote_proof,
342+
&mut Default::default(), &DummyCodeExecutor, "test", &[]).unwrap();
343+
344+
// check that both results are correct
345+
assert_eq!(remote_result, vec![66]);
346+
assert_eq!(remote_result, local_result);
347+
}
309348
}

substrate/state-machine/src/proving_backend.rs

+35
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,43 @@ pub fn create_proof_check_backend(root: TrieH256, proof: Vec<Vec<u8>>) -> Result
123123
#[cfg(test)]
124124
mod tests {
125125
use backend::{InMemory};
126+
use trie_backend::tests::test_trie;
126127
use super::*;
127128

129+
fn test_proving() -> ProvingBackend {
130+
ProvingBackend::new(test_trie())
131+
}
132+
133+
#[test]
134+
fn proof_is_empty_until_value_is_read() {
135+
assert!(test_proving().extract_proof().is_empty());
136+
}
137+
138+
#[test]
139+
fn proof_is_non_empty_after_value_is_read() {
140+
let backend = test_proving();
141+
assert_eq!(backend.storage(b"key").unwrap(), Some(b"value".to_vec()));
142+
assert!(!backend.extract_proof().is_empty());
143+
}
144+
145+
#[test]
146+
fn proof_is_invalid_when_does_not_contains_root() {
147+
assert!(create_proof_check_backend(1.into(), vec![]).is_err());
148+
}
149+
150+
#[test]
151+
fn passes_throgh_backend_calls() {
152+
let trie_backend = test_trie();
153+
let proving_backend = test_proving();
154+
assert_eq!(trie_backend.storage(b"key").unwrap(), proving_backend.storage(b"key").unwrap());
155+
assert_eq!(trie_backend.pairs(), proving_backend.pairs());
156+
157+
let (trie_root, mut trie_mdb) = trie_backend.storage_root(::std::iter::empty());
158+
let (proving_root, mut proving_mdb) = proving_backend.storage_root(::std::iter::empty());
159+
assert_eq!(trie_root, proving_root);
160+
assert_eq!(trie_mdb.drain(), proving_mdb.drain());
161+
}
162+
128163
#[test]
129164
fn proof_recorded_and_checked() {
130165
let contents = (0..64).map(|i| (vec![i], Some(vec![i]))).collect::<Vec<_>>();

substrate/state-machine/src/trie_backend.rs

+60
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,63 @@ impl TrieBackendStorage {
250250
}
251251
}
252252
}
253+
254+
#[cfg(test)]
255+
pub mod tests {
256+
use super::*;
257+
258+
fn test_db() -> (MemoryDB, TrieH256) {
259+
let mut root = TrieH256::default();
260+
let mut mdb = MemoryDB::default();
261+
{
262+
let mut trie = TrieDBMut::new(&mut mdb, &mut root);
263+
trie.insert(b"key", b"value").unwrap();
264+
trie.insert(b"value1", &[42]).unwrap();
265+
trie.insert(b"value2", &[24]).unwrap();
266+
trie.insert(b":code", b"return 42").unwrap();
267+
}
268+
(mdb, root)
269+
}
270+
271+
pub fn test_trie() -> TrieBackend {
272+
let (mdb, root) = test_db();
273+
TrieBackend::with_memorydb(mdb, root)
274+
}
275+
276+
#[test]
277+
fn read_from_storage_returns_some() {
278+
assert_eq!(test_trie().storage(b"key").unwrap(), Some(b"value".to_vec()));
279+
}
280+
281+
#[test]
282+
fn read_from_storage_returns_none() {
283+
assert_eq!(test_trie().storage(b"non-existing-key").unwrap(), None);
284+
}
285+
286+
#[test]
287+
fn pairs_are_not_empty_on_non_empty_storage() {
288+
assert!(!test_trie().pairs().is_empty());
289+
}
290+
291+
#[test]
292+
fn pairs_are_empty_on_empty_storage() {
293+
assert!(TrieBackend::with_memorydb(MemoryDB::new(), Default::default()).pairs().is_empty());
294+
}
295+
296+
#[test]
297+
fn storage_root_is_non_default() {
298+
assert!(test_trie().storage_root(::std::iter::empty()).0 != [0; 32]);
299+
}
300+
301+
#[test]
302+
fn storage_root_transaction_is_empty() {
303+
assert!(test_trie().storage_root(::std::iter::empty()).1.drain().is_empty());
304+
}
305+
306+
#[test]
307+
fn storage_root_transaction_is_non_empty() {
308+
let (new_root, mut tx) = test_trie().storage_root(vec![(b"new-key".to_vec(), Some(b"new-value".to_vec()))]);
309+
assert!(!tx.drain().is_empty());
310+
assert!(new_root != test_trie().storage_root(::std::iter::empty()).0);
311+
}
312+
}

0 commit comments

Comments
 (0)