sausage-vfs: layers (host, memory, generated, mounts), process guards, wasi:filesystem adapter
Checkpoint. More tests and the review findings follow.
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
//! 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)
|
||||
));
|
||||
}
|
||||
Reference in New Issue
Block a user