修复: shell 探测缓存测试顺序污染

PWSH_CACHE 从 OnceLock 改互斥可恢复形态,写缓存测试进时备份出时写回
涉缓存测试共持串行闸,消除全量跑时序性互踩(约一成概率触发的假失败)
生产读写语义不变:有缓存读缓存,无缓存探测后写,超时不写入
This commit is contained in:
lxy
2026-10-01 03:16:24 +08:00
parent 47a75a4d49
commit 73fe49b70c
2 changed files with 57 additions and 17 deletions
+8 -1
View File
@@ -421,6 +421,9 @@ mod tests {
#[tokio::test]
async fn detect_returns_cached_static_ref() {
// 持 shell.rs 缓存串行闸:本测试可能首次创建 SNAPSHOT,其 shell 字段取自创建时刻的
// 缓存状态;若与写缓存的 shell.rs 测试并行,漂移测试会读到与 current_shell 不一致的快照。
let _gate = crate::shell::PWSH_CACHE_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner());
// 两次 detect 返回同一引用(OnceLock 全局缓存)。
let a = EnvSnapshot::detect().await as *const _;
let b = EnvSnapshot::detect().await as *const _;
@@ -432,10 +435,14 @@ mod tests {
/// 历史 bug:detect_shell 持独立 probe_command_success 探测,与 shell.rs::probe_pwsh 各填各的
/// OnceLock → prompt 告诉 LLM 用 pwsh,执行却走 powershell(或反之)。根本修:二者共用
/// shell.rs 的 probe_pwsh_blocking + PWSH_CACHE 单源。本测试锁定「无漂移」不变量。
///
/// 隔离:持 shell.rs 缓存串行闸,快照值与 current_shell() 须读自同一缓存状态,
/// 防与写缓存的 shell.rs 测试并行互踩(Mutex 化后写值会被复位,闸保证读窗口内无交叉写)。
#[cfg(windows)]
#[tokio::test]
async fn detect_shell_matches_shell_rs_current_shell() {
// detect() 内 detect_shell → probe_pwsh_blocking 填 PWSH_CACHE,再读 current_shell 映射。
let _gate = crate::shell::PWSH_CACHE_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner());
// detect() 内 detect_shell → 读 PWSH_CACHE 映射,与下方 current_shell() 同源。
let snap = EnvSnapshot::detect().await;
let current = crate::shell::current_shell();
// 二者必须一致(同一 PWSH_CACHE 单源读出)。