aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/cli/sessions.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/tests/cli/sessions.rs b/tests/cli/sessions.rs
index 8cb0f4b7..ae7b8306 100644
--- a/tests/cli/sessions.rs
+++ b/tests/cli/sessions.rs
@@ -185,6 +185,69 @@ fn named_sessions_use_separate_servers_and_workspace_state() {
}
#[test]
+fn dead_server_cli_reports_one_session_aware_json_line() {
+ fn assert_server_not_running(
+ output: std::process::Output,
+ socket_path: &Path,
+ attach_command: &str,
+ ) {
+ assert_eq!(
+ output.status.code(),
+ Some(1),
+ "stdout={} stderr={}",
+ String::from_utf8_lossy(&output.stdout),
+ String::from_utf8_lossy(&output.stderr)
+ );
+ assert!(output.stdout.is_empty(), "server errors belong on stderr");
+
+ let stderr = String::from_utf8(output.stderr).unwrap();
+ let lines: Vec<_> = stderr.lines().collect();
+ assert_eq!(lines.len(), 1, "expected exactly one JSON line: {stderr:?}");
+
+ let response: serde_json::Value = serde_json::from_str(lines[0]).unwrap();
+ assert_eq!(response["id"], "cli:workspace:create");
+ assert_eq!(response["error"]["code"], "server_not_running");
+ assert_eq!(
+ response["error"]["message"],
+ format!(
+ "no herdr server is running at {}; run `{attach_command}` to start or attach it",
+ socket_path.display()
+ )
+ );
+ }
+
+ let base = unique_test_dir();
+ let config_home = base.join("config");
+ let runtime_dir = base.join("runtime");
+ fs::create_dir_all(&runtime_dir).unwrap();
+ register_runtime_dir(&runtime_dir);
+
+ let named_socket = named_session_socket(&config_home, "foo");
+ let missing = run_named_cli(
+ &config_home,
+ &runtime_dir,
+ &["--session", "foo", "workspace", "create"],
+ );
+ assert_server_not_running(missing, &named_socket, "herdr session attach foo");
+
+ let stale_socket = runtime_dir.join("stale.sock");
+ drop(UnixListener::bind(&stale_socket).unwrap());
+ let stale = Command::new(env!("CARGO_BIN_EXE_herdr"))
+ .args(["workspace", "create"])
+ .env("XDG_CONFIG_HOME", &config_home)
+ .env("XDG_RUNTIME_DIR", &runtime_dir)
+ .env("HERDR_SOCKET_PATH", &stale_socket)
+ .env("HERDR_SESSION", "unrelated")
+ .env_remove("HERDR_CLIENT_SOCKET_PATH")
+ .env_remove("HERDR_ENV")
+ .output()
+ .unwrap();
+ assert_server_not_running(stale, &stale_socket, "herdr");
+
+ cleanup_test_base(&base);
+}
+
+#[test]
fn integration_commands_run_locally_when_server_is_missing() {
let base = unique_test_dir();
let home_dir = base.join("home");