use std::sync::Arc;
use std::time::{Duration, Instant};
use super::super::pending_writes;
use super::super::*;
#[tokio::test]
async fn pending_cache_writes_is_empty_on_fresh_daemon() {
let endpoint = crate::ipc::unique_test_endpoint();
let server = DaemonServer::bind(&endpoint).unwrap();
assert!(
server.state.pending_cache_writes.is_empty(),
"fresh daemon must have empty pending_cache_writes registry, found {}",
server.state.pending_cache_writes.len()
);
}
#[tokio::test]
async fn pending_registry_register_and_complete_through_shared_state() {
let endpoint = crate::ipc::unique_test_endpoint();
let server = DaemonServer::bind(&endpoint).unwrap();
let state = Arc::clone(&server.state);
let key = "deadbeefcafebabe0000000000000000";
let _registered = pending_writes::register(&state.pending_cache_writes, key);
assert_eq!(state.pending_cache_writes.len(), 1);
let state_for_lookup = Arc::clone(&state);
let waiter = tokio::spawn(async move {
pending_writes::await_pending(
&state_for_lookup.pending_cache_writes,
key,
Duration::from_millis(5),
)
.await
});
tokio::time::sleep(Duration::from_millis(1)).await;
pending_writes::complete(&state.pending_cache_writes, key);
let observed = waiter.await.unwrap();
assert!(observed, "waiter must report it saw a pending entry");
assert!(
state.pending_cache_writes.is_empty(),
"complete must clear the registry entry"
);
}
#[tokio::test]
async fn pending_registry_notify_timeout_through_shared_state() {
let endpoint = crate::ipc::unique_test_endpoint();
let server = DaemonServer::bind(&endpoint).unwrap();
let state = Arc::clone(&server.state);
let key = "feedfacedeadbeef0000000000000000";
let _registered = pending_writes::register(&state.pending_cache_writes, key);
let start = Instant::now();
let observed =
pending_writes::await_pending(&state.pending_cache_writes, key, Duration::from_millis(5))
.await;
let elapsed = start.elapsed();
assert!(observed, "pending entry was present — must report true");
assert!(
elapsed < Duration::from_millis(100),
"notify-timeout blew the blast-radius bound: {elapsed:?}"
);
assert_eq!(state.pending_cache_writes.len(), 1);
pending_writes::complete(&state.pending_cache_writes, key);
assert!(state.pending_cache_writes.is_empty());
}
#[tokio::test]
async fn pending_registry_warm_lookup_pays_no_wait() {
let endpoint = crate::ipc::unique_test_endpoint();
let server = DaemonServer::bind(&endpoint).unwrap();
let state = Arc::clone(&server.state);
let start = Instant::now();
let observed = pending_writes::await_pending(
&state.pending_cache_writes,
"warmkey0000000000000000000000000",
Duration::from_millis(5),
)
.await;
let elapsed = start.elapsed();
assert!(!observed, "no pending entry must report false");
assert!(
elapsed < Duration::from_millis(2),
"warm-lookup no-wait path took {elapsed:?}"
);
}