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" |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 int decode_avail_size = kDefaultBufferSize; | 167 int decode_avail_size = kDefaultBufferSize; |
168 | 168 |
169 const char* encode_next = encoded_source; | 169 const char* encode_next = encoded_source; |
170 int encode_avail_size = encoded_source_len; | 170 int encode_avail_size = encoded_source_len; |
171 | 171 |
172 int code = Filter::FILTER_OK; | 172 int code = Filter::FILTER_OK; |
173 while (code != Filter::FILTER_DONE) { | 173 while (code != Filter::FILTER_DONE) { |
174 int encode_data_len; | 174 int encode_data_len; |
175 encode_data_len = std::min(encode_avail_size, | 175 encode_data_len = std::min(encode_avail_size, |
176 filter->stream_buffer_size()); | 176 filter->stream_buffer_size()); |
177 memcpy(filter->stream_buffer(), encode_next, encode_data_len); | 177 memcpy(filter->stream_buffer()->data(), encode_next, encode_data_len); |
178 filter->FlushStreamBuffer(encode_data_len); | 178 filter->FlushStreamBuffer(encode_data_len); |
179 encode_next += encode_data_len; | 179 encode_next += encode_data_len; |
180 encode_avail_size -= encode_data_len; | 180 encode_avail_size -= encode_data_len; |
181 | 181 |
182 while (1) { | 182 while (1) { |
183 int decode_data_len = std::min(decode_avail_size, output_buffer_size); | 183 int decode_data_len = std::min(decode_avail_size, output_buffer_size); |
184 | 184 |
185 code = filter->ReadData(decode_next, &decode_data_len); | 185 code = filter->ReadData(decode_next, &decode_data_len); |
186 decode_next += decode_data_len; | 186 decode_next += decode_data_len; |
187 decode_avail_size -= decode_data_len; | 187 decode_avail_size -= decode_data_len; |
(...skipping 13 matching lines...) Expand all Loading... |
201 EXPECT_EQ(memcmp(source, decode_buffer, source_len), 0); | 201 EXPECT_EQ(memcmp(source, decode_buffer, source_len), 0); |
202 } | 202 } |
203 | 203 |
204 // Unsafe function to use filter to decode compressed data. | 204 // Unsafe function to use filter to decode compressed data. |
205 // Parameters: Source and source_len are compressed data and its size. | 205 // 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 | 206 // 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 | 207 // of the dest buffer. Upon exit, *dest_len is the number of chars written |
208 // into the buffer. | 208 // into the buffer. |
209 int DecodeAllWithFilter(Filter* filter, const char* source, int source_len, | 209 int DecodeAllWithFilter(Filter* filter, const char* source, int source_len, |
210 char* dest, int* dest_len) { | 210 char* dest, int* dest_len) { |
211 memcpy(filter->stream_buffer(), source, source_len); | 211 memcpy(filter->stream_buffer()->data(), source, source_len); |
212 filter->FlushStreamBuffer(source_len); | 212 filter->FlushStreamBuffer(source_len); |
213 return filter->ReadData(dest, dest_len); | 213 return filter->ReadData(dest, dest_len); |
214 } | 214 } |
215 | 215 |
216 const char* source_buffer() const { return source_buffer_.data(); } | 216 const char* source_buffer() const { return source_buffer_.data(); } |
217 int source_len() const { return static_cast<int>(source_buffer_.size()); } | 217 int source_len() const { return static_cast<int>(source_buffer_.size()); } |
218 | 218 |
219 std::string source_buffer_; | 219 std::string source_buffer_; |
220 | 220 |
221 char* deflate_encode_buffer_; | 221 char* deflate_encode_buffer_; |
222 int deflate_encode_len_; | 222 int deflate_encode_len_; |
223 | 223 |
224 char* gzip_encode_buffer_; | 224 char* gzip_encode_buffer_; |
225 int gzip_encode_len_; | 225 int gzip_encode_len_; |
226 }; | 226 }; |
227 | 227 |
228 // Basic scenario: decoding deflate data with big enough buffer. | 228 // Basic scenario: decoding deflate data with big enough buffer. |
229 TEST_F(GZipUnitTest, DecodeDeflate) { | 229 TEST_F(GZipUnitTest, DecodeDeflate) { |
230 // Decode the compressed data with filter | 230 // Decode the compressed data with filter |
231 std::vector<Filter::FilterType> filter_types; | 231 std::vector<Filter::FilterType> filter_types; |
232 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); | 232 filter_types.push_back(Filter::FILTER_TYPE_DEFLATE); |
233 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 233 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); |
234 ASSERT_TRUE(filter.get()); | 234 ASSERT_TRUE(filter.get()); |
235 memcpy(filter->stream_buffer(), deflate_encode_buffer_, deflate_encode_len_); | 235 memcpy(filter->stream_buffer()->data(), deflate_encode_buffer_, |
| 236 deflate_encode_len_); |
236 filter->FlushStreamBuffer(deflate_encode_len_); | 237 filter->FlushStreamBuffer(deflate_encode_len_); |
237 | 238 |
238 char deflate_decode_buffer[kDefaultBufferSize]; | 239 char deflate_decode_buffer[kDefaultBufferSize]; |
239 int deflate_decode_size = kDefaultBufferSize; | 240 int deflate_decode_size = kDefaultBufferSize; |
240 filter->ReadData(deflate_decode_buffer, &deflate_decode_size); | 241 filter->ReadData(deflate_decode_buffer, &deflate_decode_size); |
241 | 242 |
242 // Compare the decoding result with source data | 243 // Compare the decoding result with source data |
243 EXPECT_TRUE(deflate_decode_size == source_len()); | 244 EXPECT_TRUE(deflate_decode_size == source_len()); |
244 EXPECT_EQ(memcmp(source_buffer(), deflate_decode_buffer, source_len()), 0); | 245 EXPECT_EQ(memcmp(source_buffer(), deflate_decode_buffer, source_len()), 0); |
245 } | 246 } |
246 | 247 |
247 // Basic scenario: decoding gzip data with big enough buffer. | 248 // Basic scenario: decoding gzip data with big enough buffer. |
248 TEST_F(GZipUnitTest, DecodeGZip) { | 249 TEST_F(GZipUnitTest, DecodeGZip) { |
249 // Decode the compressed data with filter | 250 // Decode the compressed data with filter |
250 std::vector<Filter::FilterType> filter_types; | 251 std::vector<Filter::FilterType> filter_types; |
251 filter_types.push_back(Filter::FILTER_TYPE_GZIP); | 252 filter_types.push_back(Filter::FILTER_TYPE_GZIP); |
252 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 253 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); |
253 ASSERT_TRUE(filter.get()); | 254 ASSERT_TRUE(filter.get()); |
254 memcpy(filter->stream_buffer(), gzip_encode_buffer_, gzip_encode_len_); | 255 memcpy(filter->stream_buffer()->data(), gzip_encode_buffer_, |
| 256 gzip_encode_len_); |
255 filter->FlushStreamBuffer(gzip_encode_len_); | 257 filter->FlushStreamBuffer(gzip_encode_len_); |
256 | 258 |
257 char gzip_decode_buffer[kDefaultBufferSize]; | 259 char gzip_decode_buffer[kDefaultBufferSize]; |
258 int gzip_decode_size = kDefaultBufferSize; | 260 int gzip_decode_size = kDefaultBufferSize; |
259 filter->ReadData(gzip_decode_buffer, &gzip_decode_size); | 261 filter->ReadData(gzip_decode_buffer, &gzip_decode_size); |
260 | 262 |
261 // Compare the decoding result with source data | 263 // Compare the decoding result with source data |
262 EXPECT_TRUE(gzip_decode_size == source_len()); | 264 EXPECT_TRUE(gzip_decode_size == source_len()); |
263 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); | 265 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); |
264 } | 266 } |
265 | 267 |
266 // SDCH scenario: decoding gzip data when content type says sdch,gzip. | 268 // SDCH scenario: decoding gzip data when content type says sdch,gzip. |
267 // This tests that sdch will degrade to pass through, and is what allows robust | 269 // This tests that sdch will degrade to pass through, and is what allows robust |
268 // handling when the response *might* be sdch,gzip by simply adding in the | 270 // handling when the response *might* be sdch,gzip by simply adding in the |
269 // tentative sdch decode. | 271 // tentative sdch decode. |
270 // All test code is otherwise modeled after the "basic" scenario above. | 272 // All test code is otherwise modeled after the "basic" scenario above. |
271 TEST_F(GZipUnitTest, DecodeGZipWithMistakenSdch) { | 273 TEST_F(GZipUnitTest, DecodeGZipWithMistakenSdch) { |
272 // Decode the compressed data with filter | 274 // Decode the compressed data with filter |
273 std::vector<Filter::FilterType> filter_types; | 275 std::vector<Filter::FilterType> filter_types; |
274 filter_types.push_back(Filter::FILTER_TYPE_SDCH); | 276 filter_types.push_back(Filter::FILTER_TYPE_SDCH); |
275 filter_types.push_back(Filter::FILTER_TYPE_GZIP); | 277 filter_types.push_back(Filter::FILTER_TYPE_GZIP); |
276 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); | 278 scoped_ptr<Filter> filter(Filter::Factory(filter_types, kDefaultBufferSize)); |
277 ASSERT_TRUE(filter.get()); | 279 ASSERT_TRUE(filter.get()); |
278 memcpy(filter->stream_buffer(), gzip_encode_buffer_, gzip_encode_len_); | 280 memcpy(filter->stream_buffer()->data(), gzip_encode_buffer_, |
| 281 gzip_encode_len_); |
279 filter->FlushStreamBuffer(gzip_encode_len_); | 282 filter->FlushStreamBuffer(gzip_encode_len_); |
280 | 283 |
281 char gzip_decode_buffer[kDefaultBufferSize]; | 284 char gzip_decode_buffer[kDefaultBufferSize]; |
282 int gzip_decode_size = kDefaultBufferSize; | 285 int gzip_decode_size = kDefaultBufferSize; |
283 filter->ReadData(gzip_decode_buffer, &gzip_decode_size); | 286 filter->ReadData(gzip_decode_buffer, &gzip_decode_size); |
284 | 287 |
285 // Compare the decoding result with source data | 288 // Compare the decoding result with source data |
286 EXPECT_TRUE(gzip_decode_size == source_len()); | 289 EXPECT_TRUE(gzip_decode_size == source_len()); |
287 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); | 290 EXPECT_EQ(memcmp(source_buffer(), gzip_decode_buffer, source_len()), 0); |
288 } | 291 } |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 int corrupt_decode_size = kDefaultBufferSize; | 406 int corrupt_decode_size = kDefaultBufferSize; |
404 | 407 |
405 int code = DecodeAllWithFilter(filter.get(), corrupt_data, corrupt_data_len, | 408 int code = DecodeAllWithFilter(filter.get(), corrupt_data, corrupt_data_len, |
406 corrupt_decode_buffer, &corrupt_decode_size); | 409 corrupt_decode_buffer, &corrupt_decode_size); |
407 | 410 |
408 // Expect failures | 411 // Expect failures |
409 EXPECT_TRUE(code == Filter::FILTER_ERROR); | 412 EXPECT_TRUE(code == Filter::FILTER_ERROR); |
410 } | 413 } |
411 | 414 |
412 } // namespace | 415 } // namespace |
OLD | NEW |