use super::*; use crate::{SyscallOutcome, SyscallResult}; use domain::syscall::Syscall; use types::bounded::PageCount; use types::address::VirtualAddress; #[test] fn request_pages_allocates_and_grants_cap() { let (mut k, _) = kernel_with_process(); let outcome = k.handle_syscall(Syscall::RequestPages { count: PageCount::new(4).unwrap(), }); assert!(matches!( outcome, SyscallOutcome::Complete(SyscallResult::Slot(_)) )); } #[test] fn request_pages_reduces_pool() { let (mut k, _) = kernel_with_process(); let before = k.free_page_count(); k.handle_syscall(Syscall::RequestPages { count: PageCount::new(10).unwrap(), }); assert_eq!(k.free_page_count(), before - 10); } #[test] fn release_pages_frees_and_restores_pool() { let (mut k, _) = kernel_with_process(); let before = k.free_page_count(); let slot = match k.handle_syscall(Syscall::RequestPages { count: PageCount::new(4).unwrap(), }) { SyscallOutcome::Complete(SyscallResult::Slot(s)) => s, _ => panic!("expected slot"), }; let outcome = k.handle_syscall(Syscall::ReleasePages { addr: VirtualAddress::from_raw(0x8000_0000), count: PageCount::new(4).unwrap(), }); assert!(matches!( outcome, SyscallOutcome::Complete(SyscallResult::Ok) )); assert_eq!(k.free_page_count(), before); }