| 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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 : factory_(nullptr, | 153 : factory_(nullptr, |
| 154 base::Bind(&TestURLFetcherCallback::CreateURLFetcher, | 154 base::Bind(&TestURLFetcherCallback::CreateURLFetcher, |
| 155 base::Unretained(&url_callback_))) {} | 155 base::Unretained(&url_callback_))) {} |
| 156 | 156 |
| 157 ~PrecacheManagerTest() { | 157 ~PrecacheManagerTest() { |
| 158 // precache_manager_'s constructor releases a PrecacheDatabase and deletes | 158 // precache_manager_'s constructor releases a PrecacheDatabase and deletes |
| 159 // it on the DB thread. PrecacheDatabase already has a pending Init call | 159 // it on the DB thread. PrecacheDatabase already has a pending Init call |
| 160 // which will assert in debug builds because the directory passed to it is | 160 // which will assert in debug builds because the directory passed to it is |
| 161 // deleted. So manually ensure that the task is run before browser_context_ | 161 // deleted. So manually ensure that the task is run before browser_context_ |
| 162 // is destructed. | 162 // is destructed. |
| 163 base::MessageLoop::current()->RunUntilIdle(); | 163 base::RunLoop().RunUntilIdle(); |
| 164 } | 164 } |
| 165 | 165 |
| 166 protected: | 166 protected: |
| 167 void SetUp() override { | 167 void SetUp() override { |
| 168 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 168 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 169 switches::kPrecacheConfigSettingsURL, kConfigURL); | 169 switches::kPrecacheConfigSettingsURL, kConfigURL); |
| 170 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 170 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 171 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix); | 171 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix); |
| 172 std::unique_ptr<PrecacheDatabase> precache_database( | 172 std::unique_ptr<PrecacheDatabase> precache_database( |
| 173 new PrecacheDatabase()); | 173 new PrecacheDatabase()); |
| 174 precache_database_ = precache_database.get(); | 174 precache_database_ = precache_database.get(); |
| 175 | 175 |
| 176 ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); | 176 ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); |
| 177 base::FilePath db_path = scoped_temp_dir_.path().Append( | 177 base::FilePath db_path = scoped_temp_dir_.path().Append( |
| 178 base::FilePath(FILE_PATH_LITERAL("precache_database"))); | 178 base::FilePath(FILE_PATH_LITERAL("precache_database"))); |
| 179 | 179 |
| 180 // Make the fetch of the precache configuration settings fail. Precaching | 180 // Make the fetch of the precache configuration settings fail. Precaching |
| 181 // should still complete normally in this case. | 181 // should still complete normally in this case. |
| 182 factory_.SetFakeResponse(GURL(kConfigURL), "", | 182 factory_.SetFakeResponse(GURL(kConfigURL), "", |
| 183 net::HTTP_INTERNAL_SERVER_ERROR, | 183 net::HTTP_INTERNAL_SERVER_ERROR, |
| 184 net::URLRequestStatus::FAILED); | 184 net::URLRequestStatus::FAILED); |
| 185 precache_manager_.reset( | 185 precache_manager_.reset( |
| 186 new PrecacheManagerUnderTest( | 186 new PrecacheManagerUnderTest( |
| 187 &browser_context_, nullptr /* sync_service */, | 187 &browser_context_, nullptr /* sync_service */, |
| 188 &history_service_, db_path, std::move(precache_database))); | 188 &history_service_, db_path, std::move(precache_database))); |
| 189 base::MessageLoop::current()->RunUntilIdle(); | 189 base::RunLoop().RunUntilIdle(); |
| 190 } | 190 } |
| 191 | 191 |
| 192 // Must be declared first so that it is destroyed last. | 192 // Must be declared first so that it is destroyed last. |
| 193 content::TestBrowserThreadBundle test_browser_thread_bundle_; | 193 content::TestBrowserThreadBundle test_browser_thread_bundle_; |
| 194 base::ScopedTempDir scoped_temp_dir_; | 194 base::ScopedTempDir scoped_temp_dir_; |
| 195 PrecacheDatabase* precache_database_; | 195 PrecacheDatabase* precache_database_; |
| 196 content::TestBrowserContext browser_context_; | 196 content::TestBrowserContext browser_context_; |
| 197 std::unique_ptr<PrecacheManagerUnderTest> precache_manager_; | 197 std::unique_ptr<PrecacheManagerUnderTest> precache_manager_; |
| 198 TestURLFetcherCallback url_callback_; | 198 TestURLFetcherCallback url_callback_; |
| 199 net::FakeURLFetcherFactory factory_; | 199 net::FakeURLFetcherFactory factory_; |
| 200 TestPrecacheCompletionCallback precache_callback_; | 200 TestPrecacheCompletionCallback precache_callback_; |
| 201 testing::NiceMock<MockHistoryService> history_service_; | 201 testing::NiceMock<MockHistoryService> history_service_; |
| 202 base::HistogramTester histograms_; | 202 base::HistogramTester histograms_; |
| 203 }; | 203 }; |
| 204 | 204 |
| 205 TEST_F(PrecacheManagerTest, StartAndFinishPrecaching) { | 205 TEST_F(PrecacheManagerTest, StartAndFinishPrecaching) { |
| 206 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 206 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 207 | 207 |
| 208 MockHistoryService::TopHostsCallback top_hosts_callback; | 208 MockHistoryService::TopHostsCallback top_hosts_callback; |
| 209 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) | 209 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) |
| 210 .WillOnce(SaveArg<1>(&top_hosts_callback)); | 210 .WillOnce(SaveArg<1>(&top_hosts_callback)); |
| 211 | 211 |
| 212 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, | 212 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, |
| 213 net::URLRequestStatus::SUCCESS); | 213 net::URLRequestStatus::SUCCESS); |
| 214 | 214 |
| 215 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 215 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 216 base::MessageLoop::current()->RunUntilIdle(); | 216 base::RunLoop().RunUntilIdle(); |
| 217 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 217 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 218 | 218 |
| 219 top_hosts_callback.Run( | 219 top_hosts_callback.Run( |
| 220 history::TopHostsList(1, std::make_pair("good-manifest.com", 1))); | 220 history::TopHostsList(1, std::make_pair("good-manifest.com", 1))); |
| 221 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher. | 221 base::RunLoop().RunUntilIdle(); // For PrecacheFetcher. |
| 222 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 222 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 223 EXPECT_TRUE(precache_callback_.was_on_done_called()); | 223 EXPECT_TRUE(precache_callback_.was_on_done_called()); |
| 224 | 224 |
| 225 std::multiset<GURL> expected_requested_urls; | 225 std::multiset<GURL> expected_requested_urls; |
| 226 expected_requested_urls.insert(GURL(kConfigURL)); | 226 expected_requested_urls.insert(GURL(kConfigURL)); |
| 227 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 227 expected_requested_urls.insert(GURL(kGoodManifestURL)); |
| 228 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 228 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
| 229 } | 229 } |
| 230 | 230 |
| 231 TEST_F(PrecacheManagerTest, StartAndFinishPrecachingWithUnfinishedHosts) { | 231 TEST_F(PrecacheManagerTest, StartAndFinishPrecachingWithUnfinishedHosts) { |
| 232 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 232 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
| 233 new PrecacheUnfinishedWork()); | 233 new PrecacheUnfinishedWork()); |
| 234 unfinished_work->add_top_host()->set_hostname("evil-manifest.com"); | 234 unfinished_work->add_top_host()->set_hostname("evil-manifest.com"); |
| 235 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); | 235 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); |
| 236 precache_database_->SaveUnfinishedWork(std::move(unfinished_work)); | 236 precache_database_->SaveUnfinishedWork(std::move(unfinished_work)); |
| 237 | 237 |
| 238 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 238 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 239 | 239 |
| 240 factory_.SetFakeResponse( | 240 factory_.SetFakeResponse( |
| 241 GURL(kEvilManifestURL), "", | 241 GURL(kEvilManifestURL), "", |
| 242 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 242 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
| 243 | 243 |
| 244 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 244 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 245 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 245 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 246 | 246 |
| 247 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher. | 247 base::RunLoop().RunUntilIdle(); // For PrecacheFetcher. |
| 248 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 248 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 249 EXPECT_TRUE(precache_callback_.was_on_done_called()); | 249 EXPECT_TRUE(precache_callback_.was_on_done_called()); |
| 250 | 250 |
| 251 std::multiset<GURL> expected_requested_urls; | 251 std::multiset<GURL> expected_requested_urls; |
| 252 expected_requested_urls.insert(GURL(kConfigURL)); | 252 expected_requested_urls.insert(GURL(kConfigURL)); |
| 253 expected_requested_urls.insert(GURL(kEvilManifestURL)); | 253 expected_requested_urls.insert(GURL(kEvilManifestURL)); |
| 254 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 254 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
| 255 } | 255 } |
| 256 | 256 |
| 257 TEST_F(PrecacheManagerTest, | 257 TEST_F(PrecacheManagerTest, |
| 258 StartAndCancelPrecachingBeforeUnfinishedWorkRetrieved) { | 258 StartAndCancelPrecachingBeforeUnfinishedWorkRetrieved) { |
| 259 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 259 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 260 | 260 |
| 261 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 261 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 262 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 262 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 263 precache_manager_->CancelPrecaching(); | 263 precache_manager_->CancelPrecaching(); |
| 264 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 264 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 265 | 265 |
| 266 base::MessageLoop::current()->RunUntilIdle(); | 266 base::RunLoop().RunUntilIdle(); |
| 267 EXPECT_FALSE(precache_callback_.was_on_done_called()); | 267 EXPECT_FALSE(precache_callback_.was_on_done_called()); |
| 268 } | 268 } |
| 269 | 269 |
| 270 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingBeforeTopHostsCompleted) { | 270 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingBeforeTopHostsCompleted) { |
| 271 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 271 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 272 | 272 |
| 273 MockHistoryService::TopHostsCallback top_hosts_callback; | 273 MockHistoryService::TopHostsCallback top_hosts_callback; |
| 274 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) | 274 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) |
| 275 .WillOnce(SaveArg<1>(&top_hosts_callback)); | 275 .WillOnce(SaveArg<1>(&top_hosts_callback)); |
| 276 | 276 |
| 277 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 277 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 278 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 278 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 279 | 279 |
| 280 precache_manager_->CancelPrecaching(); | 280 precache_manager_->CancelPrecaching(); |
| 281 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 281 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 282 base::MessageLoop::current()->RunUntilIdle(); | 282 base::RunLoop().RunUntilIdle(); |
| 283 | 283 |
| 284 top_hosts_callback.Run( | 284 top_hosts_callback.Run( |
| 285 history::TopHostsList(1, std::make_pair("starting-url.com", 1))); | 285 history::TopHostsList(1, std::make_pair("starting-url.com", 1))); |
| 286 base::MessageLoop::current()->RunUntilIdle(); | 286 base::RunLoop().RunUntilIdle(); |
| 287 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 287 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 288 EXPECT_FALSE(precache_callback_.was_on_done_called()); | 288 EXPECT_FALSE(precache_callback_.was_on_done_called()); |
| 289 } | 289 } |
| 290 | 290 |
| 291 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingBeforeURLsReceived) { | 291 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingBeforeURLsReceived) { |
| 292 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 292 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 293 | 293 |
| 294 MockHistoryService::TopHostsCallback top_hosts_callback; | 294 MockHistoryService::TopHostsCallback top_hosts_callback; |
| 295 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) | 295 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) |
| 296 .WillOnce(SaveArg<1>(&top_hosts_callback)); | 296 .WillOnce(SaveArg<1>(&top_hosts_callback)); |
| 297 | 297 |
| 298 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 298 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 299 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 299 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 300 | 300 |
| 301 precache_manager_->CancelPrecaching(); | 301 precache_manager_->CancelPrecaching(); |
| 302 base::MessageLoop::current()->RunUntilIdle(); | 302 base::RunLoop().RunUntilIdle(); |
| 303 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 303 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 304 top_hosts_callback.Run( | 304 top_hosts_callback.Run( |
| 305 history::TopHostsList(1, std::make_pair("starting-url.com", 1))); | 305 history::TopHostsList(1, std::make_pair("starting-url.com", 1))); |
| 306 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher. | 306 base::RunLoop().RunUntilIdle(); // For PrecacheFetcher. |
| 307 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 307 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 308 EXPECT_FALSE(precache_callback_.was_on_done_called()); | 308 EXPECT_FALSE(precache_callback_.was_on_done_called()); |
| 309 EXPECT_TRUE(url_callback_.requested_urls().empty()); | 309 EXPECT_TRUE(url_callback_.requested_urls().empty()); |
| 310 } | 310 } |
| 311 | 311 |
| 312 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingAfterURLsReceived) { | 312 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingAfterURLsReceived) { |
| 313 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 313 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 314 | 314 |
| 315 PrecacheManifest good_manifest; | 315 PrecacheManifest good_manifest; |
| 316 good_manifest.add_resource()->set_url("http://good-resource.com"); | 316 good_manifest.add_resource()->set_url("http://good-resource.com"); |
| 317 | 317 |
| 318 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) | 318 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) |
| 319 .WillOnce(ReturnHosts( | 319 .WillOnce(ReturnHosts( |
| 320 history::TopHostsList(1, std::make_pair("starting-url.com", 1)))); | 320 history::TopHostsList(1, std::make_pair("starting-url.com", 1)))); |
| 321 | 321 |
| 322 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 322 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 323 | 323 |
| 324 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 324 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 325 // Run a task to get unfinished work, and to get hosts. | 325 // Run a task to get unfinished work, and to get hosts. |
| 326 for (int i = 0; i < 2; ++i) { | 326 for (int i = 0; i < 2; ++i) { |
| 327 base::RunLoop run_loop; | 327 base::RunLoop run_loop; |
| 328 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure()); | 328 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure()); |
| 329 run_loop.Run(); | 329 run_loop.Run(); |
| 330 } | 330 } |
| 331 //base::MessageLoop::current()->RunUntilIdle(); | 331 // base::RunLoop().RunUntilIdle(); |
| 332 precache_manager_->CancelPrecaching(); | 332 precache_manager_->CancelPrecaching(); |
| 333 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 333 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 334 | 334 |
| 335 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher. | 335 base::RunLoop().RunUntilIdle(); // For PrecacheFetcher. |
| 336 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 336 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 337 EXPECT_FALSE(precache_callback_.was_on_done_called()); | 337 EXPECT_FALSE(precache_callback_.was_on_done_called()); |
| 338 | 338 |
| 339 std::multiset<GURL> expected_requested_urls; | 339 std::multiset<GURL> expected_requested_urls; |
| 340 expected_requested_urls.insert(GURL(kConfigURL)); | 340 expected_requested_urls.insert(GURL(kConfigURL)); |
| 341 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 341 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
| 342 } | 342 } |
| 343 | 343 |
| 344 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithSizeZero) { | 344 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithSizeZero) { |
| 345 // Fetches with size 0 should be ignored. | 345 // Fetches with size 0 should be ignored. |
| 346 precache_manager_->RecordStatsForFetch(GURL("http://url.com"), GURL(), | 346 precache_manager_->RecordStatsForFetch(GURL("http://url.com"), GURL(), |
| 347 base::TimeDelta(), base::Time(), 0, | 347 base::TimeDelta(), base::Time(), 0, |
| 348 false); | 348 false); |
| 349 base::MessageLoop::current()->RunUntilIdle(); | 349 base::RunLoop().RunUntilIdle(); |
| 350 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); | 350 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); |
| 351 } | 351 } |
| 352 | 352 |
| 353 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithNonHTTP) { | 353 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithNonHTTP) { |
| 354 // Fetches for URLs with schemes other than HTTP or HTTPS should be ignored. | 354 // Fetches for URLs with schemes other than HTTP or HTTPS should be ignored. |
| 355 precache_manager_->RecordStatsForFetch(GURL("ftp://ftp.com"), GURL(), | 355 precache_manager_->RecordStatsForFetch(GURL("ftp://ftp.com"), GURL(), |
| 356 base::TimeDelta(), base::Time(), 1000, | 356 base::TimeDelta(), base::Time(), 1000, |
| 357 false); | 357 false); |
| 358 base::MessageLoop::current()->RunUntilIdle(); | 358 base::RunLoop().RunUntilIdle(); |
| 359 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); | 359 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); |
| 360 } | 360 } |
| 361 | 361 |
| 362 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithEmptyURL) { | 362 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithEmptyURL) { |
| 363 // Fetches for empty URLs should be ignored. | 363 // Fetches for empty URLs should be ignored. |
| 364 precache_manager_->RecordStatsForFetch(GURL(), GURL(), base::TimeDelta(), | 364 precache_manager_->RecordStatsForFetch(GURL(), GURL(), base::TimeDelta(), |
| 365 base::Time(), 1000, false); | 365 base::Time(), 1000, false); |
| 366 base::MessageLoop::current()->RunUntilIdle(); | 366 base::RunLoop().RunUntilIdle(); |
| 367 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); | 367 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); |
| 368 } | 368 } |
| 369 | 369 |
| 370 TEST_F(PrecacheManagerTest, RecordStatsForFetchDuringPrecaching) { | 370 TEST_F(PrecacheManagerTest, RecordStatsForFetchDuringPrecaching) { |
| 371 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) | 371 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) |
| 372 .WillOnce(ReturnHosts(history::TopHostsList())); | 372 .WillOnce(ReturnHosts(history::TopHostsList())); |
| 373 | 373 |
| 374 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 374 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 375 | 375 |
| 376 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 376 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 377 precache_manager_->RecordStatsForFetch(GURL("http://url.com"), GURL(), | 377 precache_manager_->RecordStatsForFetch(GURL("http://url.com"), GURL(), |
| 378 base::TimeDelta(), base::Time(), 1000, | 378 base::TimeDelta(), base::Time(), 1000, |
| 379 false); | 379 false); |
| 380 base::MessageLoop::current()->RunUntilIdle(); | 380 base::RunLoop().RunUntilIdle(); |
| 381 precache_manager_->CancelPrecaching(); | 381 precache_manager_->CancelPrecaching(); |
| 382 | 382 |
| 383 // For PrecacheFetcher and RecordURLPrecached. | 383 // For PrecacheFetcher and RecordURLPrecached. |
| 384 base::MessageLoop::current()->RunUntilIdle(); | 384 base::RunLoop().RunUntilIdle(); |
| 385 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), | 385 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), |
| 386 ElementsAre(Pair("Precache.DownloadedPrecacheMotivated", 1), | 386 ElementsAre(Pair("Precache.DownloadedPrecacheMotivated", 1), |
| 387 Pair("Precache.Fetch.PercentCompleted", 1), | 387 Pair("Precache.Fetch.PercentCompleted", 1), |
| 388 Pair("Precache.Fetch.ResponseBytes.Network", 1), | 388 Pair("Precache.Fetch.ResponseBytes.Network", 1), |
| 389 Pair("Precache.Fetch.ResponseBytes.Total", 1), | 389 Pair("Precache.Fetch.ResponseBytes.Total", 1), |
| 390 Pair("Precache.Fetch.TimeToComplete", 1), | 390 Pair("Precache.Fetch.TimeToComplete", 1), |
| 391 Pair("Precache.Latency.Prefetch", 1))); | 391 Pair("Precache.Latency.Prefetch", 1))); |
| 392 } | 392 } |
| 393 | 393 |
| 394 TEST_F(PrecacheManagerTest, RecordStatsForFetchHTTP) { | 394 TEST_F(PrecacheManagerTest, RecordStatsForFetchHTTP) { |
| 395 precache_manager_->RecordStatsForFetch(GURL("http://http-url.com"), GURL(), | 395 precache_manager_->RecordStatsForFetch(GURL("http://http-url.com"), GURL(), |
| 396 base::TimeDelta(), base::Time(), 1000, | 396 base::TimeDelta(), base::Time(), 1000, |
| 397 false); | 397 false); |
| 398 base::MessageLoop::current()->RunUntilIdle(); | 398 base::RunLoop().RunUntilIdle(); |
| 399 | 399 |
| 400 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), | 400 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), |
| 401 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), | 401 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), |
| 402 Pair("Precache.Latency.NonPrefetch", 1), | 402 Pair("Precache.Latency.NonPrefetch", 1), |
| 403 Pair("Precache.Latency.NonPrefetch.NonTopHosts", 1))); | 403 Pair("Precache.Latency.NonPrefetch.NonTopHosts", 1))); |
| 404 } | 404 } |
| 405 | 405 |
| 406 TEST_F(PrecacheManagerTest, RecordStatsForFetchHTTPS) { | 406 TEST_F(PrecacheManagerTest, RecordStatsForFetchHTTPS) { |
| 407 precache_manager_->RecordStatsForFetch(GURL("https://https-url.com"), GURL(), | 407 precache_manager_->RecordStatsForFetch(GURL("https://https-url.com"), GURL(), |
| 408 base::TimeDelta(), base::Time(), 1000, | 408 base::TimeDelta(), base::Time(), 1000, |
| 409 false); | 409 false); |
| 410 base::MessageLoop::current()->RunUntilIdle(); | 410 base::RunLoop().RunUntilIdle(); |
| 411 | 411 |
| 412 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), | 412 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), |
| 413 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), | 413 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), |
| 414 Pair("Precache.Latency.NonPrefetch", 1), | 414 Pair("Precache.Latency.NonPrefetch", 1), |
| 415 Pair("Precache.Latency.NonPrefetch.NonTopHosts", 1))); | 415 Pair("Precache.Latency.NonPrefetch.NonTopHosts", 1))); |
| 416 } | 416 } |
| 417 | 417 |
| 418 TEST_F(PrecacheManagerTest, RecordStatsForFetchInTopHosts) { | 418 TEST_F(PrecacheManagerTest, RecordStatsForFetchInTopHosts) { |
| 419 EXPECT_CALL(history_service_, | 419 EXPECT_CALL(history_service_, |
| 420 HostRankIfAvailable(GURL("http://referrer.com"), _)) | 420 HostRankIfAvailable(GURL("http://referrer.com"), _)) |
| 421 .WillOnce(Invoke( | 421 .WillOnce(Invoke( |
| 422 [](const GURL& url, const base::Callback<void(int)>& callback) { | 422 [](const GURL& url, const base::Callback<void(int)>& callback) { |
| 423 callback.Run(0); | 423 callback.Run(0); |
| 424 })); | 424 })); |
| 425 precache_manager_->RecordStatsForFetch( | 425 precache_manager_->RecordStatsForFetch( |
| 426 GURL("http://http-url.com"), GURL("http://referrer.com"), | 426 GURL("http://http-url.com"), GURL("http://referrer.com"), |
| 427 base::TimeDelta(), base::Time(), 1000, false); | 427 base::TimeDelta(), base::Time(), 1000, false); |
| 428 base::MessageLoop::current()->RunUntilIdle(); | 428 base::RunLoop().RunUntilIdle(); |
| 429 | 429 |
| 430 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), | 430 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), |
| 431 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), | 431 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), |
| 432 Pair("Precache.Latency.NonPrefetch", 1), | 432 Pair("Precache.Latency.NonPrefetch", 1), |
| 433 Pair("Precache.Latency.NonPrefetch.TopHosts", 1))); | 433 Pair("Precache.Latency.NonPrefetch.TopHosts", 1))); |
| 434 } | 434 } |
| 435 | 435 |
| 436 TEST_F(PrecacheManagerTest, DeleteExpiredPrecacheHistory) { | 436 TEST_F(PrecacheManagerTest, DeleteExpiredPrecacheHistory) { |
| 437 // TODO(twifkak): Split this into multiple tests. | 437 // TODO(twifkak): Split this into multiple tests. |
| 438 base::HistogramTester::CountsMap expected_histogram_count_map; | 438 base::HistogramTester::CountsMap expected_histogram_count_map; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 455 kCurrentTime - base::TimeDelta::FromDays(59), 1000, false); | 455 kCurrentTime - base::TimeDelta::FromDays(59), 1000, false); |
| 456 precache_manager_->RecordStatsForFetch( | 456 precache_manager_->RecordStatsForFetch( |
| 457 GURL("http://yesterday-fetch.com"), GURL(), base::TimeDelta(), | 457 GURL("http://yesterday-fetch.com"), GURL(), base::TimeDelta(), |
| 458 kCurrentTime - base::TimeDelta::FromDays(1), 1000, false); | 458 kCurrentTime - base::TimeDelta::FromDays(1), 1000, false); |
| 459 expected_histogram_count_map["Precache.DownloadedPrecacheMotivated"] += 3; | 459 expected_histogram_count_map["Precache.DownloadedPrecacheMotivated"] += 3; |
| 460 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++; | 460 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++; |
| 461 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++; | 461 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++; |
| 462 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++; | 462 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++; |
| 463 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++; | 463 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++; |
| 464 expected_histogram_count_map["Precache.Latency.Prefetch"] += 3; | 464 expected_histogram_count_map["Precache.Latency.Prefetch"] += 3; |
| 465 base::MessageLoop::current()->RunUntilIdle(); | 465 base::RunLoop().RunUntilIdle(); |
| 466 | 466 |
| 467 precache_manager_->CancelPrecaching(); | 467 precache_manager_->CancelPrecaching(); |
| 468 base::MessageLoop::current()->RunUntilIdle(); | 468 base::RunLoop().RunUntilIdle(); |
| 469 | 469 |
| 470 // Disable pause-resume. | 470 // Disable pause-resume. |
| 471 precache_database_->DeleteUnfinishedWork(); | 471 precache_database_->DeleteUnfinishedWork(); |
| 472 base::MessageLoop::current()->RunUntilIdle(); | 472 base::RunLoop().RunUntilIdle(); |
| 473 | 473 |
| 474 // For PrecacheFetcher and RecordURLPrecached. | 474 // For PrecacheFetcher and RecordURLPrecached. |
| 475 base::MessageLoop::current()->RunUntilIdle(); | 475 base::RunLoop().RunUntilIdle(); |
| 476 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), | 476 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), |
| 477 ContainerEq(expected_histogram_count_map)); | 477 ContainerEq(expected_histogram_count_map)); |
| 478 | 478 |
| 479 // The expired precache will be deleted during precaching this time. | 479 // The expired precache will be deleted during precaching this time. |
| 480 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); | 480 precache_manager_->StartPrecaching(precache_callback_.GetCallback()); |
| 481 EXPECT_TRUE(precache_manager_->IsPrecaching()); | 481 EXPECT_TRUE(precache_manager_->IsPrecaching()); |
| 482 base::MessageLoop::current()->RunUntilIdle(); | 482 base::RunLoop().RunUntilIdle(); |
| 483 | 483 |
| 484 // The precache fetcher runs until done, which records these histograms, | 484 // The precache fetcher runs until done, which records these histograms, |
| 485 // and then cancels precaching, which records these histograms again. | 485 // and then cancels precaching, which records these histograms again. |
| 486 // In practice | 486 // In practice |
| 487 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++; | 487 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++; |
| 488 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++; | 488 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++; |
| 489 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++; | 489 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++; |
| 490 // For PrecacheFetcher and RecordURLPrecached. | 490 // For PrecacheFetcher and RecordURLPrecached. |
| 491 base::MessageLoop::current()->RunUntilIdle(); | 491 base::RunLoop().RunUntilIdle(); |
| 492 EXPECT_FALSE(precache_manager_->IsPrecaching()); | 492 EXPECT_FALSE(precache_manager_->IsPrecaching()); |
| 493 | 493 |
| 494 // A fetch for the same URL as the expired precache was served from the cache, | 494 // A fetch for the same URL as the expired precache was served from the cache, |
| 495 // but it isn't reported as saved bytes because it had expired in the precache | 495 // but it isn't reported as saved bytes because it had expired in the precache |
| 496 // history. | 496 // history. |
| 497 precache_manager_->RecordStatsForFetch(GURL("http://old-fetch.com"), GURL(), | 497 precache_manager_->RecordStatsForFetch(GURL("http://old-fetch.com"), GURL(), |
| 498 base::TimeDelta(), kCurrentTime, 1000, | 498 base::TimeDelta(), kCurrentTime, 1000, |
| 499 true); | 499 true); |
| 500 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++; | 500 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++; |
| 501 expected_histogram_count_map["Precache.Latency.NonPrefetch"]++; | 501 expected_histogram_count_map["Precache.Latency.NonPrefetch"]++; |
| 502 expected_histogram_count_map["Precache.Latency.NonPrefetch.NonTopHosts"]++; | 502 expected_histogram_count_map["Precache.Latency.NonPrefetch.NonTopHosts"]++; |
| 503 | 503 |
| 504 base::MessageLoop::current()->RunUntilIdle(); | 504 base::RunLoop().RunUntilIdle(); |
| 505 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), | 505 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), |
| 506 ContainerEq(expected_histogram_count_map)); | 506 ContainerEq(expected_histogram_count_map)); |
| 507 | 507 |
| 508 // The other precaches should not have expired, so the following fetches from | 508 // The other precaches should not have expired, so the following fetches from |
| 509 // the cache should count as saved bytes. | 509 // the cache should count as saved bytes. |
| 510 precache_manager_->RecordStatsForFetch(GURL("http://recent-fetch.com"), GURL()
, | 510 precache_manager_->RecordStatsForFetch(GURL("http://recent-fetch.com"), GURL()
, |
| 511 base::TimeDelta(), kCurrentTime, 1000, | 511 base::TimeDelta(), kCurrentTime, 1000, |
| 512 true); | 512 true); |
| 513 precache_manager_->RecordStatsForFetch(GURL("http://yesterday-fetch.com"), | 513 precache_manager_->RecordStatsForFetch(GURL("http://yesterday-fetch.com"), |
| 514 GURL(), base::TimeDelta(), kCurrentTime, | 514 GURL(), base::TimeDelta(), kCurrentTime, |
| 515 1000, true); | 515 1000, true); |
| 516 expected_histogram_count_map["Precache.Latency.NonPrefetch"] += 2; | 516 expected_histogram_count_map["Precache.Latency.NonPrefetch"] += 2; |
| 517 expected_histogram_count_map["Precache.Latency.NonPrefetch.NonTopHosts"] += 2; | 517 expected_histogram_count_map["Precache.Latency.NonPrefetch.NonTopHosts"] += 2; |
| 518 expected_histogram_count_map["Precache.Saved"] += 2; | 518 expected_histogram_count_map["Precache.Saved"] += 2; |
| 519 | 519 |
| 520 base::MessageLoop::current()->RunUntilIdle(); | 520 base::RunLoop().RunUntilIdle(); |
| 521 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), | 521 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), |
| 522 ContainerEq(expected_histogram_count_map)); | 522 ContainerEq(expected_histogram_count_map)); |
| 523 } | 523 } |
| 524 | 524 |
| 525 } // namespace | 525 } // namespace |
| 526 | 526 |
| 527 } // namespace precache | 527 } // namespace precache |
| OLD | NEW |