mod common;
use atap::{
Runtime,
sleep::{Sleep, SleepMode},
};
use common::cores;
use std::time::Duration;
use std::time::Instant;
#[test]
fn concurrent_tasks_run_in_parallel() {
let _ = Runtime::init();
let duration = Duration::from_millis(500);
let tasks = cores();
let started = Instant::now();
let handles: Vec<_> = (0..tasks)
.map(|_| Runtime::task(Sleep::sleep(duration).mode(SleepMode::Relaxed)).spawn())
.collect();
let mut slept = Duration::ZERO;
for handle in handles {
slept += handle.join().expect("every task finishes");
}
let elapsed = started.elapsed();
println!(
"{} tasks of {:?} took {:?}, {:?} slept between them",
tasks, duration, elapsed, slept,
);
assert!(
slept > elapsed * 2,
"{} sleeps took {:?} of wall clock but only {:?} between them, \
so they were barely overlapping",
tasks,
elapsed,
slept,
);
}