#[cfg(test)]
mod tests {
use crate::memory_core::palace::{Palace, PalaceId};
use crate::memory_core::retrieval::{PalaceHandle, shared_embedder};
use tempfile::tempdir;
#[tokio::test]
#[ignore = "mutates process-wide OnceCell; run in isolation with --include-ignored"]
async fn timeout_fires_on_embedder_init_with_tiny_limit() {
unsafe {
std::env::set_var("TRUSTY_EMBEDDER_INIT_TIMEOUT_SECS", "0");
}
let result = shared_embedder().await;
unsafe {
std::env::remove_var("TRUSTY_EMBEDDER_INIT_TIMEOUT_SECS");
}
let err = match result {
Err(e) => e,
Ok(_) => panic!("shared_embedder() must return Err when init times out, got Ok"),
};
let msg = format!("{err:#}");
assert!(
msg.contains("timed out") || msg.contains("FastEmbedder"),
"error message must mention timeout: {msg}"
);
}
#[tokio::test]
async fn remember_succeeds_with_mock_embedder() {
crate::memory_core::retrieval::seed_shared_embedder_with_mock();
let dir = tempdir().unwrap();
let palace = Palace {
id: PalaceId::new("timeout-green"),
name: "Timeout green".into(),
description: None,
created_at: chrono::Utc::now(),
data_dir: dir.path().join("timeout-green"),
};
std::fs::create_dir_all(&palace.data_dir).unwrap();
let handle = PalaceHandle::open(&palace).unwrap();
let result = handle
.remember(
"bounded timeout green path".into(),
crate::memory_core::palace::RoomType::General,
vec![],
0.5,
)
.await;
assert!(
result.is_ok(),
"remember must succeed with mock embedder: {result:?}"
);
}
#[tokio::test]
async fn write_lock_timeout_returns_error_when_held() {
crate::memory_core::retrieval::seed_shared_embedder_with_mock();
let dir = tempdir().unwrap();
let palace = Palace {
id: PalaceId::new("lock-timeout"),
name: "Lock timeout".into(),
description: None,
created_at: chrono::Utc::now(),
data_dir: dir.path().join("lock-timeout"),
};
std::fs::create_dir_all(&palace.data_dir).unwrap();
let handle = PalaceHandle::open(&palace).unwrap();
let mutex = handle.write_mutex_for_test();
let (release_tx, release_rx) = tokio::sync::oneshot::channel::<()>();
let holder = tokio::spawn(async move {
let _guard = mutex.lock().await;
let _ = release_rx.await;
});
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
unsafe { std::env::set_var("TRUSTY_WRITE_LOCK_TIMEOUT_SECS", "0") };
let result = handle
.remember(
"should time out on lock".into(),
crate::memory_core::palace::RoomType::General,
vec![],
0.5,
)
.await;
unsafe { std::env::remove_var("TRUSTY_WRITE_LOCK_TIMEOUT_SECS") };
let _ = release_tx.send(());
let _ = holder.await;
assert!(
result.is_err(),
"remember must return Err when write-lock times out, got Ok"
);
let err = result.expect_err("checked above");
let msg = format!("{err:#}");
assert!(
msg.contains("timed out") || msg.contains("write-lock"),
"error must mention lock timeout: {msg}"
);
}
}