v2 / vlib / compress / gzip / gzip_test.v
149 lines · 132 sloc · 4.21 KB · 8605599aee97f837dc6d9d636408b91de1ae2ad0
Raw
1module gzip
2
3import hash.crc32
4
5fn test_gzip() {
6 uncompressed := 'Hello world!'
7 compressed := compress(uncompressed.bytes())!
8 decompressed := decompress(compressed)!
9 assert decompressed == uncompressed.bytes()
10}
11
12fn assert_decompress_error(data []u8, reason string) ! {
13 decompress(data) or {
14 assert err.msg() == reason
15 return
16 }
17 return error('did not error')
18}
19
20fn test_gzip_invalid_too_short() {
21 assert_decompress_error([]u8{}, 'data is too short, not gzip compressed?')!
22}
23
24fn test_gzip_invalid_magic_numbers() {
25 assert_decompress_error([]u8{len: 100}, 'wrong magic numbers, not gzip compressed?')!
26}
27
28fn test_gzip_invalid_compression() {
29 mut data := []u8{len: 100}
30 data[0] = 0x1f
31 data[1] = 0x8b
32 assert_decompress_error(data, 'gzip data is not compressed with DEFLATE')!
33}
34
35fn test_gzip_with_ftext() {
36 uncompressed := 'Hello world!'
37 mut compressed := compress(uncompressed.bytes())!
38 compressed[3] |= ftext
39 decompressed := decompress(compressed)!
40 assert decompressed == uncompressed.bytes()
41}
42
43fn test_gzip_with_fname() {
44 uncompressed := 'Hello world!'
45 mut compressed := compress(uncompressed.bytes())!
46 compressed[3] |= fname
47 compressed.insert(10, `h`)
48 compressed.insert(11, `i`)
49 compressed.insert(12, 0x00)
50 decompressed := decompress(compressed)!
51 assert decompressed == uncompressed.bytes()
52}
53
54fn test_gzip_with_fcomment() {
55 uncompressed := 'Hello world!'
56 mut compressed := compress(uncompressed.bytes())!
57 compressed[3] |= fcomment
58 compressed.insert(10, `h`)
59 compressed.insert(11, `i`)
60 compressed.insert(12, 0x00)
61 decompressed := decompress(compressed)!
62 assert decompressed == uncompressed.bytes()
63}
64
65fn test_gzip_with_fname_fcomment() {
66 uncompressed := 'Hello world!'
67 mut compressed := compress(uncompressed.bytes())!
68 compressed[3] |= (fname | fcomment)
69 compressed.insert(10, `h`)
70 compressed.insert(11, `i`)
71 compressed.insert(12, 0x00)
72 compressed.insert(10, `h`)
73 compressed.insert(11, `i`)
74 compressed.insert(12, 0x00)
75 decompressed := decompress(compressed)!
76 assert decompressed == uncompressed.bytes()
77}
78
79fn test_gzip_with_fextra() {
80 uncompressed := 'Hello world!'
81 mut compressed := compress(uncompressed.bytes())!
82 compressed[3] |= fextra
83 compressed.insert(10, 2)
84 compressed.insert(11, `h`)
85 compressed.insert(12, `i`)
86 decompressed := decompress(compressed)!
87 assert decompressed == uncompressed.bytes()
88}
89
90fn test_gzip_with_hcrc() {
91 uncompressed := 'Hello world!'
92 mut compressed := compress(uncompressed.bytes())!
93 compressed[3] |= fhcrc
94 checksum := crc32.sum(compressed[..10])
95 compressed.insert(10, u8(checksum >> 24))
96 compressed.insert(11, u8(checksum >> 16))
97 compressed.insert(12, u8(checksum >> 8))
98 compressed.insert(13, u8(checksum))
99 decompressed := decompress(compressed)!
100 assert decompressed == uncompressed.bytes()
101}
102
103fn test_gzip_with_invalid_hcrc() {
104 uncompressed := 'Hello world!'
105 mut compressed := compress(uncompressed.bytes())!
106 compressed[3] |= fhcrc
107 checksum := crc32.sum(compressed[..10])
108 compressed.insert(10, u8(checksum >> 24))
109 compressed.insert(11, u8(checksum >> 16))
110 compressed.insert(12, u8(checksum >> 8))
111 compressed.insert(13, u8(checksum + 1))
112 assert_decompress_error(compressed, 'header checksum verification failed')!
113}
114
115fn test_gzip_with_invalid_checksum() {
116 uncompressed := 'Hello world!'
117 mut compressed := compress(uncompressed.bytes())!
118 compressed[compressed.len - 5] += 1
119 assert_decompress_error(compressed, 'checksum verification failed')!
120}
121
122fn test_gzip_with_invalid_length() {
123 uncompressed := 'Hello world!'
124 mut compressed := compress(uncompressed.bytes())!
125 compressed[compressed.len - 1] += 1
126 assert_decompress_error(compressed, 'length verification failed, got 12, expected 16777228')!
127}
128
129fn test_gzip_with_invalid_flags() {
130 uncompressed := 'Hello world!'
131 mut compressed := compress(uncompressed.bytes())!
132 compressed[3] |= 0b1000_0000
133 assert_decompress_error(compressed, 'reserved flags are set, unsupported field detected')!
134}
135
136fn test_gzip_decompress_callback() {
137 uncompressed := '321323'.repeat(10_000)
138 gz := compress(uncompressed.bytes())!
139 mut size := 0
140 mut ref := &size
141 decoded := decompress_with_callback(gz, fn (chunk []u8, ref &int) int {
142 unsafe {
143 *ref += chunk.len
144 }
145 return chunk.len
146 }, ref)!
147 assert decoded == size
148 assert decoded == uncompressed.len
149}
150