use aligned_vmem::{page_size, reserve_aligned, try_decommit, DecommitOutcome, PAGE};
const SPAN: usize = 2 * 1024 * 1024;
#[test]
fn well_formed_range_succeeds() {
let r = reserve_aligned(SPAN, SPAN).expect("reserve 2 MiB");
let ps = page_size();
let out = unsafe { try_decommit(r.as_ptr(), ps, 3 * ps) };
assert!(
out.is_ok(),
"a page-aligned, non-empty, in-span range must succeed"
);
assert_eq!(
out.unwrap(),
DecommitOutcome::Advised,
"a well-formed range on an ordinary reservation must be genuinely \
advised to the OS, not skipped or refused"
);
}
#[test]
fn empty_range_is_a_well_formed_no_op() {
let r = reserve_aligned(SPAN, SPAN).expect("reserve 2 MiB");
let ps = page_size();
let a = unsafe { try_decommit(r.as_ptr(), 0, 0) };
assert!(a.is_ok(), "empty range at offset 0");
assert_eq!(
a.unwrap(),
DecommitOutcome::Skipped,
"an empty range issues no backend call — Skipped, not Advised"
);
let b = unsafe { try_decommit(r.as_ptr(), 2 * ps, 2 * ps) };
assert!(b.is_ok(), "empty range at a non-zero page-aligned offset");
assert_eq!(b.unwrap(), DecommitOutcome::Skipped);
}
#[test]
fn empty_misaligned_range_is_reported() {
let r = reserve_aligned(SPAN, SPAN).expect("reserve 2 MiB");
let ps = page_size();
unsafe {
assert!(
try_decommit(r.as_ptr(), 1, 1).is_err(),
"empty AND misaligned (offset 0 + 1) is a contract violation, not a no-op"
);
assert!(
try_decommit(r.as_ptr(), ps + 1, ps + 1).is_err(),
"empty AND misaligned at a non-zero offset: same violation shape"
);
}
}
#[test]
fn contract_violations_are_reported() {
let r = reserve_aligned(SPAN, SPAN).expect("reserve 2 MiB");
let ps = page_size();
unsafe {
assert!(
try_decommit(r.as_ptr(), 4 * ps, 2 * ps).is_err(),
"start > end must be reported"
);
assert!(
try_decommit(r.as_ptr(), 1, 2 * ps).is_err(),
"misaligned start must be reported"
);
assert!(
try_decommit(r.as_ptr(), 0, 2 * ps + 1).is_err(),
"misaligned end must be reported"
);
}
}
#[test]
fn decommit_and_try_decommit_agree_on_well_formed_input() {
let r = reserve_aligned(SPAN, SPAN).expect("reserve 2 MiB");
let ps = page_size();
unsafe {
aligned_vmem::decommit(r.as_ptr(), ps, 2 * ps);
assert!(try_decommit(r.as_ptr(), ps, 2 * ps).is_ok());
}
}
#[test]
fn validation_uses_the_runtime_page_size_not_the_compile_time_floor() {
let r = reserve_aligned(SPAN, SPAN).expect("reserve 2 MiB");
let ps = page_size();
if ps == PAGE {
assert!(unsafe { try_decommit(r.as_ptr(), PAGE, 2 * PAGE) }.is_ok());
return;
}
assert!(
unsafe { try_decommit(r.as_ptr(), PAGE, ps) }.is_err(),
"a PAGE-multiple that is not a page_size() multiple must be rejected"
);
}
#[test]
#[cfg(debug_assertions)]
#[should_panic(expected = "violates the range contract")]
fn decommit_debug_asserts_on_a_contract_violation() {
let r = reserve_aligned(SPAN, SPAN).expect("reserve 2 MiB");
let ps = page_size();
unsafe {
aligned_vmem::decommit(r.as_ptr(), 4 * ps, 2 * ps);
}
}