use super::parse_payload_snapshot;
use super::snapshot::{create_snapshot_file, load_snapshot};
use rustc_hash::FxHashMap;
use std::io::ErrorKind;
const ENTRY_COUNT_OVERFLOW_2298: &[u8] =
b"VSNP\x01||||||||\xff\xffy\xff\x10\xac\xb1\xaf\x01\xbe\xad\xde";
#[test]
fn test_parse_payload_snapshot_rejects_an_entry_count_whose_size_overflows() {
let err = parse_payload_snapshot(ENTRY_COUNT_OVERFLOW_2298)
.expect_err("a snapshot claiming more entries than it holds must be rejected");
assert_eq!(err.kind(), ErrorKind::InvalidData);
assert_eq!(err.to_string(), "Entry count exceeds data size");
}
#[test]
fn test_parse_payload_snapshot_accepts_a_snapshot_the_writer_wrote() {
let dir = tempfile::TempDir::new().expect("temp dir");
let index: FxHashMap<u64, u64> = [(1, 0), (2, 64)].into_iter().collect();
create_snapshot_file(dir.path(), &index, 128).expect("write snapshot");
let bytes = std::fs::read(dir.path().join("payloads.snapshot")).expect("read snapshot");
parse_payload_snapshot(&bytes).expect("a snapshot the writer wrote must parse");
}
#[cfg(unix)]
#[test]
fn an_unreachable_snapshot_is_an_error_not_a_missing_one() {
use std::os::unix::fs::PermissionsExt;
let dir = tempfile::tempdir().expect("test: temp dir");
let locked = dir.path().join("locked");
std::fs::create_dir(&locked).expect("test: create the locked dir");
let snapshot = locked.join("payload.snapshot");
std::fs::write(&snapshot, b"whatever").expect("test: write the snapshot");
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o000))
.expect("test: chmod 000");
let reachable = std::fs::read(&snapshot).is_ok();
let outcome = load_snapshot(&snapshot);
let _ = std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o700));
assert!(
!reachable,
"the locked directory is still readable (running as root?): this test \
cannot observe what it exists to observe"
);
let err = outcome.expect_err("an unreachable snapshot must not load");
assert_ne!(
err.kind(),
std::io::ErrorKind::NotFound,
"an unreachable snapshot was reported as absent, so the caller replays \
the WAL without a word: {err}"
);
}