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

Side by Side Diff: net/filter/sdch_filter_unittest.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 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 <limits.h> 5 #include <limits.h>
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "net/base/io_buffer.h" 13 #include "net/base/io_buffer.h"
14 #include "net/filter/mock_filter_context.h" 14 #include "net/filter/mock_filter_context.h"
15 #include "net/filter/sdch_filter.h" 15 #include "net/filter/sdch_filter.h"
16 #include "net/url_request/url_request_http_job.h" 16 #include "net/url_request/url_request_http_job.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "third_party/zlib/zlib.h" 18 #include "third_party/zlib/zlib.h"
19 19
20 namespace net { 20 namespace net {
21 21
22 //------------------------------------------------------------------------------ 22 //------------------------------------------------------------------------------
23 // Provide sample data and compression results with a sample VCDIFF dictionary. 23 // Provide sample data and compression results with a sample VCDIFF dictionary.
24 // Note an SDCH dictionary has extra meta-data before the VCDIFF dictionary. 24 // Note an SDCH dictionary has extra meta-data before the VCDIFF dictionary.
25 static const char kTestVcdiffDictionary[] = "DictionaryFor" 25 static const char kTestVcdiffDictionary[] =
26 "DictionaryFor"
26 "SdchCompression1SdchCompression2SdchCompression3SdchCompression\n"; 27 "SdchCompression1SdchCompression2SdchCompression3SdchCompression\n";
27 // Pre-compression test data. Note that we pad with a lot of highly gzip 28 // Pre-compression test data. Note that we pad with a lot of highly gzip
28 // compressible content to help to exercise the chaining pipeline. That is why 29 // compressible content to help to exercise the chaining pipeline. That is why
29 // there are a PILE of zeros at the start and end. 30 // there are a PILE of zeros at the start and end.
30 // This will ensure that gzip compressed data can be fed to the chain in one 31 // This will ensure that gzip compressed data can be fed to the chain in one
31 // gulp, but (with careful selection of intermediate buffers) that it takes 32 // gulp, but (with careful selection of intermediate buffers) that it takes
32 // several sdch buffers worth of data to satisfy the sdch filter. See detailed 33 // several sdch buffers worth of data to satisfy the sdch filter. See detailed
33 // CHECK() calls in FilterChaining test for specifics. 34 // CHECK() calls in FilterChaining test for specifics.
34 static const char kTestData[] = "0000000000000000000000000000000000000000000000" 35 static const char kTestData[] =
36 "0000000000000000000000000000000000000000000000"
35 "0000000000000000000000000000TestData " 37 "0000000000000000000000000000TestData "
36 "SdchCompression1SdchCompression2SdchCompression3SdchCompression" 38 "SdchCompression1SdchCompression2SdchCompression3SdchCompression"
37 "00000000000000000000000000000000000000000000000000000000000000000000000000" 39 "00000000000000000000000000000000000000000000000000000000000000000000000000"
38 "000000000000000000000000000000000000000\n"; 40 "000000000000000000000000000000000000000\n";
39 41
40 // Note SDCH compressed data will include a reference to the SDCH dictionary. 42 // Note SDCH compressed data will include a reference to the SDCH dictionary.
41 static const char kSdchCompressedTestData[] = 43 static const char kSdchCompressedTestData[] =
42 "\326\303\304\0\0\001M\0\201S\202\004\0\201E\006\001" 44 "\326\303\304\0\0\001M\0\201S\202\004\0\201E\006\001"
43 "00000000000000000000000000000000000000000000000000000000000000000000000000" 45 "00000000000000000000000000000000000000000000000000000000000000000000000000"
44 "TestData 00000000000000000000000000000000000000000000000000000000000000000" 46 "TestData 00000000000000000000000000000000000000000000000000000000000000000"
45 "000000000000000000000000000000000000000000000000\n\001S\023\077\001r\r"; 47 "000000000000000000000000000000000000000000000000\n\001S\023\077\001r\r";
46 48
47 //------------------------------------------------------------------------------ 49 //------------------------------------------------------------------------------
48 50
49 class SdchFilterTest : public testing::Test { 51 class SdchFilterTest : public testing::Test {
50 protected: 52 protected:
51 SdchFilterTest() 53 SdchFilterTest()
52 : test_vcdiff_dictionary_(kTestVcdiffDictionary, 54 : test_vcdiff_dictionary_(kTestVcdiffDictionary,
53 sizeof(kTestVcdiffDictionary) - 1), 55 sizeof(kTestVcdiffDictionary) - 1),
54 vcdiff_compressed_data_(kSdchCompressedTestData, 56 vcdiff_compressed_data_(kSdchCompressedTestData,
55 sizeof(kSdchCompressedTestData) - 1), 57 sizeof(kSdchCompressedTestData) - 1),
56 expanded_(kTestData, sizeof(kTestData) - 1), 58 expanded_(kTestData, sizeof(kTestData) - 1),
57 sdch_manager_(new SdchManager) { 59 sdch_manager_(new SdchManager) {}
58 }
59 60
60 std::string NewSdchCompressedData(const std::string dictionary); 61 std::string NewSdchCompressedData(const std::string dictionary);
61 62
62 const std::string test_vcdiff_dictionary_; 63 const std::string test_vcdiff_dictionary_;
63 const std::string vcdiff_compressed_data_; 64 const std::string vcdiff_compressed_data_;
64 const std::string expanded_; // Desired final, decompressed data. 65 const std::string expanded_; // Desired final, decompressed data.
65 66
66 scoped_ptr<SdchManager> sdch_manager_; // A singleton database. 67 scoped_ptr<SdchManager> sdch_manager_; // A singleton database.
67 }; 68 };
68 69
69 std::string SdchFilterTest::NewSdchCompressedData( 70 std::string SdchFilterTest::NewSdchCompressedData(
70 const std::string dictionary) { 71 const std::string dictionary) {
71 std::string client_hash; 72 std::string client_hash;
72 std::string server_hash; 73 std::string server_hash;
73 SdchManager::GenerateHash(dictionary, &client_hash, &server_hash); 74 SdchManager::GenerateHash(dictionary, &client_hash, &server_hash);
74 75
75 // Build compressed data that refers to our dictionary. 76 // Build compressed data that refers to our dictionary.
76 std::string compressed(server_hash); 77 std::string compressed(server_hash);
77 compressed.append("\0", 1); 78 compressed.append("\0", 1);
78 compressed.append(vcdiff_compressed_data_); 79 compressed.append(vcdiff_compressed_data_);
79 return compressed; 80 return compressed;
80 } 81 }
81 82
82 //------------------------------------------------------------------------------ 83 //------------------------------------------------------------------------------
83 84
84
85 TEST_F(SdchFilterTest, Hashing) { 85 TEST_F(SdchFilterTest, Hashing) {
86 std::string client_hash, server_hash; 86 std::string client_hash, server_hash;
87 std::string dictionary("test contents"); 87 std::string dictionary("test contents");
88 SdchManager::GenerateHash(dictionary, &client_hash, &server_hash); 88 SdchManager::GenerateHash(dictionary, &client_hash, &server_hash);
89 89
90 EXPECT_EQ(client_hash, "lMQBjS3P"); 90 EXPECT_EQ(client_hash, "lMQBjS3P");
91 EXPECT_EQ(server_hash, "MyciMVll"); 91 EXPECT_EQ(server_hash, "MyciMVll");
92 } 92 }
93 93
94
95 //------------------------------------------------------------------------------ 94 //------------------------------------------------------------------------------
96 // Provide a generic helper function for trying to filter data. 95 // Provide a generic helper function for trying to filter data.
97 // This function repeatedly calls the filter to process data, until the entire 96 // This function repeatedly calls the filter to process data, until the entire
98 // source is consumed. The return value from the filter is appended to output. 97 // source is consumed. The return value from the filter is appended to output.
99 // This allows us to vary input and output block sizes in order to test for edge 98 // This allows us to vary input and output block sizes in order to test for edge
100 // effects (boundary effects?) during the filtering process. 99 // effects (boundary effects?) during the filtering process.
101 // This function provides data to the filter in blocks of no-more-than the 100 // This function provides data to the filter in blocks of no-more-than the
102 // specified input_block_length. It allows the filter to fill no more than 101 // specified input_block_length. It allows the filter to fill no more than
103 // output_buffer_length in any one call to proccess (a.k.a., Read) data, and 102 // output_buffer_length in any one call to proccess (a.k.a., Read) data, and
104 // concatenates all these little output blocks into the singular output string. 103 // concatenates all these little output blocks into the singular output string.
105 static bool FilterTestData(const std::string& source, 104 static bool FilterTestData(const std::string& source,
106 size_t input_block_length, 105 size_t input_block_length,
107 const size_t output_buffer_length, 106 const size_t output_buffer_length,
108 Filter* filter, std::string* output) { 107 Filter* filter,
108 std::string* output) {
109 CHECK_GT(input_block_length, 0u); 109 CHECK_GT(input_block_length, 0u);
110 Filter::FilterStatus status(Filter::FILTER_NEED_MORE_DATA); 110 Filter::FilterStatus status(Filter::FILTER_NEED_MORE_DATA);
111 size_t source_index = 0; 111 size_t source_index = 0;
112 scoped_ptr<char[]> output_buffer(new char[output_buffer_length]); 112 scoped_ptr<char[]> output_buffer(new char[output_buffer_length]);
113 size_t input_amount = std::min(input_block_length, 113 size_t input_amount = std::min(
114 static_cast<size_t>(filter->stream_buffer_size())); 114 input_block_length, static_cast<size_t>(filter->stream_buffer_size()));
115 115
116 do { 116 do {
117 int copy_amount = std::min(input_amount, source.size() - source_index); 117 int copy_amount = std::min(input_amount, source.size() - source_index);
118 if (copy_amount > 0 && status == Filter::FILTER_NEED_MORE_DATA) { 118 if (copy_amount > 0 && status == Filter::FILTER_NEED_MORE_DATA) {
119 memcpy(filter->stream_buffer()->data(), source.data() + source_index, 119 memcpy(filter->stream_buffer()->data(),
120 source.data() + source_index,
120 copy_amount); 121 copy_amount);
121 filter->FlushStreamBuffer(copy_amount); 122 filter->FlushStreamBuffer(copy_amount);
122 source_index += copy_amount; 123 source_index += copy_amount;
123 } 124 }
124 int buffer_length = output_buffer_length; 125 int buffer_length = output_buffer_length;
125 status = filter->ReadData(output_buffer.get(), &buffer_length); 126 status = filter->ReadData(output_buffer.get(), &buffer_length);
126 output->append(output_buffer.get(), buffer_length); 127 output->append(output_buffer.get(), buffer_length);
127 if (status == Filter::FILTER_ERROR) 128 if (status == Filter::FILTER_ERROR)
128 return false; 129 return false;
129 // Callers assume that FILTER_OK with no output buffer means FILTER_DONE. 130 // Callers assume that FILTER_OK with no output buffer means FILTER_DONE.
(...skipping 20 matching lines...) Expand all
150 151
151 TEST_F(SdchFilterTest, EmptyInputOk) { 152 TEST_F(SdchFilterTest, EmptyInputOk) {
152 std::vector<Filter::FilterType> filter_types; 153 std::vector<Filter::FilterType> filter_types;
153 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 154 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
154 char output_buffer[20]; 155 char output_buffer[20];
155 MockFilterContext filter_context; 156 MockFilterContext filter_context;
156 std::string url_string("http://ignore.com"); 157 std::string url_string("http://ignore.com");
157 filter_context.SetURL(GURL(url_string)); 158 filter_context.SetURL(GURL(url_string));
158 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 159 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
159 160
160
161 // With no input data, try to read output. 161 // With no input data, try to read output.
162 int output_bytes_or_buffer_size = sizeof(output_buffer); 162 int output_bytes_or_buffer_size = sizeof(output_buffer);
163 Filter::FilterStatus status = filter->ReadData(output_buffer, 163 Filter::FilterStatus status =
164 &output_bytes_or_buffer_size); 164 filter->ReadData(output_buffer, &output_bytes_or_buffer_size);
165 165
166 EXPECT_EQ(0, output_bytes_or_buffer_size); 166 EXPECT_EQ(0, output_bytes_or_buffer_size);
167 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, status); 167 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, status);
168 } 168 }
169 169
170 TEST_F(SdchFilterTest, PassThroughWhenTentative) { 170 TEST_F(SdchFilterTest, PassThroughWhenTentative) {
171 std::vector<Filter::FilterType> filter_types; 171 std::vector<Filter::FilterType> filter_types;
172 // Selective a tentative filter (which can fall back to pass through). 172 // Selective a tentative filter (which can fall back to pass through).
173 filter_types.push_back(Filter::FILTER_TYPE_GZIP_HELPING_SDCH); 173 filter_types.push_back(Filter::FILTER_TYPE_GZIP_HELPING_SDCH);
174 char output_buffer[20]; 174 char output_buffer[20];
175 MockFilterContext filter_context; 175 MockFilterContext filter_context;
176 // Response code needs to be 200 to allow a pass through. 176 // Response code needs to be 200 to allow a pass through.
177 filter_context.SetResponseCode(200); 177 filter_context.SetResponseCode(200);
178 std::string url_string("http://ignore.com"); 178 std::string url_string("http://ignore.com");
179 filter_context.SetURL(GURL(url_string)); 179 filter_context.SetURL(GURL(url_string));
180 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 180 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
181 181
182 // Supply enough data to force a pass-through mode.. 182 // Supply enough data to force a pass-through mode..
183 std::string non_gzip_content("not GZIPed data"); 183 std::string non_gzip_content("not GZIPed data");
184 184
185 char* input_buffer = filter->stream_buffer()->data(); 185 char* input_buffer = filter->stream_buffer()->data();
186 int input_buffer_size = filter->stream_buffer_size(); 186 int input_buffer_size = filter->stream_buffer_size();
187 187
188 EXPECT_LT(static_cast<int>(non_gzip_content.size()), 188 EXPECT_LT(static_cast<int>(non_gzip_content.size()), input_buffer_size);
189 input_buffer_size); 189 memcpy(input_buffer, non_gzip_content.data(), non_gzip_content.size());
190 memcpy(input_buffer, non_gzip_content.data(),
191 non_gzip_content.size());
192 filter->FlushStreamBuffer(non_gzip_content.size()); 190 filter->FlushStreamBuffer(non_gzip_content.size());
193 191
194 // Try to read output. 192 // Try to read output.
195 int output_bytes_or_buffer_size = sizeof(output_buffer); 193 int output_bytes_or_buffer_size = sizeof(output_buffer);
196 Filter::FilterStatus status = filter->ReadData(output_buffer, 194 Filter::FilterStatus status =
197 &output_bytes_or_buffer_size); 195 filter->ReadData(output_buffer, &output_bytes_or_buffer_size);
198 196
199 EXPECT_EQ(non_gzip_content.size(), 197 EXPECT_EQ(non_gzip_content.size(),
200 static_cast<size_t>(output_bytes_or_buffer_size)); 198 static_cast<size_t>(output_bytes_or_buffer_size));
201 ASSERT_GT(sizeof(output_buffer), 199 ASSERT_GT(sizeof(output_buffer),
202 static_cast<size_t>(output_bytes_or_buffer_size)); 200 static_cast<size_t>(output_bytes_or_buffer_size));
203 output_buffer[output_bytes_or_buffer_size] = '\0'; 201 output_buffer[output_bytes_or_buffer_size] = '\0';
204 EXPECT_TRUE(non_gzip_content == output_buffer); 202 EXPECT_TRUE(non_gzip_content == output_buffer);
205 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, status); 203 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, status);
206 } 204 }
207 205
208 TEST_F(SdchFilterTest, RefreshBadReturnCode) { 206 TEST_F(SdchFilterTest, RefreshBadReturnCode) {
209 std::vector<Filter::FilterType> filter_types; 207 std::vector<Filter::FilterType> filter_types;
210 // Selective a tentative filter (which can fall back to pass through). 208 // Selective a tentative filter (which can fall back to pass through).
211 filter_types.push_back(Filter::FILTER_TYPE_SDCH_POSSIBLE); 209 filter_types.push_back(Filter::FILTER_TYPE_SDCH_POSSIBLE);
212 char output_buffer[20]; 210 char output_buffer[20];
213 MockFilterContext filter_context; 211 MockFilterContext filter_context;
214 // Response code needs to be 200 to allow a pass through. 212 // Response code needs to be 200 to allow a pass through.
215 filter_context.SetResponseCode(403); 213 filter_context.SetResponseCode(403);
216 // Meta refresh will only appear for html content 214 // Meta refresh will only appear for html content
217 filter_context.SetMimeType("text/html"); 215 filter_context.SetMimeType("text/html");
218 std::string url_string("http://ignore.com"); 216 std::string url_string("http://ignore.com");
219 filter_context.SetURL(GURL(url_string)); 217 filter_context.SetURL(GURL(url_string));
220 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 218 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
221 219
222 // Supply enough data to force a pass-through mode, which means we have 220 // Supply enough data to force a pass-through mode, which means we have
223 // provided more than 9 characters that can't be a dictionary hash. 221 // provided more than 9 characters that can't be a dictionary hash.
224 std::string non_sdch_content("This is not SDCH"); 222 std::string non_sdch_content("This is not SDCH");
225 223
226 char* input_buffer = filter->stream_buffer()->data(); 224 char* input_buffer = filter->stream_buffer()->data();
227 int input_buffer_size = filter->stream_buffer_size(); 225 int input_buffer_size = filter->stream_buffer_size();
228 226
229 EXPECT_LT(static_cast<int>(non_sdch_content.size()), 227 EXPECT_LT(static_cast<int>(non_sdch_content.size()), input_buffer_size);
230 input_buffer_size); 228 memcpy(input_buffer, non_sdch_content.data(), non_sdch_content.size());
231 memcpy(input_buffer, non_sdch_content.data(),
232 non_sdch_content.size());
233 filter->FlushStreamBuffer(non_sdch_content.size()); 229 filter->FlushStreamBuffer(non_sdch_content.size());
234 230
235 // Try to read output. 231 // Try to read output.
236 int output_bytes_or_buffer_size = sizeof(output_buffer); 232 int output_bytes_or_buffer_size = sizeof(output_buffer);
237 Filter::FilterStatus status = filter->ReadData(output_buffer, 233 Filter::FilterStatus status =
238 &output_bytes_or_buffer_size); 234 filter->ReadData(output_buffer, &output_bytes_or_buffer_size);
239 235
240 // We should have read a long and complicated meta-refresh request. 236 // We should have read a long and complicated meta-refresh request.
241 EXPECT_TRUE(sizeof(output_buffer) == output_bytes_or_buffer_size); 237 EXPECT_TRUE(sizeof(output_buffer) == output_bytes_or_buffer_size);
242 // Check at least the prefix of the return. 238 // Check at least the prefix of the return.
243 EXPECT_EQ(0, strncmp(output_buffer, 239 EXPECT_EQ(0,
244 "<head><META HTTP-EQUIV=\"Refresh\" CONTENT=\"0\"></head>", 240 strncmp(output_buffer,
245 sizeof(output_buffer))); 241 "<head><META HTTP-EQUIV=\"Refresh\" CONTENT=\"0\"></head>",
242 sizeof(output_buffer)));
246 EXPECT_EQ(Filter::FILTER_OK, status); 243 EXPECT_EQ(Filter::FILTER_OK, status);
247 } 244 }
248 245
249 TEST_F(SdchFilterTest, ErrorOnBadReturnCode) { 246 TEST_F(SdchFilterTest, ErrorOnBadReturnCode) {
250 std::vector<Filter::FilterType> filter_types; 247 std::vector<Filter::FilterType> filter_types;
251 // Selective a tentative filter (which can fall back to pass through). 248 // Selective a tentative filter (which can fall back to pass through).
252 filter_types.push_back(Filter::FILTER_TYPE_SDCH_POSSIBLE); 249 filter_types.push_back(Filter::FILTER_TYPE_SDCH_POSSIBLE);
253 char output_buffer[20]; 250 char output_buffer[20];
254 MockFilterContext filter_context; 251 MockFilterContext filter_context;
255 // Response code needs to be 200 to allow a pass through. 252 // Response code needs to be 200 to allow a pass through.
256 filter_context.SetResponseCode(403); 253 filter_context.SetResponseCode(403);
257 // Meta refresh will only appear for html content, so set to something else 254 // Meta refresh will only appear for html content, so set to something else
258 // to induce an error (we can't meta refresh). 255 // to induce an error (we can't meta refresh).
259 filter_context.SetMimeType("anything"); 256 filter_context.SetMimeType("anything");
260 std::string url_string("http://ignore.com"); 257 std::string url_string("http://ignore.com");
261 filter_context.SetURL(GURL(url_string)); 258 filter_context.SetURL(GURL(url_string));
262 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 259 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
263 260
264 // Supply enough data to force a pass-through mode, which means we have 261 // Supply enough data to force a pass-through mode, which means we have
265 // provided more than 9 characters that can't be a dictionary hash. 262 // provided more than 9 characters that can't be a dictionary hash.
266 std::string non_sdch_content("This is not SDCH"); 263 std::string non_sdch_content("This is not SDCH");
267 264
268 char* input_buffer = filter->stream_buffer()->data(); 265 char* input_buffer = filter->stream_buffer()->data();
269 int input_buffer_size = filter->stream_buffer_size(); 266 int input_buffer_size = filter->stream_buffer_size();
270 267
271 EXPECT_LT(static_cast<int>(non_sdch_content.size()), 268 EXPECT_LT(static_cast<int>(non_sdch_content.size()), input_buffer_size);
272 input_buffer_size); 269 memcpy(input_buffer, non_sdch_content.data(), non_sdch_content.size());
273 memcpy(input_buffer, non_sdch_content.data(),
274 non_sdch_content.size());
275 filter->FlushStreamBuffer(non_sdch_content.size()); 270 filter->FlushStreamBuffer(non_sdch_content.size());
276 271
277 // Try to read output. 272 // Try to read output.
278 int output_bytes_or_buffer_size = sizeof(output_buffer); 273 int output_bytes_or_buffer_size = sizeof(output_buffer);
279 Filter::FilterStatus status = filter->ReadData(output_buffer, 274 Filter::FilterStatus status =
280 &output_bytes_or_buffer_size); 275 filter->ReadData(output_buffer, &output_bytes_or_buffer_size);
281 276
282 EXPECT_EQ(0, output_bytes_or_buffer_size); 277 EXPECT_EQ(0, output_bytes_or_buffer_size);
283 EXPECT_EQ(Filter::FILTER_ERROR, status); 278 EXPECT_EQ(Filter::FILTER_ERROR, status);
284 } 279 }
285 280
286 TEST_F(SdchFilterTest, ErrorOnBadReturnCodeWithHtml) { 281 TEST_F(SdchFilterTest, ErrorOnBadReturnCodeWithHtml) {
287 std::vector<Filter::FilterType> filter_types; 282 std::vector<Filter::FilterType> filter_types;
288 // Selective a tentative filter (which can fall back to pass through). 283 // Selective a tentative filter (which can fall back to pass through).
289 filter_types.push_back(Filter::FILTER_TYPE_SDCH_POSSIBLE); 284 filter_types.push_back(Filter::FILTER_TYPE_SDCH_POSSIBLE);
290 char output_buffer[20]; 285 char output_buffer[20];
291 MockFilterContext filter_context; 286 MockFilterContext filter_context;
292 // Response code needs to be 200 to allow a pass through. 287 // Response code needs to be 200 to allow a pass through.
293 filter_context.SetResponseCode(403); 288 filter_context.SetResponseCode(403);
294 // Meta refresh will only appear for html content 289 // Meta refresh will only appear for html content
295 filter_context.SetMimeType("text/html"); 290 filter_context.SetMimeType("text/html");
296 std::string url_string("http://ignore.com"); 291 std::string url_string("http://ignore.com");
297 filter_context.SetURL(GURL(url_string)); 292 filter_context.SetURL(GURL(url_string));
298 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 293 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
299 294
300 // Supply enough data to force a pass-through mode, which means we have 295 // Supply enough data to force a pass-through mode, which means we have
301 // provided more than 9 characters that can't be a dictionary hash. 296 // provided more than 9 characters that can't be a dictionary hash.
302 std::string non_sdch_content("This is not SDCH"); 297 std::string non_sdch_content("This is not SDCH");
303 298
304 char* input_buffer = filter->stream_buffer()->data(); 299 char* input_buffer = filter->stream_buffer()->data();
305 int input_buffer_size = filter->stream_buffer_size(); 300 int input_buffer_size = filter->stream_buffer_size();
306 301
307 EXPECT_LT(static_cast<int>(non_sdch_content.size()), 302 EXPECT_LT(static_cast<int>(non_sdch_content.size()), input_buffer_size);
308 input_buffer_size); 303 memcpy(input_buffer, non_sdch_content.data(), non_sdch_content.size());
309 memcpy(input_buffer, non_sdch_content.data(),
310 non_sdch_content.size());
311 filter->FlushStreamBuffer(non_sdch_content.size()); 304 filter->FlushStreamBuffer(non_sdch_content.size());
312 305
313 // Try to read output. 306 // Try to read output.
314 int output_bytes_or_buffer_size = sizeof(output_buffer); 307 int output_bytes_or_buffer_size = sizeof(output_buffer);
315 Filter::FilterStatus status = filter->ReadData(output_buffer, 308 Filter::FilterStatus status =
316 &output_bytes_or_buffer_size); 309 filter->ReadData(output_buffer, &output_bytes_or_buffer_size);
317 310
318 // We should have read a long and complicated meta-refresh request. 311 // We should have read a long and complicated meta-refresh request.
319 EXPECT_EQ(sizeof(output_buffer), 312 EXPECT_EQ(sizeof(output_buffer),
320 static_cast<size_t>(output_bytes_or_buffer_size)); 313 static_cast<size_t>(output_bytes_or_buffer_size));
321 // Check at least the prefix of the return. 314 // Check at least the prefix of the return.
322 EXPECT_EQ(0, strncmp(output_buffer, 315 EXPECT_EQ(0,
323 "<head><META HTTP-EQUIV=\"Refresh\" CONTENT=\"0\"></head>", 316 strncmp(output_buffer,
324 sizeof(output_buffer))); 317 "<head><META HTTP-EQUIV=\"Refresh\" CONTENT=\"0\"></head>",
318 sizeof(output_buffer)));
325 EXPECT_EQ(Filter::FILTER_OK, status); 319 EXPECT_EQ(Filter::FILTER_OK, status);
326 } 320 }
327 321
328 TEST_F(SdchFilterTest, BasicBadDictionary) { 322 TEST_F(SdchFilterTest, BasicBadDictionary) {
329 std::vector<Filter::FilterType> filter_types; 323 std::vector<Filter::FilterType> filter_types;
330 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 324 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
331 char output_buffer[20]; 325 char output_buffer[20];
332 MockFilterContext filter_context; 326 MockFilterContext filter_context;
333 std::string url_string("http://ignore.com"); 327 std::string url_string("http://ignore.com");
334 filter_context.SetURL(GURL(url_string)); 328 filter_context.SetURL(GURL(url_string));
335 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 329 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
336 330
337 // Supply bogus data (which doesn't yet specify a full dictionary hash). 331 // Supply bogus data (which doesn't yet specify a full dictionary hash).
338 // Dictionary hash is 8 characters followed by a null. 332 // Dictionary hash is 8 characters followed by a null.
339 std::string dictionary_hash_prefix("123"); 333 std::string dictionary_hash_prefix("123");
340 334
341 char* input_buffer = filter->stream_buffer()->data(); 335 char* input_buffer = filter->stream_buffer()->data();
342 int input_buffer_size = filter->stream_buffer_size(); 336 int input_buffer_size = filter->stream_buffer_size();
343 337
344 EXPECT_LT(static_cast<int>(dictionary_hash_prefix.size()), 338 EXPECT_LT(static_cast<int>(dictionary_hash_prefix.size()), input_buffer_size);
345 input_buffer_size); 339 memcpy(input_buffer,
346 memcpy(input_buffer, dictionary_hash_prefix.data(), 340 dictionary_hash_prefix.data(),
347 dictionary_hash_prefix.size()); 341 dictionary_hash_prefix.size());
348 filter->FlushStreamBuffer(dictionary_hash_prefix.size()); 342 filter->FlushStreamBuffer(dictionary_hash_prefix.size());
349 343
350 // With less than a dictionary specifier, try to read output. 344 // With less than a dictionary specifier, try to read output.
351 int output_bytes_or_buffer_size = sizeof(output_buffer); 345 int output_bytes_or_buffer_size = sizeof(output_buffer);
352 Filter::FilterStatus status = filter->ReadData(output_buffer, 346 Filter::FilterStatus status =
353 &output_bytes_or_buffer_size); 347 filter->ReadData(output_buffer, &output_bytes_or_buffer_size);
354 348
355 EXPECT_EQ(0, output_bytes_or_buffer_size); 349 EXPECT_EQ(0, output_bytes_or_buffer_size);
356 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, status); 350 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, status);
357 351
358 // Provide enough data to complete *a* hash, but it is bogus, and not in our 352 // Provide enough data to complete *a* hash, but it is bogus, and not in our
359 // list of dictionaries, so the filter should error out immediately. 353 // list of dictionaries, so the filter should error out immediately.
360 std::string dictionary_hash_postfix("4abcd\0", 6); 354 std::string dictionary_hash_postfix("4abcd\0", 6);
361 355
362 CHECK_LT(dictionary_hash_postfix.size(), 356 CHECK_LT(dictionary_hash_postfix.size(),
363 static_cast<size_t>(input_buffer_size)); 357 static_cast<size_t>(input_buffer_size));
364 memcpy(input_buffer, dictionary_hash_postfix.data(), 358 memcpy(input_buffer,
359 dictionary_hash_postfix.data(),
365 dictionary_hash_postfix.size()); 360 dictionary_hash_postfix.size());
366 filter->FlushStreamBuffer(dictionary_hash_postfix.size()); 361 filter->FlushStreamBuffer(dictionary_hash_postfix.size());
367 362
368 // With a non-existant dictionary specifier, try to read output. 363 // With a non-existant dictionary specifier, try to read output.
369 output_bytes_or_buffer_size = sizeof(output_buffer); 364 output_bytes_or_buffer_size = sizeof(output_buffer);
370 status = filter->ReadData(output_buffer, &output_bytes_or_buffer_size); 365 status = filter->ReadData(output_buffer, &output_bytes_or_buffer_size);
371 366
372 EXPECT_EQ(0, output_bytes_or_buffer_size); 367 EXPECT_EQ(0, output_bytes_or_buffer_size);
373 EXPECT_EQ(Filter::FILTER_ERROR, status); 368 EXPECT_EQ(Filter::FILTER_ERROR, status);
374 369
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 410 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
416 411
417 MockFilterContext filter_context; 412 MockFilterContext filter_context;
418 filter_context.SetURL(url); 413 filter_context.SetURL(url);
419 414
420 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 415 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
421 416
422 size_t feed_block_size = 100; 417 size_t feed_block_size = 100;
423 size_t output_block_size = 100; 418 size_t output_block_size = 100;
424 std::string output; 419 std::string output;
425 EXPECT_TRUE(FilterTestData(compressed, feed_block_size, output_block_size, 420 EXPECT_TRUE(FilterTestData(
426 filter.get(), &output)); 421 compressed, feed_block_size, output_block_size, filter.get(), &output));
427 EXPECT_EQ(output, expanded_); 422 EXPECT_EQ(output, expanded_);
428 423
429 // Decode with really small buffers (size 1) to check for edge effects. 424 // Decode with really small buffers (size 1) to check for edge effects.
430 filter.reset(Filter::Factory(filter_types, filter_context)); 425 filter.reset(Filter::Factory(filter_types, filter_context));
431 426
432 feed_block_size = 1; 427 feed_block_size = 1;
433 output_block_size = 1; 428 output_block_size = 1;
434 output.clear(); 429 output.clear();
435 EXPECT_TRUE(FilterTestData(compressed, feed_block_size, output_block_size, 430 EXPECT_TRUE(FilterTestData(
436 filter.get(), &output)); 431 compressed, feed_block_size, output_block_size, filter.get(), &output));
437 EXPECT_EQ(output, expanded_); 432 EXPECT_EQ(output, expanded_);
438 } 433 }
439 434
440 TEST_F(SdchFilterTest, NoDecodeHttps) { 435 TEST_F(SdchFilterTest, NoDecodeHttps) {
441 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 436 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
442 const std::string kSampleDomain = "sdchtest.com"; 437 const std::string kSampleDomain = "sdchtest.com";
443 std::string dictionary(NewSdchDictionary(kSampleDomain)); 438 std::string dictionary(NewSdchDictionary(kSampleDomain));
444 439
445 std::string url_string = "http://" + kSampleDomain; 440 std::string url_string = "http://" + kSampleDomain;
446 441
447 GURL url(url_string); 442 GURL url(url_string);
448 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 443 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
449 444
450 std::string compressed(NewSdchCompressedData(dictionary)); 445 std::string compressed(NewSdchCompressedData(dictionary));
451 446
452 std::vector<Filter::FilterType> filter_types; 447 std::vector<Filter::FilterType> filter_types;
453 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 448 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
454 449
455 MockFilterContext filter_context; 450 MockFilterContext filter_context;
456 filter_context.SetURL(GURL("https://" + kSampleDomain)); 451 filter_context.SetURL(GURL("https://" + kSampleDomain));
457 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 452 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
458 453
459 const size_t feed_block_size(100); 454 const size_t feed_block_size(100);
460 const size_t output_block_size(100); 455 const size_t output_block_size(100);
461 std::string output; 456 std::string output;
462 457
463 EXPECT_FALSE(FilterTestData(compressed, feed_block_size, output_block_size, 458 EXPECT_FALSE(FilterTestData(
464 filter.get(), &output)); 459 compressed, feed_block_size, output_block_size, filter.get(), &output));
465 } 460 }
466 461
467 // Current failsafe TODO/hack refuses to decode any content that doesn't use 462 // Current failsafe TODO/hack refuses to decode any content that doesn't use
468 // http as the scheme (see use of DICTIONARY_SELECTED_FOR_NON_HTTP). 463 // http as the scheme (see use of DICTIONARY_SELECTED_FOR_NON_HTTP).
469 // The following tests this blockage. Note that blacklisting results, so we 464 // The following tests this blockage. Note that blacklisting results, so we
470 // we need separate tests for each of these. 465 // we need separate tests for each of these.
471 TEST_F(SdchFilterTest, NoDecodeFtp) { 466 TEST_F(SdchFilterTest, NoDecodeFtp) {
472 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 467 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
473 const std::string kSampleDomain = "sdchtest.com"; 468 const std::string kSampleDomain = "sdchtest.com";
474 std::string dictionary(NewSdchDictionary(kSampleDomain)); 469 std::string dictionary(NewSdchDictionary(kSampleDomain));
475 470
476 std::string url_string = "http://" + kSampleDomain; 471 std::string url_string = "http://" + kSampleDomain;
477 472
478 GURL url(url_string); 473 GURL url(url_string);
479 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 474 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
480 475
481 std::string compressed(NewSdchCompressedData(dictionary)); 476 std::string compressed(NewSdchCompressedData(dictionary));
482 477
483 std::vector<Filter::FilterType> filter_types; 478 std::vector<Filter::FilterType> filter_types;
484 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 479 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
485 480
486 MockFilterContext filter_context; 481 MockFilterContext filter_context;
487 filter_context.SetURL(GURL("ftp://" + kSampleDomain)); 482 filter_context.SetURL(GURL("ftp://" + kSampleDomain));
488 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 483 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
489 484
490 const size_t feed_block_size(100); 485 const size_t feed_block_size(100);
491 const size_t output_block_size(100); 486 const size_t output_block_size(100);
492 std::string output; 487 std::string output;
493 488
494 EXPECT_FALSE(FilterTestData(compressed, feed_block_size, output_block_size, 489 EXPECT_FALSE(FilterTestData(
495 filter.get(), &output)); 490 compressed, feed_block_size, output_block_size, filter.get(), &output));
496 } 491 }
497 492
498 TEST_F(SdchFilterTest, NoDecodeFileColon) { 493 TEST_F(SdchFilterTest, NoDecodeFileColon) {
499 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 494 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
500 const std::string kSampleDomain = "sdchtest.com"; 495 const std::string kSampleDomain = "sdchtest.com";
501 std::string dictionary(NewSdchDictionary(kSampleDomain)); 496 std::string dictionary(NewSdchDictionary(kSampleDomain));
502 497
503 std::string url_string = "http://" + kSampleDomain; 498 std::string url_string = "http://" + kSampleDomain;
504 499
505 GURL url(url_string); 500 GURL url(url_string);
506 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 501 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
507 502
508 std::string compressed(NewSdchCompressedData(dictionary)); 503 std::string compressed(NewSdchCompressedData(dictionary));
509 504
510 std::vector<Filter::FilterType> filter_types; 505 std::vector<Filter::FilterType> filter_types;
511 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 506 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
512 507
513 MockFilterContext filter_context; 508 MockFilterContext filter_context;
514 filter_context.SetURL(GURL("file://" + kSampleDomain)); 509 filter_context.SetURL(GURL("file://" + kSampleDomain));
515 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 510 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
516 511
517 const size_t feed_block_size(100); 512 const size_t feed_block_size(100);
518 const size_t output_block_size(100); 513 const size_t output_block_size(100);
519 std::string output; 514 std::string output;
520 515
521 EXPECT_FALSE(FilterTestData(compressed, feed_block_size, output_block_size, 516 EXPECT_FALSE(FilterTestData(
522 filter.get(), &output)); 517 compressed, feed_block_size, output_block_size, filter.get(), &output));
523 } 518 }
524 519
525 TEST_F(SdchFilterTest, NoDecodeAboutColon) { 520 TEST_F(SdchFilterTest, NoDecodeAboutColon) {
526 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 521 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
527 const std::string kSampleDomain = "sdchtest.com"; 522 const std::string kSampleDomain = "sdchtest.com";
528 std::string dictionary(NewSdchDictionary(kSampleDomain)); 523 std::string dictionary(NewSdchDictionary(kSampleDomain));
529 524
530 std::string url_string = "http://" + kSampleDomain; 525 std::string url_string = "http://" + kSampleDomain;
531 526
532 GURL url(url_string); 527 GURL url(url_string);
533 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 528 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
534 529
535 std::string compressed(NewSdchCompressedData(dictionary)); 530 std::string compressed(NewSdchCompressedData(dictionary));
536 531
537 std::vector<Filter::FilterType> filter_types; 532 std::vector<Filter::FilterType> filter_types;
538 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 533 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
539 534
540 MockFilterContext filter_context; 535 MockFilterContext filter_context;
541 filter_context.SetURL(GURL("about://" + kSampleDomain)); 536 filter_context.SetURL(GURL("about://" + kSampleDomain));
542 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 537 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
543 538
544 const size_t feed_block_size(100); 539 const size_t feed_block_size(100);
545 const size_t output_block_size(100); 540 const size_t output_block_size(100);
546 std::string output; 541 std::string output;
547 542
548 EXPECT_FALSE(FilterTestData(compressed, feed_block_size, output_block_size, 543 EXPECT_FALSE(FilterTestData(
549 filter.get(), &output)); 544 compressed, feed_block_size, output_block_size, filter.get(), &output));
550 } 545 }
551 546
552 TEST_F(SdchFilterTest, NoDecodeJavaScript) { 547 TEST_F(SdchFilterTest, NoDecodeJavaScript) {
553 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 548 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
554 const std::string kSampleDomain = "sdchtest.com"; 549 const std::string kSampleDomain = "sdchtest.com";
555 std::string dictionary(NewSdchDictionary(kSampleDomain)); 550 std::string dictionary(NewSdchDictionary(kSampleDomain));
556 551
557 std::string url_string = "http://" + kSampleDomain; 552 std::string url_string = "http://" + kSampleDomain;
558 553
559 GURL url(url_string); 554 GURL url(url_string);
560 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 555 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
561 556
562 std::string compressed(NewSdchCompressedData(dictionary)); 557 std::string compressed(NewSdchCompressedData(dictionary));
563 558
564 std::vector<Filter::FilterType> filter_types; 559 std::vector<Filter::FilterType> filter_types;
565 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 560 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
566 561
567 MockFilterContext filter_context; 562 MockFilterContext filter_context;
568 filter_context.SetURL(GURL("javascript://" + kSampleDomain)); 563 filter_context.SetURL(GURL("javascript://" + kSampleDomain));
569 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 564 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
570 565
571 const size_t feed_block_size(100); 566 const size_t feed_block_size(100);
572 const size_t output_block_size(100); 567 const size_t output_block_size(100);
573 std::string output; 568 std::string output;
574 569
575 EXPECT_FALSE(FilterTestData(compressed, feed_block_size, output_block_size, 570 EXPECT_FALSE(FilterTestData(
576 filter.get(), &output)); 571 compressed, feed_block_size, output_block_size, filter.get(), &output));
577 } 572 }
578 573
579 TEST_F(SdchFilterTest, CanStillDecodeHttp) { 574 TEST_F(SdchFilterTest, CanStillDecodeHttp) {
580 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 575 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
581 const std::string kSampleDomain = "sdchtest.com"; 576 const std::string kSampleDomain = "sdchtest.com";
582 std::string dictionary(NewSdchDictionary(kSampleDomain)); 577 std::string dictionary(NewSdchDictionary(kSampleDomain));
583 578
584 std::string url_string = "http://" + kSampleDomain; 579 std::string url_string = "http://" + kSampleDomain;
585 580
586 GURL url(url_string); 581 GURL url(url_string);
587 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 582 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
588 583
589 std::string compressed(NewSdchCompressedData(dictionary)); 584 std::string compressed(NewSdchCompressedData(dictionary));
590 585
591 std::vector<Filter::FilterType> filter_types; 586 std::vector<Filter::FilterType> filter_types;
592 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 587 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
593 588
594 MockFilterContext filter_context; 589 MockFilterContext filter_context;
595 filter_context.SetURL(GURL("http://" + kSampleDomain)); 590 filter_context.SetURL(GURL("http://" + kSampleDomain));
596 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 591 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
597 592
598 const size_t feed_block_size(100); 593 const size_t feed_block_size(100);
599 const size_t output_block_size(100); 594 const size_t output_block_size(100);
600 std::string output; 595 std::string output;
601 596
602 EXPECT_TRUE(FilterTestData(compressed, feed_block_size, output_block_size, 597 EXPECT_TRUE(FilterTestData(
603 filter.get(), &output)); 598 compressed, feed_block_size, output_block_size, filter.get(), &output));
604 } 599 }
605 600
606 TEST_F(SdchFilterTest, CrossDomainDictionaryUse) { 601 TEST_F(SdchFilterTest, CrossDomainDictionaryUse) {
607 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 602 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
608 const std::string kSampleDomain = "sdchtest.com"; 603 const std::string kSampleDomain = "sdchtest.com";
609 std::string dictionary(NewSdchDictionary(kSampleDomain)); 604 std::string dictionary(NewSdchDictionary(kSampleDomain));
610 605
611 std::string url_string = "http://" + kSampleDomain; 606 std::string url_string = "http://" + kSampleDomain;
612 607
613 GURL url(url_string); 608 GURL url(url_string);
614 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 609 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
615 610
616 std::string compressed(NewSdchCompressedData(dictionary)); 611 std::string compressed(NewSdchCompressedData(dictionary));
617 612
618 std::vector<Filter::FilterType> filter_types; 613 std::vector<Filter::FilterType> filter_types;
619 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 614 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
620 615
621 // Decode with content arriving from the "wrong" domain. 616 // Decode with content arriving from the "wrong" domain.
622 // This tests SdchManager::CanSet(). 617 // This tests SdchManager::CanSet().
623 MockFilterContext filter_context; 618 MockFilterContext filter_context;
624 GURL wrong_domain_url("http://www.wrongdomain.com"); 619 GURL wrong_domain_url("http://www.wrongdomain.com");
625 filter_context.SetURL(wrong_domain_url); 620 filter_context.SetURL(wrong_domain_url);
626 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 621 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
627 622
628 size_t feed_block_size = 100; 623 size_t feed_block_size = 100;
629 size_t output_block_size = 100; 624 size_t output_block_size = 100;
630 std::string output; 625 std::string output;
631 EXPECT_FALSE(FilterTestData(compressed, feed_block_size, output_block_size, 626 EXPECT_FALSE(FilterTestData(
632 filter.get(), &output)); 627 compressed, feed_block_size, output_block_size, filter.get(), &output));
633 EXPECT_EQ(output.size(), 0u); // No output written. 628 EXPECT_EQ(output.size(), 0u); // No output written.
634 629
635 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string))); 630 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string)));
636 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(wrong_domain_url)); 631 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(wrong_domain_url));
637 SdchManager::ClearBlacklistings(); 632 SdchManager::ClearBlacklistings();
638 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(wrong_domain_url)); 633 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(wrong_domain_url));
639 } 634 }
640 635
641 TEST_F(SdchFilterTest, DictionaryPathValidation) { 636 TEST_F(SdchFilterTest, DictionaryPathValidation) {
642 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 637 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
(...skipping 18 matching lines...) Expand all
661 656
662 // Test decode the path data, arriving from a valid path. 657 // Test decode the path data, arriving from a valid path.
663 MockFilterContext filter_context; 658 MockFilterContext filter_context;
664 filter_context.SetURL(GURL(url_string + path)); 659 filter_context.SetURL(GURL(url_string + path));
665 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 660 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
666 661
667 size_t feed_block_size = 100; 662 size_t feed_block_size = 100;
668 size_t output_block_size = 100; 663 size_t output_block_size = 100;
669 std::string output; 664 std::string output;
670 665
671 EXPECT_TRUE(FilterTestData(compressed_for_path, feed_block_size, 666 EXPECT_TRUE(FilterTestData(compressed_for_path,
672 output_block_size, filter.get(), &output)); 667 feed_block_size,
668 output_block_size,
669 filter.get(),
670 &output));
673 EXPECT_EQ(output, expanded_); 671 EXPECT_EQ(output, expanded_);
674 672
675 // Test decode the path data, arriving from a invalid path. 673 // Test decode the path data, arriving from a invalid path.
676 filter_context.SetURL(GURL(url_string)); 674 filter_context.SetURL(GURL(url_string));
677 filter.reset(Filter::Factory(filter_types, filter_context)); 675 filter.reset(Filter::Factory(filter_types, filter_context));
678 676
679 feed_block_size = 100; 677 feed_block_size = 100;
680 output_block_size = 100; 678 output_block_size = 100;
681 output.clear(); 679 output.clear();
682 EXPECT_FALSE(FilterTestData(compressed_for_path, feed_block_size, 680 EXPECT_FALSE(FilterTestData(compressed_for_path,
683 output_block_size, filter.get(), &output)); 681 feed_block_size,
682 output_block_size,
683 filter.get(),
684 &output));
684 EXPECT_EQ(output.size(), 0u); // No output written. 685 EXPECT_EQ(output.size(), 0u); // No output written.
685 686
686 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string))); 687 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string)));
687 SdchManager::ClearBlacklistings(); 688 SdchManager::ClearBlacklistings();
688 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string))); 689 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string)));
689 } 690 }
690 691
691 TEST_F(SdchFilterTest, DictionaryPortValidation) { 692 TEST_F(SdchFilterTest, DictionaryPortValidation) {
692 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 693 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
693 const std::string kSampleDomain = "sdchtest.com"; 694 const std::string kSampleDomain = "sdchtest.com";
694 std::string dictionary(NewSdchDictionary(kSampleDomain)); 695 std::string dictionary(NewSdchDictionary(kSampleDomain));
695 696
696 std::string url_string = "http://" + kSampleDomain; 697 std::string url_string = "http://" + kSampleDomain;
697 698
698 GURL url(url_string); 699 GURL url(url_string);
699 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 700 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
700 701
701
702 // Create a dictionary with a port restriction, by prefixing old dictionary. 702 // Create a dictionary with a port restriction, by prefixing old dictionary.
703 const std::string port("502"); 703 const std::string port("502");
704 std::string dictionary_with_port("Port: " + port + "\n"); 704 std::string dictionary_with_port("Port: " + port + "\n");
705 dictionary_with_port.append("Port: 80\n"); // Add default port. 705 dictionary_with_port.append("Port: 80\n"); // Add default port.
706 dictionary_with_port.append(dictionary); 706 dictionary_with_port.append(dictionary);
707 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_with_port, 707 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary_with_port,
708 GURL(url_string + ":" + port))); 708 GURL(url_string + ":" + port)));
709 709
710 std::string compressed_for_port(NewSdchCompressedData(dictionary_with_port)); 710 std::string compressed_for_port(NewSdchCompressedData(dictionary_with_port));
711 711
712 std::vector<Filter::FilterType> filter_types; 712 std::vector<Filter::FilterType> filter_types;
713 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 713 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
714 714
715 // Test decode the port data, arriving from a valid port. 715 // Test decode the port data, arriving from a valid port.
716 MockFilterContext filter_context; 716 MockFilterContext filter_context;
717 filter_context.SetURL(GURL(url_string + ":" + port)); 717 filter_context.SetURL(GURL(url_string + ":" + port));
718 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 718 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
719 719
720 size_t feed_block_size = 100; 720 size_t feed_block_size = 100;
721 size_t output_block_size = 100; 721 size_t output_block_size = 100;
722 std::string output; 722 std::string output;
723 EXPECT_TRUE(FilterTestData(compressed_for_port, feed_block_size, 723 EXPECT_TRUE(FilterTestData(compressed_for_port,
724 output_block_size, filter.get(), &output)); 724 feed_block_size,
725 output_block_size,
726 filter.get(),
727 &output));
725 EXPECT_EQ(output, expanded_); 728 EXPECT_EQ(output, expanded_);
726 729
727 // Test decode the port data, arriving from a valid (default) port. 730 // Test decode the port data, arriving from a valid (default) port.
728 filter_context.SetURL(GURL(url_string)); // Default port. 731 filter_context.SetURL(GURL(url_string)); // Default port.
729 filter.reset(Filter::Factory(filter_types, filter_context)); 732 filter.reset(Filter::Factory(filter_types, filter_context));
730 733
731 feed_block_size = 100; 734 feed_block_size = 100;
732 output_block_size = 100; 735 output_block_size = 100;
733 output.clear(); 736 output.clear();
734 EXPECT_TRUE(FilterTestData(compressed_for_port, feed_block_size, 737 EXPECT_TRUE(FilterTestData(compressed_for_port,
735 output_block_size, filter.get(), &output)); 738 feed_block_size,
739 output_block_size,
740 filter.get(),
741 &output));
736 EXPECT_EQ(output, expanded_); 742 EXPECT_EQ(output, expanded_);
737 743
738 // Test decode the port data, arriving from a invalid port. 744 // Test decode the port data, arriving from a invalid port.
739 filter_context.SetURL(GURL(url_string + ":" + port + "1")); 745 filter_context.SetURL(GURL(url_string + ":" + port + "1"));
740 filter.reset(Filter::Factory(filter_types, filter_context)); 746 filter.reset(Filter::Factory(filter_types, filter_context));
741 747
742 feed_block_size = 100; 748 feed_block_size = 100;
743 output_block_size = 100; 749 output_block_size = 100;
744 output.clear(); 750 output.clear();
745 EXPECT_FALSE(FilterTestData(compressed_for_port, feed_block_size, 751 EXPECT_FALSE(FilterTestData(compressed_for_port,
746 output_block_size, filter.get(), &output)); 752 feed_block_size,
753 output_block_size,
754 filter.get(),
755 &output));
747 EXPECT_EQ(output.size(), 0u); // No output written. 756 EXPECT_EQ(output.size(), 0u); // No output written.
748 757
749 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string))); 758 EXPECT_FALSE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string)));
750 SdchManager::ClearBlacklistings(); 759 SdchManager::ClearBlacklistings();
751 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string))); 760 EXPECT_TRUE(SdchManager::Global()->IsInSupportedDomain(GURL(url_string)));
752 } 761 }
753 762
754 //------------------------------------------------------------------------------ 763 //------------------------------------------------------------------------------
755 // Helper function to perform gzip compression of data. 764 // Helper function to perform gzip compression of data.
756 765
757 static std::string gzip_compress(const std::string &input) { 766 static std::string gzip_compress(const std::string& input) {
758 z_stream zlib_stream; 767 z_stream zlib_stream;
759 memset(&zlib_stream, 0, sizeof(zlib_stream)); 768 memset(&zlib_stream, 0, sizeof(zlib_stream));
760 int code; 769 int code;
761 770
762 // Initialize zlib 771 // Initialize zlib
763 code = deflateInit2(&zlib_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 772 code = deflateInit2(&zlib_stream,
773 Z_DEFAULT_COMPRESSION,
774 Z_DEFLATED,
764 -MAX_WBITS, 775 -MAX_WBITS,
765 8, // DEF_MEM_LEVEL 776 8, // DEF_MEM_LEVEL
766 Z_DEFAULT_STRATEGY); 777 Z_DEFAULT_STRATEGY);
767 778
768 CHECK_EQ(Z_OK, code); 779 CHECK_EQ(Z_OK, code);
769 780
770 // Fill in zlib control block 781 // Fill in zlib control block
771 zlib_stream.next_in = bit_cast<Bytef*>(input.data()); 782 zlib_stream.next_in = bit_cast<Bytef*>(input.data());
772 zlib_stream.avail_in = input.size(); 783 zlib_stream.avail_in = input.size();
773 784
774 // Assume we can compress into similar buffer (add 100 bytes to be sure). 785 // Assume we can compress into similar buffer (add 100 bytes to be sure).
775 size_t gzip_compressed_length = zlib_stream.avail_in + 100; 786 size_t gzip_compressed_length = zlib_stream.avail_in + 100;
776 scoped_ptr<char[]> gzip_compressed(new char[gzip_compressed_length]); 787 scoped_ptr<char[]> gzip_compressed(new char[gzip_compressed_length]);
777 zlib_stream.next_out = bit_cast<Bytef*>(gzip_compressed.get()); 788 zlib_stream.next_out = bit_cast<Bytef*>(gzip_compressed.get());
778 zlib_stream.avail_out = gzip_compressed_length; 789 zlib_stream.avail_out = gzip_compressed_length;
779 790
780 // The GZIP header (see RFC 1952): 791 // The GZIP header (see RFC 1952):
781 // +---+---+---+---+---+---+---+---+---+---+ 792 // +---+---+---+---+---+---+---+---+---+---+
782 // |ID1|ID2|CM |FLG| MTIME |XFL|OS | 793 // |ID1|ID2|CM |FLG| MTIME |XFL|OS |
783 // +---+---+---+---+---+---+---+---+---+---+ 794 // +---+---+---+---+---+---+---+---+---+---+
784 // ID1 \037 795 // ID1 \037
785 // ID2 \213 796 // ID2 \213
786 // CM \010 (compression method == DEFLATE) 797 // CM \010 (compression method == DEFLATE)
787 // FLG \000 (special flags that we do not support) 798 // FLG \000 (special flags that we do not support)
788 // MTIME Unix format modification time (0 means not available) 799 // MTIME Unix format modification time (0 means not available)
789 // XFL 2-4? DEFLATE flags 800 // XFL 2-4? DEFLATE flags
790 // OS ???? Operating system indicator (255 means unknown) 801 // OS ???? Operating system indicator (255 means unknown)
791 // 802 //
792 // Header value we generate: 803 // Header value we generate:
793 const char kGZipHeader[] = { '\037', '\213', '\010', '\000', '\000', 804 const char kGZipHeader[] = {'\037', '\213', '\010', '\000', '\000',
794 '\000', '\000', '\000', '\002', '\377' }; 805 '\000', '\000', '\000', '\002', '\377'};
795 CHECK_GT(zlib_stream.avail_out, sizeof(kGZipHeader)); 806 CHECK_GT(zlib_stream.avail_out, sizeof(kGZipHeader));
796 memcpy(zlib_stream.next_out, kGZipHeader, sizeof(kGZipHeader)); 807 memcpy(zlib_stream.next_out, kGZipHeader, sizeof(kGZipHeader));
797 zlib_stream.next_out += sizeof(kGZipHeader); 808 zlib_stream.next_out += sizeof(kGZipHeader);
798 zlib_stream.avail_out -= sizeof(kGZipHeader); 809 zlib_stream.avail_out -= sizeof(kGZipHeader);
799 810
800 // Do deflate 811 // Do deflate
801 code = deflate(&zlib_stream, Z_FINISH); 812 code = deflate(&zlib_stream, Z_FINISH);
802 gzip_compressed_length -= zlib_stream.avail_out; 813 gzip_compressed_length -= zlib_stream.avail_out;
803 std::string compressed(gzip_compressed.get(), gzip_compressed_length); 814 std::string compressed(gzip_compressed.get(), gzip_compressed_length);
804 deflateEnd(&zlib_stream); 815 deflateEnd(&zlib_stream);
805 return compressed; 816 return compressed;
806 } 817 }
807 818
808 //------------------------------------------------------------------------------ 819 //------------------------------------------------------------------------------
809 820
810 class SdchFilterChainingTest { 821 class SdchFilterChainingTest {
811 public: 822 public:
812 static Filter* Factory(const std::vector<Filter::FilterType>& types, 823 static Filter* Factory(const std::vector<Filter::FilterType>& types,
813 const FilterContext& context, int size) { 824 const FilterContext& context,
825 int size) {
814 return Filter::FactoryForTests(types, context, size); 826 return Filter::FactoryForTests(types, context, size);
815 } 827 }
816 }; 828 };
817 829
818 // Test that filters can be cascaded (chained) so that the output of one filter 830 // Test that filters can be cascaded (chained) so that the output of one filter
819 // is processed by the next one. This is most critical for SDCH, which is 831 // is processed by the next one. This is most critical for SDCH, which is
820 // routinely followed by gzip (during encoding). The filter we'll test for will 832 // routinely followed by gzip (during encoding). The filter we'll test for will
821 // do the gzip decoding first, and then decode the SDCH content. 833 // do the gzip decoding first, and then decode the SDCH content.
822 TEST_F(SdchFilterTest, FilterChaining) { 834 TEST_F(SdchFilterTest, FilterChaining) {
823 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 835 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
(...skipping 15 matching lines...) Expand all
839 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 851 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
840 filter_types.push_back(Filter::FILTER_TYPE_GZIP); 852 filter_types.push_back(Filter::FILTER_TYPE_GZIP);
841 853
842 // First try with a large buffer (larger than test input, or compressed data). 854 // First try with a large buffer (larger than test input, or compressed data).
843 const size_t kLargeInputBufferSize(1000); // Used internally in filters. 855 const size_t kLargeInputBufferSize(1000); // Used internally in filters.
844 CHECK_GT(kLargeInputBufferSize, gzip_compressed_sdch.size()); 856 CHECK_GT(kLargeInputBufferSize, gzip_compressed_sdch.size());
845 CHECK_GT(kLargeInputBufferSize, sdch_compressed.size()); 857 CHECK_GT(kLargeInputBufferSize, sdch_compressed.size());
846 CHECK_GT(kLargeInputBufferSize, expanded_.size()); 858 CHECK_GT(kLargeInputBufferSize, expanded_.size());
847 MockFilterContext filter_context; 859 MockFilterContext filter_context;
848 filter_context.SetURL(url); 860 filter_context.SetURL(url);
849 scoped_ptr<Filter> filter( 861 scoped_ptr<Filter> filter(SdchFilterChainingTest::Factory(
850 SdchFilterChainingTest::Factory(filter_types, filter_context, 862 filter_types, filter_context, kLargeInputBufferSize));
851 kLargeInputBufferSize));
852 EXPECT_EQ(static_cast<int>(kLargeInputBufferSize), 863 EXPECT_EQ(static_cast<int>(kLargeInputBufferSize),
853 filter->stream_buffer_size()); 864 filter->stream_buffer_size());
854 865
855 // Verify that chained filter is waiting for data. 866 // Verify that chained filter is waiting for data.
856 char tiny_output_buffer[10]; 867 char tiny_output_buffer[10];
857 int tiny_output_size = sizeof(tiny_output_buffer); 868 int tiny_output_size = sizeof(tiny_output_buffer);
858 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, 869 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA,
859 filter->ReadData(tiny_output_buffer, &tiny_output_size)); 870 filter->ReadData(tiny_output_buffer, &tiny_output_size));
860 871
861 // Make chain process all data. 872 // Make chain process all data.
862 size_t feed_block_size = kLargeInputBufferSize; 873 size_t feed_block_size = kLargeInputBufferSize;
863 size_t output_block_size = kLargeInputBufferSize; 874 size_t output_block_size = kLargeInputBufferSize;
864 std::string output; 875 std::string output;
865 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 876 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
866 output_block_size, filter.get(), &output)); 877 feed_block_size,
878 output_block_size,
879 filter.get(),
880 &output));
867 EXPECT_EQ(output, expanded_); 881 EXPECT_EQ(output, expanded_);
868 882
869 // Next try with a mid-sized internal buffer size. 883 // Next try with a mid-sized internal buffer size.
870 const size_t kMidSizedInputBufferSize(100); 884 const size_t kMidSizedInputBufferSize(100);
871 // Buffer should be big enough to swallow whole gzip content. 885 // Buffer should be big enough to swallow whole gzip content.
872 CHECK_GT(kMidSizedInputBufferSize, gzip_compressed_sdch.size()); 886 CHECK_GT(kMidSizedInputBufferSize, gzip_compressed_sdch.size());
873 // Buffer should be small enough that entire SDCH content can't fit. 887 // Buffer should be small enough that entire SDCH content can't fit.
874 // We'll go even further, and force the chain to flush the buffer between the 888 // We'll go even further, and force the chain to flush the buffer between the
875 // two filters more than once (that is why we multiply by 2). 889 // two filters more than once (that is why we multiply by 2).
876 CHECK_LT(kMidSizedInputBufferSize * 2, sdch_compressed.size()); 890 CHECK_LT(kMidSizedInputBufferSize * 2, sdch_compressed.size());
877 filter_context.SetURL(url); 891 filter_context.SetURL(url);
878 filter.reset( 892 filter.reset(SdchFilterChainingTest::Factory(
879 SdchFilterChainingTest::Factory(filter_types, filter_context, 893 filter_types, filter_context, kMidSizedInputBufferSize));
880 kMidSizedInputBufferSize));
881 EXPECT_EQ(static_cast<int>(kMidSizedInputBufferSize), 894 EXPECT_EQ(static_cast<int>(kMidSizedInputBufferSize),
882 filter->stream_buffer_size()); 895 filter->stream_buffer_size());
883 896
884 feed_block_size = kMidSizedInputBufferSize; 897 feed_block_size = kMidSizedInputBufferSize;
885 output_block_size = kMidSizedInputBufferSize; 898 output_block_size = kMidSizedInputBufferSize;
886 output.clear(); 899 output.clear();
887 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 900 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
888 output_block_size, filter.get(), &output)); 901 feed_block_size,
902 output_block_size,
903 filter.get(),
904 &output));
889 EXPECT_EQ(output, expanded_); 905 EXPECT_EQ(output, expanded_);
890 906
891 // Next try with a tiny input and output buffer to cover edge effects. 907 // Next try with a tiny input and output buffer to cover edge effects.
892 filter.reset(SdchFilterChainingTest::Factory(filter_types, filter_context, 908 filter.reset(SdchFilterChainingTest::Factory(
893 kLargeInputBufferSize)); 909 filter_types, filter_context, kLargeInputBufferSize));
894 EXPECT_EQ(static_cast<int>(kLargeInputBufferSize), 910 EXPECT_EQ(static_cast<int>(kLargeInputBufferSize),
895 filter->stream_buffer_size()); 911 filter->stream_buffer_size());
896 912
897 feed_block_size = 1; 913 feed_block_size = 1;
898 output_block_size = 1; 914 output_block_size = 1;
899 output.clear(); 915 output.clear();
900 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 916 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
901 output_block_size, filter.get(), &output)); 917 feed_block_size,
918 output_block_size,
919 filter.get(),
920 &output));
902 EXPECT_EQ(output, expanded_); 921 EXPECT_EQ(output, expanded_);
903 } 922 }
904 923
905 TEST_F(SdchFilterTest, DefaultGzipIfSdch) { 924 TEST_F(SdchFilterTest, DefaultGzipIfSdch) {
906 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 925 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
907 const std::string kSampleDomain = "sdchtest.com"; 926 const std::string kSampleDomain = "sdchtest.com";
908 std::string dictionary(NewSdchDictionary(kSampleDomain)); 927 std::string dictionary(NewSdchDictionary(kSampleDomain));
909 928
910 std::string url_string = "http://" + kSampleDomain; 929 std::string url_string = "http://" + kSampleDomain;
911 930
(...skipping 15 matching lines...) Expand all
927 filter_context.SetSdchResponse(true); 946 filter_context.SetSdchResponse(true);
928 Filter::FixupEncodingTypes(filter_context, &filter_types); 947 Filter::FixupEncodingTypes(filter_context, &filter_types);
929 ASSERT_EQ(filter_types.size(), 2u); 948 ASSERT_EQ(filter_types.size(), 2u);
930 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH); 949 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH);
931 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH); 950 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH);
932 951
933 // First try with a large buffer (larger than test input, or compressed data). 952 // First try with a large buffer (larger than test input, or compressed data).
934 filter_context.SetURL(url); 953 filter_context.SetURL(url);
935 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 954 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
936 955
937
938 // Verify that chained filter is waiting for data. 956 // Verify that chained filter is waiting for data.
939 char tiny_output_buffer[10]; 957 char tiny_output_buffer[10];
940 int tiny_output_size = sizeof(tiny_output_buffer); 958 int tiny_output_size = sizeof(tiny_output_buffer);
941 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, 959 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA,
942 filter->ReadData(tiny_output_buffer, &tiny_output_size)); 960 filter->ReadData(tiny_output_buffer, &tiny_output_size));
943 961
944 size_t feed_block_size = 100; 962 size_t feed_block_size = 100;
945 size_t output_block_size = 100; 963 size_t output_block_size = 100;
946 std::string output; 964 std::string output;
947 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 965 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
948 output_block_size, filter.get(), &output)); 966 feed_block_size,
967 output_block_size,
968 filter.get(),
969 &output));
949 EXPECT_EQ(output, expanded_); 970 EXPECT_EQ(output, expanded_);
950 971
951 // Next try with a tiny buffer to cover edge effects. 972 // Next try with a tiny buffer to cover edge effects.
952 filter.reset(Filter::Factory(filter_types, filter_context)); 973 filter.reset(Filter::Factory(filter_types, filter_context));
953 974
954 feed_block_size = 1; 975 feed_block_size = 1;
955 output_block_size = 1; 976 output_block_size = 1;
956 output.clear(); 977 output.clear();
957 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 978 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
958 output_block_size, filter.get(), &output)); 979 feed_block_size,
980 output_block_size,
981 filter.get(),
982 &output));
959 EXPECT_EQ(output, expanded_); 983 EXPECT_EQ(output, expanded_);
960 } 984 }
961 985
962 TEST_F(SdchFilterTest, AcceptGzipSdchIfGzip) { 986 TEST_F(SdchFilterTest, AcceptGzipSdchIfGzip) {
963 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 987 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
964 const std::string kSampleDomain = "sdchtest.com"; 988 const std::string kSampleDomain = "sdchtest.com";
965 std::string dictionary(NewSdchDictionary(kSampleDomain)); 989 std::string dictionary(NewSdchDictionary(kSampleDomain));
966 990
967 std::string url_string = "http://" + kSampleDomain; 991 std::string url_string = "http://" + kSampleDomain;
968 992
(...skipping 18 matching lines...) Expand all
987 Filter::FixupEncodingTypes(filter_context, &filter_types); 1011 Filter::FixupEncodingTypes(filter_context, &filter_types);
988 ASSERT_EQ(filter_types.size(), 3u); 1012 ASSERT_EQ(filter_types.size(), 3u);
989 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE); 1013 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE);
990 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH); 1014 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH);
991 EXPECT_EQ(filter_types[2], Filter::FILTER_TYPE_GZIP); 1015 EXPECT_EQ(filter_types[2], Filter::FILTER_TYPE_GZIP);
992 1016
993 // First try with a large buffer (larger than test input, or compressed data). 1017 // First try with a large buffer (larger than test input, or compressed data).
994 filter_context.SetURL(url); 1018 filter_context.SetURL(url);
995 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 1019 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
996 1020
997
998 // Verify that chained filter is waiting for data. 1021 // Verify that chained filter is waiting for data.
999 char tiny_output_buffer[10]; 1022 char tiny_output_buffer[10];
1000 int tiny_output_size = sizeof(tiny_output_buffer); 1023 int tiny_output_size = sizeof(tiny_output_buffer);
1001 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, 1024 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA,
1002 filter->ReadData(tiny_output_buffer, &tiny_output_size)); 1025 filter->ReadData(tiny_output_buffer, &tiny_output_size));
1003 1026
1004 size_t feed_block_size = 100; 1027 size_t feed_block_size = 100;
1005 size_t output_block_size = 100; 1028 size_t output_block_size = 100;
1006 std::string output; 1029 std::string output;
1007 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 1030 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
1008 output_block_size, filter.get(), &output)); 1031 feed_block_size,
1032 output_block_size,
1033 filter.get(),
1034 &output));
1009 EXPECT_EQ(output, expanded_); 1035 EXPECT_EQ(output, expanded_);
1010 1036
1011 // Next try with a tiny buffer to cover edge effects. 1037 // Next try with a tiny buffer to cover edge effects.
1012 filter.reset(Filter::Factory(filter_types, filter_context)); 1038 filter.reset(Filter::Factory(filter_types, filter_context));
1013 1039
1014 feed_block_size = 1; 1040 feed_block_size = 1;
1015 output_block_size = 1; 1041 output_block_size = 1;
1016 output.clear(); 1042 output.clear();
1017 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 1043 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
1018 output_block_size, filter.get(), &output)); 1044 feed_block_size,
1045 output_block_size,
1046 filter.get(),
1047 &output));
1019 EXPECT_EQ(output, expanded_); 1048 EXPECT_EQ(output, expanded_);
1020 } 1049 }
1021 1050
1022 TEST_F(SdchFilterTest, DefaultSdchGzipIfEmpty) { 1051 TEST_F(SdchFilterTest, DefaultSdchGzipIfEmpty) {
1023 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 1052 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
1024 const std::string kSampleDomain = "sdchtest.com"; 1053 const std::string kSampleDomain = "sdchtest.com";
1025 std::string dictionary(NewSdchDictionary(kSampleDomain)); 1054 std::string dictionary(NewSdchDictionary(kSampleDomain));
1026 1055
1027 std::string url_string = "http://" + kSampleDomain; 1056 std::string url_string = "http://" + kSampleDomain;
1028 1057
(...skipping 15 matching lines...) Expand all
1044 filter_context.SetSdchResponse(true); 1073 filter_context.SetSdchResponse(true);
1045 Filter::FixupEncodingTypes(filter_context, &filter_types); 1074 Filter::FixupEncodingTypes(filter_context, &filter_types);
1046 ASSERT_EQ(filter_types.size(), 2u); 1075 ASSERT_EQ(filter_types.size(), 2u);
1047 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE); 1076 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE);
1048 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH); 1077 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH);
1049 1078
1050 // First try with a large buffer (larger than test input, or compressed data). 1079 // First try with a large buffer (larger than test input, or compressed data).
1051 filter_context.SetURL(url); 1080 filter_context.SetURL(url);
1052 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 1081 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
1053 1082
1054
1055 // Verify that chained filter is waiting for data. 1083 // Verify that chained filter is waiting for data.
1056 char tiny_output_buffer[10]; 1084 char tiny_output_buffer[10];
1057 int tiny_output_size = sizeof(tiny_output_buffer); 1085 int tiny_output_size = sizeof(tiny_output_buffer);
1058 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, 1086 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA,
1059 filter->ReadData(tiny_output_buffer, &tiny_output_size)); 1087 filter->ReadData(tiny_output_buffer, &tiny_output_size));
1060 1088
1061 size_t feed_block_size = 100; 1089 size_t feed_block_size = 100;
1062 size_t output_block_size = 100; 1090 size_t output_block_size = 100;
1063 std::string output; 1091 std::string output;
1064 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 1092 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
1065 output_block_size, filter.get(), &output)); 1093 feed_block_size,
1094 output_block_size,
1095 filter.get(),
1096 &output));
1066 EXPECT_EQ(output, expanded_); 1097 EXPECT_EQ(output, expanded_);
1067 1098
1068 // Next try with a tiny buffer to cover edge effects. 1099 // Next try with a tiny buffer to cover edge effects.
1069 filter.reset(Filter::Factory(filter_types, filter_context)); 1100 filter.reset(Filter::Factory(filter_types, filter_context));
1070 1101
1071 feed_block_size = 1; 1102 feed_block_size = 1;
1072 output_block_size = 1; 1103 output_block_size = 1;
1073 output.clear(); 1104 output.clear();
1074 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch, feed_block_size, 1105 EXPECT_TRUE(FilterTestData(gzip_compressed_sdch,
1075 output_block_size, filter.get(), &output)); 1106 feed_block_size,
1107 output_block_size,
1108 filter.get(),
1109 &output));
1076 EXPECT_EQ(output, expanded_); 1110 EXPECT_EQ(output, expanded_);
1077 } 1111 }
1078 1112
1079 TEST_F(SdchFilterTest, AcceptGzipGzipSdchIfGzip) { 1113 TEST_F(SdchFilterTest, AcceptGzipGzipSdchIfGzip) {
1080 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 1114 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
1081 const std::string kSampleDomain = "sdchtest.com"; 1115 const std::string kSampleDomain = "sdchtest.com";
1082 std::string dictionary(NewSdchDictionary(kSampleDomain)); 1116 std::string dictionary(NewSdchDictionary(kSampleDomain));
1083 1117
1084 std::string url_string = "http://" + kSampleDomain; 1118 std::string url_string = "http://" + kSampleDomain;
1085 1119
1086 GURL url(url_string); 1120 GURL url(url_string);
1087 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url)); 1121 EXPECT_TRUE(sdch_manager_->AddSdchDictionary(dictionary, url));
1088 1122
1089 std::string sdch_compressed(NewSdchCompressedData(dictionary)); 1123 std::string sdch_compressed(NewSdchCompressedData(dictionary));
1090 1124
1091 // Vodaphone (UK) Mobile Broadband provides double gzipped sdch with a content 1125 // Vodaphone (UK) Mobile Broadband provides double gzipped sdch with a content
1092 // encoding of merely gzip (apparently, only listing the extra level of 1126 // encoding of merely gzip (apparently, only listing the extra level of
1093 // wrapper compression they added, but discarding the actual content encoding. 1127 // wrapper compression they added, but discarding the actual content encoding.
1094 // Use Gzip to double compress the sdch sdch_compressed data. 1128 // Use Gzip to double compress the sdch sdch_compressed data.
1095 std::string double_gzip_compressed_sdch = gzip_compress(gzip_compress( 1129 std::string double_gzip_compressed_sdch =
1096 sdch_compressed)); 1130 gzip_compress(gzip_compress(sdch_compressed));
1097 1131
1098 // Only claim to have gzip content, but really use the double gzipped sdch 1132 // Only claim to have gzip content, but really use the double gzipped sdch
1099 // content. 1133 // content.
1100 // System should automatically add the missing (optional) sdch, gzip decoders. 1134 // System should automatically add the missing (optional) sdch, gzip decoders.
1101 std::vector<Filter::FilterType> filter_types; 1135 std::vector<Filter::FilterType> filter_types;
1102 filter_types.push_back(Filter::FILTER_TYPE_GZIP); 1136 filter_types.push_back(Filter::FILTER_TYPE_GZIP);
1103 1137
1104 MockFilterContext filter_context; 1138 MockFilterContext filter_context;
1105 filter_context.SetMimeType("anything/mime"); 1139 filter_context.SetMimeType("anything/mime");
1106 filter_context.SetSdchResponse(true); 1140 filter_context.SetSdchResponse(true);
1107 Filter::FixupEncodingTypes(filter_context, &filter_types); 1141 Filter::FixupEncodingTypes(filter_context, &filter_types);
1108 ASSERT_EQ(filter_types.size(), 3u); 1142 ASSERT_EQ(filter_types.size(), 3u);
1109 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE); 1143 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE);
1110 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH); 1144 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH);
1111 EXPECT_EQ(filter_types[2], Filter::FILTER_TYPE_GZIP); 1145 EXPECT_EQ(filter_types[2], Filter::FILTER_TYPE_GZIP);
1112 1146
1113 // First try with a large buffer (larger than test input, or compressed data). 1147 // First try with a large buffer (larger than test input, or compressed data).
1114 filter_context.SetURL(url); 1148 filter_context.SetURL(url);
1115 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context)); 1149 scoped_ptr<Filter> filter(Filter::Factory(filter_types, filter_context));
1116 1150
1117 // Verify that chained filter is waiting for data. 1151 // Verify that chained filter is waiting for data.
1118 char tiny_output_buffer[10]; 1152 char tiny_output_buffer[10];
1119 int tiny_output_size = sizeof(tiny_output_buffer); 1153 int tiny_output_size = sizeof(tiny_output_buffer);
1120 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, 1154 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA,
1121 filter->ReadData(tiny_output_buffer, &tiny_output_size)); 1155 filter->ReadData(tiny_output_buffer, &tiny_output_size));
1122 1156
1123 size_t feed_block_size = 100; 1157 size_t feed_block_size = 100;
1124 size_t output_block_size = 100; 1158 size_t output_block_size = 100;
1125 std::string output; 1159 std::string output;
1126 EXPECT_TRUE(FilterTestData(double_gzip_compressed_sdch, feed_block_size, 1160 EXPECT_TRUE(FilterTestData(double_gzip_compressed_sdch,
1127 output_block_size, filter.get(), &output)); 1161 feed_block_size,
1162 output_block_size,
1163 filter.get(),
1164 &output));
1128 EXPECT_EQ(output, expanded_); 1165 EXPECT_EQ(output, expanded_);
1129 1166
1130 // Next try with a tiny buffer to cover edge effects. 1167 // Next try with a tiny buffer to cover edge effects.
1131 filter.reset(Filter::Factory(filter_types, filter_context)); 1168 filter.reset(Filter::Factory(filter_types, filter_context));
1132 1169
1133 feed_block_size = 1; 1170 feed_block_size = 1;
1134 output_block_size = 1; 1171 output_block_size = 1;
1135 output.clear(); 1172 output.clear();
1136 EXPECT_TRUE(FilterTestData(double_gzip_compressed_sdch, feed_block_size, 1173 EXPECT_TRUE(FilterTestData(double_gzip_compressed_sdch,
1137 output_block_size, filter.get(), &output)); 1174 feed_block_size,
1175 output_block_size,
1176 filter.get(),
1177 &output));
1138 EXPECT_EQ(output, expanded_); 1178 EXPECT_EQ(output, expanded_);
1139 } 1179 }
1140 1180
1141 } // namespace net 1181 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698