60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
|
|
#![warn(rust_2018_idioms)]
|
||
|
|
#![cfg(feature = "full")]
|
||
|
|
|
||
|
|
use rand::SeedableRng;
|
||
|
|
use rand::{rngs::StdRng, Rng};
|
||
|
|
use tokio::time::{self, Duration, Instant};
|
||
|
|
use tokio_test::assert_err;
|
||
|
|
|
||
|
|
#[tokio::test]
|
||
|
|
async fn pause_time_in_main() {
|
||
|
|
tokio::time::pause();
|
||
|
|
}
|
||
|
|
|
||
|
|
#[tokio::test]
|
||
|
|
async fn pause_time_in_task() {
|
||
|
|
let t = tokio::spawn(async {
|
||
|
|
tokio::time::pause();
|
||
|
|
});
|
||
|
|
|
||
|
|
t.await.unwrap();
|
||
|
|
}
|
||
|
|
|
||
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
|
||
|
|
#[should_panic]
|
||
|
|
async fn pause_time_in_main_threads() {
|
||
|
|
tokio::time::pause();
|
||
|
|
}
|
||
|
|
|
||
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
|
||
|
|
async fn pause_time_in_spawn_threads() {
|
||
|
|
let t = tokio::spawn(async {
|
||
|
|
tokio::time::pause();
|
||
|
|
});
|
||
|
|
|
||
|
|
assert_err!(t.await);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn paused_time_is_deterministic() {
|
||
|
|
let run_1 = paused_time_stress_run();
|
||
|
|
let run_2 = paused_time_stress_run();
|
||
|
|
|
||
|
|
assert_eq!(run_1, run_2);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[tokio::main(flavor = "current_thread", start_paused = true)]
|
||
|
|
async fn paused_time_stress_run() -> Vec<Duration> {
|
||
|
|
let mut rng = StdRng::seed_from_u64(1);
|
||
|
|
|
||
|
|
let mut times = vec![];
|
||
|
|
let start = Instant::now();
|
||
|
|
for _ in 0..10_000 {
|
||
|
|
let sleep = rng.gen_range(Duration::from_secs(0)..Duration::from_secs(1));
|
||
|
|
time::sleep(sleep).await;
|
||
|
|
times.push(start.elapsed());
|
||
|
|
}
|
||
|
|
|
||
|
|
times
|
||
|
|
}
|