use anyhow::{Context, Result};
use db185::Db;
use std::io::Write;
use tempfile::NamedTempFile;
const PKGDB: &[u8] = include_bytes!("data/pkgdb.byfile.db.zst");
const BASELINE: &[u8] = include_bytes!("data/pkgdb.dump.txt.zst");
#[test]
fn dump_matches_pkg_admin() -> Result<()> {
let raw_db = zstd::decode_all(PKGDB).context("decompressing pkgdb sample")?;
let baseline = zstd::decode_all(BASELINE).context("decompressing dump baseline")?;
let mut tmp = NamedTempFile::new()?;
tmp.write_all(&raw_db)?;
tmp.flush()?;
let db = Db::open(tmp.path())?;
let mut actual = Vec::with_capacity(baseline.len());
for entry in &db {
let entry = entry?;
actual.extend_from_slice(b"file: ");
actual.extend_from_slice(trim_nul(entry.key()));
actual.extend_from_slice(b" pkg: ");
actual.extend_from_slice(trim_nul(entry.value()));
actual.push(b'\n');
}
assert_eq!(actual.len(), baseline.len(), "dump length differs");
assert!(
actual == baseline,
"dump output differs from pkg_admin baseline"
);
Ok(())
}
fn trim_nul(b: &[u8]) -> &[u8] {
b.strip_suffix(b"\0").unwrap_or(b)
}