//! Exercises adapter streams with the shared WASI resource table. use sausage_vfs::{ adapter::{Adapter, View}, *, }; use std::sync::Arc; use wasmtime::component::{Resource, ResourceTable}; use wasmtime_wasi::p2::{ StreamError, bindings::filesystem::{ preopens::Host, types::{DescriptorFlags, HostDescriptor, OpenFlags, PathFlags}, }, }; #[tokio::test] async fn adapter_streams() { let mut mounts = Mounts::default(); mounts.mount("/", Arc::new(Memory::default()), false); let mut adapter = Adapter::new(mounts); let mut table = ResourceTable::new(); let mut view = View { adapter: &mut adapter, table: &mut table, }; let root = view.get_directories().unwrap().remove(0).0; let fd = view .open_at( root, PathFlags::empty(), "file".into(), OpenFlags::CREATE, DescriptorFlags::READ | DescriptorFlags::WRITE, ) .await .unwrap(); let output = view .write_via_stream(Resource::new_borrow(fd.rep()), 2) .unwrap(); { let stream = view.table.get_mut(&output).unwrap(); assert!(stream.check_write().unwrap() > 0); stream.write(b"abc".as_slice().to_vec().into()).unwrap(); stream.flush().unwrap(); stream.ready().await; assert!(stream.check_write().unwrap() > 0); } let append = view .append_via_stream(Resource::new_borrow(fd.rep())) .unwrap(); { let stream = view.table.get_mut(&append).unwrap(); stream.write(b"!".as_slice().to_vec().into()).unwrap(); stream.ready().await; } let input = view .read_via_stream(Resource::new_borrow(fd.rep()), 0) .unwrap(); let stream = view.table.get_mut(&input).unwrap(); assert_eq!( stream.blocking_read(100).await.unwrap().as_ref(), b"\0\0abc!" ); assert!(matches!( stream.blocking_read(100).await, Err(StreamError::Closed) )); }