aboutsummaryrefslogtreecommitdiff
path: root/tests/cli/agent_transport.rs
diff options
context:
space:
mode:
authorakbash <akbash@herdr.dev>2026-08-14 00:18:35 +0300
committerGitHub <noreply@github.com>2026-08-14 00:18:35 +0300
commit37644cabe0d0f8c96f3ae7cc2a985f54d631adff (patch)
tree2d266a3a61267757133946ee28642bbe277770ed /tests/cli/agent_transport.rs
parentf76d7df549e95e1699651f59916e9a38f0f58985 (diff)
fix: wait for new pane shell readiness (#2774)
* fix: wait for new pane shell readiness refs #2773 * refactor: share agent startup bounds refs #2773 * fix: reconcile agent names after startup timeout refs #2773 * fix: cover agent cleanup scheduling skew refs #2773 * fix: bound pane shell readiness retries refs #2773 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
Diffstat (limited to 'tests/cli/agent_transport.rs')
-rw-r--r--tests/cli/agent_transport.rs118
1 files changed, 118 insertions, 0 deletions
diff --git a/tests/cli/agent_transport.rs b/tests/cli/agent_transport.rs
index 85419e90..a052f697 100644
--- a/tests/cli/agent_transport.rs
+++ b/tests/cli/agent_transport.rs
@@ -8,6 +8,24 @@ fn agent_start_waits_through_unknown_then_rejects_blocked() {
let listener = UnixListener::bind(&socket_path).unwrap();
let server = thread::spawn(move || {
+ let (mut pane_stream, pane_line) = accept_fake_cli_operation(&listener);
+ let pane: serde_json::Value = serde_json::from_str(&pane_line).unwrap();
+ assert_eq!(pane["method"], "pane.get");
+ assert_eq!(pane["params"]["pane_id"], "w1:p1");
+ writeln!(
+ pane_stream,
+ "{}",
+ serde_json::json!({
+ "id": pane["id"],
+ "result": {
+ "type": "pane_info",
+ "pane": { "terminal_id": "term_1" }
+ }
+ })
+ )
+ .unwrap();
+ pane_stream.flush().unwrap();
+
let (mut start_stream, start_line) = accept_fake_cli_operation(&listener);
let start: serde_json::Value = serde_json::from_str(&start_line).unwrap();
assert_eq!(start["method"], "agent.start");
@@ -99,6 +117,106 @@ fn agent_start_waits_through_unknown_then_rejects_blocked() {
}
#[test]
+fn agent_start_does_not_retry_after_the_target_terminal_changes() {
+ let base = unique_test_dir();
+ fs::create_dir_all(&base).unwrap();
+ let socket_path = base.join("herdr.sock");
+ let listener = UnixListener::bind(&socket_path).unwrap();
+
+ let server = thread::spawn(move || {
+ for _ in 0..2 {
+ let (mut stream, line) = accept_fake_cli_operation(&listener);
+ let request: serde_json::Value = serde_json::from_str(&line).unwrap();
+ assert_eq!(request["method"], "pane.get");
+ writeln!(
+ stream,
+ "{}",
+ serde_json::json!({
+ "id": request["id"],
+ "result": {
+ "type": "pane_info",
+ "pane": { "terminal_id": "term_1" }
+ }
+ })
+ )
+ .unwrap();
+ stream.flush().unwrap();
+
+ let (mut stream, line) = accept_fake_cli_operation(&listener);
+ let request: serde_json::Value = serde_json::from_str(&line).unwrap();
+ if request["method"] == "agent.start" {
+ writeln!(
+ stream,
+ "{}",
+ serde_json::json!({
+ "id": request["id"],
+ "error": {
+ "code": "agent_pane_busy",
+ "message": "agent target pane w1:p1 is not an available shell"
+ }
+ })
+ )
+ .unwrap();
+ stream.flush().unwrap();
+ } else {
+ assert_eq!(request["method"], "pane.process_info");
+ writeln!(
+ stream,
+ "{}",
+ serde_json::json!({
+ "id": request["id"],
+ "result": {
+ "type": "pane_process_info",
+ "process_info": {
+ "pane_id": "w1:p1",
+ "shell_pid": 10,
+ "foreground_process_group_id": 10,
+ "foreground_processes": [
+ { "pid": 10, "name": "bash" },
+ { "pid": 11, "name": "startup-helper" }
+ ]
+ }
+ }
+ })
+ )
+ .unwrap();
+ stream.flush().unwrap();
+ }
+ }
+
+ let (mut stream, line) = accept_fake_cli_operation(&listener);
+ let request: serde_json::Value = serde_json::from_str(&line).unwrap();
+ assert_eq!(request["method"], "pane.get");
+ writeln!(
+ stream,
+ "{}",
+ serde_json::json!({
+ "id": request["id"],
+ "result": {
+ "type": "pane_info",
+ "pane": { "terminal_id": "term_2" }
+ }
+ })
+ )
+ .unwrap();
+ stream.flush().unwrap();
+ });
+
+ let started = run_cli(
+ &socket_path,
+ &[
+ "agent", "start", "reviewer", "--kind", "pi", "--pane", "w1:p1",
+ ],
+ );
+ assert_eq!(started.status.code(), Some(1));
+ let error: serde_json::Value = serde_json::from_slice(&started.stderr).unwrap();
+ assert_eq!(error["error"]["code"], "agent_pane_busy");
+
+ server.join().unwrap();
+ cleanup_test_base(&base);
+}
+
+#[test]
fn prompt_wait_is_sent_as_one_agent_request() {
let base = unique_test_dir();
fs::create_dir_all(&base).unwrap();