From cc39045799d38b2f8b030332ce0d6a93b64c4072 Mon Sep 17 00:00:00 2001 From: kdletters Date: Mon, 21 Sep 2026 02:08:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E9=99=A4=20PTY=20EOF=20=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=E7=9A=84=E7=BB=88=E6=80=81=E7=AB=9E=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - process_session_real_pty_eof_reaches_terminal 原先无条件要求 close stdin 成功,PTY 在高负载下先自然 EOF 并退出时会被误判为失败 - 改为仅在会话未终止时要求 close 成功;已进入终态时保留 exited 与 EOF 输出断言,不削弱验证目标 --- .../src-tauri/src/process_session/tests.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/process_session/tests.rs b/apps/ai-game-creator-shell/src-tauri/src/process_session/tests.rs index f7a0acc12..3a890ead3 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/process_session/tests.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/process_session/tests.rs @@ -1399,10 +1399,21 @@ process.stdin.resume(); ) .expect("poll ready"); } - let eof = write_process_session_stdin_at(root, &identity, &poll.process_id, "", false, true) - .expect("close stdin"); - assert!(eof.eof); - assert!(!eof.stdin_open); + // 自然 EOF 与本用例显式 close 存在竞态:PTY 在负载下可能先收到流 EOF, + // 子进程随即退出并把会话置为终态,此时 close 会以「已进入终态」拒绝。 + // 该终态正是用例要验证的收敛结果,因此只在会话仍未终止时要求 close 成功。 + match write_process_session_stdin_at(root, &identity, &poll.process_id, "", false, true) { + Ok(eof) => { + assert!(eof.eof); + assert!(!eof.stdin_open); + } + Err(error) => { + assert!( + error.contains("已进入终态"), + "closing stdin failed for a non-terminal session: {error}" + ); + } + } let mut tail = String::new(); for _ in 0..20 { poll = poll_process_session_at(