use aligned_vmem::{page_size, recommit, release, reserve_aligned, PAGE};
const MIB: usize = 1024 * 1024;
#[test]
fn reserve_is_aligned_and_writable() {
let span = 4 * MIB;
let r = reserve_aligned(span, span).expect("reserve 4 MiB aligned 4 MiB");
let base = r.as_ptr();
assert!(!base.is_null());
assert_eq!(base as usize % span, 0, "base must be span-aligned");
assert_eq!(r.len(), span);
assert!(!r.is_empty());
unsafe {
let mut off = 0;
while off < span {
base.add(off).write(0xA5);
assert_eq!(base.add(off).read(), 0xA5);
off += PAGE;
}
}
}
#[test]
fn manual_release_via_into_parts() {
let span = 2 * MIB;
let r = reserve_aligned(span, span).expect("reserve");
let base = r.as_ptr();
unsafe { base.write(0x11) };
let (raw, raw_len, raw_align) = r.into_parts();
assert!(!raw.is_null());
assert_eq!(raw_align, span);
unsafe { release(raw, raw_len, raw_align) };
}
#[test]
fn decommit_recommit_roundtrip() {
let span = 4 * MIB;
let r = reserve_aligned(span, span).expect("reserve");
let base = r.as_ptr();
unsafe {
base.add(span / 2).write(0x77);
assert_eq!(base.add(span / 2).read(), 0x77);
}
unsafe {
recommit(base, 0, 0); aligned_vmem::decommit(base, span / 2, span);
recommit(base, span / 2, span);
assert_eq!(
base.add(span / 2).read(),
0,
"recommitted page must be zeroed"
);
}
}
#[test]
fn rejects_bad_contracts() {
assert!(reserve_aligned(0, PAGE).is_none(), "zero size rejected");
assert!(
reserve_aligned(PAGE, 3).is_none(),
"non-pow2 align rejected"
);
assert!(reserve_aligned(PAGE, 64).is_none(), "align < PAGE rejected");
assert!(
reserve_aligned(PAGE + 1, PAGE).is_none(),
"non-page-multiple size rejected"
);
}
#[test]
fn page_size_is_4k() {
assert_eq!(page_size(), 4096);
assert_eq!(PAGE, 4096);
}
#[test]
fn distinct_reservations_do_not_overlap() {
let span = 2 * MIB;
let a = reserve_aligned(span, span).expect("a");
let b = reserve_aligned(span, span).expect("b");
let pa = a.as_ptr() as usize;
let pb = b.as_ptr() as usize;
assert!(pa + span <= pb || pb + span <= pa, "reservations overlap");
}