aboutsummaryrefslogtreecommitdiff
path: root/tests/client_mode.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-21 00:29:45 +0300
committerGitHub <noreply@github.com>2026-09-21 00:29:45 +0300
commit0ff0f27e222633c97ba4291f6b9be4137002ca84 (patch)
tree97ee77c8a85801ab90133492ddd71b3ce635b8fb /tests/client_mode.rs
parentf090ce95d05d2e7811869be93f9a23bf4ac2c3af (diff)
fix: preserve session layouts across shutdown and restore failures (#4400)
* fix: preserve session layouts across shutdown and restore failures refs #4320 * test: update subscription fixture for pane restore errors --------- Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
Diffstat (limited to 'tests/client_mode.rs')
-rw-r--r--tests/client_mode.rs57
1 files changed, 43 insertions, 14 deletions
diff --git a/tests/client_mode.rs b/tests/client_mode.rs
index 0b94b32e..9bcb4b2c 100644
--- a/tests/client_mode.rs
+++ b/tests/client_mode.rs
@@ -1796,10 +1796,7 @@ fn client_receives_pane_surface_after_pane_output() {
}
#[test]
-fn pane_spawn_cwd_fallback_in_server() {
- // Pane spawn failure cwd fallback in server context.
- // This test verifies that the server can start even with invalid
- // session data pointing to non-existent directories.
+fn unavailable_restored_pane_keeps_saved_cwd_in_server() {
let _lock = test_lock();
let base = unique_test_dir();
let config_home = base.join("config");
@@ -1854,12 +1851,11 @@ fn pane_spawn_cwd_fallback_in_server() {
assert_eq!(pane["result"]["pane"]["workspace_id"], workspace_id);
let cwd = pane["result"]["pane"]["cwd"]
.as_str()
- .expect("restored pane should report fallback cwd");
- assert_ne!(cwd, missing_cwd);
- assert!(
- std::path::Path::new(cwd).exists(),
- "fallback cwd should exist: {cwd}"
- );
+ .expect("restored pane should retain saved cwd");
+ assert_eq!(cwd, missing_cwd);
+ assert!(pane["result"]["pane"]["restore_error"]
+ .as_str()
+ .is_some_and(|error| error.contains("directory")));
let client_shell = spawn_client_shell_process(&config_home, &runtime_dir, &api_socket);
let output = spawn_pty_drain(
@@ -1872,14 +1868,47 @@ fn pane_spawn_cwd_fallback_in_server() {
);
assert!(
wait_until(Duration::from_secs(8), Duration::from_millis(20), || {
- read_output(&output).contains("missing-cwd")
+ let screen = read_output(&output);
+ screen.contains("missing-cwd") && screen.contains("unavailable")
}),
- "client shell should render the restored session; output: {:?}",
+ "client shell should render the unavailable pane; output: {:?}",
read_output(&output)
);
-
+ drop(client_shell);
+ let stopped = send_json_request(
+ &api_socket,
+ r#"{"id":"stop","method":"server.stop","params":{}}"#,
+ );
+ assert!(stopped.get("error").is_none(), "{stopped}");
+ let mut spawned = spawned;
+ assert!(wait_until(
+ Duration::from_secs(10),
+ Duration::from_millis(20),
+ || { spawned.child.try_wait().unwrap().is_some() }
+ ));
drop(spawned);
- cleanup_spawned_herdr(client_shell, base);
+
+ fs::create_dir(missing_cwd).unwrap();
+ let restarted = spawn_server(&config_home, &runtime_dir, &api_socket, &client_socket);
+ wait_for_socket(&api_socket, Duration::from_secs(10));
+ let recovered = send_json_request(
+ &api_socket,
+ &format!(r#"{{"id":"recovered","method":"pane.get","params":{{"pane_id":"{pane_id}"}}}}"#),
+ );
+ assert_eq!(
+ std::fs::canonicalize(recovered["result"]["pane"]["cwd"].as_str().unwrap()).unwrap(),
+ std::fs::canonicalize(missing_cwd).unwrap()
+ );
+ assert!(recovered["result"]["pane"]["restore_error"].is_null());
+ let sent = send_json_request(
+ &api_socket,
+ &serde_json::json!({"id": "type", "method": "pane.send_text", "params": {
+ "pane_id": pane_id, "text": "printf 'RESTORE_RETRY_OK\\n'\n"
+ }})
+ .to_string(),
+ );
+ assert!(sent.get("error").is_none(), "{sent}");
+ cleanup_spawned_herdr(restarted, base);
}
#[test]