OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/predictors/resource_prefetch_predictor.h" | 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h" |
6 | 6 |
7 #include <iostream> | 7 #include <iostream> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
13 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
15 #include "chrome/browser/history/history_service_factory.h" | 15 #include "chrome/browser/history/history_service_factory.h" |
16 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" | 16 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" |
| 17 #include "chrome/browser/predictors/resource_prefetch_predictor_test_util.h" |
17 #include "chrome/test/base/testing_profile.h" | 18 #include "chrome/test/base/testing_profile.h" |
18 #include "components/history/core/browser/history_service.h" | 19 #include "components/history/core/browser/history_service.h" |
19 #include "components/history/core/browser/history_types.h" | 20 #include "components/history/core/browser/history_types.h" |
20 #include "content/public/browser/resource_request_info.h" | 21 #include "content/public/browser/resource_request_info.h" |
21 #include "content/public/test/test_browser_thread.h" | 22 #include "content/public/test/test_browser_thread.h" |
22 #include "net/http/http_response_headers.h" | 23 #include "net/http/http_response_headers.h" |
23 #include "net/url_request/url_request_context.h" | 24 #include "net/url_request/url_request_context.h" |
24 #include "net/url_request/url_request_job.h" | 25 #include "net/url_request/url_request_job.h" |
25 #include "net/url_request/url_request_test_util.h" | 26 #include "net/url_request/url_request_test_util.h" |
26 #include "net/url_request/url_request_test_util.h" | 27 #include "net/url_request/url_request_test_util.h" |
27 #include "testing/gmock/include/gmock/gmock.h" | 28 #include "testing/gmock/include/gmock/gmock.h" |
28 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
29 | 30 |
30 using testing::ContainerEq; | 31 using testing::ContainerEq; |
31 using testing::Pointee; | 32 using testing::Pointee; |
32 using testing::SetArgPointee; | 33 using testing::SetArgPointee; |
33 using testing::StrictMock; | 34 using testing::StrictMock; |
34 | 35 |
| 36 using chrome_browser_predictors::ResourceData; |
| 37 |
35 namespace predictors { | 38 namespace predictors { |
36 | 39 |
37 typedef ResourcePrefetchPredictor::URLRequestSummary URLRequestSummary; | 40 typedef ResourcePrefetchPredictor::URLRequestSummary URLRequestSummary; |
38 typedef ResourcePrefetchPredictorTables::ResourceRow ResourceRow; | |
39 typedef std::vector<ResourceRow> ResourceRows; | |
40 typedef ResourcePrefetchPredictorTables::PrefetchData PrefetchData; | 41 typedef ResourcePrefetchPredictorTables::PrefetchData PrefetchData; |
41 typedef ResourcePrefetchPredictorTables::PrefetchDataMap PrefetchDataMap; | 42 typedef ResourcePrefetchPredictorTables::PrefetchDataMap PrefetchDataMap; |
42 | 43 |
43 // For printing failures nicely. | |
44 void PrintTo(const ResourceRow& row, ::std::ostream* os) { | |
45 *os << "[" << row.primary_key << "," << row.resource_url | |
46 << "," << row.resource_type << "," << row.number_of_hits | |
47 << "," << row.number_of_misses << "," << row.consecutive_misses | |
48 << "," << row.average_position << "," << row.score << "]"; | |
49 } | |
50 | |
51 void PrintTo(const PrefetchData& data, ::std::ostream* os) { | |
52 *os << "[" << data.key_type << "," << data.primary_key | |
53 << "," << data.last_visit.ToInternalValue() << "]\n"; | |
54 for (ResourceRows::const_iterator it = data.resources.begin(); | |
55 it != data.resources.end(); ++it) { | |
56 *os << "\t\t"; | |
57 PrintTo(*it, os); | |
58 *os << "\n"; | |
59 } | |
60 } | |
61 | |
62 scoped_refptr<net::HttpResponseHeaders> MakeResponseHeaders( | 44 scoped_refptr<net::HttpResponseHeaders> MakeResponseHeaders( |
63 const char* headers) { | 45 const char* headers) { |
64 return make_scoped_refptr(new net::HttpResponseHeaders( | 46 return make_scoped_refptr(new net::HttpResponseHeaders( |
65 net::HttpUtil::AssembleRawHeaders(headers, strlen(headers)))); | 47 net::HttpUtil::AssembleRawHeaders(headers, strlen(headers)))); |
66 } | 48 } |
67 | 49 |
68 class EmptyURLRequestDelegate : public net::URLRequest::Delegate { | 50 class EmptyURLRequestDelegate : public net::URLRequest::Delegate { |
69 void OnResponseStarted(net::URLRequest* request) override {} | 51 void OnResponseStarted(net::URLRequest* request) override {} |
70 void OnReadCompleted(net::URLRequest* request, int bytes_read) override {} | 52 void OnReadCompleted(net::URLRequest* request, int bytes_read) override {} |
71 }; | 53 }; |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 | 301 |
320 void ResourcePrefetchPredictorTest::TearDown() { | 302 void ResourcePrefetchPredictorTest::TearDown() { |
321 predictor_.reset(NULL); | 303 predictor_.reset(NULL); |
322 profile_->DestroyHistoryService(); | 304 profile_->DestroyHistoryService(); |
323 } | 305 } |
324 | 306 |
325 void ResourcePrefetchPredictorTest::InitializeSampleData() { | 307 void ResourcePrefetchPredictorTest::InitializeSampleData() { |
326 { // Url data. | 308 { // Url data. |
327 PrefetchData google(PREFETCH_KEY_TYPE_URL, "http://www.google.com/"); | 309 PrefetchData google(PREFETCH_KEY_TYPE_URL, "http://www.google.com/"); |
328 google.last_visit = base::Time::FromInternalValue(1); | 310 google.last_visit = base::Time::FromInternalValue(1); |
329 google.resources.push_back( | 311 google.resources.push_back(MakeResourceData( |
330 ResourceRow(std::string(), "http://google.com/style1.css", | 312 "http://google.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 3, 2, |
331 content::RESOURCE_TYPE_STYLESHEET, 3, 2, 1, 1.0, | 313 1, 1.0, net::MEDIUM, false, false)); |
332 net::MEDIUM, false, false)); | 314 google.resources.push_back(MakeResourceData( |
333 google.resources.push_back(ResourceRow(std::string(), | 315 "http://google.com/script3.js", content::RESOURCE_TYPE_SCRIPT, 4, 0, 1, |
334 "http://google.com/script3.js", | 316 2.1, net::MEDIUM, false, false)); |
335 content::RESOURCE_TYPE_SCRIPT, 4, 0, | 317 google.resources.push_back(MakeResourceData( |
336 1, 2.1, net::MEDIUM, false, false)); | 318 "http://google.com/script4.js", content::RESOURCE_TYPE_SCRIPT, 11, 0, 0, |
337 google.resources.push_back(ResourceRow(std::string(), | 319 2.1, net::MEDIUM, false, false)); |
338 "http://google.com/script4.js", | 320 google.resources.push_back(MakeResourceData( |
339 content::RESOURCE_TYPE_SCRIPT, 11, 0, | 321 "http://google.com/image1.png", content::RESOURCE_TYPE_IMAGE, 6, 3, 0, |
340 0, 2.1, net::MEDIUM, false, false)); | 322 2.2, net::MEDIUM, false, false)); |
341 google.resources.push_back(ResourceRow( | 323 google.resources.push_back(MakeResourceData( |
342 std::string(), "http://google.com/image1.png", | 324 "http://google.com/a.font", content::RESOURCE_TYPE_LAST_TYPE, 2, 0, 0, |
343 content::RESOURCE_TYPE_IMAGE, 6, 3, 0, 2.2, net::MEDIUM, false, false)); | 325 5.1, net::MEDIUM, false, false)); |
344 google.resources.push_back( | |
345 ResourceRow(std::string(), "http://google.com/a.font", | |
346 content::RESOURCE_TYPE_LAST_TYPE, 2, 0, 0, 5.1, net::MEDIUM, | |
347 false, false)); | |
348 | 326 |
349 PrefetchData reddit(PREFETCH_KEY_TYPE_URL, "http://www.reddit.com/"); | 327 PrefetchData reddit(PREFETCH_KEY_TYPE_URL, "http://www.reddit.com/"); |
350 reddit.last_visit = base::Time::FromInternalValue(2); | 328 reddit.last_visit = base::Time::FromInternalValue(2); |
351 reddit.resources.push_back( | 329 reddit.resources.push_back(MakeResourceData( |
352 ResourceRow(std::string(), "http://reddit-resource.com/script1.js", | 330 "http://reddit-resource.com/script1.js", content::RESOURCE_TYPE_SCRIPT, |
353 content::RESOURCE_TYPE_SCRIPT, 4, 0, 1, 1.0, net::MEDIUM, | 331 4, 0, 1, 1.0, net::MEDIUM, false, false)); |
354 false, false)); | 332 reddit.resources.push_back(MakeResourceData( |
355 reddit.resources.push_back( | 333 "http://reddit-resource.com/script2.js", content::RESOURCE_TYPE_SCRIPT, |
356 ResourceRow(std::string(), "http://reddit-resource.com/script2.js", | 334 2, 0, 0, 2.1, net::MEDIUM, false, false)); |
357 content::RESOURCE_TYPE_SCRIPT, 2, 0, 0, 2.1, net::MEDIUM, | |
358 false, false)); | |
359 | 335 |
360 PrefetchData yahoo(PREFETCH_KEY_TYPE_URL, "http://www.yahoo.com/"); | 336 PrefetchData yahoo(PREFETCH_KEY_TYPE_URL, "http://www.yahoo.com/"); |
361 yahoo.last_visit = base::Time::FromInternalValue(3); | 337 yahoo.last_visit = base::Time::FromInternalValue(3); |
362 yahoo.resources.push_back(ResourceRow(std::string(), | 338 yahoo.resources.push_back(MakeResourceData( |
363 "http://google.com/image.png", | 339 "http://google.com/image.png", content::RESOURCE_TYPE_IMAGE, 20, 1, 0, |
364 content::RESOURCE_TYPE_IMAGE, 20, 1, | 340 10.0, net::MEDIUM, false, false)); |
365 0, 10.0, net::MEDIUM, false, false)); | |
366 | 341 |
367 test_url_data_.clear(); | 342 test_url_data_.clear(); |
368 test_url_data_.insert(std::make_pair("http://www.google.com/", google)); | 343 test_url_data_.insert(std::make_pair("http://www.google.com/", google)); |
369 test_url_data_.insert(std::make_pair("http://www.reddit.com/", reddit)); | 344 test_url_data_.insert(std::make_pair("http://www.reddit.com/", reddit)); |
370 test_url_data_.insert(std::make_pair("http://www.yahoo.com/", yahoo)); | 345 test_url_data_.insert(std::make_pair("http://www.yahoo.com/", yahoo)); |
371 } | 346 } |
372 | 347 |
373 { // Host data. | 348 { // Host data. |
374 PrefetchData facebook(PREFETCH_KEY_TYPE_HOST, "www.facebook.com"); | 349 PrefetchData facebook(PREFETCH_KEY_TYPE_HOST, "www.facebook.com"); |
375 facebook.last_visit = base::Time::FromInternalValue(4); | 350 facebook.last_visit = base::Time::FromInternalValue(4); |
| 351 facebook.resources.push_back(MakeResourceData( |
| 352 "http://www.facebook.com/style.css", content::RESOURCE_TYPE_STYLESHEET, |
| 353 5, 2, 1, 1.1, net::MEDIUM, false, false)); |
| 354 facebook.resources.push_back(MakeResourceData( |
| 355 "http://www.facebook.com/script.js", content::RESOURCE_TYPE_SCRIPT, 4, |
| 356 0, 1, 2.1, net::MEDIUM, false, false)); |
| 357 facebook.resources.push_back(MakeResourceData( |
| 358 "http://www.facebook.com/image.png", content::RESOURCE_TYPE_IMAGE, 6, 3, |
| 359 0, 2.2, net::MEDIUM, false, false)); |
| 360 facebook.resources.push_back(MakeResourceData( |
| 361 "http://www.facebook.com/a.font", content::RESOURCE_TYPE_LAST_TYPE, 2, |
| 362 0, 0, 5.1, net::MEDIUM, false, false)); |
376 facebook.resources.push_back( | 363 facebook.resources.push_back( |
377 ResourceRow(std::string(), "http://www.facebook.com/style.css", | 364 MakeResourceData("http://www.resources.facebook.com/script.js", |
378 content::RESOURCE_TYPE_STYLESHEET, 5, 2, 1, 1.1, | 365 content::RESOURCE_TYPE_SCRIPT, 11, 0, 0, 8.5, |
379 net::MEDIUM, false, false)); | 366 net::MEDIUM, false, false)); |
380 facebook.resources.push_back( | |
381 ResourceRow(std::string(), "http://www.facebook.com/script.js", | |
382 content::RESOURCE_TYPE_SCRIPT, 4, 0, 1, 2.1, net::MEDIUM, | |
383 false, false)); | |
384 facebook.resources.push_back(ResourceRow( | |
385 std::string(), "http://www.facebook.com/image.png", | |
386 content::RESOURCE_TYPE_IMAGE, 6, 3, 0, 2.2, net::MEDIUM, false, false)); | |
387 facebook.resources.push_back( | |
388 ResourceRow(std::string(), "http://www.facebook.com/a.font", | |
389 content::RESOURCE_TYPE_LAST_TYPE, 2, 0, 0, 5.1, net::MEDIUM, | |
390 false, false)); | |
391 facebook.resources.push_back(ResourceRow( | |
392 std::string(), "http://www.resources.facebook.com/script.js", | |
393 content::RESOURCE_TYPE_SCRIPT, 11, 0, 0, 8.5, net::MEDIUM, false, | |
394 false)); | |
395 | 367 |
396 PrefetchData yahoo(PREFETCH_KEY_TYPE_HOST, "www.yahoo.com"); | 368 PrefetchData yahoo(PREFETCH_KEY_TYPE_HOST, "www.yahoo.com"); |
397 yahoo.last_visit = base::Time::FromInternalValue(5); | 369 yahoo.last_visit = base::Time::FromInternalValue(5); |
398 yahoo.resources.push_back(ResourceRow(std::string(), | 370 yahoo.resources.push_back(MakeResourceData( |
399 "http://google.com/image.png", | 371 "http://google.com/image.png", content::RESOURCE_TYPE_IMAGE, 20, 1, 0, |
400 content::RESOURCE_TYPE_IMAGE, 20, 1, | 372 10.0, net::MEDIUM, false, false)); |
401 0, 10.0, net::MEDIUM, false, false)); | |
402 | 373 |
403 test_host_data_.clear(); | 374 test_host_data_.clear(); |
404 test_host_data_.insert(std::make_pair("www.facebook.com", facebook)); | 375 test_host_data_.insert(std::make_pair("www.facebook.com", facebook)); |
405 test_host_data_.insert(std::make_pair("www.yahoo.com", yahoo)); | 376 test_host_data_.insert(std::make_pair("www.yahoo.com", yahoo)); |
406 } | 377 } |
407 } | 378 } |
408 | 379 |
409 TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeEmpty) { | 380 TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeEmpty) { |
410 // Tests that the predictor initializes correctly without any data. | 381 // Tests that the predictor initializes correctly without any data. |
411 EXPECT_TRUE(predictor_->url_table_cache_->empty()); | 382 EXPECT_TRUE(predictor_->url_table_cache_->empty()); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 URLRequestSummary resource2 = CreateURLRequestSummary( | 424 URLRequestSummary resource2 = CreateURLRequestSummary( |
454 1, 1, "http://www.google.com", "http://google.com/script1.js", | 425 1, 1, "http://www.google.com", "http://google.com/script1.js", |
455 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); | 426 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); |
456 predictor_->RecordURLResponse(resource2); | 427 predictor_->RecordURLResponse(resource2); |
457 URLRequestSummary resource3 = CreateURLRequestSummary( | 428 URLRequestSummary resource3 = CreateURLRequestSummary( |
458 1, 1, "http://www.google.com", "http://google.com/script2.js", | 429 1, 1, "http://www.google.com", "http://google.com/script2.js", |
459 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); | 430 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); |
460 predictor_->RecordURLResponse(resource3); | 431 predictor_->RecordURLResponse(resource3); |
461 | 432 |
462 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com"); | 433 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com"); |
463 host_data.resources.push_back( | 434 host_data.resources.push_back(MakeResourceData( |
464 ResourceRow(std::string(), "http://google.com/style1.css", | 435 "http://google.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0, |
465 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, net::MEDIUM, | 436 0, 1.0, net::MEDIUM, false, false)); |
466 false, false)); | 437 host_data.resources.push_back(MakeResourceData( |
467 host_data.resources.push_back(ResourceRow( | 438 "http://google.com/script1.js", content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, |
468 std::string(), "http://google.com/script1.js", | 439 2.0, net::MEDIUM, false, false)); |
469 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false)); | 440 host_data.resources.push_back(MakeResourceData( |
470 host_data.resources.push_back(ResourceRow( | 441 "http://google.com/script2.js", content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, |
471 std::string(), "http://google.com/script2.js", | 442 3.0, net::MEDIUM, false, false)); |
472 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false)); | |
473 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); | 443 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); |
474 | 444 |
475 predictor_->OnNavigationComplete(main_frame.navigation_id); | 445 predictor_->OnNavigationComplete(main_frame.navigation_id); |
476 profile_->BlockUntilHistoryProcessesPendingRequests(); | 446 profile_->BlockUntilHistoryProcessesPendingRequests(); |
477 } | 447 } |
478 | 448 |
479 TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) { | 449 TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) { |
480 // Single navigation that will be recorded. Will check for duplicate | 450 // Single navigation that will be recorded. Will check for duplicate |
481 // resources and also for number of resources saved. | 451 // resources and also for number of resources saved. |
482 AddUrlToHistory("http://www.google.com", 4); | 452 AddUrlToHistory("http://www.google.com", 4); |
(...skipping 27 matching lines...) Expand all Loading... |
510 URLRequestSummary resource6 = CreateURLRequestSummary( | 480 URLRequestSummary resource6 = CreateURLRequestSummary( |
511 1, 1, "http://www.google.com", "http://google.com/image2.png", | 481 1, 1, "http://www.google.com", "http://google.com/image2.png", |
512 content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false); | 482 content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false); |
513 predictor_->RecordURLResponse(resource6); | 483 predictor_->RecordURLResponse(resource6); |
514 URLRequestSummary resource7 = CreateURLRequestSummary( | 484 URLRequestSummary resource7 = CreateURLRequestSummary( |
515 1, 1, "http://www.google.com", "http://google.com/style2.css", | 485 1, 1, "http://www.google.com", "http://google.com/style2.css", |
516 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); | 486 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); |
517 predictor_->RecordURLResponse(resource7); | 487 predictor_->RecordURLResponse(resource7); |
518 | 488 |
519 PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.google.com/"); | 489 PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.google.com/"); |
520 url_data.resources.push_back( | 490 url_data.resources.push_back(MakeResourceData( |
521 ResourceRow(std::string(), "http://google.com/style1.css", | 491 "http://google.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0, |
522 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, net::MEDIUM, | 492 0, 1.0, net::MEDIUM, false, false)); |
523 false, false)); | 493 url_data.resources.push_back(MakeResourceData( |
524 url_data.resources.push_back(ResourceRow( | 494 "http://google.com/script1.js", content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, |
525 std::string(), "http://google.com/script1.js", | 495 2.0, net::MEDIUM, false, false)); |
526 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false)); | 496 url_data.resources.push_back(MakeResourceData( |
527 url_data.resources.push_back(ResourceRow( | 497 "http://google.com/script2.js", content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, |
528 std::string(), "http://google.com/script2.js", | 498 3.0, net::MEDIUM, false, false)); |
529 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false)); | 499 url_data.resources.push_back(MakeResourceData( |
530 url_data.resources.push_back( | 500 "http://google.com/style2.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0, |
531 ResourceRow(std::string(), "http://google.com/style2.css", | 501 0, 7.0, net::MEDIUM, false, false)); |
532 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 7.0, net::MEDIUM, | |
533 false, false)); | |
534 EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_)); | 502 EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_)); |
535 | 503 |
536 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com"); | 504 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com"); |
537 host_data.resources = url_data.resources; | 505 host_data.resources = url_data.resources; |
538 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); | 506 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); |
539 | 507 |
540 predictor_->OnNavigationComplete(main_frame.navigation_id); | 508 predictor_->OnNavigationComplete(main_frame.navigation_id); |
541 profile_->BlockUntilHistoryProcessesPendingRequests(); | 509 profile_->BlockUntilHistoryProcessesPendingRequests(); |
542 } | 510 } |
543 | 511 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 URLRequestSummary resource6 = CreateURLRequestSummary( | 553 URLRequestSummary resource6 = CreateURLRequestSummary( |
586 1, 1, "http://www.google.com", "http://google.com/image2.png", | 554 1, 1, "http://www.google.com", "http://google.com/image2.png", |
587 content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false); | 555 content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false); |
588 predictor_->RecordURLResponse(resource6); | 556 predictor_->RecordURLResponse(resource6); |
589 URLRequestSummary resource7 = CreateURLRequestSummary( | 557 URLRequestSummary resource7 = CreateURLRequestSummary( |
590 1, 1, "http://www.google.com", "http://google.com/style2.css", | 558 1, 1, "http://www.google.com", "http://google.com/style2.css", |
591 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); | 559 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); |
592 predictor_->RecordURLResponse(resource7); | 560 predictor_->RecordURLResponse(resource7); |
593 | 561 |
594 PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.google.com/"); | 562 PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.google.com/"); |
595 url_data.resources.push_back( | 563 url_data.resources.push_back(MakeResourceData( |
596 ResourceRow(std::string(), "http://google.com/style1.css", | 564 "http://google.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 4, 2, |
597 content::RESOURCE_TYPE_STYLESHEET, 4, 2, 0, 1.0, net::MEDIUM, | 565 0, 1.0, net::MEDIUM, false, false)); |
598 false, false)); | 566 url_data.resources.push_back(MakeResourceData( |
599 url_data.resources.push_back(ResourceRow( | 567 "http://google.com/script1.js", content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, |
600 std::string(), "http://google.com/script1.js", | 568 2.0, net::MEDIUM, false, false)); |
601 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false)); | 569 url_data.resources.push_back(MakeResourceData( |
602 url_data.resources.push_back(ResourceRow( | 570 "http://google.com/script4.js", content::RESOURCE_TYPE_SCRIPT, 11, 1, 1, |
603 std::string(), "http://google.com/script4.js", | 571 2.1, net::MEDIUM, false, false)); |
604 content::RESOURCE_TYPE_SCRIPT, 11, 1, 1, 2.1, net::MEDIUM, false, false)); | 572 url_data.resources.push_back(MakeResourceData( |
605 url_data.resources.push_back(ResourceRow( | 573 "http://google.com/script2.js", content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, |
606 std::string(), "http://google.com/script2.js", | 574 3.0, net::MEDIUM, false, false)); |
607 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false)); | |
608 EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_)); | 575 EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_)); |
609 | 576 |
610 EXPECT_CALL( | 577 EXPECT_CALL( |
611 *mock_tables_.get(), | 578 *mock_tables_.get(), |
612 DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST)); | 579 DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST)); |
613 | 580 |
614 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com"); | 581 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com"); |
615 host_data.resources.push_back( | 582 host_data.resources.push_back(MakeResourceData( |
616 ResourceRow(std::string(), "http://google.com/style1.css", | 583 "http://google.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0, |
617 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, net::MEDIUM, | 584 0, 1.0, net::MEDIUM, false, false)); |
618 false, false)); | 585 host_data.resources.push_back(MakeResourceData( |
619 host_data.resources.push_back(ResourceRow( | 586 "http://google.com/script1.js", content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, |
620 std::string(), "http://google.com/script1.js", | 587 2.0, net::MEDIUM, false, false)); |
621 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false)); | 588 host_data.resources.push_back(MakeResourceData( |
622 host_data.resources.push_back(ResourceRow( | 589 "http://google.com/script2.js", content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, |
623 std::string(), "http://google.com/script2.js", | 590 3.0, net::MEDIUM, false, false)); |
624 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false)); | 591 host_data.resources.push_back(MakeResourceData( |
625 host_data.resources.push_back( | 592 "http://google.com/style2.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0, |
626 ResourceRow(std::string(), "http://google.com/style2.css", | 593 0, 7.0, net::MEDIUM, false, false)); |
627 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 7.0, net::MEDIUM, | |
628 false, false)); | |
629 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); | 594 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); |
630 | 595 |
631 predictor_->OnNavigationComplete(main_frame.navigation_id); | 596 predictor_->OnNavigationComplete(main_frame.navigation_id); |
632 profile_->BlockUntilHistoryProcessesPendingRequests(); | 597 profile_->BlockUntilHistoryProcessesPendingRequests(); |
633 } | 598 } |
634 | 599 |
635 TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) { | 600 TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) { |
636 // Tests that a URL is deleted before another is added if the cache is full. | 601 // Tests that a URL is deleted before another is added if the cache is full. |
637 AddUrlToHistory("http://www.nike.com/", 4); | 602 AddUrlToHistory("http://www.nike.com/", 4); |
638 | 603 |
(...skipping 23 matching lines...) Expand all Loading... |
662 predictor_->RecordURLResponse(resource2); | 627 predictor_->RecordURLResponse(resource2); |
663 | 628 |
664 EXPECT_CALL( | 629 EXPECT_CALL( |
665 *mock_tables_.get(), | 630 *mock_tables_.get(), |
666 DeleteSingleDataPoint("http://www.google.com/", PREFETCH_KEY_TYPE_URL)); | 631 DeleteSingleDataPoint("http://www.google.com/", PREFETCH_KEY_TYPE_URL)); |
667 EXPECT_CALL( | 632 EXPECT_CALL( |
668 *mock_tables_.get(), | 633 *mock_tables_.get(), |
669 DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST)); | 634 DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST)); |
670 | 635 |
671 PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.nike.com/"); | 636 PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.nike.com/"); |
672 url_data.resources.push_back( | 637 url_data.resources.push_back(MakeResourceData( |
673 ResourceRow(std::string(), "http://nike.com/style1.css", | 638 "http://nike.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, |
674 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, net::MEDIUM, | 639 1.0, net::MEDIUM, false, false)); |
675 false, false)); | 640 url_data.resources.push_back(MakeResourceData( |
676 url_data.resources.push_back(ResourceRow( | 641 "http://nike.com/image2.png", content::RESOURCE_TYPE_IMAGE, 1, 0, 0, 2.0, |
677 std::string(), "http://nike.com/image2.png", content::RESOURCE_TYPE_IMAGE, | 642 net::MEDIUM, false, false)); |
678 1, 0, 0, 2.0, net::MEDIUM, false, false)); | |
679 EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_)); | 643 EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_)); |
680 | 644 |
681 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.nike.com"); | 645 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.nike.com"); |
682 host_data.resources = url_data.resources; | 646 host_data.resources = url_data.resources; |
683 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); | 647 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); |
684 | 648 |
685 predictor_->OnNavigationComplete(main_frame.navigation_id); | 649 predictor_->OnNavigationComplete(main_frame.navigation_id); |
686 profile_->BlockUntilHistoryProcessesPendingRequests(); | 650 profile_->BlockUntilHistoryProcessesPendingRequests(); |
687 } | 651 } |
688 | 652 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 main_frame.navigation_id.creation_time = base::TimeTicks(); | 836 main_frame.navigation_id.creation_time = base::TimeTicks(); |
873 EXPECT_TRUE(main_frame.navigation_id.creation_time.is_null()); | 837 EXPECT_TRUE(main_frame.navigation_id.creation_time.is_null()); |
874 | 838 |
875 // Now add a subresource. | 839 // Now add a subresource. |
876 URLRequestSummary resource1 = CreateURLRequestSummary( | 840 URLRequestSummary resource1 = CreateURLRequestSummary( |
877 1, 1, "http://www.google.com", "http://google.com/style1.css", | 841 1, 1, "http://www.google.com", "http://google.com/style1.css", |
878 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", false); | 842 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", false); |
879 predictor_->RecordURLResponse(resource1); | 843 predictor_->RecordURLResponse(resource1); |
880 | 844 |
881 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com"); | 845 PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com"); |
882 host_data.resources.push_back( | 846 host_data.resources.push_back(MakeResourceData( |
883 ResourceRow(std::string(), "http://google.com/style1.css", | 847 "http://google.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0, |
884 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, net::MEDIUM, | 848 0, 1.0, net::MEDIUM, false, false)); |
885 false, false)); | |
886 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); | 849 EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data)); |
887 | 850 |
888 // The page load time will be collected by RPP_HISTOGRAM_MEDIUM_TIMES, which | 851 // The page load time will be collected by RPP_HISTOGRAM_MEDIUM_TIMES, which |
889 // has a upper bound of 3 minutes. | 852 // has a upper bound of 3 minutes. |
890 base::TimeDelta plt = | 853 base::TimeDelta plt = |
891 predictor_->OnNavigationComplete(main_frame.navigation_id); | 854 predictor_->OnNavigationComplete(main_frame.navigation_id); |
892 EXPECT_LT(plt, base::TimeDelta::FromSeconds(180)); | 855 EXPECT_LT(plt, base::TimeDelta::FromSeconds(180)); |
893 | 856 |
894 profile_->BlockUntilHistoryProcessesPendingRequests(); | 857 profile_->BlockUntilHistoryProcessesPendingRequests(); |
895 } | 858 } |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 url_request_job_factory_.set_response_info(response_info); | 1081 url_request_job_factory_.set_response_info(response_info); |
1119 std::unique_ptr<net::URLRequest> request_etag = | 1082 std::unique_ptr<net::URLRequest> request_etag = |
1120 CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM, | 1083 CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM, |
1121 content::RESOURCE_TYPE_PREFETCH, 1, 1, true); | 1084 content::RESOURCE_TYPE_PREFETCH, 1, 1, true); |
1122 EXPECT_TRUE(URLRequestSummary::SummarizeResponse(*request_etag, &summary)); | 1085 EXPECT_TRUE(URLRequestSummary::SummarizeResponse(*request_etag, &summary)); |
1123 EXPECT_TRUE(summary.has_validators); | 1086 EXPECT_TRUE(summary.has_validators); |
1124 EXPECT_TRUE(summary.always_revalidate); | 1087 EXPECT_TRUE(summary.always_revalidate); |
1125 } | 1088 } |
1126 | 1089 |
1127 } // namespace predictors | 1090 } // namespace predictors |
OLD | NEW |