| 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/gzip_filter.h" | 11 #include "net/base/gzip_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/zlib/zlib.h" | 15 #include "third_party/zlib/zlib.h" |
| 15 | 16 |
| 16 namespace { | 17 namespace { |
| 17 | 18 |
| 18 const int kDefaultBufferSize = 4096; | 19 const int kDefaultBufferSize = 4096; |
| 19 const int kSmallBufferSize = 128; | 20 const int kSmallBufferSize = 128; |
| 20 const int kMaxBufferSize = 1048576; // 1048576 == 2^20 == 1 MB | 21 const int kMaxBufferSize = 1048576; // 1048576 == 2^20 == 1 MB |
| 21 | 22 |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 | 224 |
| 224 char* gzip_encode_buffer_; | 225 char* gzip_encode_buffer_; |
| 225 int gzip_encode_len_; | 226 int gzip_encode_len_; |
| 226 }; | 227 }; |
| 227 | 228 |
| 228 // Basic scenario: decoding deflate data with big enough buffer. | 229 // Basic scenario: decoding deflate data with big enough buffer. |
| 229 TEST_F(GZipUnitTest, DecodeDeflate) { | 230 TEST_F(GZipUnitTest, DecodeDeflate) { |
| 230 // Decode the compressed data with filter | 231 // Decode the compressed data with filter |
| 231 std::vector<Filter::FilterType> filter_types; | 232 std::vector<Filter::FilterType> filter_types; |
| 232 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); | 233 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); |
| 233 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 234 MockFilterContext filter_context(kDefaultBufferSize); |
| 235 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 234 ASSERT_TRUE(filter.get()); | 236 ASSERT_TRUE(filter.get()); |
| 235 memcpy(filter->stream_buffer()->data(), deflate_encode_buffer_, | 237 memcpy(filter->stream_buffer()->data(), deflate_encode_buffer_, |
| 236 deflate_encode_len_); | 238 deflate_encode_len_); |
| 237 filter->FlushStreamBuffer(deflate_encode_len_); | 239 filter->FlushStreamBuffer(deflate_encode_len_); |
| 238 | 240 |
| 239 char deflate_decode_buffer[kDefaultBufferSize]; | 241 char deflate_decode_buffer[kDefaultBufferSize]; |
| 240 int deflate_decode_size = kDefaultBufferSize; | 242 int deflate_decode_size = kDefaultBufferSize; |
| 241 filter->ReadData(deflate_decode_buffer, &deflate_decode_size); | 243 filter->ReadData(deflate_decode_buffer, &deflate_decode_size); |
| 242 | 244 |
| 243 // Compare the decoding result with source data | 245 // Compare the decoding result with source data |
| 244 EXPECT_TRUE(deflate_decode_size == source_len()); | 246 EXPECT_TRUE(deflate_decode_size == source_len()); |
| 245 EXPECT_EQ(memcmp(source_buffer(), deflate_decode_buffer, source_len()), 0); | 247 EXPECT_EQ(memcmp(source_buffer(), deflate_decode_buffer, source_len()), 0); |
| 246 } | 248 } |
| 247 | 249 |
| 248 // Basic scenario: decoding gzip data with big enough buffer. | 250 // Basic scenario: decoding gzip data with big enough buffer. |
| 249 TEST_F(GZipUnitTest, DecodeGZip) { | 251 TEST_F(GZipUnitTest, DecodeGZip) { |
| 250 // Decode the compressed data with filter | 252 // Decode the compressed data with filter |
| 251 std::vector<Filter::FilterType> filter_types; | 253 std::vector<Filter::FilterType> filter_types; |
| 252 filter_types.push_back(Filter::FILTER_TYPE_GZIP); | 254 filter_types.push_back(Filter::FILTER_TYPE_GZIP); |
| 253 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 255 MockFilterContext filter_context(kDefaultBufferSize); |
| 256 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 254 ASSERT_TRUE(filter.get()); | 257 ASSERT_TRUE(filter.get()); |
| 255 memcpy(filter->stream_buffer()->data(), gzip_encode_buffer_, | 258 memcpy(filter->stream_buffer()->data(), gzip_encode_buffer_, |
| 256 gzip_encode_len_); | 259 gzip_encode_len_); |
| 257 filter->FlushStreamBuffer(gzip_encode_len_); | 260 filter->FlushStreamBuffer(gzip_encode_len_); |
| 258 | 261 |
| 259 char gzip_decode_buffer[kDefaultBufferSize]; | 262 char gzip_decode_buffer[kDefaultBufferSize]; |
| 260 int gzip_decode_size = kDefaultBufferSize; | 263 int gzip_decode_size = kDefaultBufferSize; |
| 261 filter->ReadData(gzip_decode_buffer, &gzip_decode_size); | 264 filter->ReadData(gzip_decode_buffer, &gzip_decode_size); |
| 262 | 265 |
| 263 // Compare the decoding result with source data | 266 // Compare the decoding result with source data |
| 264 EXPECT_TRUE(gzip_decode_size == source_len()); | 267 EXPECT_TRUE(gzip_decode_size == source_len()); |
| 265 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); | 268 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); |
| 266 } | 269 } |
| 267 | 270 |
| 268 // SDCH scenario: decoding gzip data when content type says sdch,gzip. | 271 // SDCH scenario: decoding gzip data when content type says sdch,gzip. |
| 269 // This tests that sdch will degrade to pass through, and is what allows robust | 272 // This tests that sdch will degrade to pass through, and is what allows robust |
| 270 // handling when the response *might* be sdch,gzip by simply adding in the | 273 // handling when the response *might* be sdch,gzip by simply adding in the |
| 271 // tentative sdch decode. | 274 // tentative sdch decode. |
| 272 // All test code is otherwise modeled after the "basic" scenario above. | 275 // All test code is otherwise modeled after the "basic" scenario above. |
| 273 TEST_F(GZipUnitTest, DecodeGZipWithMistakenSdch) { | 276 TEST_F(GZipUnitTest, DecodeGZipWithMistakenSdch) { |
| 274 // Decode the compressed data with filter | 277 // Decode the compressed data with filter |
| 275 std::vector<Filter::FilterType> filter_types; | 278 std::vector<Filter::FilterType> filter_types; |
| 276 filter_types.push_back(Filter::FILTER_TYPE_SDCH); | 279 filter_types.push_back(Filter::FILTER_TYPE_SDCH); |
| 277 filter_types.push_back(Filter::FILTER_TYPE_GZIP); | 280 filter_types.push_back(Filter::FILTER_TYPE_GZIP); |
| 278 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 281 MockFilterContext filter_context(kDefaultBufferSize); |
| 282 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 279 ASSERT_TRUE(filter.get()); | 283 ASSERT_TRUE(filter.get()); |
| 280 memcpy(filter->stream_buffer()->data(), gzip_encode_buffer_, | 284 memcpy(filter->stream_buffer()->data(), gzip_encode_buffer_, |
| 281 gzip_encode_len_); | 285 gzip_encode_len_); |
| 282 filter->FlushStreamBuffer(gzip_encode_len_); | 286 filter->FlushStreamBuffer(gzip_encode_len_); |
| 283 | 287 |
| 284 char gzip_decode_buffer[kDefaultBufferSize]; | 288 char gzip_decode_buffer[kDefaultBufferSize]; |
| 285 int gzip_decode_size = kDefaultBufferSize; | 289 int gzip_decode_size = kDefaultBufferSize; |
| 286 filter->ReadData(gzip_decode_buffer, &gzip_decode_size); | 290 filter->ReadData(gzip_decode_buffer, &gzip_decode_size); |
| 287 | 291 |
| 288 // Compare the decoding result with source data | 292 // Compare the decoding result with source data |
| 289 EXPECT_TRUE(gzip_decode_size == source_len()); | 293 EXPECT_TRUE(gzip_decode_size == source_len()); |
| 290 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); | 294 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); |
| 291 } | 295 } |
| 292 | 296 |
| 293 // Tests we can call filter repeatedly to get all the data decoded. | 297 // Tests we can call filter repeatedly to get all the data decoded. |
| 294 // To do that, we create a filter with a small buffer that can not hold all | 298 // To do that, we create a filter with a small buffer that can not hold all |
| 295 // the input data. | 299 // the input data. |
| 296 TEST_F(GZipUnitTest, DecodeWithSmallBuffer) { | 300 TEST_F(GZipUnitTest, DecodeWithSmallBuffer) { |
| 297 std::vector<Filter::FilterType> filter_types; | 301 std::vector<Filter::FilterType> filter_types; |
| 298 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); | 302 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); |
| 299 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kSmallBufferSize)); | 303 MockFilterContext filter_context(kSmallBufferSize); |
| 304 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 300 ASSERT_TRUE(filter.get()); | 305 ASSERT_TRUE(filter.get()); |
| 301 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), | 306 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), |
| 302 deflate_encode_buffer_, deflate_encode_len_, | 307 deflate_encode_buffer_, deflate_encode_len_, |
| 303 kDefaultBufferSize); | 308 kDefaultBufferSize); |
| 304 } | 309 } |
| 305 | 310 |
| 306 // Tests we can still decode with just 1 byte buffer in the filter. | 311 // Tests we can still decode with just 1 byte buffer in the filter. |
| 307 // The purpose of this tests are two: (1) Verify filter can parse partial GZip | 312 // The purpose of this tests are two: (1) Verify filter can parse partial GZip |
| 308 // header correctly. (2) Sometimes the filter will consume input without | 313 // header correctly. (2) Sometimes the filter will consume input without |
| 309 // generating output. Verify filter can handle it correctly. | 314 // generating output. Verify filter can handle it correctly. |
| 310 TEST_F(GZipUnitTest, DecodeWithOneByteBuffer) { | 315 TEST_F(GZipUnitTest, DecodeWithOneByteBuffer) { |
| 311 std::vector<Filter::FilterType> filter_types; | 316 std::vector<Filter::FilterType> filter_types; |
| 312 filter_types.push_back(Filter::FILTER_TYPE_GZIP); | 317 filter_types.push_back(Filter::FILTER_TYPE_GZIP); |
| 313 scoped_ptr<Filter> filter(Filter::Factory(filter_types, 1)); | 318 MockFilterContext filter_context(1); |
| 319 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 314 ASSERT_TRUE(filter.get()); | 320 ASSERT_TRUE(filter.get()); |
| 315 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), | 321 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), |
| 316 gzip_encode_buffer_, gzip_encode_len_, | 322 gzip_encode_buffer_, gzip_encode_len_, |
| 317 kDefaultBufferSize); | 323 kDefaultBufferSize); |
| 318 } | 324 } |
| 319 | 325 |
| 320 // Tests we can decode when caller has small buffer to read out from filter. | 326 // Tests we can decode when caller has small buffer to read out from filter. |
| 321 TEST_F(GZipUnitTest, DecodeWithSmallOutputBuffer) { | 327 TEST_F(GZipUnitTest, DecodeWithSmallOutputBuffer) { |
| 322 std::vector<Filter::FilterType> filter_types; | 328 std::vector<Filter::FilterType> filter_types; |
| 323 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); | 329 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); |
| 324 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 330 MockFilterContext filter_context(kDefaultBufferSize); |
| 331 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 325 ASSERT_TRUE(filter.get()); | 332 ASSERT_TRUE(filter.get()); |
| 326 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), | 333 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), |
| 327 deflate_encode_buffer_, deflate_encode_len_, | 334 deflate_encode_buffer_, deflate_encode_len_, |
| 328 kSmallBufferSize); | 335 kSmallBufferSize); |
| 329 } | 336 } |
| 330 | 337 |
| 331 // Tests we can still decode with just 1 byte buffer in the filter and just 1 | 338 // Tests we can still decode with just 1 byte buffer in the filter and just 1 |
| 332 // byte buffer in the caller. | 339 // byte buffer in the caller. |
| 333 TEST_F(GZipUnitTest, DecodeWithOneByteInputAndOutputBuffer) { | 340 TEST_F(GZipUnitTest, DecodeWithOneByteInputAndOutputBuffer) { |
| 334 std::vector<Filter::FilterType> filter_types; | 341 std::vector<Filter::FilterType> filter_types; |
| 335 filter_types.push_back(Filter::FILTER_TYPE_GZIP); | 342 filter_types.push_back(Filter::FILTER_TYPE_GZIP); |
| 336 scoped_ptr<Filter> filter(Filter::Factory(filter_types, 1)); | 343 MockFilterContext filter_context(1); |
| 344 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 337 ASSERT_TRUE(filter.get()); | 345 ASSERT_TRUE(filter.get()); |
| 338 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), | 346 DecodeAndCompareWithFilter(filter.get(), source_buffer(), source_len(), |
| 339 gzip_encode_buffer_, gzip_encode_len_, 1); | 347 gzip_encode_buffer_, gzip_encode_len_, 1); |
| 340 } | 348 } |
| 341 | 349 |
| 342 // Decoding deflate stream with corrupted data. | 350 // Decoding deflate stream with corrupted data. |
| 343 TEST_F(GZipUnitTest, DecodeCorruptedData) { | 351 TEST_F(GZipUnitTest, DecodeCorruptedData) { |
| 344 char corrupt_data[kDefaultBufferSize]; | 352 char corrupt_data[kDefaultBufferSize]; |
| 345 int corrupt_data_len = deflate_encode_len_; | 353 int corrupt_data_len = deflate_encode_len_; |
| 346 memcpy(corrupt_data, deflate_encode_buffer_, deflate_encode_len_); | 354 memcpy(corrupt_data, deflate_encode_buffer_, deflate_encode_len_); |
| 347 | 355 |
| 348 int pos = corrupt_data_len / 2; | 356 int pos = corrupt_data_len / 2; |
| 349 corrupt_data[pos] = !corrupt_data[pos]; | 357 corrupt_data[pos] = !corrupt_data[pos]; |
| 350 | 358 |
| 351 // Decode the corrupted data with filter | 359 // Decode the corrupted data with filter |
| 352 std::vector<Filter::FilterType> filter_types; | 360 std::vector<Filter::FilterType> filter_types; |
| 353 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); | 361 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); |
| 354 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 362 MockFilterContext filter_context(kDefaultBufferSize); |
| 363 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 355 ASSERT_TRUE(filter.get()); | 364 ASSERT_TRUE(filter.get()); |
| 356 char corrupt_decode_buffer[kDefaultBufferSize]; | 365 char corrupt_decode_buffer[kDefaultBufferSize]; |
| 357 int corrupt_decode_size = kDefaultBufferSize; | 366 int corrupt_decode_size = kDefaultBufferSize; |
| 358 | 367 |
| 359 int code = DecodeAllWithFilter(filter.get(), corrupt_data, corrupt_data_len, | 368 int code = DecodeAllWithFilter(filter.get(), corrupt_data, corrupt_data_len, |
| 360 corrupt_decode_buffer, &corrupt_decode_size); | 369 corrupt_decode_buffer, &corrupt_decode_size); |
| 361 | 370 |
| 362 // Expect failures | 371 // Expect failures |
| 363 EXPECT_TRUE(code == Filter::FILTER_ERROR); | 372 EXPECT_TRUE(code == Filter::FILTER_ERROR); |
| 364 } | 373 } |
| 365 | 374 |
| 366 // Decoding deflate stream with missing data. | 375 // Decoding deflate stream with missing data. |
| 367 TEST_F(GZipUnitTest, DecodeMissingData) { | 376 TEST_F(GZipUnitTest, DecodeMissingData) { |
| 368 char corrupt_data[kDefaultBufferSize]; | 377 char corrupt_data[kDefaultBufferSize]; |
| 369 int corrupt_data_len = deflate_encode_len_; | 378 int corrupt_data_len = deflate_encode_len_; |
| 370 memcpy(corrupt_data, deflate_encode_buffer_, deflate_encode_len_); | 379 memcpy(corrupt_data, deflate_encode_buffer_, deflate_encode_len_); |
| 371 | 380 |
| 372 int pos = corrupt_data_len / 2; | 381 int pos = corrupt_data_len / 2; |
| 373 int len = corrupt_data_len - pos - 1; | 382 int len = corrupt_data_len - pos - 1; |
| 374 memmove(&corrupt_data[pos], &corrupt_data[pos+1], len); | 383 memmove(&corrupt_data[pos], &corrupt_data[pos+1], len); |
| 375 --corrupt_data_len; | 384 --corrupt_data_len; |
| 376 | 385 |
| 377 // Decode the corrupted data with filter | 386 // Decode the corrupted data with filter |
| 378 std::vector<Filter::FilterType> filter_types; | 387 std::vector<Filter::FilterType> filter_types; |
| 379 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); | 388 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); |
| 380 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 389 MockFilterContext filter_context(kDefaultBufferSize); |
| 390 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 381 ASSERT_TRUE(filter.get()); | 391 ASSERT_TRUE(filter.get()); |
| 382 char corrupt_decode_buffer[kDefaultBufferSize]; | 392 char corrupt_decode_buffer[kDefaultBufferSize]; |
| 383 int corrupt_decode_size = kDefaultBufferSize; | 393 int corrupt_decode_size = kDefaultBufferSize; |
| 384 | 394 |
| 385 int code = DecodeAllWithFilter(filter.get(), corrupt_data, corrupt_data_len, | 395 int code = DecodeAllWithFilter(filter.get(), corrupt_data, corrupt_data_len, |
| 386 corrupt_decode_buffer, &corrupt_decode_size); | 396 corrupt_decode_buffer, &corrupt_decode_size); |
| 387 | 397 |
| 388 // Expect failures | 398 // Expect failures |
| 389 EXPECT_EQ(Filter::FILTER_ERROR, code); | 399 EXPECT_EQ(Filter::FILTER_ERROR, code); |
| 390 } | 400 } |
| 391 | 401 |
| 392 // Decoding gzip stream with corrupted header. | 402 // Decoding gzip stream with corrupted header. |
| 393 TEST_F(GZipUnitTest, DecodeCorruptedHeader) { | 403 TEST_F(GZipUnitTest, DecodeCorruptedHeader) { |
| 394 char corrupt_data[kDefaultBufferSize]; | 404 char corrupt_data[kDefaultBufferSize]; |
| 395 int corrupt_data_len = gzip_encode_len_; | 405 int corrupt_data_len = gzip_encode_len_; |
| 396 memcpy(corrupt_data, gzip_encode_buffer_, gzip_encode_len_); | 406 memcpy(corrupt_data, gzip_encode_buffer_, gzip_encode_len_); |
| 397 | 407 |
| 398 corrupt_data[2] = !corrupt_data[2]; | 408 corrupt_data[2] = !corrupt_data[2]; |
| 399 | 409 |
| 400 // Decode the corrupted data with filter | 410 // Decode the corrupted data with filter |
| 401 std::vector<Filter::FilterType> filter_types; | 411 std::vector<Filter::FilterType> filter_types; |
| 402 filter_types.push_back(Filter::FILTER_TYPE_GZIP); | 412 filter_types.push_back(Filter::FILTER_TYPE_GZIP); |
| 403 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 413 MockFilterContext filter_context(kDefaultBufferSize); |
| 414 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); |
| 404 ASSERT_TRUE(filter.get()); | 415 ASSERT_TRUE(filter.get()); |
| 405 char corrupt_decode_buffer[kDefaultBufferSize]; | 416 char corrupt_decode_buffer[kDefaultBufferSize]; |
| 406 int corrupt_decode_size = kDefaultBufferSize; | 417 int corrupt_decode_size = kDefaultBufferSize; |
| 407 | 418 |
| 408 int code = DecodeAllWithFilter(filter.get(), corrupt_data, corrupt_data_len, | 419 int code = DecodeAllWithFilter(filter.get(), corrupt_data, corrupt_data_len, |
| 409 corrupt_decode_buffer, &corrupt_decode_size); | 420 corrupt_decode_buffer, &corrupt_decode_size); |
| 410 | 421 |
| 411 // Expect failures | 422 // Expect failures |
| 412 EXPECT_TRUE(code == Filter::FILTER_ERROR); | 423 EXPECT_TRUE(code == Filter::FILTER_ERROR); |
| 413 } | 424 } |
| 414 | 425 |
| 415 } // namespace | 426 } // namespace |
| OLD | NEW |