68 lines
2.0 KiB
Rust
68 lines
2.0 KiB
Rust
//! 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)
|
|
));
|
|
}
|