| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <ostream> | 6 #include <ostream> |
| 7 | 7 |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 // +---+---+---+---+---+---+---+---+---+---+ | 26 // +---+---+---+---+---+---+---+---+---+---+ |
| 27 // ID1 \037 | 27 // ID1 \037 |
| 28 // ID2 \213 | 28 // ID2 \213 |
| 29 // CM \010 (compression method == DEFLATE) | 29 // CM \010 (compression method == DEFLATE) |
| 30 // FLG \000 (special flags that we do not support) | 30 // FLG \000 (special flags that we do not support) |
| 31 // MTIME Unix format modification time (0 means not available) | 31 // MTIME Unix format modification time (0 means not available) |
| 32 // XFL 2-4? DEFLATE flags | 32 // XFL 2-4? DEFLATE flags |
| 33 // OS ???? Operating system indicator (255 means unknown) | 33 // OS ???? Operating system indicator (255 means unknown) |
| 34 // | 34 // |
| 35 // Header value we generate: | 35 // Header value we generate: |
| 36 const char kGZipHeader[] = { '\037', '\213', '\010', '\000', '\000', | 36 const char kGZipHeader[] = {'\037', '\213', '\010', '\000', '\000', |
| 37 '\000', '\000', '\000', '\002', '\377' }; | 37 '\000', '\000', '\000', '\002', '\377'}; |
| 38 | 38 |
| 39 enum EncodeMode { | 39 enum EncodeMode { |
| 40 ENCODE_GZIP, // Wrap the deflate with a GZip header. | 40 ENCODE_GZIP, // Wrap the deflate with a GZip header. |
| 41 ENCODE_DEFLATE // Raw deflate. | 41 ENCODE_DEFLATE // Raw deflate. |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 } // namespace | 44 } // namespace |
| 45 | 45 |
| 46 namespace net { | 46 namespace net { |
| 47 | 47 |
| 48 // These tests use the path service, which uses autoreleased objects on the | 48 // These tests use the path service, which uses autoreleased objects on the |
| 49 // Mac, so this needs to be a PlatformTest. | 49 // Mac, so this needs to be a PlatformTest. |
| 50 class GZipUnitTest : public PlatformTest { | 50 class GZipUnitTest : public PlatformTest { |
| 51 protected: | 51 protected: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 64 file_path = file_path.AppendASCII("google.txt"); | 64 file_path = file_path.AppendASCII("google.txt"); |
| 65 | 65 |
| 66 // Read data from the file into buffer. | 66 // Read data from the file into buffer. |
| 67 ASSERT_TRUE(base::ReadFileToString(file_path, &source_buffer_)); | 67 ASSERT_TRUE(base::ReadFileToString(file_path, &source_buffer_)); |
| 68 | 68 |
| 69 // Encode the data with deflate | 69 // Encode the data with deflate |
| 70 deflate_encode_buffer_ = new char[kDefaultBufferSize]; | 70 deflate_encode_buffer_ = new char[kDefaultBufferSize]; |
| 71 ASSERT_TRUE(deflate_encode_buffer_ != NULL); | 71 ASSERT_TRUE(deflate_encode_buffer_ != NULL); |
| 72 | 72 |
| 73 deflate_encode_len_ = kDefaultBufferSize; | 73 deflate_encode_len_ = kDefaultBufferSize; |
| 74 int code = CompressAll(ENCODE_DEFLATE , source_buffer(), source_len(), | 74 int code = CompressAll(ENCODE_DEFLATE, |
| 75 deflate_encode_buffer_, &deflate_encode_len_); | 75 source_buffer(), |
| 76 source_len(), |
| 77 deflate_encode_buffer_, |
| 78 &deflate_encode_len_); |
| 76 ASSERT_TRUE(code == Z_STREAM_END); | 79 ASSERT_TRUE(code == Z_STREAM_END); |
| 77 ASSERT_GT(deflate_encode_len_, 0); | 80 ASSERT_GT(deflate_encode_len_, 0); |
| 78 ASSERT_TRUE(deflate_encode_len_ <= kDefaultBufferSize); | 81 ASSERT_TRUE(deflate_encode_len_ <= kDefaultBufferSize); |
| 79 | 82 |
| 80 // Encode the data with gzip | 83 // Encode the data with gzip |
| 81 gzip_encode_buffer_ = new char[kDefaultBufferSize]; | 84 gzip_encode_buffer_ = new char[kDefaultBufferSize]; |
| 82 ASSERT_TRUE(gzip_encode_buffer_ != NULL); | 85 ASSERT_TRUE(gzip_encode_buffer_ != NULL); |
| 83 | 86 |
| 84 gzip_encode_len_ = kDefaultBufferSize; | 87 gzip_encode_len_ = kDefaultBufferSize; |
| 85 code = CompressAll(ENCODE_GZIP, source_buffer(), source_len(), | 88 code = CompressAll(ENCODE_GZIP, |
| 86 gzip_encode_buffer_, &gzip_encode_len_); | 89 source_buffer(), |
| 90 source_len(), |
| 91 gzip_encode_buffer_, |
| 92 &gzip_encode_len_); |
| 87 ASSERT_TRUE(code == Z_STREAM_END); | 93 ASSERT_TRUE(code == Z_STREAM_END); |
| 88 ASSERT_GT(gzip_encode_len_, 0); | 94 ASSERT_GT(gzip_encode_len_, 0); |
| 89 ASSERT_TRUE(gzip_encode_len_ <= kDefaultBufferSize); | 95 ASSERT_TRUE(gzip_encode_len_ <= kDefaultBufferSize); |
| 90 } | 96 } |
| 91 | 97 |
| 92 virtual void TearDown() { | 98 virtual void TearDown() { |
| 93 delete[] deflate_encode_buffer_; | 99 delete[] deflate_encode_buffer_; |
| 94 deflate_encode_buffer_ = NULL; | 100 deflate_encode_buffer_ = NULL; |
| 95 | 101 |
| 96 delete[] gzip_encode_buffer_; | 102 delete[] gzip_encode_buffer_; |
| 97 gzip_encode_buffer_ = NULL; | 103 gzip_encode_buffer_ = NULL; |
| 98 | 104 |
| 99 PlatformTest::TearDown(); | 105 PlatformTest::TearDown(); |
| 100 } | 106 } |
| 101 | 107 |
| 102 // Compress the data in source with deflate encoding and write output to the | 108 // Compress the data in source with deflate encoding and write output to the |
| 103 // buffer provided by dest. The function returns Z_OK if success, and returns | 109 // buffer provided by dest. The function returns Z_OK if success, and returns |
| 104 // other zlib error code if fail. | 110 // other zlib error code if fail. |
| 105 // The parameter mode specifies the encoding mechanism. | 111 // The parameter mode specifies the encoding mechanism. |
| 106 // The dest buffer should be large enough to hold all the output data. | 112 // The dest buffer should be large enough to hold all the output data. |
| 107 int CompressAll(EncodeMode mode, const char* source, int source_size, | 113 int CompressAll(EncodeMode mode, |
| 108 char* dest, int* dest_len) { | 114 const char* source, |
| 115 int source_size, |
| 116 char* dest, |
| 117 int* dest_len) { |
| 109 z_stream zlib_stream; | 118 z_stream zlib_stream; |
| 110 memset(&zlib_stream, 0, sizeof(zlib_stream)); | 119 memset(&zlib_stream, 0, sizeof(zlib_stream)); |
| 111 int code; | 120 int code; |
| 112 | 121 |
| 113 // Initialize zlib | 122 // Initialize zlib |
| 114 if (mode == ENCODE_GZIP) { | 123 if (mode == ENCODE_GZIP) { |
| 115 code = deflateInit2(&zlib_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, | 124 code = deflateInit2(&zlib_stream, |
| 125 Z_DEFAULT_COMPRESSION, |
| 126 Z_DEFLATED, |
| 116 -MAX_WBITS, | 127 -MAX_WBITS, |
| 117 8, // DEF_MEM_LEVEL | 128 8, // DEF_MEM_LEVEL |
| 118 Z_DEFAULT_STRATEGY); | 129 Z_DEFAULT_STRATEGY); |
| 119 } else { | 130 } else { |
| 120 code = deflateInit(&zlib_stream, Z_DEFAULT_COMPRESSION); | 131 code = deflateInit(&zlib_stream, Z_DEFAULT_COMPRESSION); |
| 121 } | 132 } |
| 122 | 133 |
| 123 if (code != Z_OK) | 134 if (code != Z_OK) |
| 124 return code; | 135 return code; |
| 125 | 136 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 char decode_buffer[kDefaultBufferSize]; | 176 char decode_buffer[kDefaultBufferSize]; |
| 166 char* decode_next = decode_buffer; | 177 char* decode_next = decode_buffer; |
| 167 int decode_avail_size = kDefaultBufferSize; | 178 int decode_avail_size = kDefaultBufferSize; |
| 168 | 179 |
| 169 const char* encode_next = encoded_source; | 180 const char* encode_next = encoded_source; |
| 170 int encode_avail_size = encoded_source_len; | 181 int encode_avail_size = encoded_source_len; |
| 171 | 182 |
| 172 int code = Filter::FILTER_OK; | 183 int code = Filter::FILTER_OK; |
| 173 while (code != Filter::FILTER_DONE) { | 184 while (code != Filter::FILTER_DONE) { |
| 174 int encode_data_len; | 185 int encode_data_len; |
| 175 encode_data_len = std::min(encode_avail_size, | 186 encode_data_len = |
| 176 filter->stream_buffer_size()); | 187 std::min(encode_avail_size, filter->stream_buffer_size()); |
| 177 memcpy(filter->stream_buffer()->data(), encode_next, encode_data_len); | 188 memcpy(filter->stream_buffer()->data(), encode_next, encode_data_len); |
| 178 filter->FlushStreamBuffer(encode_data_len); | 189 filter->FlushStreamBuffer(encode_data_len); |
| 179 encode_next += encode_data_len; | 190 encode_next += encode_data_len; |
| 180 encode_avail_size -= encode_data_len; | 191 encode_avail_size -= encode_data_len; |
| 181 | 192 |
| 182 while (1) { | 193 while (1) { |
| 183 int decode_data_len = std::min(decode_avail_size, output_buffer_size); | 194 int decode_data_len = std::min(decode_avail_size, output_buffer_size); |
| 184 | 195 |
| 185 code = filter->ReadData(decode_next, &decode_data_len); | 196 code = filter->ReadData(decode_next, &decode_data_len); |
| 186 decode_next += decode_data_len; | 197 decode_next += decode_data_len; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 199 int decode_total_data_len = kDefaultBufferSize - decode_avail_size; | 210 int decode_total_data_len = kDefaultBufferSize - decode_avail_size; |
| 200 EXPECT_TRUE(decode_total_data_len == source_len); | 211 EXPECT_TRUE(decode_total_data_len == source_len); |
| 201 EXPECT_EQ(memcmp(source, decode_buffer, source_len), 0); | 212 EXPECT_EQ(memcmp(source, decode_buffer, source_len), 0); |
| 202 } | 213 } |
| 203 | 214 |
| 204 // Unsafe function to use filter to decode compressed data. | 215 // Unsafe function to use filter to decode compressed data. |
| 205 // Parameters: Source and source_len are compressed data and its size. | 216 // Parameters: Source and source_len are compressed data and its size. |
| 206 // Dest is the buffer for decoding results. Upon entry, *dest_len is the size | 217 // Dest is the buffer for decoding results. Upon entry, *dest_len is the size |
| 207 // of the dest buffer. Upon exit, *dest_len is the number of chars written | 218 // of the dest buffer. Upon exit, *dest_len is the number of chars written |
| 208 // into the buffer. | 219 // into the buffer. |
| 209 int DecodeAllWithFilter(Filter* filter, const char* source, int source_len, | 220 int DecodeAllWithFilter(Filter* filter, |
| 210 char* dest, int* dest_len) { | 221 const char* source, |
| 222 int source_len, |
| 223 char* dest, |
| 224 int* dest_len) { |
| 211 memcpy(filter->stream_buffer()->data(), source, source_len); | 225 memcpy(filter->stream_buffer()->data(), source, source_len); |
| 212 filter->FlushStreamBuffer(source_len); | 226 filter->FlushStreamBuffer(source_len); |
| 213 return filter->ReadData(dest, dest_len); | 227 return filter->ReadData(dest, dest_len); |
| 214 } | 228 } |
| 215 | 229 |
| 216 void InitFilter(Filter::FilterType type) { | 230 void InitFilter(Filter::FilterType type) { |
| 217 std::vector<Filter::FilterType> filter_types; | 231 std::vector<Filter::FilterType> filter_types; |
| 218 filter_types.push_back(type); | 232 filter_types.push_back(type); |
| 219 filter_.reset(Filter::Factory(filter_types, filter_context_)); | 233 filter_.reset(Filter::Factory(filter_types, filter_context_)); |
| 220 ASSERT_TRUE(filter_.get()); | 234 ASSERT_TRUE(filter_.get()); |
| 221 ASSERT_GE(filter_->stream_buffer_size(), kDefaultBufferSize); | 235 ASSERT_GE(filter_->stream_buffer_size(), kDefaultBufferSize); |
| 222 } | 236 } |
| 223 | 237 |
| 224 void InitFilterWithBufferSize(Filter::FilterType type, int buffer_size) { | 238 void InitFilterWithBufferSize(Filter::FilterType type, int buffer_size) { |
| 225 std::vector<Filter::FilterType> filter_types; | 239 std::vector<Filter::FilterType> filter_types; |
| 226 filter_types.push_back(type); | 240 filter_types.push_back(type); |
| 227 filter_.reset(Filter::FactoryForTests(filter_types, filter_context_, | 241 filter_.reset( |
| 228 buffer_size)); | 242 Filter::FactoryForTests(filter_types, filter_context_, buffer_size)); |
| 229 ASSERT_TRUE(filter_.get()); | 243 ASSERT_TRUE(filter_.get()); |
| 230 } | 244 } |
| 231 | 245 |
| 232 const char* source_buffer() const { return source_buffer_.data(); } | 246 const char* source_buffer() const { return source_buffer_.data(); } |
| 233 int source_len() const { return static_cast<int>(source_buffer_.size()); } | 247 int source_len() const { return static_cast<int>(source_buffer_.size()); } |
| 234 | 248 |
| 235 scoped_ptr<Filter> filter_; | 249 scoped_ptr<Filter> filter_; |
| 236 | 250 |
| 237 std::string source_buffer_; | 251 std::string source_buffer_; |
| 238 | 252 |
| 239 char* deflate_encode_buffer_; | 253 char* deflate_encode_buffer_; |
| 240 int deflate_encode_len_; | 254 int deflate_encode_len_; |
| 241 | 255 |
| 242 char* gzip_encode_buffer_; | 256 char* gzip_encode_buffer_; |
| 243 int gzip_encode_len_; | 257 int gzip_encode_len_; |
| 244 | 258 |
| 245 private: | 259 private: |
| 246 MockFilterContext filter_context_; | 260 MockFilterContext filter_context_; |
| 247 }; | 261 }; |
| 248 | 262 |
| 249 // Basic scenario: decoding deflate data with big enough buffer. | 263 // Basic scenario: decoding deflate data with big enough buffer. |
| 250 TEST_F(GZipUnitTest, DecodeDeflate) { | 264 TEST_F(GZipUnitTest, DecodeDeflate) { |
| 251 // Decode the compressed data with filter | 265 // Decode the compressed data with filter |
| 252 InitFilter(Filter::FILTER_TYPE_DEFLATE); | 266 InitFilter(Filter::FILTER_TYPE_DEFLATE); |
| 253 memcpy(filter_->stream_buffer()->data(), deflate_encode_buffer_, | 267 memcpy(filter_->stream_buffer()->data(), |
| 268 deflate_encode_buffer_, |
| 254 deflate_encode_len_); | 269 deflate_encode_len_); |
| 255 filter_->FlushStreamBuffer(deflate_encode_len_); | 270 filter_->FlushStreamBuffer(deflate_encode_len_); |
| 256 | 271 |
| 257 char deflate_decode_buffer[kDefaultBufferSize]; | 272 char deflate_decode_buffer[kDefaultBufferSize]; |
| 258 int deflate_decode_size = kDefaultBufferSize; | 273 int deflate_decode_size = kDefaultBufferSize; |
| 259 filter_->ReadData(deflate_decode_buffer, &deflate_decode_size); | 274 filter_->ReadData(deflate_decode_buffer, &deflate_decode_size); |
| 260 | 275 |
| 261 // Compare the decoding result with source data | 276 // Compare the decoding result with source data |
| 262 EXPECT_TRUE(deflate_decode_size == source_len()); | 277 EXPECT_TRUE(deflate_decode_size == source_len()); |
| 263 EXPECT_EQ(memcmp(source_buffer(), deflate_decode_buffer, source_len()), 0); | 278 EXPECT_EQ(memcmp(source_buffer(), deflate_decode_buffer, source_len()), 0); |
| 264 } | 279 } |
| 265 | 280 |
| 266 // Basic scenario: decoding gzip data with big enough buffer. | 281 // Basic scenario: decoding gzip data with big enough buffer. |
| 267 TEST_F(GZipUnitTest, DecodeGZip) { | 282 TEST_F(GZipUnitTest, DecodeGZip) { |
| 268 // Decode the compressed data with filter | 283 // Decode the compressed data with filter |
| 269 InitFilter(Filter::FILTER_TYPE_GZIP); | 284 InitFilter(Filter::FILTER_TYPE_GZIP); |
| 270 memcpy(filter_->stream_buffer()->data(), gzip_encode_buffer_, | 285 memcpy( |
| 271 gzip_encode_len_); | 286 filter_->stream_buffer()->data(), gzip_encode_buffer_, gzip_encode_len_); |
| 272 filter_->FlushStreamBuffer(gzip_encode_len_); | 287 filter_->FlushStreamBuffer(gzip_encode_len_); |
| 273 | 288 |
| 274 char gzip_decode_buffer[kDefaultBufferSize]; | 289 char gzip_decode_buffer[kDefaultBufferSize]; |
| 275 int gzip_decode_size = kDefaultBufferSize; | 290 int gzip_decode_size = kDefaultBufferSize; |
| 276 filter_->ReadData(gzip_decode_buffer, &gzip_decode_size); | 291 filter_->ReadData(gzip_decode_buffer, &gzip_decode_size); |
| 277 | 292 |
| 278 // Compare the decoding result with source data | 293 // Compare the decoding result with source data |
| 279 EXPECT_TRUE(gzip_decode_size == source_len()); | 294 EXPECT_TRUE(gzip_decode_size == source_len()); |
| 280 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); | 295 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); |
| 281 } | 296 } |
| 282 | 297 |
| 283 // Tests we can call filter repeatedly to get all the data decoded. | 298 // Tests we can call filter repeatedly to get all the data decoded. |
| 284 // To do that, we create a filter with a small buffer that can not hold all | 299 // To do that, we create a filter with a small buffer that can not hold all |
| 285 // the input data. | 300 // the input data. |
| 286 TEST_F(GZipUnitTest, DecodeWithSmallBuffer) { | 301 TEST_F(GZipUnitTest, DecodeWithSmallBuffer) { |
| 287 InitFilterWithBufferSize(Filter::FILTER_TYPE_DEFLATE, kSmallBufferSize); | 302 InitFilterWithBufferSize(Filter::FILTER_TYPE_DEFLATE, kSmallBufferSize); |
| 288 EXPECT_EQ(kSmallBufferSize, filter_->stream_buffer_size()); | 303 EXPECT_EQ(kSmallBufferSize, filter_->stream_buffer_size()); |
| 289 DecodeAndCompareWithFilter(filter_.get(), source_buffer(), source_len(), | 304 DecodeAndCompareWithFilter(filter_.get(), |
| 290 deflate_encode_buffer_, deflate_encode_len_, | 305 source_buffer(), |
| 306 source_len(), |
| 307 deflate_encode_buffer_, |
| 308 deflate_encode_len_, |
| 291 kDefaultBufferSize); | 309 kDefaultBufferSize); |
| 292 } | 310 } |
| 293 | 311 |
| 294 // Tests we can still decode with just 1 byte buffer in the filter. | 312 // Tests we can still decode with just 1 byte buffer in the filter. |
| 295 // The purpose of this tests are two: (1) Verify filter can parse partial GZip | 313 // The purpose of this tests are two: (1) Verify filter can parse partial GZip |
| 296 // header correctly. (2) Sometimes the filter will consume input without | 314 // header correctly. (2) Sometimes the filter will consume input without |
| 297 // generating output. Verify filter can handle it correctly. | 315 // generating output. Verify filter can handle it correctly. |
| 298 TEST_F(GZipUnitTest, DecodeWithOneByteBuffer) { | 316 TEST_F(GZipUnitTest, DecodeWithOneByteBuffer) { |
| 299 InitFilterWithBufferSize(Filter::FILTER_TYPE_GZIP, 1); | 317 InitFilterWithBufferSize(Filter::FILTER_TYPE_GZIP, 1); |
| 300 EXPECT_EQ(1, filter_->stream_buffer_size()); | 318 EXPECT_EQ(1, filter_->stream_buffer_size()); |
| 301 DecodeAndCompareWithFilter(filter_.get(), source_buffer(), source_len(), | 319 DecodeAndCompareWithFilter(filter_.get(), |
| 302 gzip_encode_buffer_, gzip_encode_len_, | 320 source_buffer(), |
| 321 source_len(), |
| 322 gzip_encode_buffer_, |
| 323 gzip_encode_len_, |
| 303 kDefaultBufferSize); | 324 kDefaultBufferSize); |
| 304 } | 325 } |
| 305 | 326 |
| 306 // Tests we can decode when caller has small buffer to read out from filter. | 327 // Tests we can decode when caller has small buffer to read out from filter. |
| 307 TEST_F(GZipUnitTest, DecodeWithSmallOutputBuffer) { | 328 TEST_F(GZipUnitTest, DecodeWithSmallOutputBuffer) { |
| 308 InitFilter(Filter::FILTER_TYPE_DEFLATE); | 329 InitFilter(Filter::FILTER_TYPE_DEFLATE); |
| 309 DecodeAndCompareWithFilter(filter_.get(), source_buffer(), source_len(), | 330 DecodeAndCompareWithFilter(filter_.get(), |
| 310 deflate_encode_buffer_, deflate_encode_len_, | 331 source_buffer(), |
| 332 source_len(), |
| 333 deflate_encode_buffer_, |
| 334 deflate_encode_len_, |
| 311 kSmallBufferSize); | 335 kSmallBufferSize); |
| 312 } | 336 } |
| 313 | 337 |
| 314 // 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 |
| 315 // byte buffer in the caller. | 339 // byte buffer in the caller. |
| 316 TEST_F(GZipUnitTest, DecodeWithOneByteInputAndOutputBuffer) { | 340 TEST_F(GZipUnitTest, DecodeWithOneByteInputAndOutputBuffer) { |
| 317 InitFilterWithBufferSize(Filter::FILTER_TYPE_GZIP, 1); | 341 InitFilterWithBufferSize(Filter::FILTER_TYPE_GZIP, 1); |
| 318 EXPECT_EQ(1, filter_->stream_buffer_size()); | 342 EXPECT_EQ(1, filter_->stream_buffer_size()); |
| 319 DecodeAndCompareWithFilter(filter_.get(), source_buffer(), source_len(), | 343 DecodeAndCompareWithFilter(filter_.get(), |
| 320 gzip_encode_buffer_, gzip_encode_len_, 1); | 344 source_buffer(), |
| 345 source_len(), |
| 346 gzip_encode_buffer_, |
| 347 gzip_encode_len_, |
| 348 1); |
| 321 } | 349 } |
| 322 | 350 |
| 323 // Decoding deflate stream with corrupted data. | 351 // Decoding deflate stream with corrupted data. |
| 324 TEST_F(GZipUnitTest, DecodeCorruptedData) { | 352 TEST_F(GZipUnitTest, DecodeCorruptedData) { |
| 325 char corrupt_data[kDefaultBufferSize]; | 353 char corrupt_data[kDefaultBufferSize]; |
| 326 int corrupt_data_len = deflate_encode_len_; | 354 int corrupt_data_len = deflate_encode_len_; |
| 327 memcpy(corrupt_data, deflate_encode_buffer_, deflate_encode_len_); | 355 memcpy(corrupt_data, deflate_encode_buffer_, deflate_encode_len_); |
| 328 | 356 |
| 329 int pos = corrupt_data_len / 2; | 357 int pos = corrupt_data_len / 2; |
| 330 corrupt_data[pos] = !corrupt_data[pos]; | 358 corrupt_data[pos] = !corrupt_data[pos]; |
| 331 | 359 |
| 332 // Decode the corrupted data with filter | 360 // Decode the corrupted data with filter |
| 333 InitFilter(Filter::FILTER_TYPE_DEFLATE); | 361 InitFilter(Filter::FILTER_TYPE_DEFLATE); |
| 334 char corrupt_decode_buffer[kDefaultBufferSize]; | 362 char corrupt_decode_buffer[kDefaultBufferSize]; |
| 335 int corrupt_decode_size = kDefaultBufferSize; | 363 int corrupt_decode_size = kDefaultBufferSize; |
| 336 | 364 |
| 337 int code = DecodeAllWithFilter(filter_.get(), corrupt_data, corrupt_data_len, | 365 int code = DecodeAllWithFilter(filter_.get(), |
| 338 corrupt_decode_buffer, &corrupt_decode_size); | 366 corrupt_data, |
| 367 corrupt_data_len, |
| 368 corrupt_decode_buffer, |
| 369 &corrupt_decode_size); |
| 339 | 370 |
| 340 // Expect failures | 371 // Expect failures |
| 341 EXPECT_TRUE(code == Filter::FILTER_ERROR); | 372 EXPECT_TRUE(code == Filter::FILTER_ERROR); |
| 342 } | 373 } |
| 343 | 374 |
| 344 // Decoding deflate stream with missing data. | 375 // Decoding deflate stream with missing data. |
| 345 TEST_F(GZipUnitTest, DecodeMissingData) { | 376 TEST_F(GZipUnitTest, DecodeMissingData) { |
| 346 char corrupt_data[kDefaultBufferSize]; | 377 char corrupt_data[kDefaultBufferSize]; |
| 347 int corrupt_data_len = deflate_encode_len_; | 378 int corrupt_data_len = deflate_encode_len_; |
| 348 memcpy(corrupt_data, deflate_encode_buffer_, deflate_encode_len_); | 379 memcpy(corrupt_data, deflate_encode_buffer_, deflate_encode_len_); |
| 349 | 380 |
| 350 int pos = corrupt_data_len / 2; | 381 int pos = corrupt_data_len / 2; |
| 351 int len = corrupt_data_len - pos - 1; | 382 int len = corrupt_data_len - pos - 1; |
| 352 memmove(&corrupt_data[pos], &corrupt_data[pos+1], len); | 383 memmove(&corrupt_data[pos], &corrupt_data[pos + 1], len); |
| 353 --corrupt_data_len; | 384 --corrupt_data_len; |
| 354 | 385 |
| 355 // Decode the corrupted data with filter | 386 // Decode the corrupted data with filter |
| 356 InitFilter(Filter::FILTER_TYPE_DEFLATE); | 387 InitFilter(Filter::FILTER_TYPE_DEFLATE); |
| 357 char corrupt_decode_buffer[kDefaultBufferSize]; | 388 char corrupt_decode_buffer[kDefaultBufferSize]; |
| 358 int corrupt_decode_size = kDefaultBufferSize; | 389 int corrupt_decode_size = kDefaultBufferSize; |
| 359 | 390 |
| 360 int code = DecodeAllWithFilter(filter_.get(), corrupt_data, corrupt_data_len, | 391 int code = DecodeAllWithFilter(filter_.get(), |
| 361 corrupt_decode_buffer, &corrupt_decode_size); | 392 corrupt_data, |
| 393 corrupt_data_len, |
| 394 corrupt_decode_buffer, |
| 395 &corrupt_decode_size); |
| 362 | 396 |
| 363 // Expect failures | 397 // Expect failures |
| 364 EXPECT_EQ(Filter::FILTER_ERROR, code); | 398 EXPECT_EQ(Filter::FILTER_ERROR, code); |
| 365 } | 399 } |
| 366 | 400 |
| 367 // Decoding gzip stream with corrupted header. | 401 // Decoding gzip stream with corrupted header. |
| 368 TEST_F(GZipUnitTest, DecodeCorruptedHeader) { | 402 TEST_F(GZipUnitTest, DecodeCorruptedHeader) { |
| 369 char corrupt_data[kDefaultBufferSize]; | 403 char corrupt_data[kDefaultBufferSize]; |
| 370 int corrupt_data_len = gzip_encode_len_; | 404 int corrupt_data_len = gzip_encode_len_; |
| 371 memcpy(corrupt_data, gzip_encode_buffer_, gzip_encode_len_); | 405 memcpy(corrupt_data, gzip_encode_buffer_, gzip_encode_len_); |
| 372 | 406 |
| 373 corrupt_data[2] = !corrupt_data[2]; | 407 corrupt_data[2] = !corrupt_data[2]; |
| 374 | 408 |
| 375 // Decode the corrupted data with filter | 409 // Decode the corrupted data with filter |
| 376 InitFilter(Filter::FILTER_TYPE_GZIP); | 410 InitFilter(Filter::FILTER_TYPE_GZIP); |
| 377 char corrupt_decode_buffer[kDefaultBufferSize]; | 411 char corrupt_decode_buffer[kDefaultBufferSize]; |
| 378 int corrupt_decode_size = kDefaultBufferSize; | 412 int corrupt_decode_size = kDefaultBufferSize; |
| 379 | 413 |
| 380 int code = DecodeAllWithFilter(filter_.get(), corrupt_data, corrupt_data_len, | 414 int code = DecodeAllWithFilter(filter_.get(), |
| 381 corrupt_decode_buffer, &corrupt_decode_size); | 415 corrupt_data, |
| 416 corrupt_data_len, |
| 417 corrupt_decode_buffer, |
| 418 &corrupt_decode_size); |
| 382 | 419 |
| 383 // Expect failures | 420 // Expect failures |
| 384 EXPECT_TRUE(code == Filter::FILTER_ERROR); | 421 EXPECT_TRUE(code == Filter::FILTER_ERROR); |
| 385 } | 422 } |
| 386 | 423 |
| 387 } // namespace net | 424 } // namespace net |
| OLD | NEW |