Path: blob/main/crates/wiggle/tests/handles.rs
1692 views
use proptest::prelude::*;1use wiggle::{GuestMemory, GuestPtr, GuestType};2use wiggle_test::{HostMemory, MemArea, WasiCtx, impl_errno};34const FD_VAL: u32 = 123;56wiggle::from_witx!({7witx: ["tests/handles.witx"],8});910impl_errno!(types::Errno);1112impl<'a> handle_examples::HandleExamples for WasiCtx<'a> {13fn fd_create(&mut self, _memory: &mut GuestMemory<'_>) -> Result<types::Fd, types::Errno> {14Ok(types::Fd::from(FD_VAL))15}16fn fd_consume(17&mut self,18_memory: &mut GuestMemory<'_>,19fd: types::Fd,20) -> Result<(), types::Errno> {21println!("FD_CONSUME {fd}");22if fd == types::Fd::from(FD_VAL) {23Ok(())24} else {25Err(types::Errno::InvalidArg)26}27}28}2930#[derive(Debug)]31struct HandleExercise {32pub return_loc: MemArea,33}3435impl HandleExercise {36pub fn test(&self) {37let mut ctx = WasiCtx::new();38let mut host_memory = HostMemory::new();39let mut memory = host_memory.guest_memory();4041let e =42handle_examples::fd_create(&mut ctx, &mut memory, self.return_loc.ptr as i32).unwrap();4344assert_eq!(e, types::Errno::Ok as i32, "fd_create error");4546let h_got: u32 = memory47.read(GuestPtr::new(self.return_loc.ptr))48.expect("return ref_mut");4950assert_eq!(h_got, 123, "fd_create return val");5152let e = handle_examples::fd_consume(&mut ctx, &mut memory, h_got as i32).unwrap();5354assert_eq!(e, types::Errno::Ok as i32, "fd_consume error");5556let e = handle_examples::fd_consume(&mut ctx, &mut memory, h_got as i32 + 1).unwrap();5758assert_eq!(59e,60types::Errno::InvalidArg as i32,61"fd_consume invalid error"62);63}6465pub fn strat() -> BoxedStrategy<Self> {66(HostMemory::mem_area_strat(types::Fd::guest_size()))67.prop_map(|return_loc| HandleExercise { return_loc })68.boxed()69}70}7172proptest! {73#[test]74fn handle_exercise(e in HandleExercise::strat()) {75e.test()76}77}787980