diff --git a/crates/wasi-common/src/sched.rs b/crates/wasi-common/src/sched.rs index d8be4deb99..fecac2c5ca 100644 --- a/crates/wasi-common/src/sched.rs +++ b/crates/wasi-common/src/sched.rs @@ -5,7 +5,9 @@ use cap_std::time::Instant; pub mod subscription; pub use cap_std::time::Duration; -use subscription::{MonotonicClockSubscription, RwSubscription, Subscription, SubscriptionResult}; +pub use subscription::{ + MonotonicClockSubscription, RwEventFlags, RwSubscription, Subscription, SubscriptionResult, +}; #[wiggle::async_trait] pub trait WasiSched { diff --git a/crates/wasi-common/tokio/tests/poll_oneoff.rs b/crates/wasi-common/tokio/tests/poll_oneoff.rs index b0e220c86b..6bd42c39ce 100644 --- a/crates/wasi-common/tokio/tests/poll_oneoff.rs +++ b/crates/wasi-common/tokio/tests/poll_oneoff.rs @@ -1,14 +1,13 @@ use anyhow::{Context, Error}; -use std::ops::Deref; use wasi_common::{ file::{FdFlags, OFlags}, - sched::{Poll, Userdata}, - WasiDir, WasiFile, + sched::{Poll, RwEventFlags, SubscriptionResult, Userdata}, + WasiDir, }; -use wasi_tokio::{sched::poll_oneoff, Dir, File}; +use wasi_tokio::{sched::poll_oneoff, Dir}; #[tokio::test(flavor = "multi_thread")] -async fn main() -> Result<(), Error> { +async fn empty_file_readable() -> Result<(), Error> { let workspace = unsafe { cap_tempfile::tempdir().expect("create tempdir") }; workspace.create_dir("d").context("create dir")?; let d = workspace.open_dir("d").context("open dir")?; @@ -21,7 +20,48 @@ async fn main() -> Result<(), Error> { let mut poll = Poll::new(); poll.subscribe_read(&mut *readable_f, Userdata::from(123)); - let poll_events = poll_oneoff(&mut poll).await?; + poll_oneoff(&mut poll).await?; + + let events = poll.results(); + + assert_eq!(events.len(), 1); + match events[0] { + (SubscriptionResult::Read(Ok((0, flags))), ud) => { + assert_eq!(flags, RwEventFlags::empty()); + assert_eq!(ud, Userdata::from(123)); + } + _ => panic!(""), + } + + Ok(()) +} + +#[tokio::test(flavor = "multi_thread")] +async fn empty_file_writable() -> Result<(), Error> { + let workspace = unsafe { cap_tempfile::tempdir().expect("create tempdir") }; + workspace.create_dir("d").context("create dir")?; + let d = workspace.open_dir("d").context("open dir")?; + let d = Dir::from_cap_std(d); + + let mut writable_f = d + .open_file(false, "f", OFlags::CREATE, true, true, FdFlags::empty()) + .await + .context("create writable file")?; + + let mut poll = Poll::new(); + poll.subscribe_write(&mut *writable_f, Userdata::from(123)); + poll_oneoff(&mut poll).await?; + + let events = poll.results(); + + assert_eq!(events.len(), 1); + match events[0] { + (SubscriptionResult::Write(Ok((0, flags))), ud) => { + assert_eq!(flags, RwEventFlags::empty()); + assert_eq!(ud, Userdata::from(123)); + } + _ => panic!(""), + } Ok(()) }