diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-29 20:39:54 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-29 20:39:54 +0300 |
| commit | 8b74fb8a12716269c76f0b503ee7db5bbec2c921 (patch) | |
| tree | e5230f94cb1e6eb70d1f00c75cd85dae8b5b9ead /tests | |
| parent | 5fffc59cd8aaea1604abb90e749e58fd97acfac0 (diff) | |
feat: emit placement mutation events
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/api_ping.rs | 2 | ||||
| -rw-r--r-- | tests/cli_wrapper.rs | 12 | ||||
| -rw-r--r-- | tests/client_mode.rs | 25 | ||||
| -rw-r--r-- | tests/cross_area.rs | 18 | ||||
| -rw-r--r-- | tests/detach_reattach.rs | 58 | ||||
| -rw-r--r-- | tests/multi_client.rs | 4 | ||||
| -rw-r--r-- | tests/server_headless.rs | 22 | ||||
| -rw-r--r-- | tests/support/mod.rs | 1 |
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 { |
