use super::*;
use std::fs;
use trusty_memory::project_root::{write_project_pin, ProjectPin, PIN_SCHEMA_VERSION};
#[tokio::test]
async fn spawn_startup_tasks_populates_pin_map() {
let tmp = tempfile::tempdir().expect("tempdir");
let search_root = tmp.path().join("Projects");
let project_dir = search_root.join("my-project");
fs::create_dir_all(&project_dir).expect("create project dir");
write_project_pin(
&project_dir,
&ProjectPin {
schema_version: PIN_SCHEMA_VERSION,
palace: "my-palace".to_string(),
note: None,
},
)
.expect("write pin");
let prev_home = std::env::var_os("HOME");
unsafe {
std::env::set_var("HOME", tmp.path());
}
unsafe {
std::env::set_var("TRUSTY_SKIP_PALACE_ENFORCEMENT", "1");
}
let state_root = tmp.path().join("data");
fs::create_dir_all(&state_root).expect("create data dir");
let state = AppState::new(state_root);
spawn_startup_tasks(&state);
let deadline = std::time::Instant::now() + std::time::Duration::from_millis(500);
loop {
if state.pin_project_map.contains_key("my-palace") {
break;
}
if std::time::Instant::now() >= deadline {
panic!(
"pin_project_map was not populated within 500 ms; \
spawn_startup_tasks may not be running the pin scan"
);
}
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
}
match prev_home {
Some(v) => unsafe { std::env::set_var("HOME", v) },
None => unsafe { std::env::remove_var("HOME") },
}
let found = state.pin_project_map.get("my-palace").map(|e| e.clone());
assert!(
found.is_some(),
"pin_project_map must contain 'my-palace' after spawn_startup_tasks"
);
let actual = fs::canonicalize(found.unwrap()).expect("canonicalize actual");
let expected = fs::canonicalize(&project_dir).expect("canonicalize expected");
assert_eq!(
actual, expected,
"pin_project_map entry must point to the project directory"
);
}