| ... | ... | @@ -4,8 +4,6 @@ const tar = std.tar; |
| 4 | 4 | const assert = std.debug.assert; |
| 5 | 5 | |
| 6 | 6 | test "tar run Go test cases" { |
| 7 | | if (builtin.os.tag == .wasi) return error.SkipZigTest; |
| 8 | | |
| 9 | 7 | const Case = struct { |
| 10 | 8 | const File = struct { |
| 11 | 9 | name: []const u8, |
| ... | ... | @@ -16,18 +14,15 @@ test "tar run Go test cases" { |
| 16 | 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 | 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 | 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 | 23 | const cases = [_]Case{ |
| 29 | 24 | .{ |
| 30 | | .path = "gnu.tar", |
| 25 | .data = @embedFile("testdata/gnu.tar"), |
| 31 | 26 | .files = &[_]Case.File{ |
| 32 | 27 | .{ |
| 33 | 28 | .name = "small.txt", |
| ... | ... | @@ -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 | 45 | .err = error.TarUnsupportedHeader, |
| 51 | 46 | }, |
| 52 | 47 | .{ |
| 53 | | .path = "star.tar", |
| 48 | .data = @embedFile("testdata/star.tar"), |
| 54 | 49 | .files = &[_]Case.File{ |
| 55 | 50 | .{ |
| 56 | 51 | .name = "small.txt", |
| ... | ... | @@ -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 | 68 | .files = &[_]Case.File{ |
| 74 | 69 | .{ |
| 75 | 70 | .name = "small.txt", |
| ... | ... | @@ -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 | 87 | .files = &[_]Case.File{ |
| 93 | 88 | .{ |
| 94 | 89 | .name = "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", |
| ... | ... | @@ -109,12 +104,12 @@ test "tar run Go test cases" { |
| 109 | 104 | }, |
| 110 | 105 | .{ |
| 111 | 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 | 108 | .err = error.PaxInvalidAttributeEnd, |
| 114 | 109 | }, |
| 115 | 110 | .{ |
| 116 | 111 | // size is in pax attribute |
| 117 | | .path = "pax-pos-size-file.tar", |
| 112 | .data = @embedFile("testdata/pax-pos-size-file.tar"), |
| 118 | 113 | .files = &[_]Case.File{ |
| 119 | 114 | .{ |
| 120 | 115 | .name = "foo", |
| ... | ... | @@ -129,7 +124,7 @@ test "tar run Go test cases" { |
| 129 | 124 | }, |
| 130 | 125 | .{ |
| 131 | 126 | // has pax records which we are not interested in |
| 132 | | .path = "pax-records.tar", |
| 127 | .data = @embedFile("testdata/pax-records.tar"), |
| 133 | 128 | .files = &[_]Case.File{ |
| 134 | 129 | .{ |
| 135 | 130 | .name = "file", |
| ... | ... | @@ -138,7 +133,7 @@ test "tar run Go test cases" { |
| 138 | 133 | }, |
| 139 | 134 | .{ |
| 140 | 135 | // has global records which we are ignoring |
| 141 | | .path = "pax-global-records.tar", |
| 136 | .data = @embedFile("testdata/pax-global-records.tar"), |
| 142 | 137 | .files = &[_]Case.File{ |
| 143 | 138 | .{ |
| 144 | 139 | .name = "file1", |
| ... | ... | @@ -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 | 154 | .files = &[_]Case.File{ |
| 160 | 155 | .{ |
| 161 | 156 | .name = "P1050238.JPG.log", |
| ... | ... | @@ -170,7 +165,7 @@ test "tar run Go test cases" { |
| 170 | 165 | }, |
| 171 | 166 | .{ |
| 172 | 167 | // has xattrs and pax records which we are ignoring |
| 173 | | .path = "xattrs.tar", |
| 168 | .data = @embedFile("testdata/xattrs.tar"), |
| 174 | 169 | .files = &[_]Case.File{ |
| 175 | 170 | .{ |
| 176 | 171 | .name = "small.txt", |
| ... | ... | @@ -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 | 190 | .files = &[_]Case.File{ |
| 196 | 191 | .{ |
| 197 | 192 | .name = "GNU2/GNU2/long-path-name", |
| ... | ... | @@ -202,12 +197,12 @@ test "tar run Go test cases" { |
| 202 | 197 | }, |
| 203 | 198 | .{ |
| 204 | 199 | // has gnu type D (directory) and S (sparse) blocks |
| 205 | | .path = "gnu-incremental.tar", |
| 200 | .data = @embedFile("testdata/gnu-incremental.tar"), |
| 206 | 201 | .err = error.TarUnsupportedHeader, |
| 207 | 202 | }, |
| 208 | 203 | .{ |
| 209 | 204 | // should use values only from last pax header |
| 210 | | .path = "pax-multi-hdrs.tar", |
| 205 | .data = @embedFile("testdata/pax-multi-hdrs.tar"), |
| 211 | 206 | .files = &[_]Case.File{ |
| 212 | 207 | .{ |
| 213 | 208 | .name = "bar", |
| ... | ... | @@ -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 | 216 | .files = &[_]Case.File{ |
| 222 | 217 | .{ |
| 223 | 218 | .name = "0123456789", |
| ... | ... | @@ -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 | 225 | .files = &[_]Case.File{ |
| 231 | 226 | .{ |
| 232 | 227 | .name = "☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹", |
| ... | ... | @@ -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 | 234 | .files = &[_]Case.File{ |
| 240 | 235 | .{ |
| 241 | 236 | .name = "hi\x80\x81\x82\x83bye", |
| ... | ... | @@ -245,32 +240,32 @@ test "tar run Go test cases" { |
| 245 | 240 | }, |
| 246 | 241 | .{ |
| 247 | 242 | // null in pax key |
| 248 | | .path = "pax-nul-xattrs.tar", |
| 243 | .data = @embedFile("testdata/pax-nul-xattrs.tar"), |
| 249 | 244 | .err = error.PaxNullInKeyword, |
| 250 | 245 | }, |
| 251 | 246 | .{ |
| 252 | | .path = "pax-nul-path.tar", |
| 247 | .data = @embedFile("testdata/pax-nul-path.tar"), |
| 253 | 248 | .err = error.PaxNullInValue, |
| 254 | 249 | }, |
| 255 | 250 | .{ |
| 256 | | .path = "neg-size.tar", |
| 251 | .data = @embedFile("testdata/neg-size.tar"), |
| 257 | 252 | .err = error.TarHeader, |
| 258 | 253 | }, |
| 259 | 254 | .{ |
| 260 | | .path = "issue10968.tar", |
| 255 | .data = @embedFile("testdata/issue10968.tar"), |
| 261 | 256 | .err = error.TarHeader, |
| 262 | 257 | }, |
| 263 | 258 | .{ |
| 264 | | .path = "issue11169.tar", |
| 259 | .data = @embedFile("testdata/issue11169.tar"), |
| 265 | 260 | .err = error.TarHeader, |
| 266 | 261 | }, |
| 267 | 262 | .{ |
| 268 | | .path = "issue12435.tar", |
| 263 | .data = @embedFile("testdata/issue12435.tar"), |
| 269 | 264 | .err = error.TarHeaderChksum, |
| 270 | 265 | }, |
| 271 | 266 | .{ |
| 272 | 267 | // has magic with space at end instead of null |
| 273 | | .path = "invalid-go17.tar", |
| 268 | .data = @embedFile("testdata/invalid-go17.tar"), |
| 274 | 269 | .files = &[_]Case.File{ |
| 275 | 270 | .{ |
| 276 | 271 | .name = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/foo", |
| ... | ... | @@ -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 | 277 | .files = &[_]Case.File{ |
| 283 | 278 | .{ |
| 284 | 279 | .name = "file", |
| ... | ... | @@ -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 | 286 | .files = &[_]Case.File{ |
| 292 | 287 | .{ |
| 293 | 288 | .name = "123456789/" ** 30, |
| ... | ... | @@ -297,7 +292,7 @@ test "tar run Go test cases" { |
| 297 | 292 | }, |
| 298 | 293 | .{ |
| 299 | 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 | 296 | .files = &[_]Case.File{ |
| 302 | 297 | .{ |
| 303 | 298 | .name = "tmp/16gig.txt", |
| ... | ... | @@ -309,7 +304,7 @@ test "tar run Go test cases" { |
| 309 | 304 | }, |
| 310 | 305 | .{ |
| 311 | 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 | 308 | .files = &[_]Case.File{ |
| 314 | 309 | .{ |
| 315 | 310 | .name = "longname/" ** 15 ++ "16gig.txt", |
| ... | ... | @@ -322,11 +317,8 @@ test "tar run Go test cases" { |
| 322 | 317 | }; |
| 323 | 318 | |
| 324 | 319 | for (cases) |case| { |
| 325 | | var fs_file = try test_dir.openFile(case.path, .{}); |
| 326 | | |
| 327 | | defer fs_file.close(); |
| 328 | | |
| 329 | | var iter = tar.tarReader(fs_file.reader(), null); |
| 320 | var fsb = std.io.fixedBufferStream(case.data); |
| 321 | var iter = tar.tarReader(fsb.reader(), null); |
| 330 | 322 | var i: usize = 0; |
| 331 | 323 | while (iter.next() catch |err| { |
| 332 | 324 | if (case.err) |e| { |