From 16c3c4753583b4ba48ba7c977d74656382295145 Mon Sep 17 00:00:00 2001 From: Charley Cunningham Date: Wed, 18 Feb 2026 19:05:35 -0800 Subject: [PATCH] Stabilize app-server detached review and running-resume tests (#12203) ## Summary - stabilize `thread_resume_rejoins_running_thread_even_with_override_mismatch` by using a valid delayed second SSE response instead of an intentionally truncated stream - set `RUST_MIN_STACK=4194304` for spawned app-server test processes in `McpProcess` to avoid stack-sensitive CI overflows in detached review tests ## Why - the thread-resume assertion could race with a mocked stream-disconnect error and intermittently observe `systemError` - detached review startup is stack-sensitive in some CI environments; pinning a larger stack in the test harness removes that flake without changing product behavior ## Validation - `just fmt` - `cargo test -p codex-app-server --test all suite::v2::thread_resume::thread_resume_rejoins_running_thread_even_with_override_mismatch` - `cargo test -p codex-app-server --test all suite::v2::review::review_start_with_detached_delivery_returns_new_thread_id` --- codex-rs/app-server/tests/common/mcp_process.rs | 4 ++++ codex-rs/app-server/tests/suite/v2/thread_resume.rs | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/codex-rs/app-server/tests/common/mcp_process.rs b/codex-rs/app-server/tests/common/mcp_process.rs index eac38e145..2677c53d8 100644 --- a/codex-rs/app-server/tests/common/mcp_process.rs +++ b/codex-rs/app-server/tests/common/mcp_process.rs @@ -105,6 +105,10 @@ impl McpProcess { cmd.stderr(Stdio::piped()); cmd.env("CODEX_HOME", codex_home); cmd.env("RUST_LOG", "debug"); + // Bazel/Linux workers can run with smaller default thread stacks, which makes + // tokio-runtime-worker stack overflows more likely in app-server integration tests. + // Pin a larger minimum stack for the spawned test server process. + cmd.env("RUST_MIN_STACK", "4194304"); cmd.env_remove(CODEX_INTERNAL_ORIGINATOR_OVERRIDE_ENV_VAR); for (k, v) in env_overrides { diff --git a/codex-rs/app-server/tests/suite/v2/thread_resume.rs b/codex-rs/app-server/tests/suite/v2/thread_resume.rs index 4ec348564..576f03156 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_resume.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_resume.rs @@ -507,14 +507,19 @@ async fn thread_resume_rejects_mismatched_path_when_thread_is_running() -> Resul #[tokio::test] async fn thread_resume_rejoins_running_thread_even_with_override_mismatch() -> Result<()> { let server = responses::start_mock_server().await; - let first_body = responses::sse(vec![ + let first_response = responses::sse_response(responses::sse(vec![ responses::ev_response_created("resp-1"), responses::ev_assistant_message("msg-1", "Done"), responses::ev_completed("resp-1"), - ]); - let second_body = responses::sse(vec![responses::ev_response_created("resp-2")]); + ])); + let second_response = responses::sse_response(responses::sse(vec![ + responses::ev_response_created("resp-2"), + responses::ev_assistant_message("msg-2", "Done"), + responses::ev_completed("resp-2"), + ])) + .set_delay(std::time::Duration::from_millis(500)); let _response_mock = - responses::mount_sse_sequence(&server, vec![first_body, second_body]).await; + responses::mount_response_sequence(&server, vec![first_response, second_response]).await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?;