blob: d881c9875b4dafe0bb8798793ed9d42fbff82a28 [file] [log] [blame]
Russ Coxf52c0262009-06-06 21:56:04 -07001// 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.
4
5package gzip
6
7import (
Russ Coxd3a412a2009-06-29 15:24:23 -07008 "bytes";
Russ Coxf52c0262009-06-06 21:56:04 -07009 "fmt";
10 "io";
Russ Coxf52c0262009-06-06 21:56:04 -070011 "os";
Nigel Taob58ecb12009-08-20 16:03:34 -070012 "testing";
Russ Coxf52c0262009-06-06 21:56:04 -070013)
14
15type gzipTest struct {
16 name string;
Russ Cox64684cc2009-06-22 13:26:13 -070017 desc string;
Russ Coxf52c0262009-06-06 21:56:04 -070018 raw string;
19 gzip []byte;
20 err os.Error;
21}
22
23var gzipTests = []gzipTest {
24 gzipTest { // has 1 empty fixed-huffman block
25 "empty.txt",
Russ Cox64684cc2009-06-22 13:26:13 -070026 "empty.txt",
Russ Coxf52c0262009-06-06 21:56:04 -070027 "",
28 []byte {
29 0x1f, 0x8b, 0x08, 0x08, 0xf7, 0x5e, 0x14, 0x4a,
30 0x00, 0x03, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,
31 0x74, 0x78, 0x74, 0x00, 0x03, 0x00, 0x00, 0x00,
32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 },
34 nil
35 },
36 gzipTest { // has 1 non-empty fixed huffman block
37 "hello.txt",
Russ Cox64684cc2009-06-22 13:26:13 -070038 "hello.txt",
Russ Coxf52c0262009-06-06 21:56:04 -070039 "hello world\n",
40 []byte {
41 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
42 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
43 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
44 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
45 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
46 0x00, 0x00,
47 },
48 nil
49 },
50 gzipTest { // concatenation
51 "hello.txt",
Russ Cox64684cc2009-06-22 13:26:13 -070052 "hello.txt x2",
Russ Coxf52c0262009-06-06 21:56:04 -070053 "hello world\n"
54 "hello world\n",
55 []byte {
56 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
57 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
58 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
59 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
60 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
61 0x00, 0x00,
62 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
63 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
64 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
65 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
66 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
67 0x00, 0x00,
68 },
69 nil
70 },
Nigel Taob58ecb12009-08-20 16:03:34 -070071 gzipTest { // has a fixed huffman block with some length-distance pairs
72 "shesells.txt",
73 "shesells.txt",
74 "she sells seashells by the seashore\n",
75 []byte {
76 0x1f, 0x8b, 0x08, 0x08, 0x72, 0x66, 0x8b, 0x4a,
77 0x00, 0x03, 0x73, 0x68, 0x65, 0x73, 0x65, 0x6c,
78 0x6c, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2b,
79 0xce, 0x48, 0x55, 0x28, 0x4e, 0xcd, 0xc9, 0x29,
80 0x06, 0x92, 0x89, 0xc5, 0x19, 0x60, 0x56, 0x52,
81 0xa5, 0x42, 0x09, 0x58, 0x18, 0x28, 0x90, 0x5f,
82 0x94, 0xca, 0x05, 0x00, 0x76, 0xb0, 0x3b, 0xeb,
83 0x24, 0x00, 0x00, 0x00,
84 },
85 nil
86 },
Russ Coxf52c0262009-06-06 21:56:04 -070087 gzipTest { // has dynamic huffman blocks
88 "gettysburg",
Russ Cox64684cc2009-06-22 13:26:13 -070089 "gettysburg",
Russ Coxf52c0262009-06-06 21:56:04 -070090 " Four score and seven years ago our fathers brought forth on\n"
91 "this continent, a new nation, conceived in Liberty, and dedicated\n"
92 "to the proposition that all men are created equal.\n"
93 " Now we are engaged in a great Civil War, testing whether that\n"
94 "nation, or any nation so conceived and so dedicated, can long\n"
95 "endure.\n"
96 " We are met on a great battle-field of that war.\n"
97 " We have come to dedicate a portion of that field, as a final\n"
98 "resting place for those who here gave their lives that that\n"
99 "nation might live. It is altogether fitting and proper that\n"
100 "we should do this.\n"
101 " But, in a larger sense, we can not dedicate — we can not\n"
102 "consecrate — we can not hallow — this ground.\n"
103 " The brave men, living and dead, who struggled here, have\n"
104 "consecrated it, far above our poor power to add or detract.\n"
105 "The world will little note, nor long remember what we say here,\n"
106 "but it can never forget what they did here.\n"
107 " It is for us the living, rather, to be dedicated here to the\n"
108 "unfinished work which they who fought here have thus far so\n"
109 "nobly advanced. It is rather for us to be here dedicated to\n"
110 "the great task remaining before us — that from these honored\n"
111 "dead we take increased devotion to that cause for which they\n"
112 "gave the last full measure of devotion —\n"
113 " that we here highly resolve that these dead shall not have\n"
114 "died in vain — that this nation, under God, shall have a new\n"
115 "birth of freedom — and that government of the people, by the\n"
116 "people, for the people, shall not perish from this earth.\n"
117 "\n"
118 "Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania\n",
119 []byte {
120 0x1f, 0x8b, 0x08, 0x08, 0xd1, 0x12, 0x2b, 0x4a,
121 0x00, 0x03, 0x67, 0x65, 0x74, 0x74, 0x79, 0x73,
122 0x62, 0x75, 0x72, 0x67, 0x00, 0x65, 0x54, 0xcd,
123 0x6e, 0xd4, 0x30, 0x10, 0xbe, 0xfb, 0x29, 0xe6,
124 0x01, 0x42, 0xa5, 0x0a, 0x09, 0xc1, 0x11, 0x90,
125 0x40, 0x48, 0xa8, 0xe2, 0x80, 0xd4, 0xf3, 0x24,
126 0x9e, 0x24, 0x56, 0xbd, 0x9e, 0xc5, 0x76, 0x76,
127 0x95, 0x1b, 0x0f, 0xc1, 0x13, 0xf2, 0x24, 0x7c,
128 0x63, 0x77, 0x9b, 0x4a, 0x5c, 0xaa, 0x6e, 0x6c,
129 0xcf, 0x7c, 0x7f, 0x33, 0x44, 0x5f, 0x74, 0xcb,
130 0x54, 0x26, 0xcd, 0x42, 0x9c, 0x3c, 0x15, 0xb9,
131 0x48, 0xa2, 0x5d, 0x38, 0x17, 0xe2, 0x45, 0xc9,
132 0x4e, 0x67, 0xae, 0xab, 0xe0, 0xf7, 0x98, 0x75,
133 0x5b, 0xd6, 0x4a, 0xb3, 0xe6, 0xba, 0x92, 0x26,
134 0x57, 0xd7, 0x50, 0x68, 0xd2, 0x54, 0x43, 0x92,
135 0x54, 0x07, 0x62, 0x4a, 0x72, 0xa5, 0xc4, 0x35,
136 0x68, 0x1a, 0xec, 0x60, 0x92, 0x70, 0x11, 0x4f,
137 0x21, 0xd1, 0xf7, 0x30, 0x4a, 0xae, 0xfb, 0xd0,
138 0x9a, 0x78, 0xf1, 0x61, 0xe2, 0x2a, 0xde, 0x55,
139 0x25, 0xd4, 0xa6, 0x73, 0xd6, 0xb3, 0x96, 0x60,
140 0xef, 0xf0, 0x9b, 0x2b, 0x71, 0x8c, 0x74, 0x02,
141 0x10, 0x06, 0xac, 0x29, 0x8b, 0xdd, 0x25, 0xf9,
142 0xb5, 0x71, 0xbc, 0x73, 0x44, 0x0f, 0x7a, 0xa5,
143 0xab, 0xb4, 0x33, 0x49, 0x0b, 0x2f, 0xbd, 0x03,
144 0xd3, 0x62, 0x17, 0xe9, 0x73, 0xb8, 0x84, 0x48,
145 0x8f, 0x9c, 0x07, 0xaa, 0x52, 0x00, 0x6d, 0xa1,
146 0xeb, 0x2a, 0xc6, 0xa0, 0x95, 0x76, 0x37, 0x78,
147 0x9a, 0x81, 0x65, 0x7f, 0x46, 0x4b, 0x45, 0x5f,
148 0xe1, 0x6d, 0x42, 0xe8, 0x01, 0x13, 0x5c, 0x38,
149 0x51, 0xd4, 0xb4, 0x38, 0x49, 0x7e, 0xcb, 0x62,
150 0x28, 0x1e, 0x3b, 0x82, 0x93, 0x54, 0x48, 0xf1,
151 0xd2, 0x7d, 0xe4, 0x5a, 0xa3, 0xbc, 0x99, 0x83,
152 0x44, 0x4f, 0x3a, 0x77, 0x36, 0x57, 0xce, 0xcf,
153 0x2f, 0x56, 0xbe, 0x80, 0x90, 0x9e, 0x84, 0xea,
154 0x51, 0x1f, 0x8f, 0xcf, 0x90, 0xd4, 0x60, 0xdc,
155 0x5e, 0xb4, 0xf7, 0x10, 0x0b, 0x26, 0xe0, 0xff,
156 0xc4, 0xd1, 0xe5, 0x67, 0x2e, 0xe7, 0xc8, 0x93,
157 0x98, 0x05, 0xb8, 0xa8, 0x45, 0xc0, 0x4d, 0x09,
158 0xdc, 0x84, 0x16, 0x2b, 0x0d, 0x9a, 0x21, 0x53,
159 0x04, 0x8b, 0xd2, 0x0b, 0xbd, 0xa2, 0x4c, 0xa7,
160 0x60, 0xee, 0xd9, 0xe1, 0x1d, 0xd1, 0xb7, 0x4a,
161 0x30, 0x8f, 0x63, 0xd5, 0xa5, 0x8b, 0x33, 0x87,
162 0xda, 0x1a, 0x18, 0x79, 0xf3, 0xe3, 0xa6, 0x17,
163 0x94, 0x2e, 0xab, 0x6e, 0xa0, 0xe3, 0xcd, 0xac,
164 0x50, 0x8c, 0xca, 0xa7, 0x0d, 0x76, 0x37, 0xd1,
165 0x23, 0xe7, 0x05, 0x57, 0x8b, 0xa4, 0x22, 0x83,
166 0xd9, 0x62, 0x52, 0x25, 0xad, 0x07, 0xbb, 0xbf,
167 0xbf, 0xff, 0xbc, 0xfa, 0xee, 0x20, 0x73, 0x91,
168 0x29, 0xff, 0x7f, 0x02, 0x71, 0x62, 0x84, 0xb5,
169 0xf6, 0xb5, 0x25, 0x6b, 0x41, 0xde, 0x92, 0xb7,
170 0x76, 0x3f, 0x91, 0x91, 0x31, 0x1b, 0x41, 0x84,
171 0x62, 0x30, 0x0a, 0x37, 0xa4, 0x5e, 0x18, 0x3a,
172 0x99, 0x08, 0xa5, 0xe6, 0x6d, 0x59, 0x22, 0xec,
173 0x33, 0x39, 0x86, 0x26, 0xf5, 0xab, 0x66, 0xc8,
174 0x08, 0x20, 0xcf, 0x0c, 0xd7, 0x47, 0x45, 0x21,
175 0x0b, 0xf6, 0x59, 0xd5, 0xfe, 0x5c, 0x8d, 0xaa,
176 0x12, 0x7b, 0x6f, 0xa1, 0xf0, 0x52, 0x33, 0x4f,
177 0xf5, 0xce, 0x59, 0xd3, 0xab, 0x66, 0x10, 0xbf,
178 0x06, 0xc4, 0x31, 0x06, 0x73, 0xd6, 0x80, 0xa2,
179 0x78, 0xc2, 0x45, 0xcb, 0x03, 0x65, 0x39, 0xc9,
180 0x09, 0xd1, 0x06, 0x04, 0x33, 0x1a, 0x5a, 0xf1,
181 0xde, 0x01, 0xb8, 0x71, 0x83, 0xc4, 0xb5, 0xb3,
182 0xc3, 0x54, 0x65, 0x33, 0x0d, 0x5a, 0xf7, 0x9b,
183 0x90, 0x7c, 0x27, 0x1f, 0x3a, 0x58, 0xa3, 0xd8,
184 0xfd, 0x30, 0x5f, 0xb7, 0xd2, 0x66, 0xa2, 0x93,
185 0x1c, 0x28, 0xb7, 0xe9, 0x1b, 0x0c, 0xe1, 0x28,
186 0x47, 0x26, 0xbb, 0xe9, 0x7d, 0x7e, 0xdc, 0x96,
187 0x10, 0x92, 0x50, 0x56, 0x7c, 0x06, 0xe2, 0x27,
188 0xb4, 0x08, 0xd3, 0xda, 0x7b, 0x98, 0x34, 0x73,
189 0x9f, 0xdb, 0xf6, 0x62, 0xed, 0x31, 0x41, 0x13,
190 0xd3, 0xa2, 0xa8, 0x4b, 0x3a, 0xc6, 0x1d, 0xe4,
191 0x2f, 0x8c, 0xf8, 0xfb, 0x97, 0x64, 0xf4, 0xb6,
192 0x2f, 0x80, 0x5a, 0xf3, 0x56, 0xe0, 0x40, 0x50,
193 0xd5, 0x19, 0xd0, 0x1e, 0xfc, 0xca, 0xe5, 0xc9,
194 0xd4, 0x60, 0x00, 0x81, 0x2e, 0xa3, 0xcc, 0xb6,
195 0x52, 0xf0, 0xb4, 0xdb, 0x69, 0x99, 0xce, 0x7a,
196 0x32, 0x4c, 0x08, 0xed, 0xaa, 0x10, 0x10, 0xe3,
197 0x6f, 0xee, 0x99, 0x68, 0x95, 0x9f, 0x04, 0x71,
198 0xb2, 0x49, 0x2f, 0x62, 0xa6, 0x5e, 0xb4, 0xef,
199 0x02, 0xed, 0x4f, 0x27, 0xde, 0x4a, 0x0f, 0xfd,
200 0xc1, 0xcc, 0xdd, 0x02, 0x8f, 0x08, 0x16, 0x54,
201 0xdf, 0xda, 0xca, 0xe0, 0x82, 0xf1, 0xb4, 0x31,
202 0x7a, 0xa9, 0x81, 0xfe, 0x90, 0xb7, 0x3e, 0xdb,
203 0xd3, 0x35, 0xc0, 0x20, 0x80, 0x33, 0x46, 0x4a,
204 0x63, 0xab, 0xd1, 0x0d, 0x29, 0xd2, 0xe2, 0x84,
205 0xb8, 0xdb, 0xfa, 0xe9, 0x89, 0x44, 0x86, 0x7c,
206 0xe8, 0x0b, 0xe6, 0x02, 0x6a, 0x07, 0x9b, 0x96,
207 0xd0, 0xdb, 0x2e, 0x41, 0x4c, 0xa1, 0xd5, 0x57,
208 0x45, 0x14, 0xfb, 0xe3, 0xa6, 0x72, 0x5b, 0x87,
209 0x6e, 0x0c, 0x6d, 0x5b, 0xce, 0xe0, 0x2f, 0xe2,
210 0x21, 0x81, 0x95, 0xb0, 0xe8, 0xb6, 0x32, 0x0b,
211 0xb2, 0x98, 0x13, 0x52, 0x5d, 0xfb, 0xec, 0x63,
212 0x17, 0x8a, 0x9e, 0x23, 0x22, 0x36, 0xee, 0xcd,
213 0xda, 0xdb, 0xcf, 0x3e, 0xf1, 0xc7, 0xf1, 0x01,
214 0x12, 0x93, 0x0a, 0xeb, 0x6f, 0xf2, 0x02, 0x15,
215 0x96, 0x77, 0x5d, 0xef, 0x9c, 0xfb, 0x88, 0x91,
216 0x59, 0xf9, 0x84, 0xdd, 0x9b, 0x26, 0x8d, 0x80,
217 0xf9, 0x80, 0x66, 0x2d, 0xac, 0xf7, 0x1f, 0x06,
218 0xba, 0x7f, 0xff, 0xee, 0xed, 0x40, 0x5f, 0xa5,
219 0xd6, 0xbd, 0x8c, 0x5b, 0x46, 0xd2, 0x7e, 0x48,
220 0x4a, 0x65, 0x8f, 0x08, 0x42, 0x60, 0xf7, 0x0f,
221 0xb9, 0x16, 0x0b, 0x0c, 0x1a, 0x06, 0x00, 0x00,
222 },
223 nil
224 },
225 gzipTest { // has 1 non-empty fixed huffman block then garbage
226 "hello.txt",
Russ Cox64684cc2009-06-22 13:26:13 -0700227 "hello.txt + garbage",
Russ Coxf52c0262009-06-06 21:56:04 -0700228 "hello world\n",
229 []byte {
230 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
231 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
232 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
233 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
234 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
Russ Cox64684cc2009-06-22 13:26:13 -0700235 0x00, 0x00, 'g', 'a', 'r', 'b', 'a', 'g', 'e', '!', '!', '!',
Russ Coxf52c0262009-06-06 21:56:04 -0700236 },
237 HeaderError,
238 },
Russ Cox64684cc2009-06-22 13:26:13 -0700239 gzipTest { // has 1 non-empty fixed huffman block not enough header
240 "hello.txt",
241 "hello.txt + garbage",
242 "hello world\n",
243 []byte {
244 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
245 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
246 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
247 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
248 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
249 0x00, 0x00, gzipID1,
250 },
251 io.ErrUnexpectedEOF,
252 },
Russ Coxf52c0262009-06-06 21:56:04 -0700253 gzipTest { // has 1 non-empty fixed huffman block but corrupt checksum
254 "hello.txt",
Russ Cox64684cc2009-06-22 13:26:13 -0700255 "hello.txt + corrupt checksum",
Russ Coxf52c0262009-06-06 21:56:04 -0700256 "hello world\n",
257 []byte {
258 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
259 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
260 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
261 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
262 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00,
263 0x00, 0x00,
264 },
265 ChecksumError,
266 },
267 gzipTest { // has 1 non-empty fixed huffman block but corrupt size
268 "hello.txt",
Russ Cox64684cc2009-06-22 13:26:13 -0700269 "hello.txt + corrupt size",
Russ Coxf52c0262009-06-06 21:56:04 -0700270 "hello world\n",
271 []byte {
272 0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
273 0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
274 0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
275 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
276 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0xff, 0x00,
277 0x00, 0x00,
278 },
279 ChecksumError,
280 },
281}
282
Russ Cox52cf67a2009-08-20 10:18:48 -0700283func TestInflater(t *testing.T) {
Russ Coxd3a412a2009-06-29 15:24:23 -0700284 b := new(bytes.Buffer);
Russ Coxf52c0262009-06-06 21:56:04 -0700285 for i, tt := range gzipTests {
Russ Cox52cf67a2009-08-20 10:18:48 -0700286 in := bytes.NewBuffer(tt.gzip);
287 gzip, err := NewInflater(in);
Russ Coxf52c0262009-06-06 21:56:04 -0700288 if err != nil {
Russ Cox52cf67a2009-08-20 10:18:48 -0700289 t.Errorf("%s: NewInflater: %s", tt.name, err);
Russ Coxf52c0262009-06-06 21:56:04 -0700290 continue;
291 }
292 if tt.name != gzip.Name {
293 t.Errorf("%s: got name %s", tt.name, gzip.Name);
294 }
295 b.Reset();
296 n, err := io.Copy(gzip, b);
297 if err != tt.err {
Russ Cox64684cc2009-06-22 13:26:13 -0700298 t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err);
Russ Coxf52c0262009-06-06 21:56:04 -0700299 }
300 s := string(b.Data());
301 if s != tt.raw {
302 t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw);
303 }
304 }
305}
306