zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 4f72106c859e71cc47bf53241387271ec3203a43 (tree)
parent 7255f3e724d7f889c32c65481b27110ef48f077d
Author: carmooo <carmooo@noreply.codeberg.org>
Date:   Wed, 17 Jun 2026 23:22:55 +0200

Add zip.extractTo test cases (#35748)

Co-authored-by: carmooo <joao.carmo@paddle.com>
Co-authored-by: Ryan Liptak <squeek502@hotmail.com>
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35748
Reviewed-by: Ryan Liptak <squeek502@noreply.codeberg.org>

Diffstat:
M.gitattributes | 1+
Mbuild.zig | 2++
Mlib/std/zip.zig | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/std/zip/testdata/test.zip | 0
4 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/.gitattributes b/.gitattributes @@ -11,6 +11,7 @@ lib/std/compress/lzma/testdata/** binary lib/std/compress/xz/testdata/** binary lib/std/crypto/codecs/asn1/der/testdata/** binary lib/std/tar/testdata/** binary +lib/std/zip/testdata/** binary src/Package/Fetch/testdata/** binary src/Package/Fetch/git/testdata/** binary diff --git a/build.zig b/build.zig @@ -153,6 +153,8 @@ pub fn build(b: *std.Build) !void { ".tzif", // exclude files from lib/std/tar/testdata ".tar", + // exclude files from lib/std/zip/testdata + ".zip", // others "README.md", }, diff --git a/lib/std/zip.zig b/lib/std/zip.zig @@ -638,3 +638,85 @@ pub fn extract(dest: Io.Dir, fr: *File.Reader, options: ExtractOptions) !void { } } } + +const testing = std.testing; + +test "extractTo" { + const io = testing.io; + var tmp = testing.tmpDir(.{}); + defer tmp.cleanup(); + + try tmp.dir.writeFile(io, .{ + .sub_path = "test.zip", + .data = @embedFile("zip/testdata/test.zip"), + }); + + var file = try tmp.dir.openFile(io, "test.zip", .{}); + defer file.close(io); + var read_buf: [512]u8 = undefined; + var reader = file.reader(io, &read_buf); + + const Expected = struct { + contents: []const u8, + compression: CompressionMethod, + }; + const expected_map = std.StaticStringMap(Expected).initComptime(.{ + .{ "deflate.txt", Expected{ .contents = "aaaaaaaaaaaaaaaaaaaaaaaa\n", .compression = .deflate } }, + .{ "store.txt", Expected{ .contents = "hello world\n", .compression = .store } }, + .{ "dir/", Expected{ .contents = "", .compression = .store } }, + }); + + var iter = try Iterator.init(&reader); + var num_entries: usize = 0; + while (try iter.next()) |entry| { + var filename_buf: [256]u8 = undefined; + const filename = try entry.getFilename(&reader, &filename_buf, .{}); + const expected = expected_map.get(filename) orelse { + std.debug.print("found unexpected filename: {f}\n", .{std.ascii.hexEscape(filename, .lower)}); + return error.UnexpectedFilename; + }; + var buf: [256]u8 = undefined; + var w: Writer = .fixed(&buf); + try entry.extractTo(&reader, &w); + try testing.expectEqualStrings(expected.contents, w.buffered()); + try testing.expectEqual(expected.compression, entry.compression_method); + num_entries += 1; + } + try testing.expectEqual(expected_map.kvs.len, num_entries); +} + +test "output buffers too small" { + const io = testing.io; + var tmp = testing.tmpDir(.{}); + defer tmp.cleanup(); + + try tmp.dir.writeFile(io, .{ + .sub_path = "test.zip", + .data = @embedFile("zip/testdata/test.zip"), + }); + + var file = try tmp.dir.openFile(io, "test.zip", .{}); + defer file.close(io); + var read_buf: [512]u8 = undefined; + var reader = file.reader(io, &read_buf); + + var iter = try Iterator.init(&reader); + var num_entries: usize = 0; + while (try iter.next()) |entry| { + try testing.expectError( + error.ZipInsufficientBuffer, + entry.getFilename(&reader, &.{}, .{}), + ); + + if (entry.uncompressed_size <= 1) continue; + + var buf: [1]u8 = undefined; + var w: Writer = .fixed(&buf); + try testing.expectError( + error.WriteFailed, + entry.extractTo(&reader, &w), + ); + num_entries += 1; + } + try std.testing.expect(num_entries > 0); +} diff --git a/lib/std/zip/testdata/test.zip b/lib/std/zip/testdata/test.zip Binary files differ.