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:
2026-10-23 00:08:02 +01:00
parent 01712e745a
commit 0a479b5800
15 changed files with 1932 additions and 1 deletions
+67
View File
@@ -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)
));
}