1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
18 type gunzipTest
struct {
26 var gunzipTests
= []gunzipTest
{
27 { // has 1 empty fixed-huffman block
32 0x1f, 0x8b, 0x08, 0x08, 0xf7, 0x5e, 0x14, 0x4a,
33 0x00, 0x03, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,
34 0x74, 0x78, 0x74, 0x00, 0x03, 0x00, 0x00, 0x00,
35 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 { // has 1 non-empty fixed huffman block
44 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
45 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
46 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
47 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
48 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
59 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
60 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
61 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
62 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
63 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
65 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
66 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
67 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
68 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
69 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
74 { // has a fixed huffman block with some length-distance pairs
77 "she sells seashells by the seashore\n",
79 0x1f, 0x8b, 0x08, 0x08, 0x72, 0x66, 0x8b, 0x4a,
80 0x00, 0x03, 0x73, 0x68, 0x65, 0x73, 0x65, 0x6c,
81 0x6c, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2b,
82 0xce, 0x48, 0x55, 0x28, 0x4e, 0xcd, 0xc9, 0x29,
83 0x06, 0x92, 0x89, 0xc5, 0x19, 0x60, 0x56, 0x52,
84 0xa5, 0x42, 0x09, 0x58, 0x18, 0x28, 0x90, 0x5f,
85 0x94, 0xca, 0x05, 0x00, 0x76, 0xb0, 0x3b, 0xeb,
86 0x24, 0x00, 0x00, 0x00,
90 { // has dynamic huffman blocks
93 " Four score and seven years ago our fathers brought forth on\n" +
94 "this continent, a new nation, conceived in Liberty, and dedicated\n" +
95 "to the proposition that all men are created equal.\n" +
96 " Now we are engaged in a great Civil War, testing whether that\n" +
97 "nation, or any nation so conceived and so dedicated, can long\n" +
99 " We are met on a great battle-field of that war.\n" +
100 " We have come to dedicate a portion of that field, as a final\n" +
101 "resting place for those who here gave their lives that that\n" +
102 "nation might live. It is altogether fitting and proper that\n" +
103 "we should do this.\n" +
104 " But, in a larger sense, we can not dedicate — we can not\n" +
105 "consecrate — we can not hallow — this ground.\n" +
106 " The brave men, living and dead, who struggled here, have\n" +
107 "consecrated it, far above our poor power to add or detract.\n" +
108 "The world will little note, nor long remember what we say here,\n" +
109 "but it can never forget what they did here.\n" +
110 " It is for us the living, rather, to be dedicated here to the\n" +
111 "unfinished work which they who fought here have thus far so\n" +
112 "nobly advanced. It is rather for us to be here dedicated to\n" +
113 "the great task remaining before us — that from these honored\n" +
114 "dead we take increased devotion to that cause for which they\n" +
115 "gave the last full measure of devotion —\n" +
116 " that we here highly resolve that these dead shall not have\n" +
117 "died in vain — that this nation, under God, shall have a new\n" +
118 "birth of freedom — and that government of the people, by the\n" +
119 "people, for the people, shall not perish from this earth.\n" +
121 "Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania\n",
123 0x1f, 0x8b, 0x08, 0x08, 0xd1, 0x12, 0x2b, 0x4a,
124 0x00, 0x03, 0x67, 0x65, 0x74, 0x74, 0x79, 0x73,
125 0x62, 0x75, 0x72, 0x67, 0x00, 0x65, 0x54, 0xcd,
126 0x6e, 0xd4, 0x30, 0x10, 0xbe, 0xfb, 0x29, 0xe6,
127 0x01, 0x42, 0xa5, 0x0a, 0x09, 0xc1, 0x11, 0x90,
128 0x40, 0x48, 0xa8, 0xe2, 0x80, 0xd4, 0xf3, 0x24,
129 0x9e, 0x24, 0x56, 0xbd, 0x9e, 0xc5, 0x76, 0x76,
130 0x95, 0x1b, 0x0f, 0xc1, 0x13, 0xf2, 0x24, 0x7c,
131 0x63, 0x77, 0x9b, 0x4a, 0x5c, 0xaa, 0x6e, 0x6c,
132 0xcf, 0x7c, 0x7f, 0x33, 0x44, 0x5f, 0x74, 0xcb,
133 0x54, 0x26, 0xcd, 0x42, 0x9c, 0x3c, 0x15, 0xb9,
134 0x48, 0xa2, 0x5d, 0x38, 0x17, 0xe2, 0x45, 0xc9,
135 0x4e, 0x67, 0xae, 0xab, 0xe0, 0xf7, 0x98, 0x75,
136 0x5b, 0xd6, 0x4a, 0xb3, 0xe6, 0xba, 0x92, 0x26,
137 0x57, 0xd7, 0x50, 0x68, 0xd2, 0x54, 0x43, 0x92,
138 0x54, 0x07, 0x62, 0x4a, 0x72, 0xa5, 0xc4, 0x35,
139 0x68, 0x1a, 0xec, 0x60, 0x92, 0x70, 0x11, 0x4f,
140 0x21, 0xd1, 0xf7, 0x30, 0x4a, 0xae, 0xfb, 0xd0,
141 0x9a, 0x78, 0xf1, 0x61, 0xe2, 0x2a, 0xde, 0x55,
142 0x25, 0xd4, 0xa6, 0x73, 0xd6, 0xb3, 0x96, 0x60,
143 0xef, 0xf0, 0x9b, 0x2b, 0x71, 0x8c, 0x74, 0x02,
144 0x10, 0x06, 0xac, 0x29, 0x8b, 0xdd, 0x25, 0xf9,
145 0xb5, 0x71, 0xbc, 0x73, 0x44, 0x0f, 0x7a, 0xa5,
146 0xab, 0xb4, 0x33, 0x49, 0x0b, 0x2f, 0xbd, 0x03,
147 0xd3, 0x62, 0x17, 0xe9, 0x73, 0xb8, 0x84, 0x48,
148 0x8f, 0x9c, 0x07, 0xaa, 0x52, 0x00, 0x6d, 0xa1,
149 0xeb, 0x2a, 0xc6, 0xa0, 0x95, 0x76, 0x37, 0x78,
150 0x9a, 0x81, 0x65, 0x7f, 0x46, 0x4b, 0x45, 0x5f,
151 0xe1, 0x6d, 0x42, 0xe8, 0x01, 0x13, 0x5c, 0x38,
152 0x51, 0xd4, 0xb4, 0x38, 0x49, 0x7e, 0xcb, 0x62,
153 0x28, 0x1e, 0x3b, 0x82, 0x93, 0x54, 0x48, 0xf1,
154 0xd2, 0x7d, 0xe4, 0x5a, 0xa3, 0xbc, 0x99, 0x83,
155 0x44, 0x4f, 0x3a, 0x77, 0x36, 0x57, 0xce, 0xcf,
156 0x2f, 0x56, 0xbe, 0x80, 0x90, 0x9e, 0x84, 0xea,
157 0x51, 0x1f, 0x8f, 0xcf, 0x90, 0xd4, 0x60, 0xdc,
158 0x5e, 0xb4, 0xf7, 0x10, 0x0b, 0x26, 0xe0, 0xff,
159 0xc4, 0xd1, 0xe5, 0x67, 0x2e, 0xe7, 0xc8, 0x93,
160 0x98, 0x05, 0xb8, 0xa8, 0x45, 0xc0, 0x4d, 0x09,
161 0xdc, 0x84, 0x16, 0x2b, 0x0d, 0x9a, 0x21, 0x53,
162 0x04, 0x8b, 0xd2, 0x0b, 0xbd, 0xa2, 0x4c, 0xa7,
163 0x60, 0xee, 0xd9, 0xe1, 0x1d, 0xd1, 0xb7, 0x4a,
164 0x30, 0x8f, 0x63, 0xd5, 0xa5, 0x8b, 0x33, 0x87,
165 0xda, 0x1a, 0x18, 0x79, 0xf3, 0xe3, 0xa6, 0x17,
166 0x94, 0x2e, 0xab, 0x6e, 0xa0, 0xe3, 0xcd, 0xac,
167 0x50, 0x8c, 0xca, 0xa7, 0x0d, 0x76, 0x37, 0xd1,
168 0x23, 0xe7, 0x05, 0x57, 0x8b, 0xa4, 0x22, 0x83,
169 0xd9, 0x62, 0x52, 0x25, 0xad, 0x07, 0xbb, 0xbf,
170 0xbf, 0xff, 0xbc, 0xfa, 0xee, 0x20, 0x73, 0x91,
171 0x29, 0xff, 0x7f, 0x02, 0x71, 0x62, 0x84, 0xb5,
172 0xf6, 0xb5, 0x25, 0x6b, 0x41, 0xde, 0x92, 0xb7,
173 0x76, 0x3f, 0x91, 0x91, 0x31, 0x1b, 0x41, 0x84,
174 0x62, 0x30, 0x0a, 0x37, 0xa4, 0x5e, 0x18, 0x3a,
175 0x99, 0x08, 0xa5, 0xe6, 0x6d, 0x59, 0x22, 0xec,
176 0x33, 0x39, 0x86, 0x26, 0xf5, 0xab, 0x66, 0xc8,
177 0x08, 0x20, 0xcf, 0x0c, 0xd7, 0x47, 0x45, 0x21,
178 0x0b, 0xf6, 0x59, 0xd5, 0xfe, 0x5c, 0x8d, 0xaa,
179 0x12, 0x7b, 0x6f, 0xa1, 0xf0, 0x52, 0x33, 0x4f,
180 0xf5, 0xce, 0x59, 0xd3, 0xab, 0x66, 0x10, 0xbf,
181 0x06, 0xc4, 0x31, 0x06, 0x73, 0xd6, 0x80, 0xa2,
182 0x78, 0xc2, 0x45, 0xcb, 0x03, 0x65, 0x39, 0xc9,
183 0x09, 0xd1, 0x06, 0x04, 0x33, 0x1a, 0x5a, 0xf1,
184 0xde, 0x01, 0xb8, 0x71, 0x83, 0xc4, 0xb5, 0xb3,
185 0xc3, 0x54, 0x65, 0x33, 0x0d, 0x5a, 0xf7, 0x9b,
186 0x90, 0x7c, 0x27, 0x1f, 0x3a, 0x58, 0xa3, 0xd8,
187 0xfd, 0x30, 0x5f, 0xb7, 0xd2, 0x66, 0xa2, 0x93,
188 0x1c, 0x28, 0xb7, 0xe9, 0x1b, 0x0c, 0xe1, 0x28,
189 0x47, 0x26, 0xbb, 0xe9, 0x7d, 0x7e, 0xdc, 0x96,
190 0x10, 0x92, 0x50, 0x56, 0x7c, 0x06, 0xe2, 0x27,
191 0xb4, 0x08, 0xd3, 0xda, 0x7b, 0x98, 0x34, 0x73,
192 0x9f, 0xdb, 0xf6, 0x62, 0xed, 0x31, 0x41, 0x13,
193 0xd3, 0xa2, 0xa8, 0x4b, 0x3a, 0xc6, 0x1d, 0xe4,
194 0x2f, 0x8c, 0xf8, 0xfb, 0x97, 0x64, 0xf4, 0xb6,
195 0x2f, 0x80, 0x5a, 0xf3, 0x56, 0xe0, 0x40, 0x50,
196 0xd5, 0x19, 0xd0, 0x1e, 0xfc, 0xca, 0xe5, 0xc9,
197 0xd4, 0x60, 0x00, 0x81, 0x2e, 0xa3, 0xcc, 0xb6,
198 0x52, 0xf0, 0xb4, 0xdb, 0x69, 0x99, 0xce, 0x7a,
199 0x32, 0x4c, 0x08, 0xed, 0xaa, 0x10, 0x10, 0xe3,
200 0x6f, 0xee, 0x99, 0x68, 0x95, 0x9f, 0x04, 0x71,
201 0xb2, 0x49, 0x2f, 0x62, 0xa6, 0x5e, 0xb4, 0xef,
202 0x02, 0xed, 0x4f, 0x27, 0xde, 0x4a, 0x0f, 0xfd,
203 0xc1, 0xcc, 0xdd, 0x02, 0x8f, 0x08, 0x16, 0x54,
204 0xdf, 0xda, 0xca, 0xe0, 0x82, 0xf1, 0xb4, 0x31,
205 0x7a, 0xa9, 0x81, 0xfe, 0x90, 0xb7, 0x3e, 0xdb,
206 0xd3, 0x35, 0xc0, 0x20, 0x80, 0x33, 0x46, 0x4a,
207 0x63, 0xab, 0xd1, 0x0d, 0x29, 0xd2, 0xe2, 0x84,
208 0xb8, 0xdb, 0xfa, 0xe9, 0x89, 0x44, 0x86, 0x7c,
209 0xe8, 0x0b, 0xe6, 0x02, 0x6a, 0x07, 0x9b, 0x96,
210 0xd0, 0xdb, 0x2e, 0x41, 0x4c, 0xa1, 0xd5, 0x57,
211 0x45, 0x14, 0xfb, 0xe3, 0xa6, 0x72, 0x5b, 0x87,
212 0x6e, 0x0c, 0x6d, 0x5b, 0xce, 0xe0, 0x2f, 0xe2,
213 0x21, 0x81, 0x95, 0xb0, 0xe8, 0xb6, 0x32, 0x0b,
214 0xb2, 0x98, 0x13, 0x52, 0x5d, 0xfb, 0xec, 0x63,
215 0x17, 0x8a, 0x9e, 0x23, 0x22, 0x36, 0xee, 0xcd,
216 0xda, 0xdb, 0xcf, 0x3e, 0xf1, 0xc7, 0xf1, 0x01,
217 0x12, 0x93, 0x0a, 0xeb, 0x6f, 0xf2, 0x02, 0x15,
218 0x96, 0x77, 0x5d, 0xef, 0x9c, 0xfb, 0x88, 0x91,
219 0x59, 0xf9, 0x84, 0xdd, 0x9b, 0x26, 0x8d, 0x80,
220 0xf9, 0x80, 0x66, 0x2d, 0xac, 0xf7, 0x1f, 0x06,
221 0xba, 0x7f, 0xff, 0xee, 0xed, 0x40, 0x5f, 0xa5,
222 0xd6, 0xbd, 0x8c, 0x5b, 0x46, 0xd2, 0x7e, 0x48,
223 0x4a, 0x65, 0x8f, 0x08, 0x42, 0x60, 0xf7, 0x0f,
224 0xb9, 0x16, 0x0b, 0x0c, 0x1a, 0x06, 0x00, 0x00,
228 { // has 1 non-empty fixed huffman block then garbage
230 "hello.txt + garbage",
233 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
234 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
235 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
236 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
237 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
238 0x00, 0x00, 'g', 'a', 'r', 'b', 'a', 'g', 'e', '!', '!', '!',
242 { // has 1 non-empty fixed huffman block not enough header
244 "hello.txt + garbage",
247 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
248 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
249 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
250 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
251 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
256 { // has 1 non-empty fixed huffman block but corrupt checksum
258 "hello.txt + corrupt checksum",
261 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
262 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
263 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
264 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
265 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00,
270 { // has 1 non-empty fixed huffman block but corrupt size
272 "hello.txt + corrupt size",
275 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
276 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
277 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
278 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
279 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0xff, 0x00,
286 func TestDecompressor(t
*testing
.T
) {
287 b
:= new(bytes
.Buffer
)
288 for _
, tt
:= range gunzipTests
{
289 in
:= bytes
.NewReader(tt
.gzip
)
290 gzip
, err
:= NewReader(in
)
292 t
.Errorf("%s: NewReader: %s", tt
.name
, err
)
296 if tt
.name
!= gzip
.Name
{
297 t
.Errorf("%s: got name %s", tt
.name
, gzip
.Name
)
300 n
, err
:= io
.Copy(b
, gzip
)
302 t
.Errorf("%s: io.Copy: %v want %v", tt
.name
, err
, tt
.err
)
306 t
.Errorf("%s: got %d-byte %q want %d-byte %q", tt
.name
, n
, s
, len(tt
.raw
), tt
.raw
)
309 // Test Reader Reset.
310 in
= bytes
.NewReader(tt
.gzip
)
313 t
.Errorf("%s: Reset: %s", tt
.name
, err
)
316 if tt
.name
!= gzip
.Name
{
317 t
.Errorf("%s: got name %s", tt
.name
, gzip
.Name
)
320 n
, err
= io
.Copy(b
, gzip
)
322 t
.Errorf("%s: io.Copy: %v want %v", tt
.name
, err
, tt
.err
)
326 t
.Errorf("%s: got %d-byte %q want %d-byte %q", tt
.name
, n
, s
, len(tt
.raw
), tt
.raw
)
331 func TestIssue6550(t
*testing
.T
) {
332 f
, err
:= os
.Open("testdata/issue6550.gz")
336 gzip
, err
:= NewReader(f
)
338 t
.Fatalf("NewReader(testdata/issue6550.gz): %v", err
)
341 done
:= make(chan bool, 1)
343 _
, err
:= io
.Copy(ioutil
.Discard
, gzip
)
345 t
.Errorf("Copy succeeded")
347 t
.Logf("Copy failed (correctly): %v", err
)
352 case <-time
.After(1 * time
.Second
):
353 t
.Errorf("Copy hung")
359 func TestInitialReset(t
*testing
.T
) {
361 if err
:= r
.Reset(bytes
.NewReader(gunzipTests
[1].gzip
)); err
!= nil {
365 if _
, err
:= io
.Copy(&buf
, &r
); err
!= nil {
368 if s
:= buf
.String(); s
!= gunzipTests
[1].raw
{
369 t
.Errorf("got %q want %q", s
, gunzipTests
[1].raw
)
373 func TestMultistreamFalse(t
*testing
.T
) {
374 // Find concatenation test.
376 for _
, tt
= range gunzipTests
{
377 if strings
.HasSuffix(tt
.desc
, " x2") {
381 t
.Fatal("cannot find hello.txt x2 in gunzip tests")
384 br
:= bytes
.NewReader(tt
.gzip
)
386 if err
:= r
.Reset(br
); err
!= nil {
387 t
.Fatalf("first reset: %v", err
)
390 // Expect two streams with "hello world\n", then real EOF.
391 const hello
= "hello world\n"
394 data
, err
:= ioutil
.ReadAll(&r
)
395 if string(data
) != hello || err
!= nil {
396 t
.Fatalf("first stream = %q, %v, want %q, %v", string(data
), err
, hello
, nil)
399 if err
:= r
.Reset(br
); err
!= nil {
400 t
.Fatalf("second reset: %v", err
)
403 data
, err
= ioutil
.ReadAll(&r
)
404 if string(data
) != hello || err
!= nil {
405 t
.Fatalf("second stream = %q, %v, want %q, %v", string(data
), err
, hello
, nil)
408 if err
:= r
.Reset(br
); err
!= io
.EOF
{
409 t
.Fatalf("third reset: err=%v, want io.EOF", err
)
413 func TestNilStream(t
*testing
.T
) {
414 // Go liberally interprets RFC1952 section 2.2 to mean that a gzip file
415 // consist of zero or more members. Thus, we test that a nil stream is okay.
416 _
, err
:= NewReader(bytes
.NewReader(nil))
418 t
.Fatalf("NewReader(nil) on empty stream: got %v, want io.EOF", err
)
422 func TestTruncatedStreams(t
*testing
.T
) {
423 const data
= "\x1f\x8b\b\x04\x00\tn\x88\x00\xff\a\x00foo bar\xcbH\xcd\xc9\xc9\xd7Q(\xcf/\xcaI\x01\x04:r\xab\xff\f\x00\x00\x00"
425 // Intentionally iterate starting with at least one byte in the stream.
426 for i
:= 1; i
< len(data
)-1; i
++ {
427 r
, err
:= NewReader(strings
.NewReader(data
[:i
]))
429 if err
!= io
.ErrUnexpectedEOF
{
430 t
.Errorf("NewReader(%d) on truncated stream: got %v, want %v", i
, err
, io
.ErrUnexpectedEOF
)
434 _
, err
= io
.Copy(ioutil
.Discard
, r
)
435 if ferr
, ok
:= err
.(*flate
.ReadError
); ok
{
438 if err
!= io
.ErrUnexpectedEOF
{
439 t
.Errorf("io.Copy(%d) on truncated stream: got %v, want %v", i
, err
, io
.ErrUnexpectedEOF
)