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:
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.