| ... | @@ -4,8 +4,6 @@ const tar = std.tar; | ... | @@ -4,8 +4,6 @@ const tar = std.tar; |
| 4 | const assert = std.debug.assert; | 4 | const assert = std.debug.assert; |
| 5 | | 5 | |
| 6 | test "tar run Go test cases" { | 6 | test "tar run Go test cases" { |
| 7 | if (builtin.os.tag == .wasi) return error.SkipZigTest; | | |
| 8 | | | |
| 9 | const Case = struct { | 7 | const Case = struct { |
| 10 | const File = struct { | 8 | const File = struct { |
| 11 | name: []const u8, | 9 | name: []const u8, |
| ... | @@ -16,18 +14,15 @@ test "tar run Go test cases" { | ... | @@ -16,18 +14,15 @@ test "tar run Go test cases" { |
| 16 | truncated: bool = false, // when there is no file body, just header, usefull for huge files | 14 | truncated: bool = false, // when there is no file body, just header, usefull for huge files |
| 17 | }; | 15 | }; |
| 18 | | 16 | |
| 19 | path: []const u8, // path to the tar archive file on dis | 17 | data: []const u8, // testdata file content |
| 20 | files: []const File = &[_]@This().File{}, // expected files to found in archive | 18 | files: []const File = &[_]@This().File{}, // expected files to found in archive |
| 21 | chksums: []const []const u8 = &[_][]const u8{}, // chksums of files content | 19 | chksums: []const []const u8 = &[_][]const u8{}, // chksums of each file content |
| 22 | err: ?anyerror = null, // parsing should fail with this error | 20 | err: ?anyerror = null, // parsing should fail with this error |
| 23 | }; | 21 | }; |
| 24 | | 22 | |
| 25 | const src_path = comptime std.fs.path.dirname(@src().file) orelse "."; | | |
| 26 | const test_dir = try std.fs.cwd().openDir(src_path ++ "/testdata", .{}); | | |
| 27 | | | |
| 28 | const cases = [_]Case{ | 23 | const cases = [_]Case{ |
| 29 | .{ | 24 | .{ |
| 30 | .path = "gnu.tar", | 25 | .data = @embedFile("testdata/gnu.tar"), |
| 31 | .files = &[_]Case.File{ | 26 | .files = &[_]Case.File{ |
| 32 | .{ | 27 | .{ |
| 33 | .name = "small.txt", | 28 | .name = "small.txt", |
| ... | @@ -46,11 +41,11 @@ test "tar run Go test cases" { | ... | @@ -46,11 +41,11 @@ test "tar run Go test cases" { |
| 46 | }, | 41 | }, |
| 47 | }, | 42 | }, |
| 48 | .{ | 43 | .{ |
| 49 | .path = "sparse-formats.tar", | 44 | .data = @embedFile("testdata/sparse-formats.tar"), |
| 50 | .err = error.TarUnsupportedHeader, | 45 | .err = error.TarUnsupportedHeader, |
| 51 | }, | 46 | }, |
| 52 | .{ | 47 | .{ |
| 53 | .path = "star.tar", | 48 | .data = @embedFile("testdata/star.tar"), |
| 54 | .files = &[_]Case.File{ | 49 | .files = &[_]Case.File{ |
| 55 | .{ | 50 | .{ |
| 56 | .name = "small.txt", | 51 | .name = "small.txt", |
| ... | @@ -69,7 +64,7 @@ test "tar run Go test cases" { | ... | @@ -69,7 +64,7 @@ test "tar run Go test cases" { |
| 69 | }, | 64 | }, |
| 70 | }, | 65 | }, |
| 71 | .{ | 66 | .{ |
| 72 | .path = "v7.tar", | 67 | .data = @embedFile("testdata/v7.tar"), |
| 73 | .files = &[_]Case.File{ | 68 | .files = &[_]Case.File{ |
| 74 | .{ | 69 | .{ |
| 75 | .name = "small.txt", | 70 | .name = "small.txt", |
| ... | @@ -88,7 +83,7 @@ test "tar run Go test cases" { | ... | @@ -88,7 +83,7 @@ test "tar run Go test cases" { |
| 88 | }, | 83 | }, |
| 89 | }, | 84 | }, |
| 90 | .{ | 85 | .{ |
| 91 | .path = "pax.tar", | 86 | .data = @embedFile("testdata/pax.tar"), |
| 92 | .files = &[_]Case.File{ | 87 | .files = &[_]Case.File{ |
| 93 | .{ | 88 | .{ |
| 94 | .name = "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", | 89 | .name = "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", |
| ... | @@ -109,12 +104,12 @@ test "tar run Go test cases" { | ... | @@ -109,12 +104,12 @@ test "tar run Go test cases" { |
| 109 | }, | 104 | }, |
| 110 | .{ | 105 | .{ |
| 111 | // pax attribute don't end with \n | 106 | // pax attribute don't end with \n |
| 112 | .path = "pax-bad-hdr-file.tar", | 107 | .data = @embedFile("testdata/pax-bad-hdr-file.tar"), |
| 113 | .err = error.PaxInvalidAttributeEnd, | 108 | .err = error.PaxInvalidAttributeEnd, |
| 114 | }, | 109 | }, |
| 115 | .{ | 110 | .{ |
| 116 | // size is in pax attribute | 111 | // size is in pax attribute |
| 117 | .path = "pax-pos-size-file.tar", | 112 | .data = @embedFile("testdata/pax-pos-size-file.tar"), |
| 118 | .files = &[_]Case.File{ | 113 | .files = &[_]Case.File{ |
| 119 | .{ | 114 | .{ |
| 120 | .name = "foo", | 115 | .name = "foo", |
| ... | @@ -129,7 +124,7 @@ test "tar run Go test cases" { | ... | @@ -129,7 +124,7 @@ test "tar run Go test cases" { |
| 129 | }, | 124 | }, |
| 130 | .{ | 125 | .{ |
| 131 | // has pax records which we are not interested in | 126 | // has pax records which we are not interested in |
| 132 | .path = "pax-records.tar", | 127 | .data = @embedFile("testdata/pax-records.tar"), |
| 133 | .files = &[_]Case.File{ | 128 | .files = &[_]Case.File{ |
| 134 | .{ | 129 | .{ |
| 135 | .name = "file", | 130 | .name = "file", |
| ... | @@ -138,7 +133,7 @@ test "tar run Go test cases" { | ... | @@ -138,7 +133,7 @@ test "tar run Go test cases" { |
| 138 | }, | 133 | }, |
| 139 | .{ | 134 | .{ |
| 140 | // has global records which we are ignoring | 135 | // has global records which we are ignoring |
| 141 | .path = "pax-global-records.tar", | 136 | .data = @embedFile("testdata/pax-global-records.tar"), |
| 142 | .files = &[_]Case.File{ | 137 | .files = &[_]Case.File{ |
| 143 | .{ | 138 | .{ |
| 144 | .name = "file1", | 139 | .name = "file1", |
| ... | @@ -155,7 +150,7 @@ test "tar run Go test cases" { | ... | @@ -155,7 +150,7 @@ test "tar run Go test cases" { |
| 155 | }, | 150 | }, |
| 156 | }, | 151 | }, |
| 157 | .{ | 152 | .{ |
| 158 | .path = "nil-uid.tar", | 153 | .data = @embedFile("testdata/nil-uid.tar"), |
| 159 | .files = &[_]Case.File{ | 154 | .files = &[_]Case.File{ |
| 160 | .{ | 155 | .{ |
| 161 | .name = "P1050238.JPG.log", | 156 | .name = "P1050238.JPG.log", |
| ... | @@ -170,7 +165,7 @@ test "tar run Go test cases" { | ... | @@ -170,7 +165,7 @@ test "tar run Go test cases" { |
| 170 | }, | 165 | }, |
| 171 | .{ | 166 | .{ |
| 172 | // has xattrs and pax records which we are ignoring | 167 | // has xattrs and pax records which we are ignoring |
| 173 | .path = "xattrs.tar", | 168 | .data = @embedFile("testdata/xattrs.tar"), |
| 174 | .files = &[_]Case.File{ | 169 | .files = &[_]Case.File{ |
| 175 | .{ | 170 | .{ |
| 176 | .name = "small.txt", | 171 | .name = "small.txt", |
| ... | @@ -191,7 +186,7 @@ test "tar run Go test cases" { | ... | @@ -191,7 +186,7 @@ test "tar run Go test cases" { |
| 191 | }, | 186 | }, |
| 192 | }, | 187 | }, |
| 193 | .{ | 188 | .{ |
| 194 | .path = "gnu-multi-hdrs.tar", | 189 | .data = @embedFile("testdata/gnu-multi-hdrs.tar"), |
| 195 | .files = &[_]Case.File{ | 190 | .files = &[_]Case.File{ |
| 196 | .{ | 191 | .{ |
| 197 | .name = "GNU2/GNU2/long-path-name", | 192 | .name = "GNU2/GNU2/long-path-name", |
| ... | @@ -202,12 +197,12 @@ test "tar run Go test cases" { | ... | @@ -202,12 +197,12 @@ test "tar run Go test cases" { |
| 202 | }, | 197 | }, |
| 203 | .{ | 198 | .{ |
| 204 | // has gnu type D (directory) and S (sparse) blocks | 199 | // has gnu type D (directory) and S (sparse) blocks |
| 205 | .path = "gnu-incremental.tar", | 200 | .data = @embedFile("testdata/gnu-incremental.tar"), |
| 206 | .err = error.TarUnsupportedHeader, | 201 | .err = error.TarUnsupportedHeader, |
| 207 | }, | 202 | }, |
| 208 | .{ | 203 | .{ |
| 209 | // should use values only from last pax header | 204 | // should use values only from last pax header |
| 210 | .path = "pax-multi-hdrs.tar", | 205 | .data = @embedFile("testdata/pax-multi-hdrs.tar"), |
| 211 | .files = &[_]Case.File{ | 206 | .files = &[_]Case.File{ |
| 212 | .{ | 207 | .{ |
| 213 | .name = "bar", | 208 | .name = "bar", |
| ... | @@ -217,7 +212,7 @@ test "tar run Go test cases" { | ... | @@ -217,7 +212,7 @@ test "tar run Go test cases" { |
| 217 | }, | 212 | }, |
| 218 | }, | 213 | }, |
| 219 | .{ | 214 | .{ |
| 220 | .path = "gnu-long-nul.tar", | 215 | .data = @embedFile("testdata/gnu-long-nul.tar"), |
| 221 | .files = &[_]Case.File{ | 216 | .files = &[_]Case.File{ |
| 222 | .{ | 217 | .{ |
| 223 | .name = "0123456789", | 218 | .name = "0123456789", |
| ... | @@ -226,7 +221,7 @@ test "tar run Go test cases" { | ... | @@ -226,7 +221,7 @@ test "tar run Go test cases" { |
| 226 | }, | 221 | }, |
| 227 | }, | 222 | }, |
| 228 | .{ | 223 | .{ |
| 229 | .path = "gnu-utf8.tar", | 224 | .data = @embedFile("testdata/gnu-utf8.tar"), |
| 230 | .files = &[_]Case.File{ | 225 | .files = &[_]Case.File{ |
| 231 | .{ | 226 | .{ |
| 232 | .name = "☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹", | 227 | .name = "☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹", |
| ... | @@ -235,7 +230,7 @@ test "tar run Go test cases" { | ... | @@ -235,7 +230,7 @@ test "tar run Go test cases" { |
| 235 | }, | 230 | }, |
| 236 | }, | 231 | }, |
| 237 | .{ | 232 | .{ |
| 238 | .path = "gnu-not-utf8.tar", | 233 | .data = @embedFile("testdata/gnu-not-utf8.tar"), |
| 239 | .files = &[_]Case.File{ | 234 | .files = &[_]Case.File{ |
| 240 | .{ | 235 | .{ |
| 241 | .name = "hi\x80\x81\x82\x83bye", | 236 | .name = "hi\x80\x81\x82\x83bye", |
| ... | @@ -245,32 +240,32 @@ test "tar run Go test cases" { | ... | @@ -245,32 +240,32 @@ test "tar run Go test cases" { |
| 245 | }, | 240 | }, |
| 246 | .{ | 241 | .{ |
| 247 | // null in pax key | 242 | // null in pax key |
| 248 | .path = "pax-nul-xattrs.tar", | 243 | .data = @embedFile("testdata/pax-nul-xattrs.tar"), |
| 249 | .err = error.PaxNullInKeyword, | 244 | .err = error.PaxNullInKeyword, |
| 250 | }, | 245 | }, |
| 251 | .{ | 246 | .{ |
| 252 | .path = "pax-nul-path.tar", | 247 | .data = @embedFile("testdata/pax-nul-path.tar"), |
| 253 | .err = error.PaxNullInValue, | 248 | .err = error.PaxNullInValue, |
| 254 | }, | 249 | }, |
| 255 | .{ | 250 | .{ |
| 256 | .path = "neg-size.tar", | 251 | .data = @embedFile("testdata/neg-size.tar"), |
| 257 | .err = error.TarHeader, | 252 | .err = error.TarHeader, |
| 258 | }, | 253 | }, |
| 259 | .{ | 254 | .{ |
| 260 | .path = "issue10968.tar", | 255 | .data = @embedFile("testdata/issue10968.tar"), |
| 261 | .err = error.TarHeader, | 256 | .err = error.TarHeader, |
| 262 | }, | 257 | }, |
| 263 | .{ | 258 | .{ |
| 264 | .path = "issue11169.tar", | 259 | .data = @embedFile("testdata/issue11169.tar"), |
| 265 | .err = error.TarHeader, | 260 | .err = error.TarHeader, |
| 266 | }, | 261 | }, |
| 267 | .{ | 262 | .{ |
| 268 | .path = "issue12435.tar", | 263 | .data = @embedFile("testdata/issue12435.tar"), |
| 269 | .err = error.TarHeaderChksum, | 264 | .err = error.TarHeaderChksum, |
| 270 | }, | 265 | }, |
| 271 | .{ | 266 | .{ |
| 272 | // has magic with space at end instead of null | 267 | // has magic with space at end instead of null |
| 273 | .path = "invalid-go17.tar", | 268 | .data = @embedFile("testdata/invalid-go17.tar"), |
| 274 | .files = &[_]Case.File{ | 269 | .files = &[_]Case.File{ |
| 275 | .{ | 270 | .{ |
| 276 | .name = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/foo", | 271 | .name = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/foo", |
| ... | @@ -278,7 +273,7 @@ test "tar run Go test cases" { | ... | @@ -278,7 +273,7 @@ test "tar run Go test cases" { |
| 278 | }, | 273 | }, |
| 279 | }, | 274 | }, |
| 280 | .{ | 275 | .{ |
| 281 | .path = "ustar-file-devs.tar", | 276 | .data = @embedFile("testdata/ustar-file-devs.tar"), |
| 282 | .files = &[_]Case.File{ | 277 | .files = &[_]Case.File{ |
| 283 | .{ | 278 | .{ |
| 284 | .name = "file", | 279 | .name = "file", |
| ... | @@ -287,7 +282,7 @@ test "tar run Go test cases" { | ... | @@ -287,7 +282,7 @@ test "tar run Go test cases" { |
| 287 | }, | 282 | }, |
| 288 | }, | 283 | }, |
| 289 | .{ | 284 | .{ |
| 290 | .path = "trailing-slash.tar", | 285 | .data = @embedFile("testdata/trailing-slash.tar"), |
| 291 | .files = &[_]Case.File{ | 286 | .files = &[_]Case.File{ |
| 292 | .{ | 287 | .{ |
| 293 | .name = "123456789/" ** 30, | 288 | .name = "123456789/" ** 30, |
| ... | @@ -297,7 +292,7 @@ test "tar run Go test cases" { | ... | @@ -297,7 +292,7 @@ test "tar run Go test cases" { |
| 297 | }, | 292 | }, |
| 298 | .{ | 293 | .{ |
| 299 | // Has size in gnu extended format. To represent size bigger than 8 GB. | 294 | // Has size in gnu extended format. To represent size bigger than 8 GB. |
| 300 | .path = "writer-big.tar", | 295 | .data = @embedFile("testdata/writer-big.tar"), |
| 301 | .files = &[_]Case.File{ | 296 | .files = &[_]Case.File{ |
| 302 | .{ | 297 | .{ |
| 303 | .name = "tmp/16gig.txt", | 298 | .name = "tmp/16gig.txt", |
| ... | @@ -309,7 +304,7 @@ test "tar run Go test cases" { | ... | @@ -309,7 +304,7 @@ test "tar run Go test cases" { |
| 309 | }, | 304 | }, |
| 310 | .{ | 305 | .{ |
| 311 | // Size in gnu extended format, and name in pax attribute. | 306 | // Size in gnu extended format, and name in pax attribute. |
| 312 | .path = "writer-big-long.tar", | 307 | .data = @embedFile("testdata/writer-big-long.tar"), |
| 313 | .files = &[_]Case.File{ | 308 | .files = &[_]Case.File{ |
| 314 | .{ | 309 | .{ |
| 315 | .name = "longname/" ** 15 ++ "16gig.txt", | 310 | .name = "longname/" ** 15 ++ "16gig.txt", |
| ... | @@ -322,11 +317,8 @@ test "tar run Go test cases" { | ... | @@ -322,11 +317,8 @@ test "tar run Go test cases" { |
| 322 | }; | 317 | }; |
| 323 | | 318 | |
| 324 | for (cases) |case| { | 319 | for (cases) |case| { |
| 325 | var fs_file = try test_dir.openFile(case.path, .{}); | 320 | var fsb = std.io.fixedBufferStream(case.data); |
| 326 | | 321 | var iter = tar.tarReader(fsb.reader(), null); |
| 327 | defer fs_file.close(); | | |
| 328 | | | |
| 329 | var iter = tar.tarReader(fs_file.reader(), null); | | |
| 330 | var i: usize = 0; | 322 | var i: usize = 0; |
| 331 | while (iter.next() catch |err| { | 323 | while (iter.next() catch |err| { |
| 332 | if (case.err) |e| { | 324 | if (case.err) |e| { |