| ... | ... | @@ -476,23 +476,33 @@ test "fuzz string escaping" { |
| 476 | 476 | } |
| 477 | 477 | |
| 478 | 478 | fn fuzzString(options: StringOptions, smith: *std.testing.Smith) !void { |
| 479 | | var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); |
| 480 | | defer arena.deinit(); |
| 481 | | const allocator = arena.allocator(); |
| 479 | const gpa = std.testing.allocator; |
| 482 | 480 | |
| 483 | | var allocating: Writer.Allocating = .init(allocator); |
| 481 | var arena_state: std.heap.ArenaAllocator = .init(gpa); |
| 482 | defer arena_state.deinit(); |
| 483 | const arena = arena_state.allocator(); |
| 484 | |
| 485 | var allocating: Writer.Allocating = .init(gpa); |
| 484 | 486 | defer allocating.deinit(); |
| 485 | 487 | var s: Serializer = .{ .writer = &allocating.writer }; |
| 486 | 488 | |
| 487 | 489 | var buf: [0x100]u8 = undefined; |
| 488 | | const input_len = smith.slice(&buf); |
| 489 | | const input = buf[0..input_len]; |
| 490 | const input = buf[0..smith.slice(&buf)]; |
| 490 | 491 | try s.string(input, options); |
| 491 | 492 | |
| 492 | | const encoded = try allocator.dupeSentinel(u8, allocating.written(), 0); |
| 493 | | defer allocator.free(encoded); |
| 494 | | const actual = try std.zon.parse.fromSliceAlloc([]const u8, allocator, encoded, null, .{}); |
| 495 | | defer std.zon.parse.free(allocator, actual); |
| 493 | var parse_diags: std.zon.parse.Diagnostics = undefined; |
| 494 | const actual = std.zon.parse.fromSlice([]const u8, .{ |
| 495 | .gpa = gpa, |
| 496 | .arena = arena, |
| 497 | .source = try arena.dupeSentinel(u8, allocating.written(), 0), |
| 498 | .diagnostics = &parse_diags, |
| 499 | }) catch |err| switch (err) { |
| 500 | error.OutOfMemory => |e| return e, |
| 501 | error.ParseZon => |e| { |
| 502 | std.log.err("failed to parse serialized ZON: {f}", .{parse_diags.fmt("fuzz_input")}); |
| 503 | return e; |
| 504 | }, |
| 505 | }; |
| 496 | 506 | try std.testing.expectEqualSlices(u8, input, actual); |
| 497 | 507 | } |
| 498 | 508 | |