#[cfg(test)]
mod tests {
use crate::manifest::{Manifest, ManifestSstEntry};
use tempfile::TempDir;
use tracing_subscriber::EnvFilter;
fn open_manifest(temp: &TempDir) -> Manifest {
Manifest::open(temp.path()).expect("Manifest open failed")
}
fn init_tracing() {
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_test_writer()
.try_init();
}
fn sst_entry(id: u64) -> ManifestSstEntry {
ManifestSstEntry {
id,
path: format!("sst_{:06}.bin", id).into(),
}
}
#[test]
fn remove_nonexistent_sstable_is_silent() {
init_tracing();
let temp = TempDir::new().unwrap();
let m = open_manifest(&temp);
m.remove_sstable(999).unwrap();
assert!(
m.get_sstables().unwrap().is_empty(),
"SSTable list should still be empty"
);
}
#[test]
fn remove_nonexistent_frozen_wal_is_silent() {
init_tracing();
let temp = TempDir::new().unwrap();
let m = open_manifest(&temp);
m.remove_frozen_wal(999).unwrap();
assert!(
m.get_frozen_wals().unwrap().is_empty(),
"Frozen WAL list should still be empty"
);
}
#[test]
fn double_add_same_sstable_id_is_idempotent() {
init_tracing();
let temp = TempDir::new().unwrap();
let m = open_manifest(&temp);
m.add_sstable(sst_entry(10)).unwrap();
m.add_sstable(sst_entry(10)).unwrap();
let sstables = m.get_sstables().unwrap();
assert_eq!(
sstables.len(),
1,
"Duplicate SSTable ID should be deduplicated"
);
assert_eq!(sstables[0].id, 10);
}
#[test]
fn checkpoint_empty_state() {
init_tracing();
let temp = TempDir::new().unwrap();
{
let mut m = open_manifest(&temp);
m.checkpoint().unwrap();
}
let m2 = open_manifest(&temp);
assert_eq!(m2.get_last_lsn().unwrap(), 0);
assert_eq!(m2.get_active_wal().unwrap(), 0);
assert!(m2.get_frozen_wals().unwrap().is_empty());
assert!(m2.get_sstables().unwrap().is_empty());
}
#[test]
fn snapshot_plus_incremental_wal_replay() {
init_tracing();
let temp = TempDir::new().unwrap();
{
let mut m = open_manifest(&temp);
m.add_sstable(sst_entry(1)).unwrap();
m.set_active_wal(5).unwrap();
m.update_lsn(100).unwrap();
m.checkpoint().unwrap();
m.add_sstable(sst_entry(2)).unwrap();
m.add_frozen_wal(5).unwrap();
m.update_lsn(200).unwrap();
}
let m2 = open_manifest(&temp);
let sstables = m2.get_sstables().unwrap();
assert_eq!(sstables.len(), 2, "Both SSTables should be present");
assert!(sstables.iter().any(|e| e.id == 1));
assert!(sstables.iter().any(|e| e.id == 2));
let frozen = m2.get_frozen_wals().unwrap();
assert!(frozen.contains(&5), "Frozen WAL 5 should be present");
assert_eq!(m2.get_last_lsn().unwrap(), 200);
}
}