summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-29 20:39:54 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-29 20:39:54 +0300
commit8b74fb8a12716269c76f0b503ee7db5bbec2c921 (patch)
treee5230f94cb1e6eb70d1f00c75cd85dae8b5b9ead /tests
parent5fffc59cd8aaea1604abb90e749e58fd97acfac0 (diff)
feat: emit placement mutation events
Diffstat (limited to 'tests')
-rw-r--r--tests/api_ping.rs2
-rw-r--r--tests/cli_wrapper.rs12
-rw-r--r--tests/client_mode.rs25
-rw-r--r--tests/cross_area.rs18
-rw-r--r--tests/detach_reattach.rs58
-rw-r--r--tests/multi_client.rs4
-rw-r--r--tests/server_headless.rs22
-rw-r--r--tests/support/mod.rs1
8 files changed, 76 insertions, 66 deletions
diff --git a/tests/api_ping.rs b/tests/api_ping.rs
index 1f9fafe6..1d625637 100644
--- a/tests/api_ping.rs
+++ b/tests/api_ping.rs
@@ -304,7 +304,7 @@ fn ping_over_socket_returns_version() {
assert_eq!(value["result"]["version"], env!("CARGO_PKG_VERSION"));
// Intentionally hardcoded so wire protocol bumps require updating this test.
// Changing this value means old clients/servers are no longer compatible.
- assert_eq!(value["result"]["protocol"], 14);
+ assert_eq!(value["result"]["protocol"], 15);
cleanup_spawned_herdr(child, base);
}
diff --git a/tests/cli_wrapper.rs b/tests/cli_wrapper.rs
index 55555be5..542d9768 100644
--- a/tests/cli_wrapper.rs
+++ b/tests/cli_wrapper.rs
@@ -1441,7 +1441,7 @@ fn status_commands_report_client_and_server_versions() {
"stdout: {full_stdout}"
);
assert!(
- full_stdout.contains(" protocol: 14"),
+ full_stdout.contains(" protocol: 15"),
"stdout: {full_stdout}"
);
assert!(full_stdout.contains("server:\n"), "stdout: {full_stdout}");
@@ -1474,7 +1474,7 @@ fn status_commands_report_client_and_server_versions() {
"stdout: {server_stdout}"
);
assert!(
- server_stdout.contains("protocol: 14"),
+ server_stdout.contains("protocol: 15"),
"stdout: {server_stdout}"
);
@@ -1486,7 +1486,7 @@ fn status_commands_report_client_and_server_versions() {
"stdout: {client_stdout}"
);
assert!(
- client_stdout.contains("protocol: 14"),
+ client_stdout.contains("protocol: 15"),
"stdout: {client_stdout}"
);
assert!(
@@ -1496,7 +1496,7 @@ fn status_commands_report_client_and_server_versions() {
let full_json = run_cli_json(&socket_path, &["status", "--json"]);
assert_eq!(full_json["client"]["version"], env!("CARGO_PKG_VERSION"));
- assert_eq!(full_json["client"]["protocol"], 14);
+ assert_eq!(full_json["client"]["protocol"], 15);
assert_eq!(full_json["server"]["status"], "running");
assert_eq!(full_json["server"]["running"], true);
assert_eq!(full_json["server"]["compatible"], true);
@@ -1510,12 +1510,12 @@ fn status_commands_report_client_and_server_versions() {
let server_json = run_cli_json(&socket_path, &["status", "server", "--json"]);
assert_eq!(server_json["status"], "running");
assert_eq!(server_json["version"], env!("CARGO_PKG_VERSION"));
- assert_eq!(server_json["protocol"], 14);
+ assert_eq!(server_json["protocol"], 15);
assert_eq!(server_json["compatible"], true);
let client_json = run_cli_json(&socket_path, &["status", "client", "--json"]);
assert_eq!(client_json["version"], env!("CARGO_PKG_VERSION"));
- assert_eq!(client_json["protocol"], 14);
+ assert_eq!(client_json["protocol"], 15);
assert!(client_json["binary"]
.as_str()
.is_some_and(|path| !path.is_empty()));
diff --git a/tests/client_mode.rs b/tests/client_mode.rs
index 4f628faa..c1b62394 100644
--- a/tests/client_mode.rs
+++ b/tests/client_mode.rs
@@ -16,7 +16,7 @@ use serde_json::Value;
use support::{
cleanup_test_base, client_handshake, encode_varint_u32, frame_message, read_server_message,
register_runtime_dir, register_spawned_herdr_pid, unregister_spawned_herdr_pid,
- wait_for_message_variant, wait_for_socket, wait_until,
+ wait_for_message_variant, wait_for_socket, wait_until, CURRENT_PROTOCOL,
};
fn unique_test_dir() -> PathBuf {
@@ -311,8 +311,11 @@ fn client_connects_and_receives_frame() {
// Connect and handshake.
let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14, "server should report protocol version 14");
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(
+ version, CURRENT_PROTOCOL,
+ "server should report current protocol version"
+ );
assert!(
error.is_none(),
"handshake should not have error: {:?}",
@@ -379,8 +382,8 @@ fn client_sees_headless_startup_config_diagnostic() {
let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
stream
@@ -595,8 +598,8 @@ fn client_receives_frame_after_pane_output() {
// Connect and handshake.
let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
read_next_frame_payload(&mut stream, Duration::from_secs(10))
@@ -710,8 +713,8 @@ fn graceful_shutdown_sends_server_shutdown_to_client() {
// Connect and handshake.
let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Drain initial frame(s).
@@ -809,8 +812,8 @@ fn client_receives_notify_on_agent_state_change() {
// Connect as a client and perform handshake.
let mut stream = UnixStream::connect(&client_socket).expect("should connect");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Drain initial frame(s).
diff --git a/tests/cross_area.rs b/tests/cross_area.rs
index d596a8fc..9fe71790 100644
--- a/tests/cross_area.rs
+++ b/tests/cross_area.rs
@@ -15,7 +15,7 @@ use serde::Deserialize;
use serde_json::{json, Value};
use support::{
cleanup_test_base, register_runtime_dir, register_spawned_herdr_pid,
- unregister_spawned_herdr_pid,
+ unregister_spawned_herdr_pid, CURRENT_PROTOCOL,
};
fn unique_test_dir() -> PathBuf {
@@ -687,7 +687,7 @@ fn cross_area_detach_and_reattach_preserves_state() {
// Local attach (client A).
let mut client_a = UnixStream::connect(&client_socket).expect("client A should connect");
- client_handshake(&mut client_a, 14, 100, 30);
+ client_handshake(&mut client_a, CURRENT_PROTOCOL, 100, 30);
assert!(wait_for_frame(&mut client_a, Duration::from_secs(2)));
// Use herdr: create a workspace and write output into its pane.
@@ -724,7 +724,7 @@ fn cross_area_detach_and_reattach_preserves_state() {
// Reattach from another terminal/session (client B).
let mut client_b = UnixStream::connect(&client_socket).expect("client B should connect");
- client_handshake(&mut client_b, 14, 80, 24);
+ client_handshake(&mut client_b, CURRENT_PROTOCOL, 80, 24);
assert!(
wait_for_frame(&mut client_b, Duration::from_secs(5)),
"reattached client should receive frame"
@@ -780,7 +780,7 @@ fn cross_area_agent_process_survives_detach_and_reattach() {
wait_for_socket(&client_socket, Duration::from_secs(10));
let mut client_a = UnixStream::connect(&client_socket).expect("client A should connect");
- client_handshake(&mut client_a, 14, 100, 30);
+ client_handshake(&mut client_a, CURRENT_PROTOCOL, 100, 30);
assert!(wait_for_frame(&mut client_a, Duration::from_secs(2)));
let created = workspace_create(&api_socket, "agent-persist");
@@ -833,7 +833,7 @@ fn cross_area_agent_process_survives_detach_and_reattach() {
// Reattach and ensure client-side state reflects the persisted working status.
let mut client_b = UnixStream::connect(&client_socket).expect("client B should connect");
- client_handshake(&mut client_b, 14, 80, 24);
+ client_handshake(&mut client_b, CURRENT_PROTOCOL, 80, 24);
let saw_working_on_client =
wait_for_frame_matching(&mut client_b, Duration::from_secs(5), |frame| {
frame_contains_text(frame, "working")
@@ -878,7 +878,7 @@ fn cross_area_client_and_api_workspace_views_are_consistent() {
wait_for_socket(&client_socket, Duration::from_secs(10));
let mut client = UnixStream::connect(&client_socket).expect("client should connect");
- client_handshake(&mut client, 14, 100, 30);
+ client_handshake(&mut client, CURRENT_PROTOCOL, 100, 30);
assert!(wait_for_frame(&mut client, Duration::from_secs(2)));
drain_server_messages(&mut client, Duration::from_millis(300));
@@ -941,9 +941,9 @@ fn cross_area_two_clients_shared_view_and_single_detach_stability() {
wait_for_socket(&client_socket, Duration::from_secs(10));
let mut client_a = UnixStream::connect(&client_socket).expect("client A should connect");
- client_handshake(&mut client_a, 14, 110, 30);
+ client_handshake(&mut client_a, CURRENT_PROTOCOL, 110, 30);
let mut client_b = UnixStream::connect(&client_socket).expect("client B should connect");
- client_handshake(&mut client_b, 14, 100, 30);
+ client_handshake(&mut client_b, CURRENT_PROTOCOL, 100, 30);
assert!(wait_for_frame(&mut client_a, Duration::from_secs(2)));
assert!(wait_for_frame(&mut client_b, Duration::from_secs(2)));
@@ -1112,7 +1112,7 @@ fn cross_area_server_kill_then_restart_and_reconnect() {
let mut reconnect_client =
UnixStream::connect(&client_socket).expect("new client should connect after restart");
- client_handshake(&mut reconnect_client, 14, 80, 24);
+ client_handshake(&mut reconnect_client, CURRENT_PROTOCOL, 80, 24);
assert!(
wait_for_frame(&mut reconnect_client, Duration::from_secs(5)),
"new client should receive frame after restart"
diff --git a/tests/detach_reattach.rs b/tests/detach_reattach.rs
index cfcb5b89..3abe1bec 100644
--- a/tests/detach_reattach.rs
+++ b/tests/detach_reattach.rs
@@ -16,7 +16,7 @@ use serde_json::Value;
use support::{
cleanup_test_base, client_handshake, drain_messages, read_server_message, register_runtime_dir,
register_spawned_herdr_pid, send_detach, send_input, unregister_spawned_herdr_pid,
- wait_for_disconnect, wait_for_message_variant, wait_for_socket, wait_until,
+ wait_for_disconnect, wait_for_message_variant, wait_for_socket, wait_until, CURRENT_PROTOCOL,
};
fn unique_test_dir() -> PathBuf {
@@ -276,8 +276,8 @@ fn navigate_q_detaches_client_and_server_persists() {
// Connect and handshake.
let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Drain initial frames.
@@ -338,8 +338,8 @@ fn explicit_detach_message_causes_clean_disconnect() {
// Connect and handshake.
let mut stream = UnixStream::connect(&client_socket).expect("should connect");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Drain initial frames.
@@ -396,9 +396,9 @@ fn reattach_after_detach_shows_current_state() {
// --- Client A ---
let mut stream_a = UnixStream::connect(&client_socket).expect("client A should connect");
- let (version, error) =
- client_handshake(&mut stream_a, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ let (version, error) = client_handshake(&mut stream_a, CURRENT_PROTOCOL, 80, 24)
+ .expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Drain initial frames.
@@ -435,9 +435,9 @@ fn reattach_after_detach_shows_current_state() {
// --- Client B (reattach) ---
let mut stream_b = UnixStream::connect(&client_socket).expect("client B should connect");
- let (version, error) =
- client_handshake(&mut stream_b, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ let (version, error) = client_handshake(&mut stream_b, CURRENT_PROTOCOL, 80, 24)
+ .expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(
error.is_none(),
"reattach handshake should succeed: {:?}",
@@ -516,8 +516,8 @@ fn processes_survive_during_and_after_detach() {
// Connect and handshake.
let mut stream = UnixStream::connect(&client_socket).expect("should connect");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Drain initial frames.
@@ -554,9 +554,9 @@ fn processes_survive_during_and_after_detach() {
// Reattach — verify we can connect and receive a frame.
let mut stream_b = UnixStream::connect(&client_socket).expect("should reattach");
- let (version, error) =
- client_handshake(&mut stream_b, 14, 80, 24).expect("reattach handshake should succeed");
- assert_eq!(version, 14);
+ let (version, error) = client_handshake(&mut stream_b, CURRENT_PROTOCOL, 80, 24)
+ .expect("reattach handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Verify the reattached client receives a frame.
@@ -604,8 +604,8 @@ fn server_persists_after_client_connection_drop() {
// Connect and handshake.
let mut stream = UnixStream::connect(&client_socket).expect("should connect");
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Drain initial frames.
@@ -630,9 +630,9 @@ fn server_persists_after_client_connection_drop() {
// Reattach — verify we can connect and handshake again.
let mut stream_b = UnixStream::connect(&client_socket).expect("should reattach");
- let (version, error) =
- client_handshake(&mut stream_b, 14, 80, 24).expect("reattach handshake should succeed");
- assert_eq!(version, 14);
+ let (version, error) = client_handshake(&mut stream_b, CURRENT_PROTOCOL, 80, 24)
+ .expect("reattach handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "reattach should succeed: {:?}", error);
cleanup_spawned_herdr(spawned, base);
@@ -653,8 +653,8 @@ fn detached_output_preserves_last_attached_pty_size() {
let mut stream = UnixStream::connect(&client_socket).expect("client should connect");
let (version, error) =
- client_handshake(&mut stream, 14, 120, 40).expect("handshake should succeed");
- assert_eq!(version, 14);
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 120, 40).expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
drain_messages(&mut stream);
@@ -721,9 +721,9 @@ fn output_accumulated_while_detached_visible_on_reattach() {
// Connect and handshake client A.
let mut stream_a = UnixStream::connect(&client_socket).expect("client A should connect");
- let (version, error) =
- client_handshake(&mut stream_a, 14, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14);
+ let (version, error) = client_handshake(&mut stream_a, CURRENT_PROTOCOL, 80, 24)
+ .expect("handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Detach client A immediately.
@@ -779,9 +779,9 @@ fn output_accumulated_while_detached_visible_on_reattach() {
// --- Client B (reattach) ---
let mut stream_b = UnixStream::connect(&client_socket).expect("client B should connect");
- let (version, error) =
- client_handshake(&mut stream_b, 14, 80, 24).expect("reattach handshake should succeed");
- assert_eq!(version, 14);
+ let (version, error) = client_handshake(&mut stream_b, CURRENT_PROTOCOL, 80, 24)
+ .expect("reattach handshake should succeed");
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none(), "{:?}", error);
// Client B should receive a frame with the current state.
diff --git a/tests/multi_client.rs b/tests/multi_client.rs
index 421a6756..d891a9f0 100644
--- a/tests/multi_client.rs
+++ b/tests/multi_client.rs
@@ -16,7 +16,7 @@ use serde::Deserialize;
use serde_json::Value;
use support::{
cleanup_test_base, register_runtime_dir, register_spawned_herdr_pid,
- unregister_spawned_herdr_pid,
+ unregister_spawned_herdr_pid, CURRENT_PROTOCOL,
};
fn unique_test_dir() -> PathBuf {
@@ -566,7 +566,7 @@ fn client_handshake(
fn connect_raw_client(client_socket: &Path, cols: u16, rows: u16) -> UnixStream {
let mut stream = UnixStream::connect(client_socket).expect("should connect to client socket");
- client_handshake(&mut stream, 14, cols, rows).expect("handshake should succeed");
+ client_handshake(&mut stream, CURRENT_PROTOCOL, cols, rows).expect("handshake should succeed");
stream
}
diff --git a/tests/server_headless.rs b/tests/server_headless.rs
index 6e5f03cd..5abb5ace 100644
--- a/tests/server_headless.rs
+++ b/tests/server_headless.rs
@@ -14,7 +14,7 @@ use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
use portable_pty::{native_pty_system, Child, CommandBuilder, MasterPty, PtySize};
use support::{
cleanup_test_base, register_runtime_dir, register_spawned_herdr_pid,
- unregister_spawned_herdr_pid,
+ unregister_spawned_herdr_pid, CURRENT_PROTOCOL,
};
fn unique_test_dir() -> PathBuf {
@@ -595,9 +595,12 @@ fn client_handshake_succeeds() {
// Send Hello with the current protocol version, 80 cols, 24 rows.
let (version, error) =
- client_handshake(&mut stream, 14, 80, 24).expect("handshake should succeed");
+ client_handshake(&mut stream, CURRENT_PROTOCOL, 80, 24).expect("handshake should succeed");
- assert_eq!(version, 14, "server should report protocol version 14");
+ assert_eq!(
+ version, CURRENT_PROTOCOL,
+ "server should report current protocol version"
+ );
assert!(
error.is_none(),
"handshake should not have an error: {:?}",
@@ -626,7 +629,10 @@ fn client_handshake_rejects_incompatible_version() {
let (version, error) = client_handshake(&mut stream, 0, 80, 24)
.expect("should read Welcome response even on rejection");
- assert_eq!(version, 14, "server should report its version 14");
+ assert_eq!(
+ version, CURRENT_PROTOCOL,
+ "server should report its current protocol version"
+ );
assert!(
error.is_some(),
"version 0 should be rejected with an error"
@@ -651,10 +657,10 @@ fn client_handshake_clamps_small_terminal_size() {
// Send Hello with 0x0 terminal size — should be clamped.
let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket");
- let (version, error) = client_handshake(&mut stream, 14, 0, 0)
+ let (version, error) = client_handshake(&mut stream, CURRENT_PROTOCOL, 0, 0)
.expect("handshake with 0x0 should succeed (server clamps)");
- assert_eq!(version, 14);
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(
error.is_none(),
"0x0 size should be accepted (clamped): {:?}",
@@ -714,9 +720,9 @@ fn no_hello_client_closed_within_five_seconds() {
// Verify the server is still healthy — a proper client can still connect.
let mut good_stream =
UnixStream::connect(&client_socket).expect("should connect after no-hello client");
- let (version, error) = client_handshake(&mut good_stream, 14, 80, 24)
+ let (version, error) = client_handshake(&mut good_stream, CURRENT_PROTOCOL, 80, 24)
.expect("proper handshake should still work after no-hello client");
- assert_eq!(version, 14);
+ assert_eq!(version, CURRENT_PROTOCOL);
assert!(error.is_none());
// API should still work.
diff --git a/tests/support/mod.rs b/tests/support/mod.rs
index 5359997f..5844bfa7 100644
--- a/tests/support/mod.rs
+++ b/tests/support/mod.rs
@@ -15,6 +15,7 @@ static INIT: Once = Once::new();
static CLEANUP_GUARD: OnceLock<CleanupGuard> = OnceLock::new();
const WATCHDOG_SCAN_INTERVAL: Duration = Duration::from_secs(1);
const RUNTIME_OWNER_MARKER: &str = ".herdr-test-owner-pid";
+pub const CURRENT_PROTOCOL: u32 = 15;
pub fn register_spawned_herdr_pid(pid: Option<u32>) {
let Some(pid) = pid else {