diff --git a/crates/spt/tests/engine_room_bringup_e2e.rs b/crates/spt/tests/engine_room_bringup_e2e.rs index 1401860..a5664ed 100644 --- a/crates/spt/tests/engine_room_bringup_e2e.rs +++ b/crates/spt/tests/engine_room_bringup_e2e.rs @@ -530,6 +530,8 @@ fn attempt_bringup_with_status_row(offline_row: bool) -> BringupAttempt { let row_before: Option = if offline_row { let warm = rc_once(&spt_bin, home.path(), id, &code, &home.path().join("rc-warm")); let warm_pid = warm.pid; + let warm_out = warm.out.clone(); + let warm_err = warm.err.clone(); warm_child = Some(warm.child); let up = wait_for_session(&perch_path, Duration::from_secs(45)); // END THE SESSION THROUGH THE PRODUCT'S OWN VERB, not by killing a pid. @@ -546,6 +548,7 @@ fn attempt_bringup_with_status_row(offline_row: bool) -> BringupAttempt { // // The controller goes away first: the seat is stopped, not merely // detached from. + let harness_pid = spt_store::info::read_pid(&perch_path); kill_pid(warm_pid); let stopped = { let mut cmd = Command::new(&spt_bin); @@ -554,13 +557,12 @@ fn attempt_bringup_with_status_row(offline_row: bool) -> BringupAttempt { .env("SPT_HOME", home.path()); output_bounded(cmd, Duration::from_secs(30)) }; + let row = wait_for_offline_row(&perch_path, Duration::from_secs(45)); setup = format!( - "{setup}; warm bring-up spawned={up}; endpoint stop exit={:?} out={} err={}", - stopped.status.code(), - String::from_utf8_lossy(&stopped.stdout).trim(), - String::from_utf8_lossy(&stopped.stderr).trim(), + "{setup}; harness_pid={harness_pid:?} alive_after_stop={} row_after_stop={row:?}", + harness_pid.is_some_and(|pid| spt_store::proc::process_cmdline(pid).is_some()), ); - wait_for_offline_row(&perch_path, Duration::from_secs(45)) + row } else { spt_store::info::read_info(&perch_path).and_then(|i| i.status) }; @@ -584,9 +586,25 @@ fn attempt_bringup_with_status_row(offline_row: bool) -> BringupAttempt { let truth_after = wait_for_broker_session(id, Duration::from_secs(45)); let spawned = truth_after.is_some(); - let sid_after = spt_store::info::read_info(&perch_path) - .map(|i| i.session_id) - .unwrap_or_default(); + let sid_probe_start = Instant::now(); + let mut sid_samples = Vec::new(); + let sid_after = loop { + let info = spt_store::info::read_info(&perch_path); + let sid = info.as_ref().map(|i| i.session_id.clone()).unwrap_or_default(); + let status = info.and_then(|i| i.status).unwrap_or_default(); + sid_samples.push(format!( + "{}ms:{sid}:{status}", + sid_probe_start.elapsed().as_millis() + )); + if sid != sid_before || sid_probe_start.elapsed() >= Duration::from_secs(3) { + break sid; + } + std::thread::sleep(Duration::from_millis(25)); + }; + setup = format!( + "{setup}; [DEBUG-er-rca] broker truth={truth_after:?} sid timeline={}", + sid_samples.join(",") + ); let rc_pid = rc.pid; let _ = rc.child.kill(); @@ -1151,8 +1169,10 @@ fn a_cleanly_offline_engine_room_is_still_brought_up_by_its_own_gate() { offline.row_before.as_deref(), Some(spt_store::liveness::STATUS_OFFLINE), "PRECONDITION: the offline arm must actually reach the offline row, \ - written by the daemon's OWN exit path — not by this test. setup: {}", + written by the daemon's OWN exit path — not by this test. setup: {}\n\ + === brain log ===\n{}", offline.setup, + offline.brain_log, ); assert_ne!( cleared.row_before.as_deref(),