| 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/favicon/core/large_icon_service.h" |
| 21 #include "components/history/core/browser/history_database_params.h" | 22 #include "components/history/core/browser/history_database_params.h" |
| 22 #include "components/history/core/browser/history_service.h" | 23 #include "components/history/core/browser/history_service.h" |
| 23 #include "components/image_fetcher/core/image_decoder.h" | 24 #include "components/image_fetcher/core/image_decoder.h" |
| 24 #include "components/image_fetcher/core/image_fetcher.h" | 25 #include "components/image_fetcher/core/image_fetcher.h" |
| 25 #include "components/image_fetcher/core/request_metadata.h" | 26 #include "components/image_fetcher/core/request_metadata.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" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 class IconCacherTest : public ::testing::Test { | 98 class IconCacherTest : public ::testing::Test { |
| 98 protected: | 99 protected: |
| 99 IconCacherTest() | 100 IconCacherTest() |
| 100 : site_(base::string16(), // title, unused | 101 : site_(base::string16(), // title, unused |
| 101 GURL("http://url.google/"), | 102 GURL("http://url.google/"), |
| 102 GURL("http://url.google/icon.png"), | 103 GURL("http://url.google/icon.png"), |
| 103 GURL("http://url.google/favicon.ico"), | 104 GURL("http://url.google/favicon.ico"), |
| 104 GURL()), // thumbnail, unused | 105 GURL()), // thumbnail, unused |
| 105 image_fetcher_(new ::testing::StrictMock<MockImageFetcher>), | 106 image_fetcher_(new ::testing::StrictMock<MockImageFetcher>), |
| 106 image_decoder_(new ::testing::StrictMock<MockImageDecoder>), | 107 image_decoder_(new ::testing::StrictMock<MockImageDecoder>), |
| 108 task_runner_(new base::TestSimpleTaskRunner()), |
| 107 favicon_service_(/*favicon_client=*/nullptr, &history_service_), | 109 favicon_service_(/*favicon_client=*/nullptr, &history_service_), |
| 108 task_runner_(new base::TestSimpleTaskRunner()) { | 110 large_icon_service_( |
| 111 &favicon_service_, |
| 112 task_runner_, |
| 113 base::MakeUnique<::testing::StrictMock<MockImageFetcher>>()) { |
| 109 CHECK(history_dir_.CreateUniqueTempDir()); | 114 CHECK(history_dir_.CreateUniqueTempDir()); |
| 110 CHECK(history_service_.Init( | 115 CHECK(history_service_.Init( |
| 111 history::HistoryDatabaseParams(history_dir_.GetPath(), 0, 0))); | 116 history::HistoryDatabaseParams(history_dir_.GetPath(), 0, 0))); |
| 112 } | 117 } |
| 113 | 118 |
| 114 void SetUp() override { | 119 void SetUp() override { |
| 115 if (ui::ResourceBundle::HasSharedInstance()) { | 120 if (ui::ResourceBundle::HasSharedInstance()) { |
| 116 ui::ResourceBundle::CleanupSharedInstance(); | 121 ui::ResourceBundle::CleanupSharedInstance(); |
| 117 } | 122 } |
| 118 ON_CALL(mock_resource_delegate_, GetPathForResourcePack(_, _)) | 123 ON_CALL(mock_resource_delegate_, GetPathForResourcePack(_, _)) |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 } | 182 } |
| 178 | 183 |
| 179 void WaitForTasksToFinish() { task_runner_->RunUntilIdle(); } | 184 void WaitForTasksToFinish() { task_runner_->RunUntilIdle(); } |
| 180 | 185 |
| 181 base::test::ScopedTaskEnvironment scoped_task_environment_; | 186 base::test::ScopedTaskEnvironment scoped_task_environment_; |
| 182 PopularSites::Site site_; | 187 PopularSites::Site site_; |
| 183 std::unique_ptr<MockImageFetcher> image_fetcher_; | 188 std::unique_ptr<MockImageFetcher> image_fetcher_; |
| 184 std::unique_ptr<MockImageDecoder> image_decoder_; | 189 std::unique_ptr<MockImageDecoder> image_decoder_; |
| 185 base::ScopedTempDir history_dir_; | 190 base::ScopedTempDir history_dir_; |
| 186 history::HistoryService history_service_; | 191 history::HistoryService history_service_; |
| 192 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 187 favicon::FaviconServiceImpl favicon_service_; | 193 favicon::FaviconServiceImpl favicon_service_; |
| 188 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 194 favicon::LargeIconService large_icon_service_; |
| 189 NiceMock<MockResourceDelegate> mock_resource_delegate_; | 195 NiceMock<MockResourceDelegate> mock_resource_delegate_; |
| 190 }; | 196 }; |
| 191 | 197 |
| 192 ACTION(FailFetch) { | 198 ACTION(FailFetch) { |
| 193 base::ThreadTaskRunnerHandle::Get()->PostTask( | 199 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 194 FROM_HERE, | 200 FROM_HERE, |
| 195 base::Bind(arg2, arg0, gfx::Image(), image_fetcher::RequestMetadata())); | 201 base::Bind(arg2, arg0, gfx::Image(), image_fetcher::RequestMetadata())); |
| 196 } | 202 } |
| 197 | 203 |
| 198 ACTION_P2(DecodeSuccessfully, width, height) { | 204 ACTION_P2(DecodeSuccessfully, width, height) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 216 base::RunLoop loop; | 222 base::RunLoop loop; |
| 217 { | 223 { |
| 218 InSequence s; | 224 InSequence s; |
| 219 EXPECT_CALL(*image_fetcher_, | 225 EXPECT_CALL(*image_fetcher_, |
| 220 SetDataUseServiceName( | 226 SetDataUseServiceName( |
| 221 data_use_measurement::DataUseUserData::NTP_TILES)); | 227 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 222 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 228 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 223 } | 229 } |
| 224 PreloadIcon(site_.url, site_.large_icon_url, favicon_base::TOUCH_ICON, 128, | 230 PreloadIcon(site_.url, site_.large_icon_url, favicon_base::TOUCH_ICON, 128, |
| 225 128); | 231 128); |
| 226 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 232 IconCacherImpl cacher(&favicon_service_, &large_icon_service_, |
| 227 cacher.StartFetch(site_, done.Get(), done.Get()); | 233 std::move(image_fetcher_)); |
| 234 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
| 228 WaitForTasksToFinish(); | 235 WaitForTasksToFinish(); |
| 229 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 236 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 230 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 237 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 231 } | 238 } |
| 232 | 239 |
| 233 TEST_F(IconCacherTest, LargeNotCachedAndFetchSucceeded) { | 240 TEST_F(IconCacherTest, LargeNotCachedAndFetchSucceeded) { |
| 234 base::MockCallback<base::Closure> done; | 241 base::MockCallback<base::Closure> done; |
| 235 base::RunLoop loop; | 242 base::RunLoop loop; |
| 236 { | 243 { |
| 237 InSequence s; | 244 InSequence s; |
| 238 EXPECT_CALL(*image_fetcher_, | 245 EXPECT_CALL(*image_fetcher_, |
| 239 SetDataUseServiceName( | 246 SetDataUseServiceName( |
| 240 data_use_measurement::DataUseUserData::NTP_TILES)); | 247 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 241 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 248 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 242 EXPECT_CALL(*image_fetcher_, | 249 EXPECT_CALL(*image_fetcher_, |
| 243 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) | 250 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) |
| 244 .WillOnce(PassFetch(128, 128)); | 251 .WillOnce(PassFetch(128, 128)); |
| 245 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); | 252 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
| 246 } | 253 } |
| 247 | 254 |
| 248 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 255 IconCacherImpl cacher(&favicon_service_, &large_icon_service_, |
| 249 cacher.StartFetch(site_, done.Get(), done.Get()); | 256 std::move(image_fetcher_)); |
| 257 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
| 250 loop.Run(); | 258 loop.Run(); |
| 251 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 259 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 252 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 260 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 253 } | 261 } |
| 254 | 262 |
| 255 TEST_F(IconCacherTest, SmallNotCachedAndFetchSucceeded) { | 263 TEST_F(IconCacherTest, SmallNotCachedAndFetchSucceeded) { |
| 256 site_.large_icon_url = GURL(); | 264 site_.large_icon_url = GURL(); |
| 257 | 265 |
| 258 base::MockCallback<base::Closure> done; | 266 base::MockCallback<base::Closure> done; |
| 259 base::RunLoop loop; | 267 base::RunLoop loop; |
| 260 { | 268 { |
| 261 InSequence s; | 269 InSequence s; |
| 262 EXPECT_CALL(*image_fetcher_, | 270 EXPECT_CALL(*image_fetcher_, |
| 263 SetDataUseServiceName( | 271 SetDataUseServiceName( |
| 264 data_use_measurement::DataUseUserData::NTP_TILES)); | 272 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 265 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 273 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 266 EXPECT_CALL(*image_fetcher_, | 274 EXPECT_CALL(*image_fetcher_, |
| 267 StartOrQueueNetworkRequest(_, site_.favicon_url, _)) | 275 StartOrQueueNetworkRequest(_, site_.favicon_url, _)) |
| 268 .WillOnce(PassFetch(128, 128)); | 276 .WillOnce(PassFetch(128, 128)); |
| 269 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); | 277 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
| 270 } | 278 } |
| 271 | 279 |
| 272 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 280 IconCacherImpl cacher(&favicon_service_, &large_icon_service_, |
| 273 cacher.StartFetch(site_, done.Get(), done.Get()); | 281 std::move(image_fetcher_)); |
| 282 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
| 274 loop.Run(); | 283 loop.Run(); |
| 275 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 284 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 276 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 285 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 277 } | 286 } |
| 278 | 287 |
| 279 TEST_F(IconCacherTest, LargeNotCachedAndFetchFailed) { | 288 TEST_F(IconCacherTest, LargeNotCachedAndFetchFailed) { |
| 280 base::MockCallback<base::Closure> done; | 289 base::MockCallback<base::Closure> done; |
| 281 EXPECT_CALL(done, Run()).Times(0); | 290 EXPECT_CALL(done, Run()).Times(0); |
| 282 { | 291 { |
| 283 InSequence s; | 292 InSequence s; |
| 284 EXPECT_CALL(*image_fetcher_, | 293 EXPECT_CALL(*image_fetcher_, |
| 285 SetDataUseServiceName( | 294 SetDataUseServiceName( |
| 286 data_use_measurement::DataUseUserData::NTP_TILES)); | 295 data_use_measurement::DataUseUserData::NTP_TILES)); |
| 287 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); | 296 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); |
| 288 EXPECT_CALL(*image_fetcher_, | 297 EXPECT_CALL(*image_fetcher_, |
| 289 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) | 298 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) |
| 290 .WillOnce(FailFetch()); | 299 .WillOnce(FailFetch()); |
| 291 } | 300 } |
| 292 | 301 |
| 293 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 302 IconCacherImpl cacher(&favicon_service_, &large_icon_service_, |
| 294 cacher.StartFetch(site_, done.Get(), done.Get()); | 303 std::move(image_fetcher_)); |
| 304 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
| 295 WaitForTasksToFinish(); | 305 WaitForTasksToFinish(); |
| 296 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); | 306 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
| 297 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); | 307 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
| 298 } | 308 } |
| 299 | 309 |
| 300 TEST_F(IconCacherTest, HandlesEmptyCallbacksNicely) { | 310 TEST_F(IconCacherTest, HandlesEmptyCallbacksNicely) { |
| 301 EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_)); | 311 EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_)); |
| 302 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_)); | 312 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_)); |
| 303 ON_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _)) | 313 ON_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _)) |
| 304 .WillByDefault(PassFetch(128, 128)); | 314 .WillByDefault(PassFetch(128, 128)); |
| 305 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 315 IconCacherImpl cacher(&favicon_service_, &large_icon_service_, |
| 306 cacher.StartFetch(site_, base::Closure(), base::Closure()); | 316 std::move(image_fetcher_)); |
| 317 cacher.StartFetchPopularSites(site_, base::Closure(), base::Closure()); |
| 307 WaitForTasksToFinish(); | 318 WaitForTasksToFinish(); |
| 308 } | 319 } |
| 309 | 320 |
| 310 TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) { | 321 TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) { |
| 311 // The returned data string is not used by the mocked decoder. | 322 // The returned data string is not used by the mocked decoder. |
| 312 ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) | 323 ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) |
| 313 .WillByDefault(Return("")); | 324 .WillByDefault(Return("")); |
| 314 // It's not important when the image_fetcher's decoder is used to decode the | 325 // It's not important when the image_fetcher's decoder is used to decode the |
| 315 // image but it must happen at some point. | 326 // image but it must happen at some point. |
| 316 EXPECT_CALL(*image_fetcher_, GetImageDecoder()) | 327 EXPECT_CALL(*image_fetcher_, GetImageDecoder()) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 331 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) | 342 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) |
| 332 .WillOnce(PassFetch(128, 128)); | 343 .WillOnce(PassFetch(128, 128)); |
| 333 | 344 |
| 334 // Both callback are called async after the request but preliminary has to | 345 // Both callback are called async after the request but preliminary has to |
| 335 // preceed icon_available. | 346 // preceed icon_available. |
| 336 EXPECT_CALL(preliminary_icon_available, Run()) | 347 EXPECT_CALL(preliminary_icon_available, Run()) |
| 337 .WillOnce(Quit(&default_loop)); | 348 .WillOnce(Quit(&default_loop)); |
| 338 EXPECT_CALL(icon_available, Run()).WillOnce(Quit(&fetch_loop)); | 349 EXPECT_CALL(icon_available, Run()).WillOnce(Quit(&fetch_loop)); |
| 339 } | 350 } |
| 340 | 351 |
| 341 IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); | 352 IconCacherImpl cacher(&favicon_service_, &large_icon_service_, |
| 353 std::move(image_fetcher_)); |
| 342 site_.default_icon_resource = 12345; | 354 site_.default_icon_resource = 12345; |
| 343 cacher.StartFetch(site_, icon_available.Get(), | 355 cacher.StartFetchPopularSites(site_, icon_available.Get(), |
| 344 preliminary_icon_available.Get()); | 356 preliminary_icon_available.Get()); |
| 345 | 357 |
| 346 default_loop.Run(); // Wait for the default image. | 358 default_loop.Run(); // Wait for the default image. |
| 347 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), | 359 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), |
| 348 Eq(gfx::Size(64, 64))); // Compares dimensions, not objects. | 360 Eq(gfx::Size(64, 64))); // Compares dimensions, not objects. |
| 349 | 361 |
| 350 // Let the fetcher continue and wait for the second call of the callback. | 362 // Let the fetcher continue and wait for the second call of the callback. |
| 351 fetch_loop.Run(); // Wait for the updated image. | 363 fetch_loop.Run(); // Wait for the updated image. |
| 352 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), | 364 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), |
| 353 Eq(gfx::Size(128, 128))); // Compares dimensions, not objects. | 365 Eq(gfx::Size(128, 128))); // Compares dimensions, not objects. |
| 354 } | 366 } |
| 355 | 367 |
| 356 } // namespace | 368 } // namespace |
| 357 } // namespace ntp_tiles | 369 } // namespace ntp_tiles |
| OLD | NEW |