diff options
Diffstat (limited to 'src/session_test.zig')
| -rw-r--r-- | src/session_test.zig | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/session_test.zig b/src/session_test.zig index 8600d03..f31ff31 100644 --- a/src/session_test.zig +++ b/src/session_test.zig @@ -220,3 +220,106 @@ test "server reserves cancellation capacity and rejects duplicate pending tags" try testing.expectError(error.Protocol, server.receive()); try testing.expect(server.dead); } + +test "client: an msize below the floor, and one the server tried to raise" { + var in: [512]u8 = undefined; + var out: [512]u8 = undefined; + var buf: [64]u8 = undefined; + + var c = c9.Client.init(.{ .in = &in, .out = &out }); + try testing.expectError(error.BadRequest, c.submit(.{ .version = .{ .msize = c9.Server.msize_min - 1 } })); + _ = try c.submit(.{ .version = .{} }); + try testing.expectEqual(@as(u32, 512), c.asked); + + _ = c.push(try c9.encode(.{ .rversion = .{ .msize = 1024, .version = "9P2000" } }, c9.notag, &buf)); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + + var c2 = c9.Client.init(.{ .in = &in, .out = &out }); + _ = try c2.submit(.{ .version = .{} }); + _ = c2.push(try c9.encode(.{ .rversion = .{ .msize = 512, .version = "unknown" } }, c9.notag, &buf)); + const done = c2.take() orelse return error.NoReply; + try testing.expectEqualStrings("unknown", done.result.version.version); + try testing.expect(!c2.dead); + try testing.expectEqual(@as(u32, 0), c2.msize); + try testing.expectError(error.Handshake, c2.submit(.{ .stat = .{ .fid = 0 } })); + + var c3 = c9.Client.init(.{ .in = &in, .out = &out }); + _ = try c3.submit(.{ .version = .{} }); + _ = c3.push(try c9.encode(.{ .rversion = .{ .msize = 512, .version = "9P2000.u" } }, c9.notag, &buf)); + try testing.expect(c3.take() == null); + try testing.expect(c3.dead); +} + +test "client: what is not an answer to one of our requests ends the connection" { + var buf: [64]u8 = undefined; + const Case = struct { + fn armed(in: []u8, out: []u8, scratch: []u8) !c9.Client { + var c = c9.Client.init(.{ .in = in, .out = out }); + _ = try c.submit(.{ .version = .{} }); + c.wrote(c.output().len); + _ = c.push(try c9.encode(.{ .rversion = .{ .msize = 512, .version = "9P2000" } }, c9.notag, scratch)); + _ = c.take() orelse return error.NoReply; + _ = try c.submit(.{ .stat = .{ .fid = 0 } }); + c.wrote(c.output().len); + return c; + } + }; + var in: [512]u8 = undefined; + var out: [512]u8 = undefined; + + { + var c = try Case.armed(&in, &out, &buf); + _ = c.push(try c9.encode(.{ .tstat = .{ .fid = 0 } }, 0, &buf)); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + } + { + var c = try Case.armed(&in, &out, &buf); + _ = c.push(try c9.encode(.rclunk, 3, &buf)); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + } + { + var c = try Case.armed(&in, &out, &buf); + _ = c.push(try c9.encode(.rclunk, 900, &buf)); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + } + { + var c = try Case.armed(&in, &out, &buf); + _ = c.push(try c9.encode(.rclunk, 0, &buf)); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + } + { + var c = try Case.armed(&in, &out, &buf); + _ = c.push(try c9.encode(.rwstat, 0, &buf)); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + } + { + var c = try Case.armed(&in, &out, &buf); + _ = c.push(&.{ 3, 0, 0, 0 }); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + } + { + var c = try Case.armed(&in, &out, &buf); + _ = c.push(&.{ 0, 4, 0, 0 }); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + } + { + var c = try Case.armed(&in, &out, &buf); + _ = c.push(&.{ 8, 0, 0, 0, @intFromEnum(c9.Type.rstat), 0, 0, 0 }); + try testing.expect(c.take() == null); + try testing.expect(c.dead); + } +} + +test "client: session memory is bounded independently of input" { + try testing.expect(@sizeOf(c9.Client) <= 512); + try testing.expect(2 * 8192 + @sizeOf(c9.Client) <= 17 * 1024); + try testing.expect(2 * c9.Server.msize_min + @sizeOf(c9.Client) <= 700); +} |
