async_time_mock_core/
time_handler_guard.rs

1use 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}