in common/rusty_leveldb_sgx/src/db_impl.rs [1421:1473]
fn test_db_impl_build_table() {
let mut opt = options::for_test();
opt.block_size = 128;
let mt = build_memtable();
let f = build_table("db", &opt, mt.iter(), 123).unwrap();
let path = Path::new("db/000123.ldb");
assert_eq!(
LookupKey::new("aabc".as_bytes(), 6).internal_key(),
f.smallest.as_slice()
);
assert_eq!(
LookupKey::new("test123".as_bytes(), 7).internal_key(),
f.largest.as_slice()
);
assert_eq!(379, f.size);
assert_eq!(123, f.num);
assert!(opt.env.exists(path).unwrap());
{
// Read table back in.
let mut tc = TableCache::new("db", opt.clone(), 100);
let tbl = tc.get_table(123).unwrap();
assert_eq!(mt.len(), LdbIteratorIter::wrap(&mut tbl.iter()).count());
}
{
// Corrupt table; make sure it doesn't load fully.
let mut buf = vec![];
opt.env
.open_sequential_file(path)
.unwrap()
.read_to_end(&mut buf)
.unwrap();
buf[150] += 1;
opt.env
.open_writable_file(path)
.unwrap()
.write_all(&buf)
.unwrap();
let mut tc = TableCache::new("db", opt.clone(), 100);
let tbl = tc.get_table(123).unwrap();
// The last two entries are skipped due to the corruption above.
assert_eq!(
5,
LdbIteratorIter::wrap(&mut tbl.iter())
.map(|v| println!("{:?}", v))
.count()
);
}
}