| ... | @@ -234,3 +234,114 @@ test "flate compress/decompress" { | ... | @@ -234,3 +234,114 @@ test "flate compress/decompress" { |
| 234 | } | 234 | } |
| 235 | } | 235 | } |
| 236 | } | 236 | } |
| | 237 | |
| | 238 | fn testDecompress(comptime container: Container, compressed: []const u8, expected_plain: []const u8) !void { |
| | 239 | var in_stream = std.io.fixedBufferStream(compressed); |
| | 240 | var al = std.ArrayList(u8).init(testing.allocator); |
| | 241 | defer al.deinit(); |
| | 242 | |
| | 243 | try inflate.decompress(container, in_stream.reader(), al.writer()); |
| | 244 | |
| | 245 | try testing.expectEqualSlices(u8, expected_plain, al.items); |
| | 246 | } |
| | 247 | |
| | 248 | test "flate don't read past deflate stream's end" { |
| | 249 | try testDecompress(.zlib, &[_]u8{ |
| | 250 | 0x08, 0xd7, 0x63, 0xf8, 0xcf, 0xc0, 0xc0, 0x00, 0xc1, 0xff, |
| | 251 | 0xff, 0x43, 0x30, 0x03, 0x03, 0xc3, 0xff, 0xff, 0xff, 0x01, |
| | 252 | 0x83, 0x95, 0x0b, 0xf5, |
| | 253 | }, &[_]u8{ |
| | 254 | 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, |
| | 255 | 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, |
| | 256 | 0x00, 0x00, 0xff, 0xff, 0xff, |
| | 257 | }); |
| | 258 | } |
| | 259 | |
| | 260 | test "flate zlib header" { |
| | 261 | // Truncated header |
| | 262 | try testing.expectError( |
| | 263 | error.EndOfStream, |
| | 264 | testDecompress(.zlib, &[_]u8{0x78}, ""), |
| | 265 | ); |
| | 266 | // Wrong CM |
| | 267 | try testing.expectError( |
| | 268 | error.BadZlibHeader, |
| | 269 | testDecompress(.zlib, &[_]u8{ 0x79, 0x94 }, ""), |
| | 270 | ); |
| | 271 | // Wrong CINFO |
| | 272 | try testing.expectError( |
| | 273 | error.BadZlibHeader, |
| | 274 | testDecompress(.zlib, &[_]u8{ 0x88, 0x98 }, ""), |
| | 275 | ); |
| | 276 | // Wrong checksum |
| | 277 | try testing.expectError( |
| | 278 | error.WrongZlibChecksum, |
| | 279 | testDecompress(.zlib, &[_]u8{ 0x78, 0xda, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 }, ""), |
| | 280 | ); |
| | 281 | // Truncated checksum |
| | 282 | try testing.expectError( |
| | 283 | error.EndOfStream, |
| | 284 | testDecompress(.zlib, &[_]u8{ 0x78, 0xda, 0x03, 0x00, 0x00 }, ""), |
| | 285 | ); |
| | 286 | } |
| | 287 | |
| | 288 | test "flate gzip header" { |
| | 289 | // Truncated header |
| | 290 | try testing.expectError( |
| | 291 | error.EndOfStream, |
| | 292 | testDecompress(.gzip, &[_]u8{ 0x1f, 0x8B }, undefined), |
| | 293 | ); |
| | 294 | // Wrong CM |
| | 295 | try testing.expectError( |
| | 296 | error.BadGzipHeader, |
| | 297 | testDecompress(.gzip, &[_]u8{ |
| | 298 | 0x1f, 0x8b, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, |
| | 299 | 0x00, 0x03, |
| | 300 | }, undefined), |
| | 301 | ); |
| | 302 | |
| | 303 | // Wrong checksum |
| | 304 | try testing.expectError( |
| | 305 | error.WrongGzipChecksum, |
| | 306 | testDecompress(.gzip, &[_]u8{ |
| | 307 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
| | 308 | 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, |
| | 309 | 0x00, 0x00, 0x00, 0x00, |
| | 310 | }, undefined), |
| | 311 | ); |
| | 312 | // Truncated checksum |
| | 313 | try testing.expectError( |
| | 314 | error.EndOfStream, |
| | 315 | testDecompress(.gzip, &[_]u8{ |
| | 316 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
| | 317 | 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, |
| | 318 | }, undefined), |
| | 319 | ); |
| | 320 | // Wrong initial size |
| | 321 | try testing.expectError( |
| | 322 | error.WrongGzipSize, |
| | 323 | testDecompress(.gzip, &[_]u8{ |
| | 324 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
| | 325 | 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, |
| | 326 | 0x00, 0x00, 0x00, 0x01, |
| | 327 | }, undefined), |
| | 328 | ); |
| | 329 | // Truncated initial size field |
| | 330 | try testing.expectError( |
| | 331 | error.EndOfStream, |
| | 332 | testDecompress(.gzip, &[_]u8{ |
| | 333 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
| | 334 | 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, |
| | 335 | 0x00, 0x00, 0x00, |
| | 336 | }, undefined), |
| | 337 | ); |
| | 338 | |
| | 339 | try testDecompress(.gzip, &[_]u8{ |
| | 340 | // GZIP header |
| | 341 | 0x1f, 0x8b, 0x08, 0x12, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x00, |
| | 342 | // header.FHCRC (should cover entire header) |
| | 343 | 0x99, 0xd6, |
| | 344 | // GZIP data |
| | 345 | 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| | 346 | }, ""); |
| | 347 | } |