libgo: Update to Go 1.3 release.
[official-gcc.git] / libgo / go / compress / gzip / gunzip_test.go
blob2471038f53690476f06db1ce68c62e805e7a67d7
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.
5 package gzip
7 import (
8 "bytes"
9 "io"
10 "io/ioutil"
11 "os"
12 "testing"
13 "time"
16 type gunzipTest struct {
17 name string
18 desc string
19 raw string
20 gzip []byte
21 err error
24 var gunzipTests = []gunzipTest{
25 { // has 1 empty fixed-huffman block
26 "empty.txt",
27 "empty.txt",
28 "",
29 []byte{
30 0x1f, 0x8b, 0x08, 0x08, 0xf7, 0x5e, 0x14, 0x4a,
31 0x00, 0x03, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,
32 0x74, 0x78, 0x74, 0x00, 0x03, 0x00, 0x00, 0x00,
33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
35 nil,
37 { // has 1 non-empty fixed huffman block
38 "hello.txt",
39 "hello.txt",
40 "hello world\n",
41 []byte{
42 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
43 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
44 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
45 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
46 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
47 0x00, 0x00,
49 nil,
51 { // concatenation
52 "hello.txt",
53 "hello.txt x2",
54 "hello world\n" +
55 "hello world\n",
56 []byte{
57 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
58 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
59 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
60 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
61 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
62 0x00, 0x00,
63 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
64 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
65 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
66 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
67 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
68 0x00, 0x00,
70 nil,
72 { // has a fixed huffman block with some length-distance pairs
73 "shesells.txt",
74 "shesells.txt",
75 "she sells seashells by the seashore\n",
76 []byte{
77 0x1f, 0x8b, 0x08, 0x08, 0x72, 0x66, 0x8b, 0x4a,
78 0x00, 0x03, 0x73, 0x68, 0x65, 0x73, 0x65, 0x6c,
79 0x6c, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2b,
80 0xce, 0x48, 0x55, 0x28, 0x4e, 0xcd, 0xc9, 0x29,
81 0x06, 0x92, 0x89, 0xc5, 0x19, 0x60, 0x56, 0x52,
82 0xa5, 0x42, 0x09, 0x58, 0x18, 0x28, 0x90, 0x5f,
83 0x94, 0xca, 0x05, 0x00, 0x76, 0xb0, 0x3b, 0xeb,
84 0x24, 0x00, 0x00, 0x00,
86 nil,
88 { // has dynamic huffman blocks
89 "gettysburg",
90 "gettysburg",
91 " Four score and seven years ago our fathers brought forth on\n" +
92 "this continent, a new nation, conceived in Liberty, and dedicated\n" +
93 "to the proposition that all men are created equal.\n" +
94 " Now we are engaged in a great Civil War, testing whether that\n" +
95 "nation, or any nation so conceived and so dedicated, can long\n" +
96 "endure.\n" +
97 " We are met on a great battle-field of that war.\n" +
98 " We have come to dedicate a portion of that field, as a final\n" +
99 "resting place for those who here gave their lives that that\n" +
100 "nation might live. It is altogether fitting and proper that\n" +
101 "we should do this.\n" +
102 " But, in a larger sense, we can not dedicate — we can not\n" +
103 "consecrate — we can not hallow — this ground.\n" +
104 " The brave men, living and dead, who struggled here, have\n" +
105 "consecrated it, far above our poor power to add or detract.\n" +
106 "The world will little note, nor long remember what we say here,\n" +
107 "but it can never forget what they did here.\n" +
108 " It is for us the living, rather, to be dedicated here to the\n" +
109 "unfinished work which they who fought here have thus far so\n" +
110 "nobly advanced. It is rather for us to be here dedicated to\n" +
111 "the great task remaining before us — that from these honored\n" +
112 "dead we take increased devotion to that cause for which they\n" +
113 "gave the last full measure of devotion —\n" +
114 " that we here highly resolve that these dead shall not have\n" +
115 "died in vain — that this nation, under God, shall have a new\n" +
116 "birth of freedom — and that government of the people, by the\n" +
117 "people, for the people, shall not perish from this earth.\n" +
118 "\n" +
119 "Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania\n",
120 []byte{
121 0x1f, 0x8b, 0x08, 0x08, 0xd1, 0x12, 0x2b, 0x4a,
122 0x00, 0x03, 0x67, 0x65, 0x74, 0x74, 0x79, 0x73,
123 0x62, 0x75, 0x72, 0x67, 0x00, 0x65, 0x54, 0xcd,
124 0x6e, 0xd4, 0x30, 0x10, 0xbe, 0xfb, 0x29, 0xe6,
125 0x01, 0x42, 0xa5, 0x0a, 0x09, 0xc1, 0x11, 0x90,
126 0x40, 0x48, 0xa8, 0xe2, 0x80, 0xd4, 0xf3, 0x24,
127 0x9e, 0x24, 0x56, 0xbd, 0x9e, 0xc5, 0x76, 0x76,
128 0x95, 0x1b, 0x0f, 0xc1, 0x13, 0xf2, 0x24, 0x7c,
129 0x63, 0x77, 0x9b, 0x4a, 0x5c, 0xaa, 0x6e, 0x6c,
130 0xcf, 0x7c, 0x7f, 0x33, 0x44, 0x5f, 0x74, 0xcb,
131 0x54, 0x26, 0xcd, 0x42, 0x9c, 0x3c, 0x15, 0xb9,
132 0x48, 0xa2, 0x5d, 0x38, 0x17, 0xe2, 0x45, 0xc9,
133 0x4e, 0x67, 0xae, 0xab, 0xe0, 0xf7, 0x98, 0x75,
134 0x5b, 0xd6, 0x4a, 0xb3, 0xe6, 0xba, 0x92, 0x26,
135 0x57, 0xd7, 0x50, 0x68, 0xd2, 0x54, 0x43, 0x92,
136 0x54, 0x07, 0x62, 0x4a, 0x72, 0xa5, 0xc4, 0x35,
137 0x68, 0x1a, 0xec, 0x60, 0x92, 0x70, 0x11, 0x4f,
138 0x21, 0xd1, 0xf7, 0x30, 0x4a, 0xae, 0xfb, 0xd0,
139 0x9a, 0x78, 0xf1, 0x61, 0xe2, 0x2a, 0xde, 0x55,
140 0x25, 0xd4, 0xa6, 0x73, 0xd6, 0xb3, 0x96, 0x60,
141 0xef, 0xf0, 0x9b, 0x2b, 0x71, 0x8c, 0x74, 0x02,
142 0x10, 0x06, 0xac, 0x29, 0x8b, 0xdd, 0x25, 0xf9,
143 0xb5, 0x71, 0xbc, 0x73, 0x44, 0x0f, 0x7a, 0xa5,
144 0xab, 0xb4, 0x33, 0x49, 0x0b, 0x2f, 0xbd, 0x03,
145 0xd3, 0x62, 0x17, 0xe9, 0x73, 0xb8, 0x84, 0x48,
146 0x8f, 0x9c, 0x07, 0xaa, 0x52, 0x00, 0x6d, 0xa1,
147 0xeb, 0x2a, 0xc6, 0xa0, 0x95, 0x76, 0x37, 0x78,
148 0x9a, 0x81, 0x65, 0x7f, 0x46, 0x4b, 0x45, 0x5f,
149 0xe1, 0x6d, 0x42, 0xe8, 0x01, 0x13, 0x5c, 0x38,
150 0x51, 0xd4, 0xb4, 0x38, 0x49, 0x7e, 0xcb, 0x62,
151 0x28, 0x1e, 0x3b, 0x82, 0x93, 0x54, 0x48, 0xf1,
152 0xd2, 0x7d, 0xe4, 0x5a, 0xa3, 0xbc, 0x99, 0x83,
153 0x44, 0x4f, 0x3a, 0x77, 0x36, 0x57, 0xce, 0xcf,
154 0x2f, 0x56, 0xbe, 0x80, 0x90, 0x9e, 0x84, 0xea,
155 0x51, 0x1f, 0x8f, 0xcf, 0x90, 0xd4, 0x60, 0xdc,
156 0x5e, 0xb4, 0xf7, 0x10, 0x0b, 0x26, 0xe0, 0xff,
157 0xc4, 0xd1, 0xe5, 0x67, 0x2e, 0xe7, 0xc8, 0x93,
158 0x98, 0x05, 0xb8, 0xa8, 0x45, 0xc0, 0x4d, 0x09,
159 0xdc, 0x84, 0x16, 0x2b, 0x0d, 0x9a, 0x21, 0x53,
160 0x04, 0x8b, 0xd2, 0x0b, 0xbd, 0xa2, 0x4c, 0xa7,
161 0x60, 0xee, 0xd9, 0xe1, 0x1d, 0xd1, 0xb7, 0x4a,
162 0x30, 0x8f, 0x63, 0xd5, 0xa5, 0x8b, 0x33, 0x87,
163 0xda, 0x1a, 0x18, 0x79, 0xf3, 0xe3, 0xa6, 0x17,
164 0x94, 0x2e, 0xab, 0x6e, 0xa0, 0xe3, 0xcd, 0xac,
165 0x50, 0x8c, 0xca, 0xa7, 0x0d, 0x76, 0x37, 0xd1,
166 0x23, 0xe7, 0x05, 0x57, 0x8b, 0xa4, 0x22, 0x83,
167 0xd9, 0x62, 0x52, 0x25, 0xad, 0x07, 0xbb, 0xbf,
168 0xbf, 0xff, 0xbc, 0xfa, 0xee, 0x20, 0x73, 0x91,
169 0x29, 0xff, 0x7f, 0x02, 0x71, 0x62, 0x84, 0xb5,
170 0xf6, 0xb5, 0x25, 0x6b, 0x41, 0xde, 0x92, 0xb7,
171 0x76, 0x3f, 0x91, 0x91, 0x31, 0x1b, 0x41, 0x84,
172 0x62, 0x30, 0x0a, 0x37, 0xa4, 0x5e, 0x18, 0x3a,
173 0x99, 0x08, 0xa5, 0xe6, 0x6d, 0x59, 0x22, 0xec,
174 0x33, 0x39, 0x86, 0x26, 0xf5, 0xab, 0x66, 0xc8,
175 0x08, 0x20, 0xcf, 0x0c, 0xd7, 0x47, 0x45, 0x21,
176 0x0b, 0xf6, 0x59, 0xd5, 0xfe, 0x5c, 0x8d, 0xaa,
177 0x12, 0x7b, 0x6f, 0xa1, 0xf0, 0x52, 0x33, 0x4f,
178 0xf5, 0xce, 0x59, 0xd3, 0xab, 0x66, 0x10, 0xbf,
179 0x06, 0xc4, 0x31, 0x06, 0x73, 0xd6, 0x80, 0xa2,
180 0x78, 0xc2, 0x45, 0xcb, 0x03, 0x65, 0x39, 0xc9,
181 0x09, 0xd1, 0x06, 0x04, 0x33, 0x1a, 0x5a, 0xf1,
182 0xde, 0x01, 0xb8, 0x71, 0x83, 0xc4, 0xb5, 0xb3,
183 0xc3, 0x54, 0x65, 0x33, 0x0d, 0x5a, 0xf7, 0x9b,
184 0x90, 0x7c, 0x27, 0x1f, 0x3a, 0x58, 0xa3, 0xd8,
185 0xfd, 0x30, 0x5f, 0xb7, 0xd2, 0x66, 0xa2, 0x93,
186 0x1c, 0x28, 0xb7, 0xe9, 0x1b, 0x0c, 0xe1, 0x28,
187 0x47, 0x26, 0xbb, 0xe9, 0x7d, 0x7e, 0xdc, 0x96,
188 0x10, 0x92, 0x50, 0x56, 0x7c, 0x06, 0xe2, 0x27,
189 0xb4, 0x08, 0xd3, 0xda, 0x7b, 0x98, 0x34, 0x73,
190 0x9f, 0xdb, 0xf6, 0x62, 0xed, 0x31, 0x41, 0x13,
191 0xd3, 0xa2, 0xa8, 0x4b, 0x3a, 0xc6, 0x1d, 0xe4,
192 0x2f, 0x8c, 0xf8, 0xfb, 0x97, 0x64, 0xf4, 0xb6,
193 0x2f, 0x80, 0x5a, 0xf3, 0x56, 0xe0, 0x40, 0x50,
194 0xd5, 0x19, 0xd0, 0x1e, 0xfc, 0xca, 0xe5, 0xc9,
195 0xd4, 0x60, 0x00, 0x81, 0x2e, 0xa3, 0xcc, 0xb6,
196 0x52, 0xf0, 0xb4, 0xdb, 0x69, 0x99, 0xce, 0x7a,
197 0x32, 0x4c, 0x08, 0xed, 0xaa, 0x10, 0x10, 0xe3,
198 0x6f, 0xee, 0x99, 0x68, 0x95, 0x9f, 0x04, 0x71,
199 0xb2, 0x49, 0x2f, 0x62, 0xa6, 0x5e, 0xb4, 0xef,
200 0x02, 0xed, 0x4f, 0x27, 0xde, 0x4a, 0x0f, 0xfd,
201 0xc1, 0xcc, 0xdd, 0x02, 0x8f, 0x08, 0x16, 0x54,
202 0xdf, 0xda, 0xca, 0xe0, 0x82, 0xf1, 0xb4, 0x31,
203 0x7a, 0xa9, 0x81, 0xfe, 0x90, 0xb7, 0x3e, 0xdb,
204 0xd3, 0x35, 0xc0, 0x20, 0x80, 0x33, 0x46, 0x4a,
205 0x63, 0xab, 0xd1, 0x0d, 0x29, 0xd2, 0xe2, 0x84,
206 0xb8, 0xdb, 0xfa, 0xe9, 0x89, 0x44, 0x86, 0x7c,
207 0xe8, 0x0b, 0xe6, 0x02, 0x6a, 0x07, 0x9b, 0x96,
208 0xd0, 0xdb, 0x2e, 0x41, 0x4c, 0xa1, 0xd5, 0x57,
209 0x45, 0x14, 0xfb, 0xe3, 0xa6, 0x72, 0x5b, 0x87,
210 0x6e, 0x0c, 0x6d, 0x5b, 0xce, 0xe0, 0x2f, 0xe2,
211 0x21, 0x81, 0x95, 0xb0, 0xe8, 0xb6, 0x32, 0x0b,
212 0xb2, 0x98, 0x13, 0x52, 0x5d, 0xfb, 0xec, 0x63,
213 0x17, 0x8a, 0x9e, 0x23, 0x22, 0x36, 0xee, 0xcd,
214 0xda, 0xdb, 0xcf, 0x3e, 0xf1, 0xc7, 0xf1, 0x01,
215 0x12, 0x93, 0x0a, 0xeb, 0x6f, 0xf2, 0x02, 0x15,
216 0x96, 0x77, 0x5d, 0xef, 0x9c, 0xfb, 0x88, 0x91,
217 0x59, 0xf9, 0x84, 0xdd, 0x9b, 0x26, 0x8d, 0x80,
218 0xf9, 0x80, 0x66, 0x2d, 0xac, 0xf7, 0x1f, 0x06,
219 0xba, 0x7f, 0xff, 0xee, 0xed, 0x40, 0x5f, 0xa5,
220 0xd6, 0xbd, 0x8c, 0x5b, 0x46, 0xd2, 0x7e, 0x48,
221 0x4a, 0x65, 0x8f, 0x08, 0x42, 0x60, 0xf7, 0x0f,
222 0xb9, 0x16, 0x0b, 0x0c, 0x1a, 0x06, 0x00, 0x00,
224 nil,
226 { // has 1 non-empty fixed huffman block then garbage
227 "hello.txt",
228 "hello.txt + garbage",
229 "hello world\n",
230 []byte{
231 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
232 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
233 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
234 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
235 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
236 0x00, 0x00, 'g', 'a', 'r', 'b', 'a', 'g', 'e', '!', '!', '!',
238 ErrHeader,
240 { // has 1 non-empty fixed huffman block not enough header
241 "hello.txt",
242 "hello.txt + garbage",
243 "hello world\n",
244 []byte{
245 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
246 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
247 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
248 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
249 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
250 0x00, 0x00, gzipID1,
252 io.ErrUnexpectedEOF,
254 { // has 1 non-empty fixed huffman block but corrupt checksum
255 "hello.txt",
256 "hello.txt + corrupt checksum",
257 "hello world\n",
258 []byte{
259 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
260 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
261 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
262 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
263 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00,
264 0x00, 0x00,
266 ErrChecksum,
268 { // has 1 non-empty fixed huffman block but corrupt size
269 "hello.txt",
270 "hello.txt + corrupt size",
271 "hello world\n",
272 []byte{
273 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
274 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
275 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
276 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
277 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0xff, 0x00,
278 0x00, 0x00,
280 ErrChecksum,
284 func TestDecompressor(t *testing.T) {
285 b := new(bytes.Buffer)
286 for _, tt := range gunzipTests {
287 in := bytes.NewReader(tt.gzip)
288 gzip, err := NewReader(in)
289 if err != nil {
290 t.Errorf("%s: NewReader: %s", tt.name, err)
291 continue
293 defer gzip.Close()
294 if tt.name != gzip.Name {
295 t.Errorf("%s: got name %s", tt.name, gzip.Name)
297 b.Reset()
298 n, err := io.Copy(b, gzip)
299 if err != tt.err {
300 t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err)
302 s := b.String()
303 if s != tt.raw {
304 t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw)
307 // Test Reader Reset.
308 in = bytes.NewReader(tt.gzip)
309 err = gzip.Reset(in)
310 if err != nil {
311 t.Errorf("%s: Reset: %s", tt.name, err)
312 continue
314 if tt.name != gzip.Name {
315 t.Errorf("%s: got name %s", tt.name, gzip.Name)
317 b.Reset()
318 n, err = io.Copy(b, gzip)
319 if err != tt.err {
320 t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err)
322 s = b.String()
323 if s != tt.raw {
324 t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw)
329 func TestIssue6550(t *testing.T) {
330 f, err := os.Open("testdata/issue6550.gz")
331 if err != nil {
332 t.Fatal(err)
334 gzip, err := NewReader(f)
335 if err != nil {
336 t.Fatalf("NewReader(testdata/issue6550.gz): %v", err)
338 defer gzip.Close()
339 done := make(chan bool, 1)
340 go func() {
341 _, err := io.Copy(ioutil.Discard, gzip)
342 if err == nil {
343 t.Errorf("Copy succeeded")
344 } else {
345 t.Logf("Copy failed (correctly): %v", err)
347 done <- true
349 select {
350 case <-time.After(1 * time.Second):
351 t.Errorf("Copy hung")
352 case <-done:
353 // ok
357 func TestInitialReset(t *testing.T) {
358 var r Reader
359 if err := r.Reset(bytes.NewReader(gunzipTests[1].gzip)); err != nil {
360 t.Error(err)
362 var buf bytes.Buffer
363 if _, err := io.Copy(&buf, &r); err != nil {
364 t.Error(err)
366 if s := buf.String(); s != gunzipTests[1].raw {
367 t.Errorf("got %q want %q", s, gunzipTests[1].raw)