OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <fstream> | 5 #include <fstream> |
6 #include <iostream> | 6 #include <iostream> |
7 | 7 |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
10 #include "base/scoped_ptr.h" | 10 #include "base/scoped_ptr.h" |
11 #include "net/base/bzip2_filter.h" | 11 #include "net/base/bzip2_filter.h" |
| 12 #include "net/base/filter_unittest.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "testing/platform_test.h" | 14 #include "testing/platform_test.h" |
14 #include "third_party/bzip2/bzlib.h" | 15 #include "third_party/bzip2/bzlib.h" |
15 | 16 |
16 namespace { | 17 namespace { |
17 | 18 |
18 const char* kExtraData = "Test Data, More Test Data, Even More Data of Test"; | 19 const char* kExtraData = "Test Data, More Test Data, Even More Data of Test"; |
19 const int kExtraDataBufferSize = 49; | 20 const int kExtraDataBufferSize = 49; |
20 const int kDefaultBufferSize = 4096; | 21 const int kDefaultBufferSize = 4096; |
21 const int kSmallBufferSize = 128; | 22 const int kSmallBufferSize = 128; |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 scoped_ptr<bz_stream> bzip2_data_stream_; | 178 scoped_ptr<bz_stream> bzip2_data_stream_; |
178 char* bzip2_encode_buffer_; | 179 char* bzip2_encode_buffer_; |
179 int bzip2_encode_len_; | 180 int bzip2_encode_len_; |
180 }; | 181 }; |
181 | 182 |
182 // Basic scenario: decoding bzip2 data with big enough buffer. | 183 // Basic scenario: decoding bzip2 data with big enough buffer. |
183 TEST_F(BZip2FilterUnitTest, DecodeBZip2) { | 184 TEST_F(BZip2FilterUnitTest, DecodeBZip2) { |
184 // Decode the compressed data with filter | 185 // Decode the compressed data with filter |
185 std::vector<Filter::FilterType> filter_types; | 186 std::vector<Filter::FilterType> filter_types; |
186 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 187 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
187 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 188 MockFilterContext filter_context(kDefaultBufferSize); |
| 189 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
188 ASSERT_TRUE(filter.get()); | 190 ASSERT_TRUE(filter.get()); |
189 memcpy(filter->stream_buffer()->data(), bzip2_encode_buffer_, | 191 memcpy(filter->stream_buffer()->data(), bzip2_encode_buffer_, |
190 bzip2_encode_len_); | 192 bzip2_encode_len_); |
191 filter->FlushStreamBuffer(bzip2_encode_len_); | 193 filter->FlushStreamBuffer(bzip2_encode_len_); |
192 | 194 |
193 char bzip2_decode_buffer[kDefaultBufferSize]; | 195 char bzip2_decode_buffer[kDefaultBufferSize]; |
194 int bzip2_decode_size = kDefaultBufferSize; | 196 int bzip2_decode_size = kDefaultBufferSize; |
195 Filter::FilterStatus result = | 197 Filter::FilterStatus result = |
196 filter->ReadData(bzip2_decode_buffer, &bzip2_decode_size); | 198 filter->ReadData(bzip2_decode_buffer, &bzip2_decode_size); |
197 ASSERT_EQ(Filter::FILTER_DONE, result); | 199 ASSERT_EQ(Filter::FILTER_DONE, result); |
198 | 200 |
199 // Compare the decoding result with source data | 201 // Compare the decoding result with source data |
200 EXPECT_TRUE(bzip2_decode_size == source_len()); | 202 EXPECT_TRUE(bzip2_decode_size == source_len()); |
201 EXPECT_EQ(memcmp(source_buffer(), bzip2_decode_buffer, source_len()), 0); | 203 EXPECT_EQ(memcmp(source_buffer(), bzip2_decode_buffer, source_len()), 0); |
202 } | 204 } |
203 | 205 |
204 // Tests we can call filter repeatedly to get all the data decoded. | 206 // Tests we can call filter repeatedly to get all the data decoded. |
205 // To do that, we create a filter with a small buffer that can not hold all | 207 // To do that, we create a filter with a small buffer that can not hold all |
206 // the input data. | 208 // the input data. |
207 TEST_F(BZip2FilterUnitTest, DecodeWithSmallInputBuffer) { | 209 TEST_F(BZip2FilterUnitTest, DecodeWithSmallInputBuffer) { |
208 std::vector<Filter::FilterType> filter_types; | 210 std::vector<Filter::FilterType> filter_types; |
209 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 211 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
210 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kSmallBufferSize)); | 212 MockFilterContext filter_context(kSmallBufferSize); |
| 213 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
211 ASSERT_TRUE(filter.get()); | 214 ASSERT_TRUE(filter.get()); |
212 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), | 215 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), |
213 bzip2_encode_buffer_, bzip2_encode_len_, | 216 bzip2_encode_buffer_, bzip2_encode_len_, |
214 kDefaultBufferSize, false); | 217 kDefaultBufferSize, false); |
215 } | 218 } |
216 | 219 |
217 // Tests we can decode when caller has small buffer to read out from filter. | 220 // Tests we can decode when caller has small buffer to read out from filter. |
218 TEST_F(BZip2FilterUnitTest, DecodeWithSmallOutputBuffer) { | 221 TEST_F(BZip2FilterUnitTest, DecodeWithSmallOutputBuffer) { |
219 std::vector<Filter::FilterType> filter_types; | 222 std::vector<Filter::FilterType> filter_types; |
220 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 223 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
221 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 224 MockFilterContext filter_context(kDefaultBufferSize); |
| 225 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
222 ASSERT_TRUE(filter.get()); | 226 ASSERT_TRUE(filter.get()); |
223 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), | 227 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), |
224 bzip2_encode_buffer_, bzip2_encode_len_, | 228 bzip2_encode_buffer_, bzip2_encode_len_, |
225 kSmallBufferSize, false); | 229 kSmallBufferSize, false); |
226 } | 230 } |
227 | 231 |
228 // Tests we can still decode with just 1 byte buffer in the filter. | 232 // Tests we can still decode with just 1 byte buffer in the filter. |
229 // The purpose of this tests are two: (1) Verify filter can parse partial BZip2 | 233 // The purpose of this tests are two: (1) Verify filter can parse partial BZip2 |
230 // header correctly. (2) Sometimes the filter will consume input without | 234 // header correctly. (2) Sometimes the filter will consume input without |
231 // generating output. Verify filter can handle it correctly. | 235 // generating output. Verify filter can handle it correctly. |
232 TEST_F(BZip2FilterUnitTest, DecodeWithOneByteInputBuffer) { | 236 TEST_F(BZip2FilterUnitTest, DecodeWithOneByteInputBuffer) { |
233 std::vector<Filter::FilterType> filter_types; | 237 std::vector<Filter::FilterType> filter_types; |
234 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 238 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
235 scoped_ptr<Filter> filter(Filter::Factory(filter_types, 1)); | 239 MockFilterContext filter_context(1); |
| 240 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
236 ASSERT_TRUE(filter.get()); | 241 ASSERT_TRUE(filter.get()); |
237 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), | 242 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), |
238 bzip2_encode_buffer_, bzip2_encode_len_, | 243 bzip2_encode_buffer_, bzip2_encode_len_, |
239 kDefaultBufferSize, false); | 244 kDefaultBufferSize, false); |
240 } | 245 } |
241 | 246 |
242 // Tests we can still decode with just 1 byte buffer in the filter and just 1 | 247 // Tests we can still decode with just 1 byte buffer in the filter and just 1 |
243 // byte buffer in the caller. | 248 // byte buffer in the caller. |
244 TEST_F(BZip2FilterUnitTest, DecodeWithOneByteInputAndOutputBuffer) { | 249 TEST_F(BZip2FilterUnitTest, DecodeWithOneByteInputAndOutputBuffer) { |
245 std::vector<Filter::FilterType> filter_types; | 250 std::vector<Filter::FilterType> filter_types; |
246 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 251 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
247 scoped_ptr<Filter> filter(Filter::Factory(filter_types, 1)); | 252 MockFilterContext filter_context(1); |
| 253 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
248 ASSERT_TRUE(filter.get()); | 254 ASSERT_TRUE(filter.get()); |
249 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), | 255 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), |
250 bzip2_encode_buffer_, bzip2_encode_len_, 1, false); | 256 bzip2_encode_buffer_, bzip2_encode_len_, 1, false); |
251 } | 257 } |
252 | 258 |
253 // Decoding bzip2 stream with corrupted data. | 259 // Decoding bzip2 stream with corrupted data. |
254 TEST_F(BZip2FilterUnitTest, DecodeCorruptedData) { | 260 TEST_F(BZip2FilterUnitTest, DecodeCorruptedData) { |
255 char corrupt_data[kDefaultBufferSize]; | 261 char corrupt_data[kDefaultBufferSize]; |
256 int corrupt_data_len = bzip2_encode_len_; | 262 int corrupt_data_len = bzip2_encode_len_; |
257 memcpy(corrupt_data, bzip2_encode_buffer_, bzip2_encode_len_); | 263 memcpy(corrupt_data, bzip2_encode_buffer_, bzip2_encode_len_); |
258 | 264 |
259 char corrupt_decode_buffer[kDefaultBufferSize]; | 265 char corrupt_decode_buffer[kDefaultBufferSize]; |
260 int corrupt_decode_size = kDefaultBufferSize; | 266 int corrupt_decode_size = kDefaultBufferSize; |
261 | 267 |
262 // Decode the correct data with filter | 268 // Decode the correct data with filter |
263 std::vector<Filter::FilterType> filter_types; | 269 std::vector<Filter::FilterType> filter_types; |
264 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 270 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
265 scoped_ptr<Filter> filter1(Filter::Factory(filter_types, kDefaultBufferSize)); | 271 MockFilterContext filter_context(kDefaultBufferSize); |
| 272 scoped_ptr<Filter> filter1(Filter::Factory(filter_types, filter_context)); |
266 ASSERT_TRUE(filter1.get()); | 273 ASSERT_TRUE(filter1.get()); |
267 | 274 |
268 Filter::FilterStatus code = DecodeAllWithFilter(filter1.get(), | 275 Filter::FilterStatus code = DecodeAllWithFilter(filter1.get(), |
269 corrupt_data, | 276 corrupt_data, |
270 corrupt_data_len, | 277 corrupt_data_len, |
271 corrupt_decode_buffer, | 278 corrupt_decode_buffer, |
272 &corrupt_decode_size); | 279 &corrupt_decode_size); |
273 | 280 |
274 // Expect failures | 281 // Expect failures |
275 EXPECT_TRUE(code == Filter::FILTER_DONE); | 282 EXPECT_TRUE(code == Filter::FILTER_DONE); |
276 | 283 |
277 // Decode the corrupted data with filter | 284 // Decode the corrupted data with filter |
278 scoped_ptr<Filter> filter2(Filter::Factory(filter_types, kDefaultBufferSize)); | 285 scoped_ptr<Filter> filter2(Filter::Factory(filter_types, filter_context)); |
279 ASSERT_TRUE(filter2.get()); | 286 ASSERT_TRUE(filter2.get()); |
280 | 287 |
281 int pos = corrupt_data_len / 2; | 288 int pos = corrupt_data_len / 2; |
282 corrupt_data[pos] = !corrupt_data[pos]; | 289 corrupt_data[pos] = !corrupt_data[pos]; |
283 | 290 |
284 code = DecodeAllWithFilter(filter2.get(), | 291 code = DecodeAllWithFilter(filter2.get(), |
285 corrupt_data, | 292 corrupt_data, |
286 corrupt_data_len, | 293 corrupt_data_len, |
287 corrupt_decode_buffer, | 294 corrupt_decode_buffer, |
288 &corrupt_decode_size); | 295 &corrupt_decode_size); |
289 | 296 |
290 // Expect failures | 297 // Expect failures |
291 EXPECT_TRUE(code != Filter::FILTER_DONE); | 298 EXPECT_TRUE(code != Filter::FILTER_DONE); |
292 } | 299 } |
293 | 300 |
294 // Decoding bzip2 stream with missing data. | 301 // Decoding bzip2 stream with missing data. |
295 TEST_F(BZip2FilterUnitTest, DecodeMissingData) { | 302 TEST_F(BZip2FilterUnitTest, DecodeMissingData) { |
296 char corrupt_data[kDefaultBufferSize]; | 303 char corrupt_data[kDefaultBufferSize]; |
297 int corrupt_data_len = bzip2_encode_len_; | 304 int corrupt_data_len = bzip2_encode_len_; |
298 memcpy(corrupt_data, bzip2_encode_buffer_, bzip2_encode_len_); | 305 memcpy(corrupt_data, bzip2_encode_buffer_, bzip2_encode_len_); |
299 | 306 |
300 int pos = corrupt_data_len / 2; | 307 int pos = corrupt_data_len / 2; |
301 int len = corrupt_data_len - pos - 1; | 308 int len = corrupt_data_len - pos - 1; |
302 memmove(&corrupt_data[pos], &corrupt_data[pos+1], len); | 309 memmove(&corrupt_data[pos], &corrupt_data[pos+1], len); |
303 --corrupt_data_len; | 310 --corrupt_data_len; |
304 | 311 |
305 // Decode the corrupted data with filter | 312 // Decode the corrupted data with filter |
306 std::vector<Filter::FilterType> filter_types; | 313 std::vector<Filter::FilterType> filter_types; |
307 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 314 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
308 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 315 MockFilterContext filter_context(kDefaultBufferSize); |
| 316 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
309 ASSERT_TRUE(filter.get()); | 317 ASSERT_TRUE(filter.get()); |
310 char corrupt_decode_buffer[kDefaultBufferSize]; | 318 char corrupt_decode_buffer[kDefaultBufferSize]; |
311 int corrupt_decode_size = kDefaultBufferSize; | 319 int corrupt_decode_size = kDefaultBufferSize; |
312 | 320 |
313 Filter::FilterStatus code = DecodeAllWithFilter(filter.get(), | 321 Filter::FilterStatus code = DecodeAllWithFilter(filter.get(), |
314 corrupt_data, | 322 corrupt_data, |
315 corrupt_data_len, | 323 corrupt_data_len, |
316 corrupt_decode_buffer, | 324 corrupt_decode_buffer, |
317 &corrupt_decode_size); | 325 &corrupt_decode_size); |
318 // Expect failures | 326 // Expect failures |
319 EXPECT_TRUE(code != Filter::FILTER_DONE); | 327 EXPECT_TRUE(code != Filter::FILTER_DONE); |
320 } | 328 } |
321 | 329 |
322 // Decoding bzip2 stream with corrupted header. | 330 // Decoding bzip2 stream with corrupted header. |
323 TEST_F(BZip2FilterUnitTest, DecodeCorruptedHeader) { | 331 TEST_F(BZip2FilterUnitTest, DecodeCorruptedHeader) { |
324 char corrupt_data[kDefaultBufferSize]; | 332 char corrupt_data[kDefaultBufferSize]; |
325 int corrupt_data_len = bzip2_encode_len_; | 333 int corrupt_data_len = bzip2_encode_len_; |
326 memcpy(corrupt_data, bzip2_encode_buffer_, bzip2_encode_len_); | 334 memcpy(corrupt_data, bzip2_encode_buffer_, bzip2_encode_len_); |
327 | 335 |
328 corrupt_data[2] = !corrupt_data[2]; | 336 corrupt_data[2] = !corrupt_data[2]; |
329 | 337 |
330 // Decode the corrupted data with filter | 338 // Decode the corrupted data with filter |
331 std::vector<Filter::FilterType> filter_types; | 339 std::vector<Filter::FilterType> filter_types; |
332 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 340 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
333 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 341 MockFilterContext filter_context(kDefaultBufferSize); |
| 342 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
334 ASSERT_TRUE(filter.get()); | 343 ASSERT_TRUE(filter.get()); |
335 char corrupt_decode_buffer[kDefaultBufferSize]; | 344 char corrupt_decode_buffer[kDefaultBufferSize]; |
336 int corrupt_decode_size = kDefaultBufferSize; | 345 int corrupt_decode_size = kDefaultBufferSize; |
337 | 346 |
338 Filter::FilterStatus code = DecodeAllWithFilter(filter.get(), | 347 Filter::FilterStatus code = DecodeAllWithFilter(filter.get(), |
339 corrupt_data, | 348 corrupt_data, |
340 corrupt_data_len, | 349 corrupt_data_len, |
341 corrupt_decode_buffer, | 350 corrupt_decode_buffer, |
342 &corrupt_decode_size); | 351 &corrupt_decode_size); |
343 | 352 |
344 // Expect failures | 353 // Expect failures |
345 EXPECT_TRUE(code == Filter::FILTER_ERROR); | 354 EXPECT_TRUE(code == Filter::FILTER_ERROR); |
346 } | 355 } |
347 | 356 |
348 // Tests we can decode all compress data and get extra data which is | 357 // Tests we can decode all compress data and get extra data which is |
349 // appended to compress data stream by some server when it finish | 358 // appended to compress data stream by some server when it finish |
350 // sending compress data. | 359 // sending compress data. |
351 TEST_F(BZip2FilterUnitTest, DecodeWithExtraDataAndSmallOutputBuffer) { | 360 TEST_F(BZip2FilterUnitTest, DecodeWithExtraDataAndSmallOutputBuffer) { |
352 char more_data[kDefaultBufferSize + kExtraDataBufferSize]; | 361 char more_data[kDefaultBufferSize + kExtraDataBufferSize]; |
353 int more_data_len = bzip2_encode_len_ + kExtraDataBufferSize; | 362 int more_data_len = bzip2_encode_len_ + kExtraDataBufferSize; |
354 memcpy(more_data, bzip2_encode_buffer_, bzip2_encode_len_); | 363 memcpy(more_data, bzip2_encode_buffer_, bzip2_encode_len_); |
355 memcpy(more_data + bzip2_encode_len_, kExtraData, kExtraDataBufferSize); | 364 memcpy(more_data + bzip2_encode_len_, kExtraData, kExtraDataBufferSize); |
356 | 365 |
357 std::vector<Filter::FilterType> filter_types; | 366 std::vector<Filter::FilterType> filter_types; |
358 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 367 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
359 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 368 MockFilterContext filter_context(kDefaultBufferSize); |
| 369 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
360 ASSERT_TRUE(filter.get()); | 370 ASSERT_TRUE(filter.get()); |
361 DecodeAndCompareWithFilter(filter.get(), | 371 DecodeAndCompareWithFilter(filter.get(), |
362 source_buffer(), | 372 source_buffer(), |
363 source_len() + kExtraDataBufferSize, | 373 source_len() + kExtraDataBufferSize, |
364 more_data, | 374 more_data, |
365 more_data_len, | 375 more_data_len, |
366 kSmallBufferSize, | 376 kSmallBufferSize, |
367 true); | 377 true); |
368 } | 378 } |
369 | 379 |
370 TEST_F(BZip2FilterUnitTest, DecodeWithExtraDataAndSmallInputBuffer) { | 380 TEST_F(BZip2FilterUnitTest, DecodeWithExtraDataAndSmallInputBuffer) { |
371 char more_data[kDefaultBufferSize + kExtraDataBufferSize]; | 381 char more_data[kDefaultBufferSize + kExtraDataBufferSize]; |
372 int more_data_len = bzip2_encode_len_ + kExtraDataBufferSize; | 382 int more_data_len = bzip2_encode_len_ + kExtraDataBufferSize; |
373 memcpy(more_data, bzip2_encode_buffer_, bzip2_encode_len_); | 383 memcpy(more_data, bzip2_encode_buffer_, bzip2_encode_len_); |
374 memcpy(more_data + bzip2_encode_len_, kExtraData, kExtraDataBufferSize); | 384 memcpy(more_data + bzip2_encode_len_, kExtraData, kExtraDataBufferSize); |
375 | 385 |
376 std::vector<Filter::FilterType> filter_types; | 386 std::vector<Filter::FilterType> filter_types; |
377 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); | 387 filter_types.push_back(Filter::FILTER_TYPE_BZIP2); |
378 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kSmallBufferSize)); | 388 MockFilterContext filter_context(kSmallBufferSize); |
| 389 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
379 ASSERT_TRUE(filter.get()); | 390 ASSERT_TRUE(filter.get()); |
380 DecodeAndCompareWithFilter(filter.get(), | 391 DecodeAndCompareWithFilter(filter.get(), |
381 source_buffer(), | 392 source_buffer(), |
382 source_len() + kExtraDataBufferSize, | 393 source_len() + kExtraDataBufferSize, |
383 more_data, | 394 more_data, |
384 more_data_len, | 395 more_data_len, |
385 kDefaultBufferSize, | 396 kDefaultBufferSize, |
386 true); | 397 true); |
387 } | 398 } |
388 | 399 |
389 } // namespace | 400 } // namespace |
OLD | NEW |