OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/data_reduction_proxy/content/browser/content_lofi_decider.h
" | 5 #include "components/data_reduction_proxy/content/browser/content_lofi_decider.h
" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <memory> | 8 #include <memory> |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 static void VerifyLoFiHeader(bool expected_lofi_used, | 133 static void VerifyLoFiHeader(bool expected_lofi_used, |
134 const net::HttpRequestHeaders& headers) { | 134 const net::HttpRequestHeaders& headers) { |
135 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); | 135 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); |
136 std::string header_value; | 136 std::string header_value; |
137 headers.GetHeader(chrome_proxy_header(), &header_value); | 137 headers.GetHeader(chrome_proxy_header(), &header_value); |
138 EXPECT_EQ( | 138 EXPECT_EQ( |
139 expected_lofi_used, | 139 expected_lofi_used, |
140 header_value.find(chrome_proxy_lo_fi_directive()) != std::string::npos); | 140 header_value.find(chrome_proxy_lo_fi_directive()) != std::string::npos); |
141 } | 141 } |
142 | 142 |
143 static void VerifyLoFiPreviewHeader(bool expected_lofi_preview_used, | 143 static void VerifyLitePageHeader(bool expected_lite_page_used, |
144 const net::HttpRequestHeaders& headers) { | 144 const net::HttpRequestHeaders& headers) { |
145 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); | 145 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); |
146 std::string header_value; | 146 std::string header_value; |
147 headers.GetHeader(chrome_proxy_header(), &header_value); | 147 headers.GetHeader(chrome_proxy_header(), &header_value); |
148 EXPECT_EQ(expected_lofi_preview_used, | 148 EXPECT_EQ(expected_lite_page_used, |
149 header_value.find(chrome_proxy_lo_fi_preview_directive()) != | 149 header_value.find(chrome_proxy_lite_page_directive()) != |
150 std::string::npos); | 150 std::string::npos); |
151 } | 151 } |
152 | 152 |
153 static void VerifyLoFiIgnorePreviewBlacklistHeader( | 153 static void VerifyLitePageIgnoreBlacklistHeader( |
154 bool expected_lofi_preview_used, | 154 bool expected_lite_page_used, |
155 const net::HttpRequestHeaders& headers) { | 155 const net::HttpRequestHeaders& headers) { |
156 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); | 156 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); |
157 std::string header_value; | 157 std::string header_value; |
158 headers.GetHeader(chrome_proxy_header(), &header_value); | 158 headers.GetHeader(chrome_proxy_header(), &header_value); |
159 EXPECT_EQ(expected_lofi_preview_used, | 159 EXPECT_EQ(expected_lite_page_used, |
160 header_value.find( | 160 header_value.find( |
161 chrome_proxy_lo_fi_ignore_preview_blacklist_directive()) != | 161 chrome_proxy_lite_page_ignore_blacklist_directive()) != |
162 std::string::npos); | 162 std::string::npos); |
163 } | 163 } |
164 | 164 |
165 protected: | 165 protected: |
166 base::MessageLoopForIO message_loop_; | 166 base::MessageLoopForIO message_loop_; |
167 net::MockClientSocketFactory mock_socket_factory_; | 167 net::MockClientSocketFactory mock_socket_factory_; |
168 net::TestURLRequestContext context_; | 168 net::TestURLRequestContext context_; |
169 net::TestDelegate delegate_; | 169 net::TestDelegate delegate_; |
170 std::unique_ptr<DataReductionProxyTestContext> test_context_; | 170 std::unique_ptr<DataReductionProxyTestContext> test_context_; |
171 std::unique_ptr<DataReductionProxyNetworkDelegate> | 171 std::unique_ptr<DataReductionProxyNetworkDelegate> |
172 data_reduction_proxy_network_delegate_; | 172 data_reduction_proxy_network_delegate_; |
173 }; | 173 }; |
174 | 174 |
175 TEST_F(ContentLoFiDeciderTest, LoFiFlags) { | 175 TEST_F(ContentLoFiDeciderTest, LoFiFlags) { |
176 // Enable Lo-Fi. | 176 // Enable Lo-Fi. |
177 const struct { | 177 const struct { |
178 bool is_using_lofi; | 178 bool is_using_lofi; |
179 bool is_using_previews; | 179 bool is_using_lite_page; |
180 bool is_main_frame; | 180 bool is_main_frame; |
181 } tests[] = { | 181 } tests[] = { |
182 {false, false, false}, {false, false, true}, {true, false, true}, | 182 {false, false, false}, {false, false, true}, {true, false, true}, |
183 {true, false, false}, {false, true, false}, {false, true, true}, | 183 {true, false, false}, {false, true, false}, {false, true, true}, |
184 {true, true, true}, {true, true, false}, | 184 {true, true, true}, {true, true, false}, |
185 }; | 185 }; |
186 | 186 |
187 for (size_t i = 0; i < arraysize(tests); ++i) { | 187 for (size_t i = 0; i < arraysize(tests); ++i) { |
188 std::unique_ptr<net::URLRequest> request = | 188 std::unique_ptr<net::URLRequest> request = |
189 CreateRequest(tests[i].is_using_lofi); | 189 CreateRequest(tests[i].is_using_lofi); |
190 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | 190 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
191 command_line->InitFromArgv(command_line->argv()); | 191 command_line->InitFromArgv(command_line->argv()); |
192 if (tests[i].is_using_previews) { | 192 if (tests[i].is_using_lite_page) { |
193 command_line->AppendSwitch( | 193 command_line->AppendSwitch(switches::kEnableDataReductionProxyLitePage); |
194 switches::kEnableDataReductionProxyLoFiPreview); | |
195 } | 194 } |
196 | 195 |
197 // No flags or field trials. The Lo-Fi header should not be added. | 196 // No flags or field trials. The Lo-Fi header should not be added. |
198 net::HttpRequestHeaders headers; | 197 net::HttpRequestHeaders headers; |
199 NotifyBeforeSendHeaders(&headers, request.get(), true); | 198 NotifyBeforeSendHeaders(&headers, request.get(), true); |
200 VerifyLoFiHeader(false, headers); | 199 VerifyLoFiHeader(false, headers); |
201 VerifyLoFiPreviewHeader(false, headers); | 200 VerifyLitePageHeader(false, headers); |
202 VerifyLoFiIgnorePreviewBlacklistHeader(false, headers); | 201 VerifyLitePageIgnoreBlacklistHeader(false, headers); |
203 | 202 |
204 // The Lo-Fi flag is "always-on", Lo-Fi is being used, and it's a main frame | 203 // The Lo-Fi flag is "always-on", Lo-Fi is being used, and it's a main frame |
205 // request. Lo-Fi preview header should be added. | 204 // request. Lo-Fi or lite page header should be added. |
206 command_line->AppendSwitchASCII( | 205 command_line->AppendSwitchASCII( |
207 switches::kDataReductionProxyLoFi, | 206 switches::kDataReductionProxyLoFi, |
208 switches::kDataReductionProxyLoFiValueAlwaysOn); | 207 switches::kDataReductionProxyLoFiValueAlwaysOn); |
209 if (tests[i].is_main_frame) | 208 if (tests[i].is_main_frame) |
210 request->SetLoadFlags(request->load_flags() | | 209 request->SetLoadFlags(request->load_flags() | |
211 net::LOAD_MAIN_FRAME_DEPRECATED); | 210 net::LOAD_MAIN_FRAME_DEPRECATED); |
212 headers.Clear(); | 211 headers.Clear(); |
213 NotifyBeforeSendHeaders(&headers, request.get(), true); | 212 NotifyBeforeSendHeaders(&headers, request.get(), true); |
214 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_previews && | 213 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_lite_page && |
215 !tests[i].is_main_frame, | 214 !tests[i].is_main_frame, |
216 headers); | 215 headers); |
217 VerifyLoFiPreviewHeader(tests[i].is_using_lofi && | 216 VerifyLitePageHeader(tests[i].is_using_lofi && |
218 tests[i].is_using_previews && | 217 tests[i].is_using_lite_page && |
219 tests[i].is_main_frame, | 218 tests[i].is_main_frame, |
220 headers); | 219 headers); |
221 VerifyLoFiIgnorePreviewBlacklistHeader(tests[i].is_using_lofi && | 220 VerifyLitePageIgnoreBlacklistHeader(tests[i].is_using_lofi && |
222 tests[i].is_using_previews && | 221 tests[i].is_using_lite_page && |
223 tests[i].is_main_frame, | 222 tests[i].is_main_frame, |
224 headers); | 223 headers); |
225 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | 224 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); |
226 // |lofi_requested| should be set to false when Lo-Fi is enabled using | 225 // |lofi_requested| should be set to false when Lo-Fi is enabled using |
227 // flags. | 226 // flags. |
228 EXPECT_FALSE(data->lofi_requested()); | 227 EXPECT_FALSE(data->lofi_requested()); |
229 | 228 |
230 // The Lo-Fi flag is "always-on" and Lo-Fi is being used. Lo-Fi header | 229 // The Lo-Fi flag is "always-on" and Lo-Fi is being used. Lo-Fi header |
231 // should be added. | 230 // should be added. |
232 request->SetLoadFlags(0); | 231 request->SetLoadFlags(0); |
233 headers.Clear(); | 232 headers.Clear(); |
234 NotifyBeforeSendHeaders(&headers, request.get(), true); | 233 NotifyBeforeSendHeaders(&headers, request.get(), true); |
235 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_previews, | 234 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_lite_page, |
236 headers); | 235 headers); |
237 VerifyLoFiPreviewHeader(false, headers); | 236 VerifyLitePageHeader(false, headers); |
238 VerifyLoFiIgnorePreviewBlacklistHeader(false, headers); | 237 VerifyLitePageIgnoreBlacklistHeader(false, headers); |
239 | 238 |
240 // The Lo-Fi flag is "cellular-only" and Lo-Fi is being used. Lo-Fi header | 239 // The Lo-Fi flag is "cellular-only" and Lo-Fi is being used. Lo-Fi header |
241 // should be added. | 240 // should be added. |
242 command_line->AppendSwitchASCII( | 241 command_line->AppendSwitchASCII( |
243 switches::kDataReductionProxyLoFi, | 242 switches::kDataReductionProxyLoFi, |
244 switches::kDataReductionProxyLoFiValueCellularOnly); | 243 switches::kDataReductionProxyLoFiValueCellularOnly); |
245 headers.Clear(); | 244 headers.Clear(); |
246 NotifyBeforeSendHeaders(&headers, request.get(), true); | 245 NotifyBeforeSendHeaders(&headers, request.get(), true); |
247 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_previews, | 246 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_lite_page, |
248 headers); | 247 headers); |
249 VerifyLoFiPreviewHeader(false, headers); | 248 VerifyLitePageHeader(false, headers); |
250 VerifyLoFiIgnorePreviewBlacklistHeader(false, headers); | 249 VerifyLitePageIgnoreBlacklistHeader(false, headers); |
251 data = DataReductionProxyData::GetData(*request); | 250 data = DataReductionProxyData::GetData(*request); |
252 // |lofi_requested| should be set to false when Lo-Fi is enabled using | 251 // |lofi_requested| should be set to false when Lo-Fi is enabled using |
253 // flags. | 252 // flags. |
254 EXPECT_FALSE(data->lofi_requested()); | 253 EXPECT_FALSE(data->lofi_requested()); |
255 | 254 |
256 // The Lo-Fi flag is "slow-connections-only" and Lo-Fi is being used. Lo-Fi | 255 // The Lo-Fi flag is "slow-connections-only" and Lo-Fi is being used. Lo-Fi |
257 // header should be added. | 256 // header should be added. |
258 command_line->AppendSwitchASCII( | 257 command_line->AppendSwitchASCII( |
259 switches::kDataReductionProxyLoFi, | 258 switches::kDataReductionProxyLoFi, |
260 switches::kDataReductionProxyLoFiValueSlowConnectionsOnly); | 259 switches::kDataReductionProxyLoFiValueSlowConnectionsOnly); |
261 headers.Clear(); | 260 headers.Clear(); |
262 NotifyBeforeSendHeaders(&headers, request.get(), true); | 261 NotifyBeforeSendHeaders(&headers, request.get(), true); |
263 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_previews, | 262 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_using_lite_page, |
264 headers); | 263 headers); |
265 VerifyLoFiPreviewHeader(false, headers); | 264 VerifyLitePageHeader(false, headers); |
266 VerifyLoFiIgnorePreviewBlacklistHeader(false, headers); | 265 VerifyLitePageIgnoreBlacklistHeader(false, headers); |
267 data = DataReductionProxyData::GetData(*request); | 266 data = DataReductionProxyData::GetData(*request); |
268 // |lofi_requested| should be set to false when Lo-Fi is enabled using | 267 // |lofi_requested| should be set to false when Lo-Fi is enabled using |
269 // flags. | 268 // flags. |
270 EXPECT_FALSE(data->lofi_requested()); | 269 EXPECT_FALSE(data->lofi_requested()); |
271 } | 270 } |
272 } | 271 } |
273 | 272 |
274 TEST_F(ContentLoFiDeciderTest, LoFiEnabledFieldTrial) { | 273 TEST_F(ContentLoFiDeciderTest, LoFiEnabledFieldTrial) { |
275 base::FieldTrialList field_trial_list(nullptr); | 274 base::FieldTrialList field_trial_list(nullptr); |
276 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 275 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
277 "Enabled"); | 276 "Enabled"); |
278 // Enable Lo-Fi. | 277 // Enable Lo-Fi. |
279 const struct { | 278 const struct { |
280 bool is_using_lofi; | 279 bool is_using_lofi; |
281 bool is_main_frame; | 280 bool is_main_frame; |
282 } tests[] = {{false, false}, {false, true}, {true, false}, {true, true}}; | 281 } tests[] = {{false, false}, {false, true}, {true, false}, {true, true}}; |
283 | 282 |
284 for (size_t i = 0; i < arraysize(tests); ++i) { | 283 for (size_t i = 0; i < arraysize(tests); ++i) { |
285 std::unique_ptr<net::URLRequest> request = | 284 std::unique_ptr<net::URLRequest> request = |
286 CreateRequest(tests[i].is_using_lofi); | 285 CreateRequest(tests[i].is_using_lofi); |
287 if (tests[i].is_main_frame) | 286 if (tests[i].is_main_frame) |
288 request->SetLoadFlags(request->load_flags() | | 287 request->SetLoadFlags(request->load_flags() | |
289 net::LOAD_MAIN_FRAME_DEPRECATED); | 288 net::LOAD_MAIN_FRAME_DEPRECATED); |
290 net::HttpRequestHeaders headers; | 289 net::HttpRequestHeaders headers; |
291 NotifyBeforeSendHeaders(&headers, request.get(), true); | 290 NotifyBeforeSendHeaders(&headers, request.get(), true); |
292 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_main_frame, | 291 VerifyLoFiHeader(tests[i].is_using_lofi && !tests[i].is_main_frame, |
293 headers); | 292 headers); |
294 VerifyLoFiPreviewHeader(false, headers); | 293 VerifyLitePageHeader(false, headers); |
295 VerifyLoFiIgnorePreviewBlacklistHeader(false, headers); | 294 VerifyLitePageIgnoreBlacklistHeader(false, headers); |
296 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | 295 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); |
297 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; | 296 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; |
298 } | 297 } |
299 } | 298 } |
300 | 299 |
301 TEST_F(ContentLoFiDeciderTest, LoFiControlFieldTrial) { | 300 TEST_F(ContentLoFiDeciderTest, LoFiControlFieldTrial) { |
302 base::FieldTrialList field_trial_list(nullptr); | 301 base::FieldTrialList field_trial_list(nullptr); |
303 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 302 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
304 "Control"); | 303 "Control"); |
305 // Enable Lo-Fi. | 304 // Enable Lo-Fi. |
306 const struct { | 305 const struct { |
307 bool is_using_lofi; | 306 bool is_using_lofi; |
308 bool is_main_frame; | 307 bool is_main_frame; |
309 } tests[] = {{false, false}, {false, true}, {true, false}, {true, true}}; | 308 } tests[] = {{false, false}, {false, true}, {true, false}, {true, true}}; |
310 | 309 |
311 for (size_t i = 0; i < arraysize(tests); ++i) { | 310 for (size_t i = 0; i < arraysize(tests); ++i) { |
312 std::unique_ptr<net::URLRequest> request = | 311 std::unique_ptr<net::URLRequest> request = |
313 CreateRequest(tests[i].is_using_lofi); | 312 CreateRequest(tests[i].is_using_lofi); |
314 if (tests[i].is_main_frame) | 313 if (tests[i].is_main_frame) |
315 request->SetLoadFlags(request->load_flags() | | 314 request->SetLoadFlags(request->load_flags() | |
316 net::LOAD_MAIN_FRAME_DEPRECATED); | 315 net::LOAD_MAIN_FRAME_DEPRECATED); |
317 net::HttpRequestHeaders headers; | 316 net::HttpRequestHeaders headers; |
318 NotifyBeforeSendHeaders(&headers, request.get(), true); | 317 NotifyBeforeSendHeaders(&headers, request.get(), true); |
319 VerifyLoFiHeader(false, headers); | 318 VerifyLoFiHeader(false, headers); |
320 VerifyLoFiPreviewHeader(false, headers); | 319 VerifyLitePageHeader(false, headers); |
321 VerifyLoFiIgnorePreviewBlacklistHeader(false, headers); | 320 VerifyLitePageIgnoreBlacklistHeader(false, headers); |
322 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | 321 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); |
323 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; | 322 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; |
324 } | 323 } |
325 } | 324 } |
326 | 325 |
327 TEST_F(ContentLoFiDeciderTest, LoFiPreviewFieldTrial) { | 326 TEST_F(ContentLoFiDeciderTest, LitePageFieldTrial) { |
328 base::FieldTrialList field_trial_list(nullptr); | 327 base::FieldTrialList field_trial_list(nullptr); |
329 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 328 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
330 "Enabled_Preview"); | 329 "Enabled_Preview"); |
331 // Enable Lo-Fi. | 330 // Enable Lo-Fi. |
332 const struct { | 331 const struct { |
333 bool is_using_lofi; | 332 bool is_using_lofi; |
334 bool is_main_frame; | 333 bool is_main_frame; |
335 } tests[] = { | 334 } tests[] = { |
336 {false, false}, {true, false}, {false, true}, {true, true}, | 335 {false, false}, {true, false}, {false, true}, {true, true}, |
337 }; | 336 }; |
338 | 337 |
339 for (size_t i = 0; i < arraysize(tests); ++i) { | 338 for (size_t i = 0; i < arraysize(tests); ++i) { |
340 std::unique_ptr<net::URLRequest> request = | 339 std::unique_ptr<net::URLRequest> request = |
341 CreateRequest(tests[i].is_using_lofi); | 340 CreateRequest(tests[i].is_using_lofi); |
342 if (tests[i].is_main_frame) | 341 if (tests[i].is_main_frame) |
343 request->SetLoadFlags(request->load_flags() | | 342 request->SetLoadFlags(request->load_flags() | |
344 net::LOAD_MAIN_FRAME_DEPRECATED); | 343 net::LOAD_MAIN_FRAME_DEPRECATED); |
345 net::HttpRequestHeaders headers; | 344 net::HttpRequestHeaders headers; |
346 NotifyBeforeSendHeaders(&headers, request.get(), true); | 345 NotifyBeforeSendHeaders(&headers, request.get(), true); |
347 VerifyLoFiHeader(false, headers); | 346 VerifyLoFiHeader(false, headers); |
348 VerifyLoFiPreviewHeader(tests[i].is_using_lofi && tests[i].is_main_frame, | 347 VerifyLitePageHeader(tests[i].is_using_lofi && tests[i].is_main_frame, |
349 headers); | 348 headers); |
350 VerifyLoFiIgnorePreviewBlacklistHeader(false, headers); | 349 VerifyLitePageIgnoreBlacklistHeader(false, headers); |
351 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | 350 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); |
352 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; | 351 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; |
353 } | 352 } |
354 } | 353 } |
355 | 354 |
356 TEST_F(ContentLoFiDeciderTest, AutoLoFi) { | 355 TEST_F(ContentLoFiDeciderTest, AutoLoFi) { |
357 const struct { | 356 const struct { |
358 bool auto_lofi_enabled_group; | 357 bool auto_lofi_enabled_group; |
359 bool auto_lofi_control_group; | 358 bool auto_lofi_control_group; |
360 bool network_prohibitively_slow; | 359 bool network_prohibitively_slow; |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 net::HttpRequestHeaders headers; | 476 net::HttpRequestHeaders headers; |
478 NotifyBeforeSendHeaders(&headers, request.get(), false); | 477 NotifyBeforeSendHeaders(&headers, request.get(), false); |
479 std::string header_value; | 478 std::string header_value; |
480 headers.GetHeader(chrome_proxy_header(), &header_value); | 479 headers.GetHeader(chrome_proxy_header(), &header_value); |
481 EXPECT_EQ(std::string::npos, | 480 EXPECT_EQ(std::string::npos, |
482 header_value.find(chrome_proxy_lo_fi_directive())); | 481 header_value.find(chrome_proxy_lo_fi_directive())); |
483 } | 482 } |
484 } | 483 } |
485 | 484 |
486 } // namespace data_reduction_roxy | 485 } // namespace data_reduction_roxy |
OLD | NEW |