use std::future::Future; use std::sync::Arc; use std::task::Poll; use tokio::sync::{OwnedSemaphorePermit, Semaphore}; use tokio_util::sync::PollSemaphore; type SemRet = Option; fn semaphore_poll( sem: &mut PollSemaphore, ) -> tokio_test::task::Spawn + '_> { let fut = futures::future::poll_fn(move |cx| sem.poll_acquire(cx)); tokio_test::task::spawn(fut) } #[tokio::test] async fn it_works() { let sem = Arc::new(Semaphore::new(1)); let mut poll_sem = PollSemaphore::new(sem.clone()); let permit = sem.acquire().await.unwrap(); let mut poll = semaphore_poll(&mut poll_sem); assert!(poll.poll().is_pending()); drop(permit); assert!(matches!(poll.poll(), Poll::Ready(Some(_)))); drop(poll); sem.close(); assert!(semaphore_poll(&mut poll_sem).await.is_none()); // Check that it is fused. assert!(semaphore_poll(&mut poll_sem).await.is_none()); assert!(semaphore_poll(&mut poll_sem).await.is_none()); }