pub mod h2_server;
use std::thread;
use std::time::{Duration, Instant};
pub fn wait_for_condition<F>(timeout: Duration, mut predicate: F) -> bool
where
F: FnMut() -> bool,
{
let deadline = Instant::now() + timeout;
loop {
if predicate() {
return true;
}
if Instant::now() >= deadline {
return predicate(); }
thread::sleep(std::time::Duration::from_millis(1));
}
}
pub fn wait_for_worker_stopped<F>(timeout: Duration, mut is_running: F) -> bool
where
F: FnMut() -> bool,
{
wait_for_condition(timeout, || !is_running())
}
pub fn wait_for_worker_state<F>(timeout: Duration, reached: F) -> bool
where
F: FnMut() -> bool,
{
wait_for_condition(timeout, reached)
}
pub fn wait_for_context_ready<F>(timeout: Duration, ready: F) -> bool
where
F: FnMut() -> bool,
{
wait_for_condition(timeout, ready)
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
#[test]
fn test_wait_for_condition_immediate() {
let start = Instant::now();
let result = wait_for_condition(Duration::from_secs(1), || true);
assert!(result, "immediate true should return true");
assert!(
start.elapsed() < Duration::from_millis(50),
"should not wait"
);
}
#[test]
fn test_wait_for_condition_timeout() {
let start = Instant::now();
let result = wait_for_condition(Duration::from_millis(100), || false);
assert!(!result, "always false should timeout and return false");
assert!(
start.elapsed() >= Duration::from_millis(90),
"should wait full timeout"
);
}
#[test]
fn test_wait_for_condition_becomes_true() {
let flag = Arc::new(AtomicBool::new(false));
let flag_clone = Arc::clone(&flag);
std::thread::spawn(move || {
thread::sleep(Duration::from_millis(50));
flag_clone.store(true, Ordering::Release);
});
let start = Instant::now();
let result = wait_for_condition(Duration::from_secs(1), || flag.load(Ordering::Acquire));
assert!(result, "flag should become true");
let elapsed = start.elapsed();
assert!(
elapsed >= Duration::from_millis(40),
"should wait at least ~50ms"
);
assert!(
elapsed < Duration::from_millis(300),
"should not wait too long"
);
}
}