Skip to content

Commit 06a49e0

Browse files
author
jinzhongjia
committed
test: increase error path coverage for packer limits and writeFn
- Add tests for string, bin, ext, and map length limit violations - Add tests for write functions that return short writes to ensure LengthWriting errors are triggered Improve coverage for code paths not tested elsewhere
1 parent de41d46 commit 06a49e0

1 file changed

Lines changed: 161 additions & 0 deletions

File tree

src/test.zig

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5515,3 +5515,164 @@ test "PackerIO: packIO convenience function" {
55155515

55165516
try expect(result.uint == 12345);
55175517
}
5518+
5519+
// ============================================================================
5520+
// ParseLimits: error path coverage for limits not exercised elsewhere
5521+
// ============================================================================
5522+
5523+
test "iterative parser: string too long" {
5524+
const custom_pack = msgpack.PackWithLimits(
5525+
*bufferType,
5526+
*bufferType,
5527+
bufferType.WriteError,
5528+
bufferType.ReadError,
5529+
bufferType.write,
5530+
bufferType.read,
5531+
.{ .max_string_length = 10 },
5532+
);
5533+
5534+
// str8 marker (0xd9) + length=20 + 20 bytes of zeros
5535+
var arr: [256]u8 = std.mem.zeroes([256]u8);
5536+
arr[0] = 0xd9;
5537+
arr[1] = 20;
5538+
5539+
var write_buffer = fixedBufferStream(&arr);
5540+
var read_buffer = fixedBufferStream(&arr);
5541+
var p = custom_pack.init(&write_buffer, &read_buffer);
5542+
5543+
const result = p.read(allocator);
5544+
try std.testing.expectError(msgpack.MsgPackError.StringTooLong, result);
5545+
}
5546+
5547+
test "iterative parser: bin too long" {
5548+
const custom_pack = msgpack.PackWithLimits(
5549+
*bufferType,
5550+
*bufferType,
5551+
bufferType.WriteError,
5552+
bufferType.ReadError,
5553+
bufferType.write,
5554+
bufferType.read,
5555+
.{ .max_bin_length = 10 },
5556+
);
5557+
5558+
// bin8 marker (0xc4) + length=20 + 20 bytes of zeros
5559+
var arr: [256]u8 = std.mem.zeroes([256]u8);
5560+
arr[0] = 0xc4;
5561+
arr[1] = 20;
5562+
5563+
var write_buffer = fixedBufferStream(&arr);
5564+
var read_buffer = fixedBufferStream(&arr);
5565+
var p = custom_pack.init(&write_buffer, &read_buffer);
5566+
5567+
const result = p.read(allocator);
5568+
try std.testing.expectError(msgpack.MsgPackError.BinDataLengthTooLong, result);
5569+
}
5570+
5571+
test "iterative parser: ext too long" {
5572+
const custom_pack = msgpack.PackWithLimits(
5573+
*bufferType,
5574+
*bufferType,
5575+
bufferType.WriteError,
5576+
bufferType.ReadError,
5577+
bufferType.write,
5578+
bufferType.read,
5579+
.{ .max_ext_length = 10 },
5580+
);
5581+
5582+
// ext8 marker (0xc7) + length=20 + type byte (0x01) + 20 bytes of zeros
5583+
var arr: [256]u8 = std.mem.zeroes([256]u8);
5584+
arr[0] = 0xc7;
5585+
arr[1] = 20;
5586+
arr[2] = 0x01;
5587+
5588+
var write_buffer = fixedBufferStream(&arr);
5589+
var read_buffer = fixedBufferStream(&arr);
5590+
var p = custom_pack.init(&write_buffer, &read_buffer);
5591+
5592+
const result = p.read(allocator);
5593+
try std.testing.expectError(msgpack.MsgPackError.ExtDataTooLarge, result);
5594+
}
5595+
5596+
test "iterative parser: map too large" {
5597+
const custom_pack = msgpack.PackWithLimits(
5598+
*bufferType,
5599+
*bufferType,
5600+
bufferType.WriteError,
5601+
bufferType.ReadError,
5602+
bufferType.write,
5603+
bufferType.read,
5604+
.{ .max_map_size = 10 },
5605+
);
5606+
5607+
// map16 marker (0xde) + length=1000 (0x03 0xE8 big-endian)
5608+
var arr: [16]u8 = std.mem.zeroes([16]u8);
5609+
arr[0] = 0xde;
5610+
arr[1] = 0x03;
5611+
arr[2] = 0xE8;
5612+
5613+
var write_buffer = fixedBufferStream(&arr);
5614+
var read_buffer = fixedBufferStream(&arr);
5615+
var p = custom_pack.init(&write_buffer, &read_buffer);
5616+
5617+
const result = p.read(allocator);
5618+
try std.testing.expectError(msgpack.MsgPackError.MapTooLarge, result);
5619+
}
5620+
5621+
// ============================================================================
5622+
// Write error path: short writes from writeFn must surface as LengthWriting
5623+
// ============================================================================
5624+
5625+
const ZeroWriter = struct {
5626+
pub const WriteError = error{};
5627+
pub fn write(_: *@This(), _: []const u8) WriteError!usize {
5628+
return 0;
5629+
}
5630+
};
5631+
5632+
const ShortByOneWriter = struct {
5633+
pub const WriteError = error{};
5634+
pub fn write(_: *@This(), bytes: []const u8) WriteError!usize {
5635+
if (bytes.len <= 1) return bytes.len;
5636+
return bytes.len - 1;
5637+
}
5638+
};
5639+
5640+
test "write: zero-byte writeFn return triggers LengthWriting (writeByte path)" {
5641+
const test_pack = msgpack.Pack(
5642+
*ZeroWriter,
5643+
*bufferType,
5644+
ZeroWriter.WriteError,
5645+
bufferType.ReadError,
5646+
ZeroWriter.write,
5647+
bufferType.read,
5648+
);
5649+
5650+
var writer = ZeroWriter{};
5651+
var dummy: [1]u8 = undefined;
5652+
var reader = fixedBufferStream(&dummy);
5653+
var p = test_pack.init(&writer, &reader);
5654+
5655+
const result = p.write(msgpack.Payload.boolToPayload(true));
5656+
try std.testing.expectError(msgpack.MsgPackError.LengthWriting, result);
5657+
}
5658+
5659+
test "write: short multi-byte writeFn return triggers LengthWriting (writeData path)" {
5660+
const test_pack = msgpack.Pack(
5661+
*ShortByOneWriter,
5662+
*bufferType,
5663+
ShortByOneWriter.WriteError,
5664+
bufferType.ReadError,
5665+
ShortByOneWriter.write,
5666+
bufferType.read,
5667+
);
5668+
5669+
var writer = ShortByOneWriter{};
5670+
var dummy: [1]u8 = undefined;
5671+
var reader = fixedBufferStream(&dummy);
5672+
var p = test_pack.init(&writer, &reader);
5673+
5674+
// uint32: 1-byte marker (single-byte write succeeds) + 4-byte big-endian value
5675+
// (multi-byte writeData returns N-1 -> LengthWriting).
5676+
const result = p.write(msgpack.Payload.uintToPayload(0x12345678));
5677+
try std.testing.expectError(msgpack.MsgPackError.LengthWriting, result);
5678+
}

0 commit comments

Comments
 (0)