async_time_mock_core/
time_handler_guard.rs1use event_listener::{Event, EventListener};
2
3#[must_use = "TimeHandlerGuard must be kept until the timer has performed it's side-effects"]
4#[derive(Debug)]
5pub struct TimeHandlerGuard(Event);
6
7impl TimeHandlerGuard {
8 pub(crate) fn new() -> (Self, TimeHandlerFinished) {
9 let event = Event::new();
10 let listener = event.listen();
11 (Self(event), TimeHandlerFinished(listener))
12 }
13}
14
15impl Drop for TimeHandlerGuard {
16 fn drop(&mut self) {
17 self.0.notify(1);
18 }
19}
20
21pub(crate) struct TimeHandlerFinished(EventListener);
22
23impl TimeHandlerFinished {
24 pub(crate) async fn wait(self) {
25 self.0.await
26 }
27}
28
29#[cfg(test)]
30mod test {
31 use crate::TimeHandlerGuard;
32 use futures_lite::future::poll_once;
33 use std::pin::pin;
34
35 #[tokio::test]
36 async fn should_notify_once_time_handler_guard_is_dropped() {
37 let (guard, waiter) = TimeHandlerGuard::new();
38
39 let mut waiter_future = pin!(waiter.wait());
40 assert!(
41 poll_once(waiter_future.as_mut()).await.is_none(),
42 "Waiter should have been pending before the guard is dropped",
43 );
44
45 drop(guard);
46 assert!(
47 poll_once(waiter_future.as_mut()).await.is_some(),
48 "Waiter should have been ready after the guard was dropped",
49 );
50 }
51}