parity-zcash/db/tests/blockchaindb.rs

130 lines
4.3 KiB
Rust

extern crate zebra_chain;
extern crate zebra_db;
extern crate zebra_storage;
extern crate zebra_test_data;
use zebra_chain::IndexedBlock;
use zebra_db::kv::{MemoryDatabase, SharedMemoryDatabase};
use zebra_db::BlockChainDatabase;
use zebra_storage::{BlockProvider, ForkChain, SideChainOrigin};
#[test]
fn insert_block() {
let store = BlockChainDatabase::open(MemoryDatabase::default());
let b0: IndexedBlock = zebra_test_data::block_h0().into();
let b1: IndexedBlock = zebra_test_data::block_h1().into();
let b2: IndexedBlock = zebra_test_data::block_h2().into();
store.insert(b0.clone()).unwrap();
store.insert(b1.clone()).unwrap();
store.insert(b2.clone()).unwrap();
assert_eq!(0, store.best_block().number);
assert!(store.best_block().hash.is_zero());
store.canonize(b0.hash()).unwrap();
assert_eq!(0, store.best_block().number);
assert_eq!(b0.hash(), &store.best_block().hash);
store.canonize(b1.hash()).unwrap();
assert_eq!(1, store.best_block().number);
assert_eq!(b1.hash(), &store.best_block().hash);
store.canonize(b2.hash()).unwrap();
assert_eq!(2, store.best_block().number);
assert_eq!(b2.hash(), &store.best_block().hash);
let decanonized = store.decanonize().unwrap();
assert_eq!(b2.hash(), &decanonized);
assert_eq!(1, store.best_block().number);
assert_eq!(b1.hash(), &store.best_block().hash);
assert_eq!(b0.hash(), &store.block_hash(0).unwrap());
assert_eq!(b1.hash(), &store.block_hash(1).unwrap());
assert!(store.block_hash(2).is_none());
assert_eq!(0, store.block_number(b0.hash()).unwrap());
assert_eq!(1, store.block_number(b1.hash()).unwrap());
assert!(store.block_number(b2.hash()).is_none());
}
#[test]
fn reopen_db() {
let shared_database = SharedMemoryDatabase::default();
let b0: IndexedBlock = zebra_test_data::block_h0().into();
let b1: IndexedBlock = zebra_test_data::block_h1().into();
let b2: IndexedBlock = zebra_test_data::block_h2().into();
{
let store = BlockChainDatabase::open(shared_database.clone());
store.insert(b0.clone()).unwrap();
store.insert(b1.clone()).unwrap();
store.insert(b2.clone()).unwrap();
store.canonize(b0.hash()).unwrap();
store.canonize(b1.hash()).unwrap();
store.canonize(b2.hash()).unwrap();
store.decanonize().unwrap();
}
{
let store = BlockChainDatabase::open(shared_database);
assert_eq!(b0.hash(), &store.block_hash(0).unwrap());
assert_eq!(1, store.best_block().number);
assert_eq!(b1.hash(), &store.best_block().hash);
}
}
#[test]
fn switch_to_simple_fork() {
let store = BlockChainDatabase::open(MemoryDatabase::default());
let b0: IndexedBlock = zebra_test_data::block_h0().into();
let b1: IndexedBlock = zebra_test_data::block_h1().into();
let b2: IndexedBlock = zebra_test_data::block_h2().into();
store.insert(b0.clone()).unwrap();
store.insert(b1.clone()).unwrap();
store.insert(b2.clone()).unwrap();
store.canonize(b0.hash()).unwrap();
store.canonize(b1.hash()).unwrap();
assert_eq!(1, store.best_block().number);
assert_eq!(b1.hash(), &store.best_block().hash);
let side_chain_origin = SideChainOrigin {
ancestor: 1,
canonized_route: Vec::new(),
decanonized_route: Vec::new(),
block_number: 2,
};
let fork = store.fork(side_chain_origin).unwrap();
assert_eq!(1, fork.store().best_block().number);
assert_eq!(b1.hash(), &fork.store().best_block().hash);
fork.store().canonize(b2.hash()).unwrap();
store.switch_to_fork(fork).unwrap();
assert_eq!(2, store.best_block().number);
assert_eq!(b2.hash(), &store.best_block().hash);
let side_chain_origin = SideChainOrigin {
ancestor: 1,
canonized_route: Vec::new(),
decanonized_route: vec![b2.hash().clone()],
block_number: 2,
};
let fork = store.fork(side_chain_origin).unwrap();
let decanonized = fork.store().decanonize().unwrap();
assert_eq!(b1.hash(), &decanonized);
assert_eq!(0, fork.store().best_block().number);
assert_eq!(b0.hash(), &fork.store().best_block().hash);
assert_eq!(2, store.best_block().number);
assert_eq!(b2.hash(), &store.best_block().hash);
assert_eq!(store.best_block().hash, store.block_hash(2).unwrap());
}