diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-24 02:49:33 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-24 02:50:58 +0300 |
| commit | e608a75159fc5cca70485d83ffb8ee681c9da385 (patch) | |
| tree | 5ffdec62d0bee9a798418d6414ecbddae7ff8ae5 /tests/live_handoff.rs | |
| parent | 169a4fd90c20a00aec77d684ecec98b9f0f996cc (diff) | |
fix: make known-agent exit process-owned
refs #1792
refs #1648
Diffstat (limited to 'tests/live_handoff.rs')
| -rw-r--r-- | tests/live_handoff.rs | 89 |
1 files changed, 78 insertions, 11 deletions
diff --git a/tests/live_handoff.rs b/tests/live_handoff.rs index c93898b6..4d81246a 100644 --- a/tests/live_handoff.rs +++ b/tests/live_handoff.rs @@ -1213,6 +1213,8 @@ fn live_handoff_accepts_canonical_pane_id_from_child_env() { #[test] fn live_handoff_keeps_unmanaged_agent_name_bound_to_saved_session() { + use std::os::unix::fs::PermissionsExt; + let _lock = test_lock(); let base = unique_test_dir(); let config_home = base.join("config"); @@ -1220,6 +1222,18 @@ fn live_handoff_keeps_unmanaged_agent_name_bound_to_saved_session() { let api_socket = runtime_dir.join("herdr.sock"); let old_session = base.join("old-session.jsonl"); let new_session = base.join("new-session.jsonl"); + let started_marker = base.join("agent-started"); + let fake_pi = base.join("pi"); + fs::create_dir_all(&base).unwrap(); + fs::write( + &fake_pi, + format!( + "#!/bin/sh\nexport HERDR_AGENT=pi\necho started > {}\nexec /bin/sleep 30\n", + started_marker.display() + ), + ) + .unwrap(); + fs::set_permissions(&fake_pi, fs::Permissions::from_mode(0o755)).unwrap(); let spawned = spawn_server(&config_home, &runtime_dir, &api_socket); wait_for_socket(&api_socket, Duration::from_secs(10)); @@ -1239,6 +1253,30 @@ fn live_handoff_keeps_unmanaged_agent_name_bound_to_saved_session() { assert_ok(request( &api_socket, serde_json::json!({ + "id": "test:pane:start-agent", + "method": "pane.send_input", + "params": {"pane_id": pane_id, "text": fake_pi, "keys": ["Enter"]} + }), + )); + support::wait_for_file(&started_marker, Duration::from_secs(5)); + assert_ok(request( + &api_socket, + serde_json::json!({ + "id": "test:agent:session", + "method": "pane.report_agent_session", + "params": { + "pane_id": pane_id, + "source": "herdr:pi", + "agent": "pi", + "seq": 1, + "agent_session_path": old_session, + "session_start_source": "startup" + } + }), + )); + assert_ok(request( + &api_socket, + serde_json::json!({ "id": "test:agent:report", "method": "pane.report_agent", "params": { @@ -1246,11 +1284,30 @@ fn live_handoff_keeps_unmanaged_agent_name_bound_to_saved_session() { "source": "herdr:pi", "agent": "pi", "state": "idle", - "seq": 1, + "seq": 2, "agent_session_path": old_session } }), )); + let deadline = Instant::now() + Duration::from_secs(5); + loop { + let response = request( + &api_socket, + serde_json::json!({ + "id": "test:agent:wait-for-process", + "method": "agent.get", + "params": {"target": pane_id} + }), + ); + if response.get("result").is_some() { + break; + } + assert!( + Instant::now() < deadline, + "agent process was not detected: {response}" + ); + thread::sleep(Duration::from_millis(25)); + } assert_ok(request( &api_socket, serde_json::json!({ @@ -1276,21 +1333,31 @@ fn live_handoff_keeps_unmanaged_agent_name_bound_to_saved_session() { "pane_id": pane_id, "source": "herdr:pi", "agent": "pi", - "seq": 2, + "seq": 3, "agent_session_path": new_session, "session_start_source": "new" } }), )); - let old_name = request( - &api_socket, - serde_json::json!({ - "id": "test:agent:get-old-name", - "method": "agent.get", - "params": {"target": "reviewer"} - }), - ); - assert_eq!(old_name["error"]["code"], "agent_not_found", "{old_name}"); + let deadline = Instant::now() + Duration::from_secs(5); + loop { + let old_name = request( + &api_socket, + serde_json::json!({ + "id": "test:agent:get-old-name", + "method": "agent.get", + "params": {"target": "reviewer"} + }), + ); + if old_name["error"]["code"] == "agent_not_found" { + break; + } + assert!( + Instant::now() < deadline, + "old session alias was not cleared: {old_name}" + ); + thread::sleep(Duration::from_millis(25)); + } let _ = request( &api_socket, |
