aboutsummaryrefslogtreecommitdiff
path: root/tests/live_handoff.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-24 02:49:33 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-24 02:50:58 +0300
commite608a75159fc5cca70485d83ffb8ee681c9da385 (patch)
tree5ffdec62d0bee9a798418d6414ecbddae7ff8ae5 /tests/live_handoff.rs
parent169a4fd90c20a00aec77d684ecec98b9f0f996cc (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.rs89
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,