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