#![forbid(unsafe_code)]
#[path = "common/mod.rs"]
#[allow(dead_code)]
mod common;
use dig_blockstore::BlockStore;
use common::{build_chain, temp_blockstore_dir, test_config};
#[test]
fn test_blocks_survive_rollback() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(10);
for block in &chain {
store.extend_chain(block).expect("extend");
}
store.rollback_to_height(5).expect("rollback");
for (i, block) in chain.iter().enumerate() {
let got = store
.get_block(&block.hash())
.expect("get_block")
.expect("must survive rollback");
assert_eq!(got.hash(), block.hash(), "block {i} preserved");
}
}
#[test]
fn test_headers_survive_rollback() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(8);
for block in &chain {
store.extend_chain(block).expect("extend");
}
store.rollback_to_height(3).expect("rollback");
for (i, block) in chain.iter().enumerate() {
let hdr = store
.get_header(&block.hash())
.expect("get_header")
.expect("must survive rollback");
assert_eq!(hdr, block.header, "header {i} preserved");
}
}
#[test]
fn test_non_canonical_get_block() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(3);
store.extend_chain(&chain[0]).expect("genesis");
store
.put_block(&chain[1], false)
.expect("put non-canonical");
let got = store
.get_block(&chain[1].hash())
.expect("get")
.expect("non-canonical block retrievable");
assert_eq!(got.hash(), chain[1].hash());
}
#[test]
fn test_recanonicalize_existing_block() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(5);
for block in &chain {
store.extend_chain(block).expect("extend");
}
store.rollback_to_height(2).expect("rollback");
assert!(
store.get_hash_by_height(3).expect("h3").is_none(),
"height 3 no longer canonical"
);
store
.set_canonical(&chain[3].hash())
.expect("re-canonicalize");
let h3 = store
.get_hash_by_height(3)
.expect("h3")
.expect("re-canonical");
assert_eq!(
h3,
chain[3].hash(),
"block re-canonicalized from existing data"
);
}
#[test]
fn test_block_count_unchanged_by_rollback() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(8);
for block in &chain {
store.extend_chain(block).expect("extend");
}
let stats_before = store.stats().expect("stats");
store.rollback_to_height(3).expect("rollback");
let stats_after = store.stats().expect("stats");
assert_eq!(
stats_before.block_count, stats_after.block_count,
"block_count must not change on rollback (fork preservation)"
);
}