pub mod time {
pub use std::time::Duration;
#[cfg(all(feature = "simulation", madsim))]
pub use madsim::time::{Instant, sleep, timeout};
#[cfg(not(all(feature = "simulation", madsim)))]
pub use tokio::time::{Instant, sleep, timeout};
}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(all(feature = "simulation", madsim))]
#[madsim::test]
async fn test_dst_sleep_uses_virtual_time() {
let start = time::Instant::now();
time::sleep(time::Duration::from_millis(100)).await;
let elapsed = start.elapsed();
assert!(elapsed >= time::Duration::from_millis(100));
assert!(
elapsed < time::Duration::from_millis(101),
"virtual sleep showed real-tokio jitter: {elapsed:?}"
);
}
#[cfg(not(all(feature = "simulation", madsim)))]
#[tokio::test(flavor = "current_thread", start_paused = true)]
async fn test_dst_sleep_advances_paused_clock() {
let start = time::Instant::now();
time::sleep(time::Duration::from_mins(1)).await;
assert!(start.elapsed() >= time::Duration::from_mins(1));
}
#[cfg(all(feature = "simulation", madsim))]
#[madsim::test]
async fn test_dst_timeout_fires_in_virtual_time() {
let result = time::timeout(
time::Duration::from_millis(10),
std::future::pending::<()>(),
)
.await;
assert!(
result.is_err(),
"timeout should fire on a never-completing future"
);
}
}