╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ ssh_tui.zig ──────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
50 try buf.writer.writeAll("haxy-tui-v1\nuser-key="); 51 try buf.writer.splatByteAll('x', ssh_tui.max_user_key_len + 1); 52 try buf.writer.writeAll("\nterm=x\nwidth=80\nheight=24\n\n"); 53 54 var in = std.Io.Reader.fixed(buf.written()); 55 try std.testing.expectError(error.InvalidPrelude, ssh_tui.readPrelude(allocator, &in)); 56 } 57 58 test "data frame round-trip" { 59 const allocator = std.testing.allocator; 60 61 var out: std.Io.Writer.Allocating = .init(allocator); 62 defer out.deinit(); 63 try ssh_tui.writeDataFrame(&out.writer, "hello"); 64 65 var in = std.Io.Reader.fixed(out.written()); 66 const frame = try ssh_tui.readFrame(allocator, &in); 67 defer frame.deinit(allocator); 68 69 try std.testing.expectEqualStrings("hello", frame.data); 70 } 71 72 test "resize frame round-trip" { 73 const allocator = std.testing.allocator; 74 75 var out: std.Io.Writer.Allocating = .init(allocator); 76 defer out.deinit(); 77 try ssh_tui.writeResizeFrame(&out.writer, 132, 50); 78 79 var in = std.Io.Reader.fixed(out.written()); 80 const frame = try ssh_tui.readFrame(allocator, &in); 81 defer frame.deinit(allocator); 82 83 try std.testing.expectEqual(@as(u16, 132), frame.resize.width); 84 try std.testing.expectEqual(@as(u16, 50), frame.resize.height); 85 } 86 87 test "close frame round-trip" { 88 const allocator = std.testing.allocator; 89 90 var out: std.Io.Writer.Allocating = .init(allocator); 91 defer out.deinit(); 92 try ssh_tui.writeCloseFrame(&out.writer); 93 94 var in = std.Io.Reader.fixed(out.written()); 95 const frame = try ssh_tui.readFrame(allocator, &in); 96 defer frame.deinit(allocator); 97 98 try std.testing.expect(frame == .close); 99 } 100 101 test "frame rejects unknown type" { 102 const allocator = std.testing.allocator; 103 // type 0xFF (unknown), length 0 104 var in = std.Io.Reader.fixed(&[_]u8{ 0xFF, 0, 0, 0, 0 }); 105 try std.testing.expectError(error.InvalidFrameType, ssh_tui.readFrame(allocator, &in)); 106 } 107 108 test "frame rejects oversized data payload" { 109 const allocator = std.testing.allocator; 110 // type 0x01 (data), length max+1 111 var header: [5]u8 = undefined; 112 header[0] = 0x01; 113 std.mem.writeInt(u32, header[1..5], @intCast(ssh_tui.max_data_frame_len + 1), .big); 114 115 var in = std.Io.Reader.fixed(&header); 116 try std.testing.expectError(error.FrameTooLarge, ssh_tui.readFrame(allocator, &in)); 117 } 118 119 test "frame rejects resize with wrong length" { 120 const allocator = std.testing.allocator; 121 // type 0x02 (resize), length 3 (should be 4) 122 var in = std.Io.Reader.fixed(&[_]u8{ 0x02, 0, 0, 0, 3, 0, 0, 0 }); 123 try std.testing.expectError(error.InvalidResizeFrame, ssh_tui.readFrame(allocator, &in)); 124 } 125 126 test "frame rejects close with non-zero length" { 127 const allocator = std.testing.allocator; 128 // type 0x03 (close), length 1 (should be 0) 129 var in = std.Io.Reader.fixed(&[_]u8{ 0x03, 0, 0, 0, 1, 0 }); 130 try std.testing.expectError(error.InvalidCloseFrame, ssh_tui.readFrame(allocator, &in)); 131 } 132