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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
81 new DataReductionProxyNetworkDelegate( | 81 new DataReductionProxyNetworkDelegate( |
82 std::unique_ptr<net::NetworkDelegate>( | 82 std::unique_ptr<net::NetworkDelegate>( |
83 new net::NetworkDelegateImpl()), | 83 new net::NetworkDelegateImpl()), |
84 test_context_->config(), | 84 test_context_->config(), |
85 test_context_->io_data()->request_options(), | 85 test_context_->io_data()->request_options(), |
86 test_context_->configurator())); | 86 test_context_->configurator())); |
87 | 87 |
88 data_reduction_proxy_network_delegate_->InitIODataAndUMA( | 88 data_reduction_proxy_network_delegate_->InitIODataAndUMA( |
89 test_context_->io_data(), test_context_->io_data()->bypass_stats()); | 89 test_context_->io_data(), test_context_->io_data()->bypass_stats()); |
90 | 90 |
91 | |
92 std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> | 91 std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> |
93 data_reduction_proxy_lofi_decider( | 92 data_reduction_proxy_lofi_decider( |
94 new data_reduction_proxy::ContentLoFiDecider()); | 93 new data_reduction_proxy::ContentLoFiDecider()); |
95 test_context_->io_data()->set_lofi_decider( | 94 test_context_->io_data()->set_lofi_decider( |
96 std::move(data_reduction_proxy_lofi_decider)); | 95 std::move(data_reduction_proxy_lofi_decider)); |
97 } | 96 } |
98 | 97 |
99 void AllocateRequestInfoForTesting(net::URLRequest* request, | 98 void AllocateRequestInfoForTesting(net::URLRequest* request, |
100 content::ResourceType resource_type, | 99 content::ResourceType resource_type, |
101 content::PreviewsState previews_state) { | 100 content::PreviewsState previews_state) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
153 | 152 |
154 data_reduction_proxy_network_delegate_->NotifyBeforeStartTransaction( | 153 data_reduction_proxy_network_delegate_->NotifyBeforeStartTransaction( |
155 request, base::Bind(&ContentLoFiDeciderTest::DelegateStageDone, | 154 request, base::Bind(&ContentLoFiDeciderTest::DelegateStageDone, |
156 base::Unretained(this)), | 155 base::Unretained(this)), |
157 headers); | 156 headers); |
158 data_reduction_proxy_network_delegate_->NotifyBeforeSendHeaders( | 157 data_reduction_proxy_network_delegate_->NotifyBeforeSendHeaders( |
159 request, data_reduction_proxy_info, proxy_retry_info, headers); | 158 request, data_reduction_proxy_info, proxy_retry_info, headers); |
160 } | 159 } |
161 | 160 |
162 static void VerifyLoFiHeader(bool expected_lofi_used, | 161 static void VerifyLoFiHeader(bool expected_lofi_used, |
163 bool expected_if_heavy, | |
164 const net::HttpRequestHeaders& headers) { | 162 const net::HttpRequestHeaders& headers) { |
165 if (expected_lofi_used) | 163 if (expected_lofi_used) |
166 EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); | 164 EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); |
167 std::string header_value; | 165 std::string header_value; |
168 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); | 166 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); |
169 if (expected_if_heavy) { | 167 EXPECT_EQ(expected_lofi_used, header_value == empty_image_directive()); |
170 std::string empty_image_if_heavy = base::StringPrintf( | |
171 "%s;%s", empty_image_directive(), if_heavy_qualifier()); | |
172 EXPECT_EQ(expected_lofi_used, empty_image_if_heavy == header_value); | |
173 } else { | |
174 EXPECT_EQ(expected_lofi_used, header_value == empty_image_directive()); | |
175 } | |
176 } | 168 } |
177 | 169 |
178 static void VerifyLitePageHeader(bool expected_lofi_preview_used, | 170 static void VerifyLitePageHeader(bool expected_lofi_preview_used, |
179 bool expected_if_heavy, | |
180 const net::HttpRequestHeaders& headers) { | 171 const net::HttpRequestHeaders& headers) { |
181 if (expected_lofi_preview_used) | 172 if (expected_lofi_preview_used) |
182 EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); | 173 EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); |
183 std::string header_value; | 174 std::string header_value; |
184 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); | 175 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); |
185 if (expected_if_heavy) { | 176 EXPECT_EQ(expected_lofi_preview_used, |
186 std::string lite_page_if_heavy = base::StringPrintf( | 177 header_value == lite_page_directive()); |
187 "%s;%s", lite_page_directive(), if_heavy_qualifier()); | |
188 EXPECT_EQ(expected_lofi_preview_used, lite_page_if_heavy == header_value); | |
189 } else { | |
190 EXPECT_EQ(expected_lofi_preview_used, | |
191 header_value == lite_page_directive()); | |
192 } | |
193 } | 178 } |
194 | 179 |
195 static void VerifyVideoHeader(bool expected_compressed_video_used, | 180 static void VerifyVideoHeader(bool expected_compressed_video_used, |
196 const net::HttpRequestHeaders& headers) { | 181 const net::HttpRequestHeaders& headers) { |
197 EXPECT_EQ(expected_compressed_video_used, | 182 EXPECT_EQ(expected_compressed_video_used, |
198 headers.HasHeader(chrome_proxy_accept_transform_header())); | 183 headers.HasHeader(chrome_proxy_accept_transform_header())); |
199 std::string header_value; | 184 std::string header_value; |
200 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); | 185 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); |
201 EXPECT_EQ( | 186 EXPECT_EQ( |
202 expected_compressed_video_used, | 187 expected_compressed_video_used, |
203 header_value.find(compressed_video_directive()) != std::string::npos); | 188 header_value.find(compressed_video_directive()) != std::string::npos); |
204 } | 189 } |
205 | 190 |
206 static void VerifyLitePageIgnoreBlacklistHeader( | 191 static void VerifyForceLitePageHeader( |
207 bool expected_blacklist_directive_added, | 192 bool expected_directive_added, |
208 const net::HttpRequestHeaders& headers) { | 193 const net::HttpRequestHeaders& headers) { |
209 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); | 194 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); |
210 std::string header_value; | 195 std::string header_value; |
211 headers.GetHeader(chrome_proxy_header(), &header_value); | 196 headers.GetHeader(chrome_proxy_header(), &header_value); |
212 EXPECT_EQ(expected_blacklist_directive_added, | 197 EXPECT_EQ(expected_directive_added, |
213 header_value.find( | 198 header_value.find(chrome_proxy_force_lite_page_directive()) != |
214 chrome_proxy_lite_page_ignore_blacklist_directive()) != | |
215 std::string::npos); | 199 std::string::npos); |
216 } | 200 } |
217 | 201 |
218 protected: | 202 protected: |
219 base::MessageLoopForIO message_loop_; | 203 base::MessageLoopForIO message_loop_; |
220 net::TestURLRequestContext context_; | 204 net::TestURLRequestContext context_; |
221 net::TestDelegate delegate_; | 205 net::TestDelegate delegate_; |
222 std::unique_ptr<DataReductionProxyTestContext> test_context_; | 206 std::unique_ptr<DataReductionProxyTestContext> test_context_; |
207 std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> | |
208 data_reduction_proxy_lofi_decider_; | |
209 | |
223 std::unique_ptr<DataReductionProxyNetworkDelegate> | 210 std::unique_ptr<DataReductionProxyNetworkDelegate> |
224 data_reduction_proxy_network_delegate_; | 211 data_reduction_proxy_network_delegate_; |
225 }; | 212 }; |
226 | 213 |
227 TEST_F(ContentLoFiDeciderTest, LoFiFlags) { | 214 TEST_F(ContentLoFiDeciderTest, MaybeSetAcceptTransformHeader) { |
228 // Enable Lo-Fi. | |
229 const struct { | 215 const struct { |
230 bool is_using_lofi; | 216 bool is_server_lofi_on; |
231 bool is_using_lite_page; | 217 bool is_server_lite_page_on; |
232 bool is_main_frame; | 218 bool is_main_frame; |
233 } tests[] = { | 219 } tests[] = { |
234 {false, false, false}, {false, false, true}, {true, false, true}, | 220 {false, false, false}, {false, false, true}, {true, false, true}, |
235 {true, false, false}, {false, true, false}, {false, true, true}, | 221 {true, false, false}, {false, true, false}, {false, true, true}, |
236 {true, true, true}, {true, true, false}, | 222 {true, true, true}, {true, true, false}, |
237 }; | 223 }; |
238 | 224 |
225 std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( | |
226 new data_reduction_proxy::ContentLoFiDecider()); | |
227 | |
239 for (size_t i = 0; i < arraysize(tests); ++i) { | 228 for (size_t i = 0; i < arraysize(tests); ++i) { |
240 content::PreviewsState previews_state = content::PREVIEWS_UNSPECIFIED; | 229 content::PreviewsState previews_state = content::PREVIEWS_UNSPECIFIED; |
241 if (tests[i].is_using_lofi) | 230 if (tests[i].is_server_lofi_on) |
242 previews_state |= content::SERVER_LOFI_ON; | 231 previews_state |= content::SERVER_LOFI_ON; |
243 if (tests[i].is_using_lite_page) | 232 if (tests[i].is_server_lite_page_on) |
244 previews_state |= content::SERVER_LITE_PAGE_ON; | 233 previews_state |= content::SERVER_LITE_PAGE_ON; |
245 if (previews_state == content::PREVIEWS_UNSPECIFIED) | 234 if (previews_state == content::PREVIEWS_UNSPECIFIED) |
246 previews_state = content::PREVIEWS_OFF; | 235 previews_state = content::PREVIEWS_OFF; |
247 | 236 |
248 std::unique_ptr<net::URLRequest> request = | 237 std::unique_ptr<net::URLRequest> request = |
249 CreateRequest(tests[i].is_main_frame, previews_state); | 238 CreateRequest(tests[i].is_main_frame, previews_state); |
250 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | |
251 command_line->InitFromArgv(command_line->argv()); | |
252 if (tests[i].is_using_lite_page) { | |
253 command_line->AppendSwitch(switches::kEnableDataReductionProxyLitePage); | |
254 } | |
255 | 239 |
256 // No flags or field trials. The Lo-Fi header should not be added. | |
257 net::HttpRequestHeaders headers; | 240 net::HttpRequestHeaders headers; |
258 NotifyBeforeSendHeaders(&headers, request.get(), true); | 241 lofi_decider->MaybeSetAcceptTransformHeader(*request.get(), &headers); |
259 VerifyLoFiHeader(false, false, headers); | |
260 VerifyLitePageHeader(false, false, headers); | |
261 VerifyLitePageIgnoreBlacklistHeader(false, headers); | |
262 | 242 |
263 // The Lo-Fi flag is "always-on", Lo-Fi is being used, and it's a main frame | 243 bool expect_lite_page = |
264 // request. Lo-Fi or lite page header should be added. | 244 tests[i].is_server_lite_page_on && tests[i].is_main_frame; |
265 command_line->AppendSwitchASCII( | 245 VerifyLitePageHeader(expect_lite_page, headers); |
266 switches::kDataReductionProxyLoFi, | |
267 switches::kDataReductionProxyLoFiValueAlwaysOn); | |
268 headers.Clear(); | |
269 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
270 VerifyLoFiHeader(!tests[i].is_main_frame && !tests[i].is_using_lite_page, | |
271 !tests[i].is_main_frame && !tests[i].is_using_lofi && | |
272 !tests[i].is_using_lite_page, | |
273 headers); | |
274 VerifyLitePageHeader(tests[i].is_using_lite_page && tests[i].is_main_frame, | |
275 false, headers); | |
276 VerifyLitePageIgnoreBlacklistHeader( | |
277 tests[i].is_using_lite_page && tests[i].is_main_frame, headers); | |
278 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | |
279 // |lofi_requested| should be set to false when Lo-Fi is enabled using | |
280 // flags. | |
281 EXPECT_FALSE(data->lofi_requested()); | |
282 | 246 |
283 // The Lo-Fi flag is "always-on" and Lo-Fi is being used. Lo-Fi header | 247 bool expect_lofi = tests[i].is_server_lofi_on && !tests[i].is_main_frame; |
284 // should be added. | 248 VerifyLoFiHeader(expect_lofi, headers); |
285 AllocateRequestInfoForTesting( | |
286 request.get(), content::RESOURCE_TYPE_SUB_FRAME, previews_state); | |
287 headers.Clear(); | |
288 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
289 VerifyLoFiHeader(!tests[i].is_using_lite_page, !tests[i].is_using_lofi, | |
290 headers); | |
291 VerifyLitePageHeader(false, false, headers); | |
292 VerifyLitePageIgnoreBlacklistHeader(false, headers); | |
293 | |
294 // The Lo-Fi flag is "cellular-only" and Lo-Fi is being used. Lo-Fi header | |
295 // should be added. | |
296 command_line->AppendSwitchASCII( | |
297 switches::kDataReductionProxyLoFi, | |
298 switches::kDataReductionProxyLoFiValueCellularOnly); | |
299 headers.Clear(); | |
300 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
301 VerifyLoFiHeader(!tests[i].is_using_lite_page, !tests[i].is_using_lofi, | |
302 headers); | |
303 VerifyLitePageHeader(false, false, headers); | |
304 VerifyLitePageIgnoreBlacklistHeader(false, headers); | |
305 data = DataReductionProxyData::GetData(*request); | |
306 // |lofi_requested| should be set to false when Lo-Fi is enabled using | |
307 // flags. | |
308 EXPECT_FALSE(data->lofi_requested()); | |
309 | |
310 // The Lo-Fi flag is "slow-connections-only" and Lo-Fi is being used. Lo-Fi | |
311 // header should be added. | |
312 command_line->AppendSwitchASCII( | |
313 switches::kDataReductionProxyLoFi, | |
314 switches::kDataReductionProxyLoFiValueSlowConnectionsOnly); | |
315 headers.Clear(); | |
316 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
317 VerifyLoFiHeader(!tests[i].is_using_lite_page, !tests[i].is_using_lofi, | |
318 headers); | |
319 VerifyLitePageHeader(false, false, headers); | |
320 VerifyLitePageIgnoreBlacklistHeader(false, headers); | |
321 data = DataReductionProxyData::GetData(*request); | |
322 // |lofi_requested| should be set to false when Lo-Fi is enabled using | |
323 // flags. | |
324 EXPECT_FALSE(data->lofi_requested()); | |
325 } | 249 } |
326 } | 250 } |
327 | 251 |
328 TEST_F(ContentLoFiDeciderTest, LoFiEnabledFieldTrial) { | 252 TEST_F(ContentLoFiDeciderTest, LoFiEnabledFieldTrialAndResourceTypes) { |
329 base::FieldTrialList field_trial_list(nullptr); | 253 base::FieldTrialList field_trial_list(nullptr); |
330 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 254 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
331 "Enabled"); | 255 "Enabled"); |
332 // Add the Lite Page fallback field trial. Having this enabled when not in the | 256 // Add the Lite Page fallback field trial. Having this enabled when not in the |
333 // Enabled_Previews group should not affect how Lo-Fi works. | 257 // Enabled_Previews group should not affect how Lo-Fi works. |
334 base::FieldTrialList::CreateFieldTrial( | 258 base::FieldTrialList::CreateFieldTrial( |
335 params::GetLitePageFallbackFieldTrialName(), "Enabled"); | 259 params::GetLitePageFallbackFieldTrialName(), "Enabled"); |
336 | 260 |
337 // Enable Lo-Fi. | 261 // Enable Lo-Fi. |
338 const struct { | 262 const struct { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
376 {true, content::RESOURCE_TYPE_CSP_REPORT}, | 300 {true, content::RESOURCE_TYPE_CSP_REPORT}, |
377 {true, content::RESOURCE_TYPE_PLUGIN_RESOURCE}}; | 301 {true, content::RESOURCE_TYPE_PLUGIN_RESOURCE}}; |
378 | 302 |
379 for (size_t i = 0; i < arraysize(tests); ++i) { | 303 for (size_t i = 0; i < arraysize(tests); ++i) { |
380 std::unique_ptr<net::URLRequest> request = | 304 std::unique_ptr<net::URLRequest> request = |
381 CreateRequestByType(tests[i].resource_type, false, | 305 CreateRequestByType(tests[i].resource_type, false, |
382 tests[i].is_using_lofi ? content::SERVER_LOFI_ON | 306 tests[i].is_using_lofi ? content::SERVER_LOFI_ON |
383 : content::PREVIEWS_OFF); | 307 : content::PREVIEWS_OFF); |
384 net::HttpRequestHeaders headers; | 308 net::HttpRequestHeaders headers; |
385 NotifyBeforeSendHeaders(&headers, request.get(), true); | 309 NotifyBeforeSendHeaders(&headers, request.get(), true); |
386 bool is_lofi_resource_type = | 310 bool is_lofi_resource_type = |
bengr
2017/05/01 16:53:13
Are there tests that cover !is_lofi_resource_type?
| |
387 !(tests[i].resource_type == content::RESOURCE_TYPE_MAIN_FRAME || | 311 !(tests[i].resource_type == content::RESOURCE_TYPE_MAIN_FRAME || |
388 tests[i].resource_type == content::RESOURCE_TYPE_STYLESHEET || | 312 tests[i].resource_type == content::RESOURCE_TYPE_STYLESHEET || |
389 tests[i].resource_type == content::RESOURCE_TYPE_SCRIPT || | 313 tests[i].resource_type == content::RESOURCE_TYPE_SCRIPT || |
390 tests[i].resource_type == content::RESOURCE_TYPE_FONT_RESOURCE || | 314 tests[i].resource_type == content::RESOURCE_TYPE_FONT_RESOURCE || |
391 tests[i].resource_type == content::RESOURCE_TYPE_MEDIA || | 315 tests[i].resource_type == content::RESOURCE_TYPE_MEDIA || |
392 tests[i].resource_type == content::RESOURCE_TYPE_CSP_REPORT); | 316 tests[i].resource_type == content::RESOURCE_TYPE_CSP_REPORT); |
393 | 317 |
394 VerifyLoFiHeader(is_lofi_resource_type, !tests[i].is_using_lofi, headers); | 318 VerifyLoFiHeader(tests[i].is_using_lofi && is_lofi_resource_type, headers); |
395 VerifyLitePageHeader(false, false, headers); | 319 VerifyLitePageHeader(false, headers); |
396 VerifyLitePageIgnoreBlacklistHeader(false, headers); | 320 VerifyForceLitePageHeader(false, headers); |
397 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | 321 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); |
398 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; | 322 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; |
399 } | 323 } |
400 } | 324 } |
401 | 325 |
402 TEST_F(ContentLoFiDeciderTest, LoFiControlFieldTrial) { | |
bengr
2017/05/01 16:53:13
Please explain why each of these tests can be dele
| |
403 base::FieldTrialList field_trial_list(nullptr); | |
404 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | |
405 "Control"); | |
406 // Enable Lo-Fi. | |
407 const struct { | |
408 bool is_using_lofi; | |
409 bool is_main_frame; | |
410 } tests[] = {{false, false}, {false, true}, {true, false}, {true, true}}; | |
411 | |
412 for (size_t i = 0; i < arraysize(tests); ++i) { | |
413 std::unique_ptr<net::URLRequest> request = CreateRequest( | |
414 tests[i].is_main_frame, tests[i].is_using_lofi ? content::SERVER_LOFI_ON | |
415 : content::PREVIEWS_OFF); | |
416 net::HttpRequestHeaders headers; | |
417 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
418 VerifyLoFiHeader(false, false, headers); | |
419 VerifyLitePageHeader(false, false, headers); | |
420 VerifyLitePageIgnoreBlacklistHeader(false, headers); | |
421 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | |
422 EXPECT_EQ(tests[i].is_using_lofi, data->lofi_requested()) << i; | |
423 } | |
424 } | |
425 | |
426 TEST_F(ContentLoFiDeciderTest, LitePageFieldTrial) { | |
427 base::FieldTrialList field_trial_list(nullptr); | |
428 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | |
429 "Enabled_Preview"); | |
430 // Enable Lo-Fi. | |
431 const struct { | |
432 bool is_using_lite_page; | |
433 bool is_main_frame; | |
434 } tests[] = { | |
435 {false, false}, {true, false}, {false, true}, {true, true}, | |
436 }; | |
437 | |
438 for (size_t i = 0; i < arraysize(tests); ++i) { | |
439 std::unique_ptr<net::URLRequest> request = | |
440 CreateRequest(tests[i].is_main_frame, tests[i].is_using_lite_page | |
441 ? content::SERVER_LITE_PAGE_ON | |
442 : content::PREVIEWS_OFF); | |
443 net::HttpRequestHeaders headers; | |
444 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
445 VerifyLoFiHeader(false, false, headers); | |
446 VerifyLitePageHeader(tests[i].is_main_frame, !tests[i].is_using_lite_page, | |
447 headers); | |
448 VerifyLitePageIgnoreBlacklistHeader(false, headers); | |
449 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | |
450 EXPECT_EQ(tests[i].is_using_lite_page, data->lofi_requested()) << i; | |
451 } | |
452 } | |
453 | |
454 TEST_F(ContentLoFiDeciderTest, LitePageFieldTrialFallbackEnabled) { | |
455 base::FieldTrialList field_trial_list(nullptr); | |
456 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | |
457 "Enabled_Preview"); | |
458 base::FieldTrialList::CreateFieldTrial( | |
459 params::GetLitePageFallbackFieldTrialName(), "Enabled"); | |
460 | |
461 // Enable Lo-Fi. | |
462 const struct { | |
463 bool is_using_lofi; | |
464 bool is_using_lite_page; | |
465 bool is_main_frame; | |
466 } tests[] = { | |
467 {false, false, false}, {false, false, true}, {true, false, true}, | |
468 {true, false, false}, {false, true, false}, {false, true, true}, | |
469 {true, true, true}, {true, true, false}, | |
470 }; | |
471 | |
472 for (size_t i = 0; i < arraysize(tests); ++i) { | |
473 content::PreviewsState previews_state = content::PREVIEWS_UNSPECIFIED; | |
474 if (tests[i].is_using_lofi) | |
475 previews_state |= content::SERVER_LOFI_ON; | |
476 if (tests[i].is_using_lite_page) | |
477 previews_state |= content::SERVER_LITE_PAGE_ON; | |
478 if (previews_state == content::PREVIEWS_UNSPECIFIED) | |
479 previews_state = content::PREVIEWS_OFF; | |
480 | |
481 std::unique_ptr<net::URLRequest> request = | |
482 CreateRequest(tests[i].is_main_frame, previews_state); | |
483 net::HttpRequestHeaders headers; | |
484 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
485 VerifyLoFiHeader(!tests[i].is_main_frame && !tests[i].is_using_lite_page, | |
486 !tests[i].is_main_frame && !tests[i].is_using_lofi && | |
487 !tests[i].is_using_lite_page, | |
488 headers); | |
489 VerifyLitePageHeader(tests[i].is_main_frame, | |
490 tests[i].is_main_frame && !tests[i].is_using_lite_page, | |
491 headers); | |
492 VerifyLitePageIgnoreBlacklistHeader(false, headers); | |
493 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | |
494 EXPECT_EQ(tests[i].is_using_lofi || tests[i].is_using_lite_page, | |
495 data->lofi_requested()) | |
496 << i; | |
497 } | |
498 } | |
499 | |
500 TEST_F(ContentLoFiDeciderTest, LitePageFieldTrialFallbackDisabled) { | |
501 base::FieldTrialList field_trial_list(nullptr); | |
502 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | |
503 "Enabled_Preview"); | |
504 // Enable Lo-Fi. | |
505 const struct { | |
506 bool is_using_lofi; | |
507 bool is_using_lite_page; | |
508 bool is_main_frame; | |
509 } tests[] = { | |
510 {false, false, false}, {false, false, true}, {true, false, true}, | |
511 {true, false, false}, {false, true, false}, {false, true, true}, | |
512 {true, true, true}, {true, true, false}, | |
513 }; | |
514 | |
515 for (size_t i = 0; i < arraysize(tests); ++i) { | |
516 content::PreviewsState previews_state = content::PREVIEWS_UNSPECIFIED; | |
517 if (tests[i].is_using_lofi) | |
518 previews_state |= content::SERVER_LOFI_ON; | |
519 if (tests[i].is_using_lite_page) | |
520 previews_state |= content::SERVER_LITE_PAGE_ON; | |
521 if (previews_state == content::PREVIEWS_UNSPECIFIED) | |
522 previews_state = content::PREVIEWS_OFF; | |
523 | |
524 std::unique_ptr<net::URLRequest> request = | |
525 CreateRequest(tests[i].is_main_frame, previews_state); | |
526 net::HttpRequestHeaders headers; | |
527 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
528 VerifyLoFiHeader(false, false, headers); | |
529 VerifyLitePageHeader(tests[i].is_main_frame, | |
530 tests[i].is_main_frame && !tests[i].is_using_lite_page, | |
531 headers); | |
532 VerifyLitePageIgnoreBlacklistHeader(false, headers); | |
533 DataReductionProxyData* data = DataReductionProxyData::GetData(*request); | |
534 EXPECT_EQ(tests[i].is_using_lofi || tests[i].is_using_lite_page, | |
535 data->lofi_requested()) | |
536 << i; | |
537 } | |
538 } | |
539 | |
540 TEST_F(ContentLoFiDeciderTest, AutoLoFi) { | |
541 const struct { | |
542 bool auto_lofi_enabled_group; | |
543 bool auto_lofi_control_group; | |
544 bool network_prohibitively_slow; | |
545 bool is_main_frame; | |
546 } tests[] = { | |
547 {false, false, false, false}, | |
548 {false, false, true, false}, | |
549 {true, false, false, false}, | |
550 {true, false, true, false}, | |
551 {true, false, true, true}, | |
552 {false, true, false, false}, | |
553 {false, true, true, false}, | |
554 // Repeat this test data to simulate user moving out of Lo-Fi control | |
555 // experiment. | |
556 {false, true, false, false}, | |
557 }; | |
558 | |
559 for (size_t i = 0; i < arraysize(tests); ++i) { | |
560 test_context_->config()->ResetLoFiStatusForTest(); | |
561 const bool expect_lofi_header = tests[i].auto_lofi_enabled_group && | |
562 !tests[i].is_main_frame; | |
563 | |
564 base::FieldTrialList field_trial_list(nullptr); | |
565 if (tests[i].auto_lofi_enabled_group) { | |
566 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | |
567 "Enabled"); | |
568 } | |
569 | |
570 if (tests[i].auto_lofi_control_group) { | |
571 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | |
572 "Control"); | |
573 } | |
574 | |
575 test_context_->config()->SetNetworkProhibitivelySlow( | |
576 tests[i].network_prohibitively_slow); | |
577 | |
578 std::unique_ptr<net::URLRequest> request = CreateRequest( | |
579 tests[i].is_main_frame, tests[i].network_prohibitively_slow); | |
580 net::HttpRequestHeaders headers; | |
581 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
582 | |
583 VerifyLoFiHeader(expect_lofi_header, !tests[i].network_prohibitively_slow, | |
584 headers); | |
585 } | |
586 } | |
587 | |
588 TEST_F(ContentLoFiDeciderTest, SlowConnectionsFlag) { | |
589 const struct { | |
590 bool slow_connections_flag_enabled; | |
591 bool network_prohibitively_slow; | |
592 bool auto_lofi_enabled_group; | |
593 bool is_main_frame; | |
594 } tests[] = { | |
595 {false, false, false, false}, {false, true, false, false}, | |
596 {true, false, false, false}, {true, true, false, false}, | |
597 {true, true, false, true}, {false, false, true, false}, | |
598 {false, false, true, true}, {false, true, true, false}, | |
599 {true, false, true, false}, {true, true, true, false}, | |
600 }; | |
601 | |
602 for (size_t i = 0; i < arraysize(tests); ++i) { | |
603 test_context_->config()->ResetLoFiStatusForTest(); | |
604 // For the purpose of this test, Lo-Fi header is expected only if LoFi Slow | |
605 // Connection Flag is enabled or session is part of Lo-Fi enabled field | |
606 // trial. For both cases, an additional condition is that network must be | |
607 // prohibitively slow. | |
608 const bool expect_lofi_header = ((tests[i].slow_connections_flag_enabled && | |
609 tests[i].network_prohibitively_slow) || | |
610 (!tests[i].slow_connections_flag_enabled && | |
611 tests[i].auto_lofi_enabled_group && | |
612 tests[i].network_prohibitively_slow)) && | |
613 !tests[i].is_main_frame; | |
614 | |
615 std::string expected_header; | |
616 | |
617 if (tests[i].slow_connections_flag_enabled) { | |
618 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
619 switches::kDataReductionProxyLoFi, | |
620 switches::kDataReductionProxyLoFiValueSlowConnectionsOnly); | |
621 } | |
622 | |
623 base::FieldTrialList field_trial_list(nullptr); | |
624 if (tests[i].auto_lofi_enabled_group) { | |
625 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | |
626 "Enabled"); | |
627 } | |
628 | |
629 test_context_->config()->SetNetworkProhibitivelySlow( | |
630 tests[i].network_prohibitively_slow); | |
631 | |
632 std::unique_ptr<net::URLRequest> request = CreateRequest( | |
633 tests[i].is_main_frame, tests[i].network_prohibitively_slow); | |
634 net::HttpRequestHeaders headers; | |
635 NotifyBeforeSendHeaders(&headers, request.get(), true); | |
636 | |
637 VerifyLoFiHeader(expect_lofi_header, false, headers); | |
638 } | |
639 } | |
640 | |
641 TEST_F(ContentLoFiDeciderTest, ProxyIsNotDataReductionProxy) { | 326 TEST_F(ContentLoFiDeciderTest, ProxyIsNotDataReductionProxy) { |
642 base::FieldTrialList field_trial_list(nullptr); | 327 base::FieldTrialList field_trial_list(nullptr); |
643 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 328 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
644 "Enabled"); | 329 "Enabled"); |
645 // Enable Lo-Fi. | 330 // Enable Lo-Fi. |
646 const struct { | 331 const struct { |
647 content::PreviewsState previews_state; | 332 content::PreviewsState previews_state; |
648 } tests[] = { | 333 } tests[] = { |
649 {content::PREVIEWS_OFF}, {content::SERVER_LOFI_ON}, | 334 {content::PREVIEWS_OFF}, {content::SERVER_LOFI_ON}, |
650 }; | 335 }; |
651 | 336 |
652 for (size_t i = 0; i < arraysize(tests); ++i) { | 337 for (size_t i = 0; i < arraysize(tests); ++i) { |
653 std::unique_ptr<net::URLRequest> request = | 338 std::unique_ptr<net::URLRequest> request = |
654 CreateRequest(false, tests[i].previews_state); | 339 CreateRequest(false, tests[i].previews_state); |
655 net::HttpRequestHeaders headers; | 340 net::HttpRequestHeaders headers; |
656 NotifyBeforeSendHeaders(&headers, request.get(), false); | 341 NotifyBeforeSendHeaders(&headers, request.get(), false); |
657 std::string header_value; | 342 std::string header_value; |
658 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); | 343 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); |
659 EXPECT_EQ(std::string::npos, header_value.find(empty_image_directive())); | 344 EXPECT_EQ(std::string::npos, header_value.find(empty_image_directive())); |
660 } | 345 } |
661 } | 346 } |
662 | 347 |
663 TEST_F(ContentLoFiDeciderTest, VideoDirectiveNotOverridden) { | 348 TEST_F(ContentLoFiDeciderTest, VideoDirectiveNotOverridden) { |
664 base::FieldTrialList field_trial_list(nullptr); | 349 base::FieldTrialList field_trial_list(nullptr); |
665 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 350 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
666 "Enabled"); | 351 "Enabled"); |
667 // Verify the directive gets added even when LoFi is triggered. | 352 // Verify the directive gets added even when LoFi is triggered. |
668 test_context_->config()->SetNetworkProhibitivelySlow(true); | |
669 std::unique_ptr<net::URLRequest> request = | 353 std::unique_ptr<net::URLRequest> request = |
670 CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); | 354 CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); |
671 net::HttpRequestHeaders headers; | 355 net::HttpRequestHeaders headers; |
672 NotifyBeforeSendHeaders(&headers, request.get(), true); | 356 NotifyBeforeSendHeaders(&headers, request.get(), true); |
673 VerifyVideoHeader(true, headers); | 357 VerifyVideoHeader(true, headers); |
674 } | 358 } |
675 | 359 |
676 TEST_F(ContentLoFiDeciderTest, VideoDirectiveNotAdded) { | 360 TEST_F(ContentLoFiDeciderTest, VideoDirectiveNotAdded) { |
677 base::FieldTrialList field_trial_list(nullptr); | 361 base::FieldTrialList field_trial_list(nullptr); |
678 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 362 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
679 "Enabled"); | 363 "Enabled"); |
680 test_context_->config()->SetNetworkProhibitivelySlow(true); | |
681 std::unique_ptr<net::URLRequest> request = | 364 std::unique_ptr<net::URLRequest> request = |
682 CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); | 365 CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); |
683 net::HttpRequestHeaders headers; | 366 net::HttpRequestHeaders headers; |
684 // Verify the header isn't there when the data reduction proxy is disabled. | 367 // Verify the header isn't there when the data reduction proxy is disabled. |
685 NotifyBeforeSendHeaders(&headers, request.get(), false); | 368 NotifyBeforeSendHeaders(&headers, request.get(), false); |
686 VerifyVideoHeader(false, headers); | 369 VerifyVideoHeader(false, headers); |
687 } | 370 } |
688 | 371 |
689 TEST_F(ContentLoFiDeciderTest, VideoDirectiveDoesNotOverride) { | 372 TEST_F(ContentLoFiDeciderTest, VideoDirectiveDoesNotOverride) { |
690 base::FieldTrialList field_trial_list(nullptr); | 373 base::FieldTrialList field_trial_list(nullptr); |
691 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 374 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
692 "Enabled"); | 375 "Enabled"); |
693 // Verify the directive gets added even when LoFi is triggered. | 376 // Verify the directive gets added even when LoFi is triggered. |
694 test_context_->config()->SetNetworkProhibitivelySlow(true); | |
695 std::unique_ptr<net::URLRequest> request = | 377 std::unique_ptr<net::URLRequest> request = |
696 CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); | 378 CreateRequestByType(content::RESOURCE_TYPE_MEDIA, false, true); |
697 net::HttpRequestHeaders headers; | 379 net::HttpRequestHeaders headers; |
698 headers.SetHeader(chrome_proxy_accept_transform_header(), "foo"); | 380 headers.SetHeader(chrome_proxy_accept_transform_header(), "foo"); |
699 NotifyBeforeSendHeaders(&headers, request.get(), true); | 381 NotifyBeforeSendHeaders(&headers, request.get(), true); |
700 std::string header_value; | 382 std::string header_value; |
701 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); | 383 headers.GetHeader(chrome_proxy_accept_transform_header(), &header_value); |
702 EXPECT_EQ("foo", header_value); | 384 EXPECT_EQ("foo", header_value); |
703 } | 385 } |
704 | 386 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
742 TEST_F(ContentLoFiDeciderTest, RemoveAcceptTransformHeader) { | 424 TEST_F(ContentLoFiDeciderTest, RemoveAcceptTransformHeader) { |
743 std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( | 425 std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( |
744 new data_reduction_proxy::ContentLoFiDecider()); | 426 new data_reduction_proxy::ContentLoFiDecider()); |
745 net::HttpRequestHeaders headers; | 427 net::HttpRequestHeaders headers; |
746 headers.SetHeader(chrome_proxy_accept_transform_header(), "Foo"); | 428 headers.SetHeader(chrome_proxy_accept_transform_header(), "Foo"); |
747 EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); | 429 EXPECT_TRUE(headers.HasHeader(chrome_proxy_accept_transform_header())); |
748 lofi_decider->RemoveAcceptTransformHeader(&headers); | 430 lofi_decider->RemoveAcceptTransformHeader(&headers); |
749 EXPECT_FALSE(headers.HasHeader(chrome_proxy_accept_transform_header())); | 431 EXPECT_FALSE(headers.HasHeader(chrome_proxy_accept_transform_header())); |
750 } | 432 } |
751 | 433 |
752 TEST_F(ContentLoFiDeciderTest, MaybeIgnoreBlacklist) { | 434 TEST_F(ContentLoFiDeciderTest, MaybeForceLitePage) { |
753 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | 435 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
754 command_line->InitFromArgv(command_line->argv()); | 436 command_line->InitFromArgv(command_line->argv()); |
755 std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( | 437 std::unique_ptr<data_reduction_proxy::ContentLoFiDecider> lofi_decider( |
756 new data_reduction_proxy::ContentLoFiDecider()); | 438 new data_reduction_proxy::ContentLoFiDecider()); |
757 net::HttpRequestHeaders headers; | 439 net::HttpRequestHeaders headers; |
758 lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); | 440 lofi_decider->MaybeSetForceLitePageDirective(&headers); |
759 EXPECT_FALSE(headers.HasHeader(chrome_proxy_header())); | 441 EXPECT_FALSE(headers.HasHeader(chrome_proxy_header())); |
760 | 442 |
761 headers.SetHeader(chrome_proxy_header(), "Foo"); | 443 headers.SetHeader(chrome_proxy_header(), "Foo"); |
762 lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); | 444 lofi_decider->MaybeSetForceLitePageDirective(&headers); |
763 std::string header_value; | 445 std::string header_value; |
764 headers.GetHeader(chrome_proxy_header(), &header_value); | 446 headers.GetHeader(chrome_proxy_header(), &header_value); |
765 EXPECT_EQ("Foo", header_value); | 447 EXPECT_EQ("Foo", header_value); |
766 | 448 |
767 headers.RemoveHeader(chrome_proxy_header()); | 449 headers.RemoveHeader(chrome_proxy_header()); |
768 command_line->AppendSwitch(switches::kEnableDataReductionProxyLitePage); | 450 command_line->AppendSwitch(switches::kEnableDataReductionProxyLitePage); |
769 headers.SetHeader(chrome_proxy_accept_transform_header(), "empty-image"); | 451 headers.SetHeader(chrome_proxy_accept_transform_header(), "empty-image"); |
770 lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); | 452 lofi_decider->MaybeSetForceLitePageDirective(&headers); |
771 EXPECT_FALSE(headers.HasHeader(chrome_proxy_header())); | 453 EXPECT_FALSE(headers.HasHeader(chrome_proxy_header())); |
772 | 454 |
773 headers.SetHeader(chrome_proxy_accept_transform_header(), "lite-page"); | 455 headers.SetHeader(chrome_proxy_accept_transform_header(), "lite-page"); |
774 lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); | 456 lofi_decider->MaybeSetForceLitePageDirective(&headers); |
775 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); | 457 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); |
776 headers.GetHeader(chrome_proxy_header(), &header_value); | 458 headers.GetHeader(chrome_proxy_header(), &header_value); |
777 EXPECT_EQ("exp=ignore_preview_blacklist", header_value); | 459 EXPECT_EQ("exp=force_lite_page", header_value); |
778 | 460 |
779 headers.SetHeader(chrome_proxy_header(), "Foo"); | 461 headers.SetHeader(chrome_proxy_header(), "Foo"); |
780 lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(&headers); | 462 lofi_decider->MaybeSetForceLitePageDirective(&headers); |
781 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); | 463 EXPECT_TRUE(headers.HasHeader(chrome_proxy_header())); |
782 headers.GetHeader(chrome_proxy_header(), &header_value); | 464 headers.GetHeader(chrome_proxy_header(), &header_value); |
783 EXPECT_EQ("Foo, exp=ignore_preview_blacklist", header_value); | 465 EXPECT_EQ("Foo, exp=force_lite_page", header_value); |
784 } | 466 } |
785 | 467 |
786 TEST_F(ContentLoFiDeciderTest, NoTransformDoesNotAddHeader) { | 468 TEST_F(ContentLoFiDeciderTest, NoTransformDoesNotAddHeader) { |
787 base::FieldTrialList field_trial_list(nullptr); | 469 base::FieldTrialList field_trial_list(nullptr); |
788 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), | 470 base::FieldTrialList::CreateFieldTrial(params::GetLoFiFieldTrialName(), |
789 "Enabled"); | 471 "Enabled"); |
790 std::unique_ptr<net::URLRequest> request = | 472 std::unique_ptr<net::URLRequest> request = |
791 CreateRequest(false, content::PREVIEWS_NO_TRANSFORM); | 473 CreateRequest(false, content::PREVIEWS_OFF); |
792 net::HttpRequestHeaders headers; | 474 net::HttpRequestHeaders headers; |
793 NotifyBeforeSendHeaders(&headers, request.get(), true); | 475 NotifyBeforeSendHeaders(&headers, request.get(), true); |
794 EXPECT_FALSE(headers.HasHeader(chrome_proxy_accept_transform_header())); | 476 EXPECT_FALSE(headers.HasHeader(chrome_proxy_accept_transform_header())); |
795 } | 477 } |
796 | 478 |
797 } // namespace data_reduction_proxy | 479 } // namespace data_reduction_proxy |
OLD | NEW |