Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(891)

Side by Side Diff: net/base/gzip_filter_unittest.cc

Issue 40138: Use FilterContext to allow filters to access URLRequestJob data... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698