| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/precache/content/precache_manager.h" | 5 #include "components/precache/content/precache_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 net::URLRequestStatus::FAILED); | 188 net::URLRequestStatus::FAILED); |
| 189 precache_manager_.reset( | 189 precache_manager_.reset( |
| 190 new PrecacheManagerUnderTest( | 190 new PrecacheManagerUnderTest( |
| 191 &browser_context_, nullptr /* sync_service */, | 191 &browser_context_, nullptr /* sync_service */, |
| 192 &history_service_, db_path, std::move(precache_database))); | 192 &history_service_, db_path, std::move(precache_database))); |
| 193 base::RunLoop().RunUntilIdle(); | 193 base::RunLoop().RunUntilIdle(); |
| 194 | 194 |
| 195 info_.headers = new net::HttpResponseHeaders(""); | 195 info_.headers = new net::HttpResponseHeaders(""); |
| 196 } | 196 } |
| 197 | 197 |
| 198 void RecordStatsForPrecacheFetch(const GURL& url, |
| 199 const std::string& referrer_host, |
| 200 const base::TimeDelta& latency, |
| 201 const base::Time& fetch_time, |
| 202 const net::HttpResponseInfo& info, |
| 203 int64_t size) { |
| 204 precache_manager_->RecordStatsForFetch(url, GURL(referrer_host), latency, |
| 205 fetch_time, info, size); |
| 206 precache_manager_->precache_database_->RecordURLPrefetch( |
| 207 url, referrer_host, fetch_time, info.was_cached, size); |
| 208 } |
| 209 |
| 198 // Must be declared first so that it is destroyed last. | 210 // Must be declared first so that it is destroyed last. |
| 199 content::TestBrowserThreadBundle test_browser_thread_bundle_; | 211 content::TestBrowserThreadBundle test_browser_thread_bundle_; |
| 200 base::ScopedTempDir scoped_temp_dir_; | 212 base::ScopedTempDir scoped_temp_dir_; |
| 201 PrecacheDatabase* precache_database_; | 213 PrecacheDatabase* precache_database_; |
| 202 content::TestBrowserContext browser_context_; | 214 content::TestBrowserContext browser_context_; |
| 203 std::unique_ptr<PrecacheManagerUnderTest> precache_manager_; | 215 std::unique_ptr<PrecacheManagerUnderTest> precache_manager_; |
| 204 TestURLFetcherCallback url_callback_; | 216 TestURLFetcherCallback url_callback_; |
| 205 net::FakeURLFetcherFactory factory_; | 217 net::FakeURLFetcherFactory factory_; |
| 206 TestPrecacheCompletionCallback precache_callback_; | 218 TestPrecacheCompletionCallback precache_callback_; |
| 207 testing::NiceMock<MockHistoryService> history_service_; | 219 testing::NiceMock<MockHistoryService> history_service_; |
| 208 base::HistogramTester histograms_; | 220 base::HistogramTester histograms_; |
| 209 net::HttpResponseInfo info_; | 221 net::HttpResponseInfo info_; |
| 210 }; | 222 }; |
| 211 | 223 |
| 212 TEST_F(PrecacheManagerTest, StartAndFinishPrecaching) { | 224 TEST_F(PrecacheManagerTest, StartAndFinishPrecaching) { |
| 213 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 225 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 214 | 226 |
| 215 MockHistoryService::TopHostsCallback top_hosts_callback; | 227 MockHistoryService::TopHostsCallback top_hosts_callback; |
| 216 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) | 228 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) |
| 217 .WillOnce(SaveArg<1>(&top_hosts_callback)); | 229 .WillOnce(SaveArg<1>(&top_hosts_callback)); |
| 218 | 230 |
| 231 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK, |
| 232 net::URLRequestStatus::SUCCESS); |
| 219 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, | 233 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, |
| 220 net::URLRequestStatus::SUCCESS); | 234 net::URLRequestStatus::SUCCESS); |
| 221 | 235 |
| 222 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 236 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 223 base::RunLoop().RunUntilIdle(); | 237 base::RunLoop().RunUntilIdle(); |
| 224 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 238 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 225 | 239 |
| 226 top_hosts_callback.Run( | 240 top_hosts_callback.Run( |
| 227 history::TopHostsList(1, std::make_pair("good-manifest.com", 1))); | 241 history::TopHostsList(1, std::make_pair("good-manifest.com", 1))); |
| 228 base::RunLoop().RunUntilIdle(); // For PrecacheFetcher. | 242 base::RunLoop().RunUntilIdle(); // For PrecacheFetcher. |
| 229 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 243 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 230 EXPECT_TRUE(precache_callback_.was_on_done_called()); | 244 EXPECT_TRUE(precache_callback_.was_on_done_called()); |
| 231 | 245 |
| 232 std::multiset<GURL> expected_requested_urls; | 246 std::multiset<GURL> expected_requested_urls; |
| 233 expected_requested_urls.insert(GURL(kConfigURL)); | 247 expected_requested_urls.insert(GURL(kConfigURL)); |
| 234 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 248 expected_requested_urls.insert(GURL(kGoodManifestURL)); |
| 235 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 249 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
| 236 } | 250 } |
| 237 | 251 |
| 238 TEST_F(PrecacheManagerTest, StartAndFinishPrecachingWithUnfinishedHosts) { | 252 TEST_F(PrecacheManagerTest, StartAndFinishPrecachingWithUnfinishedHosts) { |
| 239 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 253 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
| 240 new PrecacheUnfinishedWork()); | 254 new PrecacheUnfinishedWork()); |
| 241 unfinished_work->add_top_host()->set_hostname("evil-manifest.com"); | 255 unfinished_work->add_top_host()->set_hostname("evil-manifest.com"); |
| 242 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); | 256 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); |
| 243 precache_database_->SaveUnfinishedWork(std::move(unfinished_work)); | 257 precache_database_->SaveUnfinishedWork(std::move(unfinished_work)); |
| 244 | 258 |
| 245 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 259 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 246 | 260 |
| 261 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK, |
| 262 net::URLRequestStatus::SUCCESS); |
| 247 factory_.SetFakeResponse( | 263 factory_.SetFakeResponse( |
| 248 GURL(kEvilManifestURL), "", | 264 GURL(kEvilManifestURL), "", |
| 249 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 265 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
| 250 | 266 |
| 251 ASSERT_TRUE(precache_database_->GetLastPrecacheTimestamp().is_null()); | 267 ASSERT_TRUE(precache_database_->GetLastPrecacheTimestamp().is_null()); |
| 252 | 268 |
| 253 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 269 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 254 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 270 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 255 | 271 |
| 256 base::RunLoop().RunUntilIdle(); // For PrecacheFetcher. | 272 base::RunLoop().RunUntilIdle(); // For PrecacheFetcher. |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); | 398 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); |
| 383 } | 399 } |
| 384 | 400 |
| 385 TEST_F(PrecacheManagerTest, RecordStatsForFetchDuringPrecaching) { | 401 TEST_F(PrecacheManagerTest, RecordStatsForFetchDuringPrecaching) { |
| 386 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) | 402 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) |
| 387 .WillOnce(ReturnHosts(history::TopHostsList())); | 403 .WillOnce(ReturnHosts(history::TopHostsList())); |
| 388 | 404 |
| 389 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 405 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 390 | 406 |
| 391 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 407 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 392 precache_manager_->RecordStatsForFetch(GURL("http://url.com"), GURL(), | 408 RecordStatsForPrecacheFetch(GURL("http://url.com"), std::string(), |
| 393 base::TimeDelta(), base::Time(), info_, | 409 base::TimeDelta(), base::Time(), info_, 1000); |
| 394 1000); | |
| 395 base::RunLoop().RunUntilIdle(); | 410 base::RunLoop().RunUntilIdle(); |
| 396 precache_manager_->CancelPrecaching(); | 411 precache_manager_->CancelPrecaching(); |
| 397 | 412 |
| 398 // For PrecacheFetcher and RecordURLPrecached. | 413 // For PrecacheFetcher and RecordURLPrecached. |
| 399 base::RunLoop().RunUntilIdle(); | 414 base::RunLoop().RunUntilIdle(); |
| 400 EXPECT_THAT( | 415 EXPECT_THAT( |
| 401 histograms_.GetTotalCountsForPrefix("Precache."), | 416 histograms_.GetTotalCountsForPrefix("Precache."), |
| 402 UnorderedElementsAre(Pair("Precache.DownloadedPrecacheMotivated", 1), | 417 UnorderedElementsAre(Pair("Precache.DownloadedPrecacheMotivated", 1), |
| 403 Pair("Precache.Fetch.PercentCompleted", 1), | 418 Pair("Precache.Fetch.PercentCompleted", 1), |
| 404 Pair("Precache.Fetch.ResponseBytes.Network", 1), | 419 Pair("Precache.Fetch.ResponseBytes.Network", 1), |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 // This test has to use Time::Now() because StartPrecaching uses Time::Now(). | 478 // This test has to use Time::Now() because StartPrecaching uses Time::Now(). |
| 464 const base::Time kCurrentTime = base::Time::Now(); | 479 const base::Time kCurrentTime = base::Time::Now(); |
| 465 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) | 480 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) |
| 466 .Times(2) | 481 .Times(2) |
| 467 .WillRepeatedly(ReturnHosts(history::TopHostsList())); | 482 .WillRepeatedly(ReturnHosts(history::TopHostsList())); |
| 468 | 483 |
| 469 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 484 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 470 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 485 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 471 | 486 |
| 472 // Precache a bunch of URLs, with different fetch times. | 487 // Precache a bunch of URLs, with different fetch times. |
| 473 precache_manager_->RecordStatsForFetch( | 488 RecordStatsForPrecacheFetch( |
| 474 GURL("http://old-fetch.com"), GURL(), base::TimeDelta(), | 489 GURL("http://old-fetch.com"), std::string(), base::TimeDelta(), |
| 475 kCurrentTime - base::TimeDelta::FromDays(61), info_, 1000); | 490 kCurrentTime - base::TimeDelta::FromDays(61), info_, 1000); |
| 476 precache_manager_->RecordStatsForFetch( | 491 RecordStatsForPrecacheFetch( |
| 477 GURL("http://recent-fetch.com"), GURL(), base::TimeDelta(), | 492 GURL("http://recent-fetch.com"), std::string(), base::TimeDelta(), |
| 478 kCurrentTime - base::TimeDelta::FromDays(59), info_, 1000); | 493 kCurrentTime - base::TimeDelta::FromDays(59), info_, 1000); |
| 479 precache_manager_->RecordStatsForFetch( | 494 RecordStatsForPrecacheFetch( |
| 480 GURL("http://yesterday-fetch.com"), GURL(), base::TimeDelta(), | 495 GURL("http://yesterday-fetch.com"), std::string(), base::TimeDelta(), |
| 481 kCurrentTime - base::TimeDelta::FromDays(1), info_, 1000); | 496 kCurrentTime - base::TimeDelta::FromDays(1), info_, 1000); |
| 482 expected_histogram_count_map["Precache.DownloadedPrecacheMotivated"] += 3; | 497 expected_histogram_count_map["Precache.DownloadedPrecacheMotivated"] += 3; |
| 483 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++; | 498 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++; |
| 484 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++; | 499 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++; |
| 485 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++; | 500 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++; |
| 486 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++; | 501 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++; |
| 487 expected_histogram_count_map["Precache.Latency.Prefetch"] += 3; | 502 expected_histogram_count_map["Precache.Latency.Prefetch"] += 3; |
| 488 expected_histogram_count_map["Precache.Freshness.Prefetch"] += 3; | 503 expected_histogram_count_map["Precache.Freshness.Prefetch"] += 3; |
| 489 base::RunLoop().RunUntilIdle(); | 504 base::RunLoop().RunUntilIdle(); |
| 490 | 505 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 expected_histogram_count_map["Precache.Saved"] += 2; | 561 expected_histogram_count_map["Precache.Saved"] += 2; |
| 547 expected_histogram_count_map["Precache.TimeSinceLastPrecache"] += 2; | 562 expected_histogram_count_map["Precache.TimeSinceLastPrecache"] += 2; |
| 548 expected_histogram_count_map["Precache.Saved.Freshness"] = 2; | 563 expected_histogram_count_map["Precache.Saved.Freshness"] = 2; |
| 549 | 564 |
| 550 base::RunLoop().RunUntilIdle(); | 565 base::RunLoop().RunUntilIdle(); |
| 551 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), | 566 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), |
| 552 ContainerEq(expected_histogram_count_map)); | 567 ContainerEq(expected_histogram_count_map)); |
| 553 } | 568 } |
| 554 | 569 |
| 555 } // namespace precache | 570 } // namespace precache |
| OLD | NEW |