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

Side by Side Diff: components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc

Issue 2802843003: Update CPAT protocol to send lite-page transform acceptance with ect
Patch Set: Merge with testLitePageBTF Created 3 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
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698