diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-07 21:41:13 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-07 21:48:50 +0300 |
| commit | b0aa7b2cddc57a55a1c0285a1ea82b59ac9783bd (patch) | |
| tree | 866e4bd3322e69c4916457cde420c7e4b74792ef /tests | |
| parent | dcfe11a7588fcd42471159453810abc9b7720a57 (diff) | |
fix: preserve osc8 hyperlinks in client rendering
fixes #73
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/api_ping.rs | 2 | ||||
| -rw-r--r-- | tests/cli_wrapper.rs | 6 | ||||
| -rw-r--r-- | tests/client_mode.rs | 40 | ||||
| -rw-r--r-- | tests/cross_area.rs | 20 | ||||
| -rw-r--r-- | tests/detach_reattach.rs | 44 | ||||
| -rw-r--r-- | tests/multi_client.rs | 6 | ||||
| -rw-r--r-- | tests/server_headless.rs | 14 |
7 files changed, 72 insertions, 60 deletions
diff --git a/tests/api_ping.rs b/tests/api_ping.rs index a0e2d33b..b0411559 100644 --- a/tests/api_ping.rs +++ b/tests/api_ping.rs @@ -223,7 +223,7 @@ fn ping_over_socket_returns_version() { assert_eq!(value["id"], "req_1"); assert_eq!(value["result"]["type"], "pong"); assert_eq!(value["result"]["version"], env!("CARGO_PKG_VERSION")); - assert_eq!(value["result"]["protocol"], 2); + assert_eq!(value["result"]["protocol"], 3); cleanup_spawned_herdr(child, base); } diff --git a/tests/cli_wrapper.rs b/tests/cli_wrapper.rs index 035264df..a68fcb6c 100644 --- a/tests/cli_wrapper.rs +++ b/tests/cli_wrapper.rs @@ -871,7 +871,7 @@ fn status_commands_report_client_and_server_versions() { "stdout: {full_stdout}" ); assert!( - full_stdout.contains(" protocol: 2"), + full_stdout.contains(" protocol: 3"), "stdout: {full_stdout}" ); assert!(full_stdout.contains("server:\n"), "stdout: {full_stdout}"); @@ -904,7 +904,7 @@ fn status_commands_report_client_and_server_versions() { "stdout: {server_stdout}" ); assert!( - server_stdout.contains("protocol: 2"), + server_stdout.contains("protocol: 3"), "stdout: {server_stdout}" ); @@ -916,7 +916,7 @@ fn status_commands_report_client_and_server_versions() { "stdout: {client_stdout}" ); assert!( - client_stdout.contains("protocol: 2"), + client_stdout.contains("protocol: 3"), "stdout: {client_stdout}" ); assert!( diff --git a/tests/client_mode.rs b/tests/client_mode.rs index 958b48a3..f35ee301 100644 --- a/tests/client_mode.rs +++ b/tests/client_mode.rs @@ -158,14 +158,17 @@ fn ping_socket(socket_path: &PathBuf) -> String { response.trim().to_string() } +#[allow(dead_code)] #[derive(Debug, Deserialize)] struct FrameWire { cells: Vec<CellWire>, width: u16, height: u16, cursor: Option<CursorWire>, + hyperlinks: Vec<String>, } +#[allow(dead_code)] #[derive(Debug, Deserialize)] struct CellWire { symbol: String, @@ -173,6 +176,7 @@ struct CellWire { bg: u32, modifier: u16, skip: bool, + hyperlink: Option<u32>, } #[derive(Debug, Deserialize)] @@ -246,8 +250,8 @@ 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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2, "server should report protocol version 2"); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3, "server should report protocol version 3"); assert!( error.is_none(), "handshake should not have error: {:?}", @@ -326,8 +330,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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); stream @@ -375,8 +379,8 @@ fn client_input_forwarded_to_pane() { // Connect and handshake. let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket"); let (version, error) = - client_handshake(&mut stream, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Send an Input message containing "echo hello\n". @@ -429,8 +433,8 @@ fn client_resize_sends_message() { // Connect and handshake. let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket"); let (version, error) = - client_handshake(&mut stream, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Drain the initial frame(s). @@ -486,8 +490,8 @@ fn server_shutdown_sends_message_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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Send SIGINT so the server takes the graceful shutdown path and @@ -713,8 +717,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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Read the initial frame (server renders immediately on client connect). @@ -767,8 +771,8 @@ fn navigate_mode_keybind_dispatch_in_server() { // Connect and handshake. let mut stream = UnixStream::connect(&client_socket).expect("should connect to client socket"); let (version, error) = - client_handshake(&mut stream, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Drain initial frames. @@ -885,8 +889,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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Drain initial frame(s). @@ -983,8 +987,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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Drain initial frame(s). diff --git a/tests/cross_area.rs b/tests/cross_area.rs index df2dced1..0740a7dd 100644 --- a/tests/cross_area.rs +++ b/tests/cross_area.rs @@ -483,14 +483,17 @@ fn is_timeout(err: &io::Error) -> bool { ) } +#[allow(dead_code)] #[derive(Debug, Deserialize)] struct FrameWire { cells: Vec<CellWire>, width: u16, height: u16, cursor: Option<CursorWire>, + hyperlinks: Vec<String>, } +#[allow(dead_code)] #[derive(Debug, Deserialize)] struct CellWire { symbol: String, @@ -498,6 +501,7 @@ struct CellWire { bg: u32, modifier: u16, skip: bool, + hyperlink: Option<u32>, } #[derive(Debug, Deserialize)] @@ -665,7 +669,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, 2, 100, 30); + client_handshake(&mut client_a, 3, 100, 30); assert!(wait_for_frame(&mut client_a, Duration::from_secs(2))); // Use herdr: create a workspace and write output into its pane. @@ -702,7 +706,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, 2, 80, 24); + client_handshake(&mut client_b, 3, 80, 24); assert!( wait_for_frame(&mut client_b, Duration::from_secs(5)), "reattached client should receive frame" @@ -758,7 +762,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, 2, 100, 30); + client_handshake(&mut client_a, 3, 100, 30); assert!(wait_for_frame(&mut client_a, Duration::from_secs(2))); let created = workspace_create(&api_socket, "agent-persist"); @@ -811,7 +815,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, 2, 80, 24); + client_handshake(&mut client_b, 3, 80, 24); let saw_working_on_client = wait_for_frame_matching(&mut client_b, Duration::from_secs(5), |frame| { frame_contains_text(frame, "working") @@ -856,7 +860,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, 2, 100, 30); + client_handshake(&mut client, 3, 100, 30); assert!(wait_for_frame(&mut client, Duration::from_secs(2))); drain_server_messages(&mut client, Duration::from_millis(300)); @@ -919,9 +923,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, 2, 110, 30); + client_handshake(&mut client_a, 3, 110, 30); let mut client_b = UnixStream::connect(&client_socket).expect("client B should connect"); - client_handshake(&mut client_b, 2, 100, 30); + client_handshake(&mut client_b, 3, 100, 30); assert!(wait_for_frame(&mut client_a, Duration::from_secs(2))); assert!(wait_for_frame(&mut client_b, Duration::from_secs(2))); @@ -1087,7 +1091,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, 2, 80, 24); + client_handshake(&mut reconnect_client, 3, 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 b71ee4cb..259cf350 100644 --- a/tests/detach_reattach.rs +++ b/tests/detach_reattach.rs @@ -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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); 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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Drain initial frames. @@ -397,8 +397,8 @@ 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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream_a, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Drain initial frames. @@ -436,8 +436,8 @@ 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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream_b, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); 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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Drain initial frames. @@ -555,8 +555,8 @@ 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, 2, 80, 24).expect("reattach handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream_b, 3, 80, 24).expect("reattach handshake should succeed"); + assert_eq!(version, 3); 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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Drain initial frames. @@ -631,8 +631,8 @@ 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, 2, 80, 24).expect("reattach handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream_b, 3, 80, 24).expect("reattach handshake should succeed"); + assert_eq!(version, 3); 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, 2, 120, 40).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream, 3, 120, 40).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); drain_messages(&mut stream); @@ -722,8 +722,8 @@ 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, 2, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream_a, 3, 80, 24).expect("handshake should succeed"); + assert_eq!(version, 3); assert!(error.is_none(), "{:?}", error); // Detach client A immediately. @@ -780,8 +780,8 @@ 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, 2, 80, 24).expect("reattach handshake should succeed"); - assert_eq!(version, 2); + client_handshake(&mut stream_b, 3, 80, 24).expect("reattach handshake should succeed"); + assert_eq!(version, 3); 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 062a0f60..f65538b4 100644 --- a/tests/multi_client.rs +++ b/tests/multi_client.rs @@ -542,7 +542,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, 2, cols, rows).expect("handshake should succeed"); + client_handshake(&mut stream, 3, cols, rows).expect("handshake should succeed"); stream } @@ -565,14 +565,17 @@ fn send_client_detach(stream: &mut UnixStream) { stream.flush().unwrap(); } +#[allow(dead_code)] #[derive(Debug, Deserialize)] struct FrameWire { cells: Vec<CellWire>, width: u16, height: u16, cursor: Option<CursorWire>, + hyperlinks: Vec<String>, } +#[allow(dead_code)] #[derive(Debug, Deserialize)] struct CellWire { symbol: String, @@ -580,6 +583,7 @@ struct CellWire { bg: u32, modifier: u16, skip: bool, + hyperlink: Option<u32>, } #[derive(Debug, Deserialize)] diff --git a/tests/server_headless.rs b/tests/server_headless.rs index 19b78e95..687b886b 100644 --- a/tests/server_headless.rs +++ b/tests/server_headless.rs @@ -578,9 +578,9 @@ fn client_handshake_succeeds() { // Send Hello with version 2, 80 cols, 24 rows. let (version, error) = - client_handshake(&mut stream, 2, 80, 24).expect("handshake should succeed"); + client_handshake(&mut stream, 3, 80, 24).expect("handshake should succeed"); - assert_eq!(version, 2, "server should report protocol version 2"); + assert_eq!(version, 3, "server should report protocol version 3"); assert!( error.is_none(), "handshake should not have an error: {:?}", @@ -609,7 +609,7 @@ 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, 2, "server should report its version 2"); + assert_eq!(version, 3, "server should report its version 3"); assert!( error.is_some(), "version 0 should be rejected with an error" @@ -634,10 +634,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, 2, 0, 0) + let (version, error) = client_handshake(&mut stream, 3, 0, 0) .expect("handshake with 0x0 should succeed (server clamps)"); - assert_eq!(version, 2); + assert_eq!(version, 3); assert!( error.is_none(), "0x0 size should be accepted (clamped): {:?}", @@ -697,9 +697,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, 2, 80, 24) + let (version, error) = client_handshake(&mut good_stream, 3, 80, 24) .expect("proper handshake should still work after no-hello client"); - assert_eq!(version, 2); + assert_eq!(version, 3); assert!(error.is_none()); // API should still work. |
