diff --git a/tests/m6_5_repl_acceptance.rs b/tests/m6_5_repl_acceptance.rs index a637b71..8646ca5 100644 --- a/tests/m6_5_repl_acceptance.rs +++ b/tests/m6_5_repl_acceptance.rs @@ -289,12 +289,25 @@ fn m6_5_ctrl_c_sends_sigint() { r#" _G.h = pmacs.repl.spawn { argv = { "cat" } } _G.sigint_sent = false + _G.first_seen_running_at = nil "#, r#" local h = _G.h if not _G.sigint_sent then local status = pmacs.process.status(h._proc_id) if status and status.kind == "running" then + -- Running means the PTY child has been spawned, not + -- that the raw-mode /bin/sh trampoline has necessarily + -- completed stty + exec. macOS runners can observe that + -- gap; wait briefly so SIGINT targets cat, not the + -- setup shell. + if _G.first_seen_running_at == nil then + _G.first_seen_running_at = pmacs.now_ms() + return false + end + if pmacs.now_ms() - _G.first_seen_running_at < 100 then + return false + end pmacs.command.invoke("pmacs.repl.send-sigint-current") _G.sigint_sent = true end @@ -325,7 +338,10 @@ fn m6_5_exit_marker_uses_basename_with_leading_newline() { -- Marker starts with "\n[false exited with code 1]\n". return history:find("\n[false exited with code 1]\n", 1, true) ~= nil "#, - 3000, + // PTY shutdown publishes the exit event only after a bounded + // final-output drain. macOS runners can spend most of the old + // 3s budget in spawn + that drain, even for /bin/false. + 10_000, ); }