| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/ntp_tiles/icon_cacher_impl.h" | 5 #include "components/ntp_tiles/icon_cacher_impl.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/path_service.h" | 12 #include "base/path_service.h" |
| 13 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
| 14 #include "base/test/histogram_tester.h" |
| 14 #include "base/test/mock_callback.h" | 15 #include "base/test/mock_callback.h" |
| 15 #include "base/test/scoped_task_environment.h" | 16 #include "base/test/scoped_task_environment.h" |
| 16 #include "base/test/test_simple_task_runner.h" | 17 #include "base/test/test_simple_task_runner.h" |
| 17 #include "base/threading/thread_task_runner_handle.h" | 18 #include "base/threading/thread_task_runner_handle.h" |
| 18 #include "components/favicon/core/favicon_client.h" | 19 #include "components/favicon/core/favicon_client.h" |
| 19 #include "components/favicon/core/favicon_service_impl.h" | 20 #include "components/favicon/core/favicon_service_impl.h" |
| 20 #include "components/favicon/core/favicon_util.h" | 21 #include "components/favicon/core/favicon_util.h" |
| 21 #include "components/favicon/core/large_icon_service.h" | 22 #include "components/favicon/core/large_icon_service.h" |
| 22 #include "components/history/core/browser/history_database_params.h" | 23 #include "components/history/core/browser/history_database_params.h" |
| 23 #include "components/history/core/browser/history_service.h" | 24 #include "components/history/core/browser/history_service.h" |
| 24 #include "components/image_fetcher/core/image_decoder.h" | 25 #include "components/image_fetcher/core/image_decoder.h" |
| 25 #include "components/image_fetcher/core/image_fetcher.h" | 26 #include "components/image_fetcher/core/image_fetcher.h" |
| 26 #include "components/image_fetcher/core/request_metadata.h" | 27 #include "components/image_fetcher/core/request_metadata.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 #include "ui/base/resource/resource_bundle.h" | 30 #include "ui/base/resource/resource_bundle.h" |
| 30 #include "ui/base/ui_base_paths.h" | 31 #include "ui/base/ui_base_paths.h" |
| 31 #include "ui/gfx/image/image_unittest_util.h" | 32 #include "ui/gfx/image/image_unittest_util.h" |
| 32 | 33 |
| 34 using base::Bucket; |
| 33 using ::testing::_; | 35 using ::testing::_; |
| 36 using ::testing::ElementsAre; |
| 34 using ::testing::Eq; | 37 using ::testing::Eq; |
| 35 using ::testing::Invoke; | 38 using ::testing::Invoke; |
| 36 using ::testing::InSequence; | 39 using ::testing::InSequence; |
| 40 using ::testing::IsEmpty; |
| 37 using ::testing::NiceMock; | 41 using ::testing::NiceMock; |
| 38 using ::testing::Return; | 42 using ::testing::Return; |
| 39 using ::testing::ReturnArg; | 43 using ::testing::ReturnArg; |
| 40 | 44 |
| 41 namespace ntp_tiles { | 45 namespace ntp_tiles { |
| 42 namespace { | 46 namespace { |
| 43 | 47 |
| 44 class MockImageFetcher : public image_fetcher::ImageFetcher { | 48 class MockImageFetcher : public image_fetcher::ImageFetcher { |
| 45 public: | 49 public: |
| 46 MOCK_METHOD1(SetImageFetcherDelegate, | 50 MOCK_METHOD1(SetImageFetcherDelegate, |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 ui::SCALE_FACTOR_NONE); | 227 ui::SCALE_FACTOR_NONE); |
| 224 } | 228 } |
| 225 | 229 |
| 226 PopularSites::Site site_; | 230 PopularSites::Site site_; |
| 227 std::unique_ptr<MockImageFetcher> image_fetcher_; | 231 std::unique_ptr<MockImageFetcher> image_fetcher_; |
| 228 std::unique_ptr<MockImageDecoder> image_decoder_; | 232 std::unique_ptr<MockImageDecoder> image_decoder_; |
| 229 NiceMock<MockResourceDelegate> mock_resource_delegate_; | 233 NiceMock<MockResourceDelegate> mock_resource_delegate_; |
| 230 }; | 234 }; |
| 231 | 235 |
| 232 TEST_F(IconCacherTestPopularSites, LargeCached) { | 236 TEST_F(IconCacherTestPopularSites, LargeCached) { |
| 237 base::HistogramTester histogram_tester; |
| 233 base::MockCallback<base::Closure> done; | 238 base::MockCallback<base::Closure> done; |
| 234 EXPECT_CALL(done, Run()).Times(0); | 239 EXPECT_CALL(done, Run()).Times(0); |
| 235 base::RunLoop loop; | 240 base::RunLoop loop; |
| 236 { | 241 { |
| 237 InSequence s; | 242 InSequence s; |
| 238 EXPECT_CALL(*image_fetcher_, | 243 EXPECT_CALL(*image_fetcher_, |
| 239 SetDataUseServiceName( | 244 SetDataUseServiceName( |
| 240 data_use_measurement::DataUseUserData::NTP_TILES)); | 245 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 241 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 246 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 242 } | 247 } |
| 243 PreloadIcon(site_.url, site_.large_icon_url, favicon_base::TOUCH_ICON, 128, | 248 PreloadIcon(site_.url, site_.large_icon_url, favicon_base::TOUCH_ICON, 128, |
| 244 128); | 249 128); |
| 245 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); | 250 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
| 246 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); | 251 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
| 247 WaitForMainThreadTasksToFinish(); | 252 WaitForMainThreadTasksToFinish(); |
| 248 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 253 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 249 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 254 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 255 EXPECT_THAT( |
| 256 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"), |
| 257 IsEmpty()); |
| 250 } | 258 } |
| 251 | 259 |
| 252 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchSucceeded) { | 260 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchSucceeded) { |
| 261 base::HistogramTester histogram_tester; |
| 253 base::MockCallback<base::Closure> done; | 262 base::MockCallback<base::Closure> done; |
| 254 base::RunLoop loop; | 263 base::RunLoop loop; |
| 255 { | 264 { |
| 256 InSequence s; | 265 InSequence s; |
| 257 EXPECT_CALL(*image_fetcher_, | 266 EXPECT_CALL(*image_fetcher_, |
| 258 SetDataUseServiceName( | 267 SetDataUseServiceName( |
| 259 data_use_measurement::DataUseUserData::NTP_TILES)); | 268 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 260 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 269 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 261 EXPECT_CALL(*image_fetcher_, | 270 EXPECT_CALL(*image_fetcher_, |
| 262 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) | 271 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) |
| 263 .WillOnce(PassFetch(128, 128)); | 272 .WillOnce(PassFetch(128, 128)); |
| 264 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); | 273 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
| 265 } | 274 } |
| 266 | 275 |
| 267 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); | 276 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
| 268 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); | 277 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
| 269 loop.Run(); | 278 loop.Run(); |
| 270 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 279 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 271 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 280 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 281 EXPECT_THAT( |
| 282 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"), |
| 283 ElementsAre(Bucket(/*bucket=*/0, /*count=*/1))); // bucket 0 = SUCCESS. |
| 272 } | 284 } |
| 273 | 285 |
| 274 TEST_F(IconCacherTestPopularSites, SmallNotCachedAndFetchSucceeded) { | 286 TEST_F(IconCacherTestPopularSites, SmallNotCachedAndFetchSucceeded) { |
| 275 site_.large_icon_url = GURL(); | 287 site_.large_icon_url = GURL(); |
| 276 | 288 |
| 277 base::MockCallback<base::Closure> done; | 289 base::MockCallback<base::Closure> done; |
| 278 base::RunLoop loop; | 290 base::RunLoop loop; |
| 279 { | 291 { |
| 280 InSequence s; | 292 InSequence s; |
| 281 EXPECT_CALL(*image_fetcher_, | 293 EXPECT_CALL(*image_fetcher_, |
| 282 SetDataUseServiceName( | 294 SetDataUseServiceName( |
| 283 data_use_measurement::DataUseUserData::NTP_TILES)); | 295 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 284 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 296 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 285 EXPECT_CALL(*image_fetcher_, | 297 EXPECT_CALL(*image_fetcher_, |
| 286 StartOrQueueNetworkRequest(_, site_.favicon_url, _)) | 298 StartOrQueueNetworkRequest(_, site_.favicon_url, _)) |
| 287 .WillOnce(PassFetch(128, 128)); | 299 .WillOnce(PassFetch(128, 128)); |
| 288 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); | 300 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
| 289 } | 301 } |
| 290 | 302 |
| 291 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); | 303 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
| 292 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); | 304 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
| 293 loop.Run(); | 305 loop.Run(); |
| 294 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 306 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 295 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 307 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 296 } | 308 } |
| 297 | 309 |
| 298 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchFailed) { | 310 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchFailed) { |
| 311 base::HistogramTester histogram_tester; |
| 299 base::MockCallback<base::Closure> done; | 312 base::MockCallback<base::Closure> done; |
| 300 EXPECT_CALL(done, Run()).Times(0); | 313 EXPECT_CALL(done, Run()).Times(0); |
| 301 { | 314 { |
| 302 InSequence s; | 315 InSequence s; |
| 303 EXPECT_CALL(*image_fetcher_, | 316 EXPECT_CALL(*image_fetcher_, |
| 304 SetDataUseServiceName( | 317 SetDataUseServiceName( |
| 305 data_use_measurement::DataUseUserData::NTP_TILES)); | 318 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 306 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 319 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 307 EXPECT_CALL(*image_fetcher_, | 320 EXPECT_CALL(*image_fetcher_, |
| 308 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) | 321 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) |
| 309 .WillOnce(FailFetch()); | 322 .WillOnce(FailFetch()); |
| 310 } | 323 } |
| 311 | 324 |
| 312 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); | 325 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
| 313 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); | 326 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
| 314 WaitForMainThreadTasksToFinish(); | 327 WaitForMainThreadTasksToFinish(); |
| 315 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 328 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 316 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 329 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 330 EXPECT_THAT( |
| 331 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"), |
| 332 ElementsAre(Bucket(/*bucket=*/1, /*count=*/1))); // bucket 1 = FAILURE. |
| 317 } | 333 } |
| 318 | 334 |
| 319 TEST_F(IconCacherTestPopularSites, HandlesEmptyCallbacksNicely) { | 335 TEST_F(IconCacherTestPopularSites, HandlesEmptyCallbacksNicely) { |
| 336 base::HistogramTester histogram_tester; |
| 320 EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_)); | 337 EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_)); |
| 321 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_)); | 338 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_)); |
| 322 EXPECT_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _)) | 339 EXPECT_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _)) |
| 323 .WillOnce(PassFetch(128, 128)); | 340 .WillOnce(PassFetch(128, 128)); |
| 324 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); | 341 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
| 325 cacher.StartFetchPopularSites(site_, base::Closure(), base::Closure()); | 342 cacher.StartFetchPopularSites(site_, base::Closure(), base::Closure()); |
| 326 WaitForHistoryThreadTasksToFinish(); // Writing the icon into the DB. | 343 WaitForHistoryThreadTasksToFinish(); // Writing the icon into the DB. |
| 327 WaitForMainThreadTasksToFinish(); // Finishing tasks after the DB write. | 344 WaitForMainThreadTasksToFinish(); // Finishing tasks after the DB write. |
| 328 // Even though the callbacks are not called, the icon gets written out. | 345 // Even though the callbacks are not called, the icon gets written out. |
| 329 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 346 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 330 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 347 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 348 // The histogram gets reported despite empty callbacks. |
| 349 EXPECT_THAT( |
| 350 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"), |
| 351 ElementsAre(Bucket(/*bucket=*/0, /*count=*/1))); // bucket 0 = SUCCESS. |
| 331 } | 352 } |
| 332 | 353 |
| 333 TEST_F(IconCacherTestPopularSites, ProvidesDefaultIconAndSucceedsWithFetching) { | 354 TEST_F(IconCacherTestPopularSites, ProvidesDefaultIconAndSucceedsWithFetching) { |
| 355 base::HistogramTester histogram_tester; |
| 334 // The returned data string is not used by the mocked decoder. | 356 // The returned data string is not used by the mocked decoder. |
| 335 ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) | 357 ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) |
| 336 .WillByDefault(Return("")); | 358 .WillByDefault(Return("")); |
| 337 // It's not important when the image_fetcher's decoder is used to decode the | 359 // It's not important when the image_fetcher's decoder is used to decode the |
| 338 // image but it must happen at some point. | 360 // image but it must happen at some point. |
| 339 EXPECT_CALL(*image_fetcher_, GetImageDecoder()) | 361 EXPECT_CALL(*image_fetcher_, GetImageDecoder()) |
| 340 .WillOnce(Return(image_decoder_.get())); | 362 .WillOnce(Return(image_decoder_.get())); |
| 341 EXPECT_CALL(*image_decoder_, DecodeImage(_, gfx::Size(128, 128), _)) | 363 EXPECT_CALL(*image_decoder_, DecodeImage(_, gfx::Size(128, 128), _)) |
| 342 .WillOnce(DecodeSuccessfully(64, 64)); | 364 .WillOnce(DecodeSuccessfully(64, 64)); |
| 343 base::MockCallback<base::Closure> preliminary_icon_available; | 365 base::MockCallback<base::Closure> preliminary_icon_available; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 367 preliminary_icon_available.Get()); | 389 preliminary_icon_available.Get()); |
| 368 | 390 |
| 369 default_loop.Run(); // Wait for the default image. | 391 default_loop.Run(); // Wait for the default image. |
| 370 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), | 392 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), |
| 371 Eq(gfx::Size(64, 64))); // Compares dimensions, not objects. | 393 Eq(gfx::Size(64, 64))); // Compares dimensions, not objects. |
| 372 | 394 |
| 373 // Let the fetcher continue and wait for the second call of the callback. | 395 // Let the fetcher continue and wait for the second call of the callback. |
| 374 fetch_loop.Run(); // Wait for the updated image. | 396 fetch_loop.Run(); // Wait for the updated image. |
| 375 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), | 397 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), |
| 376 Eq(gfx::Size(128, 128))); // Compares dimensions, not objects. | 398 Eq(gfx::Size(128, 128))); // Compares dimensions, not objects. |
| 399 // The histogram gets reported only once (for the downloaded icon, not for the |
| 400 // default one). |
| 401 EXPECT_THAT( |
| 402 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"), |
| 403 ElementsAre(Bucket(/*bucket=*/0, /*count=*/1))); // bucket 0 = SUCCESS. |
| 377 } | 404 } |
| 378 | 405 |
| 379 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchPerformedOnlyOnce) { | 406 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchPerformedOnlyOnce) { |
| 380 base::MockCallback<base::Closure> done; | 407 base::MockCallback<base::Closure> done; |
| 381 base::RunLoop loop; | 408 base::RunLoop loop; |
| 382 { | 409 { |
| 383 InSequence s; | 410 InSequence s; |
| 384 // Image fetcher is used only once. | 411 // Image fetcher is used only once. |
| 385 EXPECT_CALL(*image_fetcher_, | 412 EXPECT_CALL(*image_fetcher_, |
| 386 SetDataUseServiceName( | 413 SetDataUseServiceName( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 } | 448 } |
| 422 | 449 |
| 423 scoped_refptr<base::TestSimpleTaskRunner> | 450 scoped_refptr<base::TestSimpleTaskRunner> |
| 424 large_icon_service_background_task_runner_; | 451 large_icon_service_background_task_runner_; |
| 425 std::unique_ptr<MockImageFetcher> fetcher_for_large_icon_service_; | 452 std::unique_ptr<MockImageFetcher> fetcher_for_large_icon_service_; |
| 426 std::unique_ptr<MockImageFetcher> fetcher_for_icon_cacher_; | 453 std::unique_ptr<MockImageFetcher> fetcher_for_icon_cacher_; |
| 427 }; | 454 }; |
| 428 | 455 |
| 429 TEST_F(IconCacherTestMostLikely, Cached) { | 456 TEST_F(IconCacherTestMostLikely, Cached) { |
| 430 GURL page_url("http://www.site.com"); | 457 GURL page_url("http://www.site.com"); |
| 458 base::HistogramTester histogram_tester; |
| 459 |
| 431 GURL icon_url("http://www.site.com/favicon.png"); | 460 GURL icon_url("http://www.site.com/favicon.png"); |
| 432 PreloadIcon(page_url, icon_url, favicon_base::TOUCH_ICON, 128, 128); | 461 PreloadIcon(page_url, icon_url, favicon_base::TOUCH_ICON, 128, 128); |
| 433 | 462 |
| 434 favicon::LargeIconService large_icon_service( | 463 favicon::LargeIconService large_icon_service( |
| 435 &favicon_service_, large_icon_service_background_task_runner_, | 464 &favicon_service_, large_icon_service_background_task_runner_, |
| 436 std::move(fetcher_for_large_icon_service_)); | 465 std::move(fetcher_for_large_icon_service_)); |
| 437 IconCacherImpl cacher(&favicon_service_, &large_icon_service, | 466 IconCacherImpl cacher(&favicon_service_, &large_icon_service, |
| 438 std::move(fetcher_for_icon_cacher_)); | 467 std::move(fetcher_for_icon_cacher_)); |
| 439 | 468 |
| 440 base::MockCallback<base::Closure> done; | 469 base::MockCallback<base::Closure> done; |
| 441 EXPECT_CALL(done, Run()).Times(0); | 470 EXPECT_CALL(done, Run()).Times(0); |
| 442 cacher.StartFetchMostLikely(page_url, done.Get()); | 471 cacher.StartFetchMostLikely(page_url, done.Get()); |
| 443 WaitForMainThreadTasksToFinish(); | 472 WaitForMainThreadTasksToFinish(); |
| 444 | 473 |
| 445 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); | 474 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); |
| 446 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); | 475 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); |
| 476 EXPECT_THAT( |
| 477 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.server"), |
| 478 IsEmpty()); |
| 447 } | 479 } |
| 448 | 480 |
| 449 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchSucceeded) { | 481 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchSucceeded) { |
| 450 GURL page_url("http://www.site.com"); | 482 GURL page_url("http://www.site.com"); |
| 483 base::HistogramTester histogram_tester; |
| 451 | 484 |
| 452 base::MockCallback<base::Closure> done; | 485 base::MockCallback<base::Closure> done; |
| 453 base::RunLoop loop; | 486 base::RunLoop loop; |
| 454 { | 487 { |
| 455 InSequence s; | 488 InSequence s; |
| 456 EXPECT_CALL(*fetcher_for_large_icon_service_, | 489 EXPECT_CALL(*fetcher_for_large_icon_service_, |
| 457 SetDataUseServiceName( | 490 SetDataUseServiceName( |
| 458 data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE)); | 491 data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE)); |
| 459 EXPECT_CALL(*fetcher_for_large_icon_service_, | 492 EXPECT_CALL(*fetcher_for_large_icon_service_, |
| 460 StartOrQueueNetworkRequest(_, _, _)) | 493 StartOrQueueNetworkRequest(_, _, _)) |
| 461 .WillOnce(PassFetch(128, 128)); | 494 .WillOnce(PassFetch(128, 128)); |
| 462 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); | 495 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
| 463 } | 496 } |
| 464 | 497 |
| 465 favicon::LargeIconService large_icon_service( | 498 favicon::LargeIconService large_icon_service( |
| 466 &favicon_service_, large_icon_service_background_task_runner_, | 499 &favicon_service_, large_icon_service_background_task_runner_, |
| 467 std::move(fetcher_for_large_icon_service_)); | 500 std::move(fetcher_for_large_icon_service_)); |
| 468 IconCacherImpl cacher(&favicon_service_, &large_icon_service, | 501 IconCacherImpl cacher(&favicon_service_, &large_icon_service, |
| 469 std::move(fetcher_for_icon_cacher_)); | 502 std::move(fetcher_for_icon_cacher_)); |
| 470 | 503 |
| 471 cacher.StartFetchMostLikely(page_url, done.Get()); | 504 cacher.StartFetchMostLikely(page_url, done.Get()); |
| 472 // Both these task runners need to be flushed in order to get |done| called by | 505 // Both these task runners need to be flushed in order to get |done| called by |
| 473 // running the main loop. | 506 // running the main loop. |
| 474 WaitForHistoryThreadTasksToFinish(); | 507 WaitForHistoryThreadTasksToFinish(); |
| 475 large_icon_service_background_task_runner_->RunUntilIdle(); | 508 large_icon_service_background_task_runner_->RunUntilIdle(); |
| 476 | 509 |
| 477 loop.Run(); | 510 loop.Run(); |
| 478 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); | 511 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); |
| 479 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); | 512 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); |
| 513 EXPECT_THAT( |
| 514 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.server"), |
| 515 ElementsAre(Bucket(/*bucket=*/0, /*count=*/1))); // bucket 0 = SUCCESS. |
| 480 } | 516 } |
| 481 | 517 |
| 482 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchFailed) { | 518 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchFailed) { |
| 483 GURL page_url("http://www.site.com"); | 519 GURL page_url("http://www.site.com"); |
| 520 base::HistogramTester histogram_tester; |
| 484 | 521 |
| 485 base::MockCallback<base::Closure> done; | 522 base::MockCallback<base::Closure> done; |
| 486 { | 523 { |
| 487 InSequence s; | 524 InSequence s; |
| 488 EXPECT_CALL(*fetcher_for_large_icon_service_, | 525 EXPECT_CALL(*fetcher_for_large_icon_service_, |
| 489 SetDataUseServiceName( | 526 SetDataUseServiceName( |
| 490 data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE)); | 527 data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE)); |
| 491 EXPECT_CALL(*fetcher_for_large_icon_service_, | 528 EXPECT_CALL(*fetcher_for_large_icon_service_, |
| 492 StartOrQueueNetworkRequest(_, _, _)) | 529 StartOrQueueNetworkRequest(_, _, _)) |
| 493 .WillOnce(FailFetch()); | 530 .WillOnce(FailFetch()); |
| 494 EXPECT_CALL(done, Run()).Times(0); | 531 EXPECT_CALL(done, Run()).Times(0); |
| 495 } | 532 } |
| 496 | 533 |
| 497 favicon::LargeIconService large_icon_service( | 534 favicon::LargeIconService large_icon_service( |
| 498 &favicon_service_, large_icon_service_background_task_runner_, | 535 &favicon_service_, large_icon_service_background_task_runner_, |
| 499 std::move(fetcher_for_large_icon_service_)); | 536 std::move(fetcher_for_large_icon_service_)); |
| 500 IconCacherImpl cacher(&favicon_service_, &large_icon_service, | 537 IconCacherImpl cacher(&favicon_service_, &large_icon_service, |
| 501 std::move(fetcher_for_icon_cacher_)); | 538 std::move(fetcher_for_icon_cacher_)); |
| 502 | 539 |
| 503 cacher.StartFetchMostLikely(page_url, done.Get()); | 540 cacher.StartFetchMostLikely(page_url, done.Get()); |
| 504 // Both these task runners need to be flushed before flushing the main thread | 541 // Both these task runners need to be flushed before flushing the main thread |
| 505 // queue in order to finish the work. | 542 // queue in order to finish the work. |
| 506 WaitForHistoryThreadTasksToFinish(); | 543 WaitForHistoryThreadTasksToFinish(); |
| 507 large_icon_service_background_task_runner_->RunUntilIdle(); | 544 large_icon_service_background_task_runner_->RunUntilIdle(); |
| 508 WaitForMainThreadTasksToFinish(); | 545 WaitForMainThreadTasksToFinish(); |
| 509 | 546 |
| 510 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); | 547 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); |
| 511 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); | 548 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); |
| 549 EXPECT_THAT( |
| 550 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.server"), |
| 551 ElementsAre(Bucket(/*bucket=*/1, /*count=*/1))); // bucket 1 = FAILURE. |
| 512 } | 552 } |
| 513 | 553 |
| 514 TEST_F(IconCacherTestMostLikely, HandlesEmptyCallbacksNicely) { | 554 TEST_F(IconCacherTestMostLikely, HandlesEmptyCallbacksNicely) { |
| 515 GURL page_url("http://www.site.com"); | 555 GURL page_url("http://www.site.com"); |
| 516 | 556 |
| 517 EXPECT_CALL(*fetcher_for_large_icon_service_, SetDataUseServiceName(_)); | 557 EXPECT_CALL(*fetcher_for_large_icon_service_, SetDataUseServiceName(_)); |
| 518 EXPECT_CALL(*fetcher_for_large_icon_service_, | 558 EXPECT_CALL(*fetcher_for_large_icon_service_, |
| 519 StartOrQueueNetworkRequest(_, _, _)) | 559 StartOrQueueNetworkRequest(_, _, _)) |
| 520 .WillOnce(PassFetch(128, 128)); | 560 .WillOnce(PassFetch(128, 128)); |
| 521 | 561 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 WaitForHistoryThreadTasksToFinish(); | 608 WaitForHistoryThreadTasksToFinish(); |
| 569 large_icon_service_background_task_runner_->RunUntilIdle(); | 609 large_icon_service_background_task_runner_->RunUntilIdle(); |
| 570 | 610 |
| 571 loop.Run(); | 611 loop.Run(); |
| 572 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); | 612 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); |
| 573 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); | 613 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); |
| 574 } | 614 } |
| 575 | 615 |
| 576 } // namespace | 616 } // namespace |
| 577 } // namespace ntp_tiles | 617 } // namespace ntp_tiles |
| OLD | NEW |