diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/live_handoff.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/tests/live_handoff.rs b/tests/live_handoff.rs index 38e68a5a..e40f8268 100644 --- a/tests/live_handoff.rs +++ b/tests/live_handoff.rs @@ -702,6 +702,79 @@ fn live_handoff_unknown_pane_exit_preserves_session_on_shutdown() { cleanup_test_base(&base); } +#[cfg(any(target_os = "linux", target_os = "macos"))] +#[test] +fn live_handoff_carries_more_panes_than_one_scm_rights_message() { + const PANES: usize = 70; + + let _lock = test_lock(); + let base = unique_test_dir(); + let config_home = base.join("config"); + let runtime_dir = base.join("runtime"); + let api_socket = runtime_dir.join("herdr.sock"); + + let spawned = spawn_server(&config_home, &runtime_dir, &api_socket); + wait_for_socket(&api_socket, Duration::from_secs(10)); + register_runtime_dir(&runtime_dir); + let server_pid = spawned + .child + .process_id() + .expect("test server should expose pid"); + + let created = request( + &api_socket, + serde_json::json!({ + "id": "test:workspace:create", + "method": "workspace.create", + "params": {"cwd": "/tmp", "focus": true} + }), + ); + let workspace_id = created["result"]["workspace"]["workspace_id"] + .as_str() + .unwrap() + .to_string(); + + // One pane per tab keeps the layout shallow, so this exercises the fd + // transfer rather than the depth of a single split tree. + for index in 1..PANES { + assert_ok(request( + &api_socket, + serde_json::json!({ + "id": format!("test:tab:create-{index}"), + "method": "tab.create", + "params": {"workspace_id": workspace_id, "focus": false} + }), + )); + } + wait_for_server_ptmx_fd_count(server_pid, PANES, Duration::from_secs(60)); + + assert_ok(request( + &api_socket, + serde_json::json!({"id":"test:handoff","method":"server.live_handoff","params":{}}), + )); + let replacement_pid = + wait_for_replacement_server_pid(&runtime_dir, server_pid, Duration::from_secs(30)); + wait_for_api(&api_socket, Duration::from_secs(30)); + wait_for_server_ptmx_fd_count(replacement_pid, PANES, Duration::from_secs(30)); + + let panes = request( + &api_socket, + serde_json::json!({"id":"test:pane:list","method":"pane.list","params":{}}), + ); + assert_eq!( + panes["result"]["panes"].as_array().map(Vec::len), + Some(PANES), + "replacement server should report every pane after handoff" + ); + + let _ = request( + &api_socket, + serde_json::json!({"id":"test:stop","method":"server.stop","params":{}}), + ); + drop(spawned); + cleanup_test_base(&base); +} + #[test] fn live_handoff_preserves_named_session_socket_paths() { let _lock = test_lock(); |
