| 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/mock_callback.h" | 14 #include "base/test/mock_callback.h" |
| 15 #include "base/test/scoped_task_environment.h" | 15 #include "base/test/scoped_task_environment.h" |
| 16 #include "base/test/test_simple_task_runner.h" | 16 #include "base/test/test_simple_task_runner.h" |
| 17 #include "base/threading/thread_task_runner_handle.h" | 17 #include "base/threading/thread_task_runner_handle.h" |
| 18 #include "components/favicon/core/favicon_client.h" | 18 #include "components/favicon/core/favicon_client.h" |
| 19 #include "components/favicon/core/favicon_service_impl.h" | 19 #include "components/favicon/core/favicon_service_impl.h" |
| 20 #include "components/favicon/core/favicon_util.h" | 20 #include "components/favicon/core/favicon_util.h" |
| 21 #include "components/history/core/browser/history_database_params.h" | 21 #include "components/history/core/browser/history_database_params.h" |
| 22 #include "components/history/core/browser/history_service.h" | 22 #include "components/history/core/browser/history_service.h" |
| 23 #include "components/image_fetcher/core/image_decoder.h" | 23 #include "components/image_fetcher/core/image_decoder.h" |
| 24 #include "components/image_fetcher/core/image_fetcher.h" | 24 #include "components/image_fetcher/core/image_fetcher.h" |
| 25 #include "components/image_fetcher/core/request_metadata.h" | 25 #include "components/image_fetcher/core/request_metadata.h" |
| 26 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "ui/base/resource/resource_bundle.h" | 29 #include "ui/base/resource/resource_bundle.h" |
| 29 #include "ui/base/ui_base_paths.h" | 30 #include "ui/base/ui_base_paths.h" |
| 30 #include "ui/gfx/image/image_unittest_util.h" | 31 #include "ui/gfx/image/image_unittest_util.h" |
| 31 | 32 |
| 32 using ::testing::_; | 33 using ::testing::_; |
| 33 using ::testing::Eq; | 34 using ::testing::Eq; |
| 34 using ::testing::Invoke; | 35 using ::testing::Invoke; |
| 35 using ::testing::InSequence; | 36 using ::testing::InSequence; |
| 36 using ::testing::NiceMock; | 37 using ::testing::NiceMock; |
| 37 using ::testing::Return; | 38 using ::testing::Return; |
| 38 using ::testing::ReturnArg; | 39 using ::testing::ReturnArg; |
| 39 | 40 |
| 40 namespace ntp_tiles { | 41 namespace ntp_tiles { |
| 41 namespace { | 42 namespace { |
| 42 | 43 |
| 43 class MockImageFetcher : public image_fetcher::ImageFetcher { | 44 class MockImageFetcher : public image_fetcher::ImageFetcher { |
| 44 public: | 45 public: |
| 45 MOCK_METHOD1(SetImageFetcherDelegate, | 46 MOCK_METHOD1(SetImageFetcherDelegate, |
| 46 void(image_fetcher::ImageFetcherDelegate* delegate)); | 47 void(image_fetcher::ImageFetcherDelegate* delegate)); |
| 47 MOCK_METHOD1(SetDataUseServiceName, | 48 MOCK_METHOD1(SetDataUseServiceName, |
| 48 void(image_fetcher::ImageFetcher::DataUseServiceName name)); | 49 void(image_fetcher::ImageFetcher::DataUseServiceName name)); |
| 49 MOCK_METHOD1(SetImageDownloadLimit, | 50 MOCK_METHOD1(SetImageDownloadLimit, |
| 50 void(base::Optional<int64_t> max_download_bytes)); | 51 void(base::Optional<int64_t> max_download_bytes)); |
| 51 MOCK_METHOD3(StartOrQueueNetworkRequest, | 52 MOCK_METHOD4(StartOrQueueNetworkRequest, |
| 52 void(const std::string& id, | 53 void(const std::string& id, |
| 53 const GURL& image_url, | 54 const GURL& image_url, |
| 54 const ImageFetcherCallback& callback)); | 55 const ImageFetcherCallback& callback, |
| 56 const net::NetworkTrafficAnnotationTag&)); |
| 55 MOCK_METHOD1(SetDesiredImageFrameSize, void(const gfx::Size&)); | 57 MOCK_METHOD1(SetDesiredImageFrameSize, void(const gfx::Size&)); |
| 56 MOCK_METHOD0(GetImageDecoder, image_fetcher::ImageDecoder*()); | 58 MOCK_METHOD0(GetImageDecoder, image_fetcher::ImageDecoder*()); |
| 57 }; | 59 }; |
| 58 | 60 |
| 59 class MockImageDecoder : public image_fetcher::ImageDecoder { | 61 class MockImageDecoder : public image_fetcher::ImageDecoder { |
| 60 public: | 62 public: |
| 61 MOCK_METHOD3(DecodeImage, | 63 MOCK_METHOD3(DecodeImage, |
| 62 void(const std::string& image_data, | 64 void(const std::string& image_data, |
| 63 const gfx::Size& desired_image_frame_size, | 65 const gfx::Size& desired_image_frame_size, |
| 64 const image_fetcher::ImageDecodedCallback& callback)); | 66 const image_fetcher::ImageDecodedCallback& callback)); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 TEST_F(IconCacherTest, LargeNotCachedAndFetchSucceeded) { | 235 TEST_F(IconCacherTest, LargeNotCachedAndFetchSucceeded) { |
| 234 base::MockCallback<base::Closure> done; | 236 base::MockCallback<base::Closure> done; |
| 235 base::RunLoop loop; | 237 base::RunLoop loop; |
| 236 { | 238 { |
| 237 InSequence s; | 239 InSequence s; |
| 238 EXPECT_CALL(*image_fetcher_, | 240 EXPECT_CALL(*image_fetcher_, |
| 239 SetDataUseServiceName( | 241 SetDataUseServiceName( |
| 240 data_use_measurement::DataUseUserData::NTP_TILES)); | 242 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 241 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 243 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 242 EXPECT_CALL(*image_fetcher_, | 244 EXPECT_CALL(*image_fetcher_, |
| 243 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) | 245 StartOrQueueNetworkRequest(_, site_.large_icon_url, _, _)) |
| 244 .WillOnce(PassFetch(128, 128)); | 246 .WillOnce(PassFetch(128, 128)); |
| 245 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); | 247 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
| 246 } | 248 } |
| 247 | 249 |
| 248 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 250 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
| 249 cacher.StartFetch(site_, done.Get(), done.Get()); | 251 cacher.StartFetch(site_, done.Get(), done.Get()); |
| 250 loop.Run(); | 252 loop.Run(); |
| 251 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 253 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 252 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 254 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 253 } | 255 } |
| 254 | 256 |
| 255 TEST_F(IconCacherTest, SmallNotCachedAndFetchSucceeded) { | 257 TEST_F(IconCacherTest, SmallNotCachedAndFetchSucceeded) { |
| 256 site_.large_icon_url = GURL(); | 258 site_.large_icon_url = GURL(); |
| 257 | 259 |
| 258 base::MockCallback<base::Closure> done; | 260 base::MockCallback<base::Closure> done; |
| 259 base::RunLoop loop; | 261 base::RunLoop loop; |
| 260 { | 262 { |
| 261 InSequence s; | 263 InSequence s; |
| 262 EXPECT_CALL(*image_fetcher_, | 264 EXPECT_CALL(*image_fetcher_, |
| 263 SetDataUseServiceName( | 265 SetDataUseServiceName( |
| 264 data_use_measurement::DataUseUserData::NTP_TILES)); | 266 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 265 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 267 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 266 EXPECT_CALL(*image_fetcher_, | 268 EXPECT_CALL(*image_fetcher_, |
| 267 StartOrQueueNetworkRequest(_, site_.favicon_url, _)) | 269 StartOrQueueNetworkRequest(_, site_.favicon_url, _, _)) |
| 268 .WillOnce(PassFetch(128, 128)); | 270 .WillOnce(PassFetch(128, 128)); |
| 269 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); | 271 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
| 270 } | 272 } |
| 271 | 273 |
| 272 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 274 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
| 273 cacher.StartFetch(site_, done.Get(), done.Get()); | 275 cacher.StartFetch(site_, done.Get(), done.Get()); |
| 274 loop.Run(); | 276 loop.Run(); |
| 275 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 277 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 276 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 278 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 277 } | 279 } |
| 278 | 280 |
| 279 TEST_F(IconCacherTest, LargeNotCachedAndFetchFailed) { | 281 TEST_F(IconCacherTest, LargeNotCachedAndFetchFailed) { |
| 280 base::MockCallback<base::Closure> done; | 282 base::MockCallback<base::Closure> done; |
| 281 EXPECT_CALL(done, Run()).Times(0); | 283 EXPECT_CALL(done, Run()).Times(0); |
| 282 { | 284 { |
| 283 InSequence s; | 285 InSequence s; |
| 284 EXPECT_CALL(*image_fetcher_, | 286 EXPECT_CALL(*image_fetcher_, |
| 285 SetDataUseServiceName( | 287 SetDataUseServiceName( |
| 286 data_use_measurement::DataUseUserData::NTP_TILES)); | 288 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 287 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 289 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 288 EXPECT_CALL(*image_fetcher_, | 290 EXPECT_CALL(*image_fetcher_, |
| 289 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) | 291 StartOrQueueNetworkRequest(_, site_.large_icon_url, _, _)) |
| 290 .WillOnce(FailFetch()); | 292 .WillOnce(FailFetch()); |
| 291 } | 293 } |
| 292 | 294 |
| 293 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 295 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
| 294 cacher.StartFetch(site_, done.Get(), done.Get()); | 296 cacher.StartFetch(site_, done.Get(), done.Get()); |
| 295 WaitForTasksToFinish(); | 297 WaitForTasksToFinish(); |
| 296 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 298 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 297 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 299 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 298 } | 300 } |
| 299 | 301 |
| 300 TEST_F(IconCacherTest, HandlesEmptyCallbacksNicely) { | 302 TEST_F(IconCacherTest, HandlesEmptyCallbacksNicely) { |
| 301 EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_)); | 303 EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_)); |
| 302 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_)); | 304 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_)); |
| 303 ON_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _)) | 305 ON_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _, _)) |
| 304 .WillByDefault(PassFetch(128, 128)); | 306 .WillByDefault(PassFetch(128, 128)); |
| 305 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 307 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
| 306 cacher.StartFetch(site_, base::Closure(), base::Closure()); | 308 cacher.StartFetch(site_, base::Closure(), base::Closure()); |
| 307 WaitForTasksToFinish(); | 309 WaitForTasksToFinish(); |
| 308 } | 310 } |
| 309 | 311 |
| 310 TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) { | 312 TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) { |
| 311 // The returned data string is not used by the mocked decoder. | 313 // The returned data string is not used by the mocked decoder. |
| 312 ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) | 314 ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) |
| 313 .WillByDefault(Return("")); | 315 .WillByDefault(Return("")); |
| 314 // It's not important when the image_fetcher's decoder is used to decode the | 316 // It's not important when the image_fetcher's decoder is used to decode the |
| 315 // image but it must happen at some point. | 317 // image but it must happen at some point. |
| 316 EXPECT_CALL(*image_fetcher_, GetImageDecoder()) | 318 EXPECT_CALL(*image_fetcher_, GetImageDecoder()) |
| 317 .WillOnce(Return(image_decoder_.get())); | 319 .WillOnce(Return(image_decoder_.get())); |
| 318 EXPECT_CALL(*image_decoder_, DecodeImage(_, gfx::Size(128, 128), _)) | 320 EXPECT_CALL(*image_decoder_, DecodeImage(_, gfx::Size(128, 128), _)) |
| 319 .WillOnce(DecodeSuccessfully(64, 64)); | 321 .WillOnce(DecodeSuccessfully(64, 64)); |
| 320 base::MockCallback<base::Closure> preliminary_icon_available; | 322 base::MockCallback<base::Closure> preliminary_icon_available; |
| 321 base::MockCallback<base::Closure> icon_available; | 323 base::MockCallback<base::Closure> icon_available; |
| 322 base::RunLoop default_loop; | 324 base::RunLoop default_loop; |
| 323 base::RunLoop fetch_loop; | 325 base::RunLoop fetch_loop; |
| 324 { | 326 { |
| 325 InSequence s; | 327 InSequence s; |
| 326 EXPECT_CALL(*image_fetcher_, | 328 EXPECT_CALL(*image_fetcher_, |
| 327 SetDataUseServiceName( | 329 SetDataUseServiceName( |
| 328 data_use_measurement::DataUseUserData::NTP_TILES)); | 330 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 329 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 331 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 330 EXPECT_CALL(*image_fetcher_, | 332 EXPECT_CALL(*image_fetcher_, |
| 331 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) | 333 StartOrQueueNetworkRequest(_, site_.large_icon_url, _, _)) |
| 332 .WillOnce(PassFetch(128, 128)); | 334 .WillOnce(PassFetch(128, 128)); |
| 333 | 335 |
| 334 // Both callback are called async after the request but preliminary has to | 336 // Both callback are called async after the request but preliminary has to |
| 335 // preceed icon_available. | 337 // preceed icon_available. |
| 336 EXPECT_CALL(preliminary_icon_available, Run()) | 338 EXPECT_CALL(preliminary_icon_available, Run()) |
| 337 .WillOnce(Quit(&default_loop)); | 339 .WillOnce(Quit(&default_loop)); |
| 338 EXPECT_CALL(icon_available, Run()).WillOnce(Quit(&fetch_loop)); | 340 EXPECT_CALL(icon_available, Run()).WillOnce(Quit(&fetch_loop)); |
| 339 } | 341 } |
| 340 | 342 |
| 341 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 343 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
| 342 site_.default_icon_resource = 12345; | 344 site_.default_icon_resource = 12345; |
| 343 cacher.StartFetch(site_, icon_available.Get(), | 345 cacher.StartFetch(site_, icon_available.Get(), |
| 344 preliminary_icon_available.Get()); | 346 preliminary_icon_available.Get()); |
| 345 | 347 |
| 346 default_loop.Run(); // Wait for the default image. | 348 default_loop.Run(); // Wait for the default image. |
| 347 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), | 349 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), |
| 348 Eq(gfx::Size(64, 64))); // Compares dimensions, not objects. | 350 Eq(gfx::Size(64, 64))); // Compares dimensions, not objects. |
| 349 | 351 |
| 350 // Let the fetcher continue and wait for the second call of the callback. | 352 // Let the fetcher continue and wait for the second call of the callback. |
| 351 fetch_loop.Run(); // Wait for the updated image. | 353 fetch_loop.Run(); // Wait for the updated image. |
| 352 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), | 354 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), |
| 353 Eq(gfx::Size(128, 128))); // Compares dimensions, not objects. | 355 Eq(gfx::Size(128, 128))); // Compares dimensions, not objects. |
| 354 } | 356 } |
| 355 | 357 |
| 356 } // namespace | 358 } // namespace |
| 357 } // namespace ntp_tiles | 359 } // namespace ntp_tiles |
| OLD | NEW |