98 lines
2.7 KiB
V
98 lines
2.7 KiB
V
module deflate
|
|
|
|
fn test_zlib_roundtrip() {
|
|
data := 'Hello world!'.bytes()
|
|
compressed := compress(data)!
|
|
assert compressed[0] == 0x78 && compressed[1] == 0x9c // zlib header
|
|
assert decompress(compressed)! == data
|
|
}
|
|
|
|
fn test_gzip_roundtrip() {
|
|
data := 'Hello gzip!'.repeat(10).bytes()
|
|
compressed := compress(data, format: .gzip)!
|
|
assert compressed[0] == 0x1f && compressed[1] == 0x8b // gzip magic
|
|
assert decompress(compressed)! == data
|
|
}
|
|
|
|
fn test_raw_deflate_roundtrip() {
|
|
data := 'raw deflate'.repeat(20).bytes()
|
|
raw := compress(data, format: .raw_deflate)!
|
|
decoded := decompress(raw)! // auto-detected as raw
|
|
assert decoded == data
|
|
}
|
|
|
|
fn test_decompress_auto_detects_all_formats() {
|
|
data := 'multi-format detection test'.repeat(5).bytes()
|
|
assert decompress(compress(data)!)! == data
|
|
assert decompress(compress(data, format: .gzip)!)! == data
|
|
assert decompress(compress(data, format: .raw_deflate)!)! == data
|
|
}
|
|
|
|
fn test_wrapper_helpers_match_unified_api() {
|
|
data := 'wrapper compatibility'.repeat(8).bytes()
|
|
assert compress(data)! == compress(data, format: .zlib)!
|
|
assert compress_gzip(data)! == compress(data, format: .gzip)!
|
|
assert compress_raw(data)! == compress(data, format: .raw_deflate)!
|
|
}
|
|
|
|
fn test_roundtrip_repeated() {
|
|
data := 'abcabc'.repeat(100).bytes()
|
|
compressed := compress(data)!
|
|
assert compressed.len < data.len
|
|
assert decompress(compressed)! == data
|
|
}
|
|
|
|
fn test_bad_compression_method_fails() {
|
|
bad := [u8(0x79), 0x18, 0x00, 0x00, 0x00, 0x00]
|
|
decompress(bad) or {
|
|
assert err.msg().len > 0
|
|
return
|
|
}
|
|
assert false
|
|
}
|
|
|
|
fn test_corrupt_checksum_fails() {
|
|
mut enc := compress(('hello world').repeat(10).bytes())!
|
|
// flip a byte in the adler32 footer
|
|
enc[enc.len - 1] ^= 0xff
|
|
decompress(enc) or {
|
|
assert err.msg().contains('adler32')
|
|
return
|
|
}
|
|
assert false
|
|
}
|
|
|
|
fn test_truncated_zlib_payload_fails() {
|
|
decompress([u8(0x78), 0x9c, 0x03, 0x00, 0x00, 0x00, 0x01]) or {
|
|
assert err.msg().contains('unexpected end of stream')
|
|
return
|
|
}
|
|
assert false
|
|
}
|
|
|
|
fn test_zlib_inserted_bytes_before_adler_fails() {
|
|
enc := compress('zlib injected trailer bytes'.repeat(4).bytes())!
|
|
mut bad := []u8{cap: enc.len + 2}
|
|
bad << enc[..enc.len - 4]
|
|
bad << [u8(0xaa), 0x55]
|
|
bad << enc[enc.len - 4..]
|
|
decompress(bad) or {
|
|
assert err.msg() == 'invalid zlib stream: trailing data before adler32'
|
|
return
|
|
}
|
|
assert false
|
|
}
|
|
|
|
fn test_gzip_inserted_bytes_before_trailer_fails() {
|
|
enc := compress('gzip injected trailer bytes'.repeat(4).bytes(), format: .gzip)!
|
|
mut bad := []u8{cap: enc.len + 1}
|
|
bad << enc[..enc.len - 8]
|
|
bad << u8(0x42)
|
|
bad << enc[enc.len - 8..]
|
|
decompress(bad) or {
|
|
assert err.msg() == 'invalid gzip stream: trailing data before trailer'
|
|
return
|
|
}
|
|
assert false
|
|
}
|