From 448f6f2f03f0e0af415df86eae8a24733e459dce Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:03:42 -0700 Subject: [PATCH 1/3] test(tui): remove fixed synchronization waits --- .../cmux-tui-core/tests/browser_runtime.rs | 4 ++-- cmux-tui/crates/cmux-tui/tests/cli.rs | 18 +++++++++++++++++- .../cmux-tui/tests/terminal_host_recovery.rs | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs b/cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs index 728b36c5521f..dad230c81f6d 100644 --- a/cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs +++ b/cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs @@ -229,12 +229,12 @@ fn recv_attach_event(reader: &mut BufReader, event: &str) -> Value { } fn wait_for(mut f: impl FnMut() -> Option, timeout: Duration) -> Option { - let start = Instant::now(); + let deadline = Instant::now() + test_duration(timeout); loop { if let Some(value) = f() { return Some(value); } - if start.elapsed() > timeout { + if Instant::now() >= deadline { return None; } thread::sleep(Duration::from_millis(20)); diff --git a/cmux-tui/crates/cmux-tui/tests/cli.rs b/cmux-tui/crates/cmux-tui/tests/cli.rs index f3aa03d3010d..946397d978b8 100644 --- a/cmux-tui/crates/cmux-tui/tests/cli.rs +++ b/cmux-tui/crates/cmux-tui/tests/cli.rs @@ -3613,8 +3613,24 @@ fn assert_subscribe_reports_tree_changed(server: &HeadlessServer) { } }); writeln!(writer, r#"{{"id":1,"cmd":"subscribe"}}"#).unwrap(); + writer.flush().unwrap(); + + let deadline = Instant::now() + Duration::from_secs(5); + loop { + let remaining = deadline + .checked_duration_since(Instant::now()) + .expect("server did not acknowledge the tree-change subscription"); + let line = rx + .recv_timeout(remaining) + .expect("server did not acknowledge the tree-change subscription"); + let message: serde_json::Value = + serde_json::from_str(&line).expect("subscription returned invalid JSON"); + if message["id"].as_u64() == Some(1) { + assert_eq!(message["ok"], true, "tree-change subscription failed: {message}"); + break; + } + } - std::thread::sleep(Duration::from_millis(200)); let tab = json_cli(server, &["tab", "create", "terminal"]); if !tab.status.success() { let mut lines = Vec::new(); diff --git a/cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs b/cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs index c373ef54b911..824cea9664e5 100644 --- a/cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs +++ b/cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs @@ -3807,7 +3807,7 @@ fn wait_for_socket(path: &Path) { } fn wait_for_screen(path: &Path, surface: u64, marker: &str) -> String { - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = Instant::now() + test_timeout(Duration::from_secs(10)); let mut last = String::new(); while Instant::now() < deadline { last = request(path, serde_json::json!({"cmd": "read-screen", "surface": surface}))["text"] From 81e8a3ec59effd6db6a63c257776d08afe604be0 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:25:22 -0700 Subject: [PATCH 2/3] test(tui): avoid double timeout scaling --- cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs b/cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs index dad230c81f6d..e615a229736b 100644 --- a/cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs +++ b/cmux-tui/crates/cmux-tui-core/tests/browser_runtime.rs @@ -1537,7 +1537,7 @@ fn browser_capture_scale_applies_to_metrics_screencast_and_input() { let frame_seq = surface.browser_frame_seq()?; (frame.seq == frame_seq).then_some((frame, frame_seq)) }, - test_duration(Duration::from_secs(10)), + Duration::from_secs(10), ) .expect("browser produced a pointer-authoritative frame"); assert_eq!(frame.data_b64, "c2NhbGU="); From e12ce402fc760a9d51dceee2faba1331f59855cd Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:52:24 -0700 Subject: [PATCH 3/3] test(tui): scale terminal record waits --- cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs b/cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs index 824cea9664e5..1399d6e829c1 100644 --- a/cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs +++ b/cmux-tui/crates/cmux-tui/tests/terminal_host_recovery.rs @@ -3823,7 +3823,7 @@ fn wait_for_screen(path: &Path, surface: u64, marker: &str) -> String { } fn wait_for_host_records(root: &Path, expected: usize) -> Vec<(PathBuf, TerminalHostRecord)> { - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = Instant::now() + test_timeout(Duration::from_secs(10)); loop { let records = load_terminal_host_records(root).unwrap(); if records.len() == expected { @@ -3835,7 +3835,7 @@ fn wait_for_host_records(root: &Path, expected: usize) -> Vec<(PathBuf, Terminal } fn wait_for_no_host_records(root: &Path) { - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = Instant::now() + test_timeout(Duration::from_secs(10)); while Instant::now() < deadline { if load_terminal_host_records(root).unwrap().is_empty() && load_terminal_host_exit_records(root).unwrap().is_empty()