Index: components/ntp_tiles/icon_cacher_impl_unittest.cc |
diff --git a/components/ntp_tiles/icon_cacher_impl_unittest.cc b/components/ntp_tiles/icon_cacher_impl_unittest.cc |
index 4a2ddc2513d15138b61251ba2eb978d72ae774fe..8ad37b19651a10b6987f38fdb292460533604a87 100644 |
--- a/components/ntp_tiles/icon_cacher_impl_unittest.cc |
+++ b/components/ntp_tiles/icon_cacher_impl_unittest.cc |
@@ -18,6 +18,7 @@ |
#include "components/favicon/core/favicon_client.h" |
#include "components/favicon/core/favicon_service_impl.h" |
#include "components/favicon/core/favicon_util.h" |
+#include "components/favicon/core/large_icon_service.h" |
#include "components/history/core/browser/history_database_params.h" |
#include "components/history/core/browser/history_service.h" |
#include "components/image_fetcher/core/image_decoder.h" |
@@ -94,54 +95,37 @@ class MockResourceDelegate : public ui::ResourceBundle::Delegate { |
MOCK_METHOD2(GetLocalizedString, bool(int message_id, base::string16* value)); |
}; |
-class IconCacherTest : public ::testing::Test { |
- protected: |
- IconCacherTest() |
- : site_(base::string16(), // title, unused |
- GURL("http://url.google/"), |
- GURL("http://url.google/icon.png"), |
- GURL("http://url.google/favicon.ico"), |
- GURL()), // thumbnail, unused |
- image_fetcher_(new ::testing::StrictMock<MockImageFetcher>), |
- image_decoder_(new ::testing::StrictMock<MockImageDecoder>), |
- favicon_service_(/*favicon_client=*/nullptr, &history_service_), |
- task_runner_(new base::TestSimpleTaskRunner()) { |
- CHECK(history_dir_.CreateUniqueTempDir()); |
- CHECK(history_service_.Init( |
- history::HistoryDatabaseParams(history_dir_.GetPath(), 0, 0))); |
- } |
+ACTION(FailFetch) { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, |
+ base::Bind(arg2, arg0, gfx::Image(), image_fetcher::RequestMetadata())); |
+} |
- void SetUp() override { |
- if (ui::ResourceBundle::HasSharedInstance()) { |
- ui::ResourceBundle::CleanupSharedInstance(); |
- } |
- ON_CALL(mock_resource_delegate_, GetPathForResourcePack(_, _)) |
- .WillByDefault(ReturnArg<0>()); |
- ON_CALL(mock_resource_delegate_, GetPathForLocalePack(_, _)) |
- .WillByDefault(ReturnArg<0>()); |
- ui::ResourceBundle::InitSharedInstanceWithLocale( |
- "en-US", &mock_resource_delegate_, |
- ui::ResourceBundle::LOAD_COMMON_RESOURCES); |
- } |
+ACTION_P2(DecodeSuccessfully, width, height) { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(arg2, gfx::test::CreateImage(width, height))); |
+} |
- void TearDown() override { |
- if (ui::ResourceBundle::HasSharedInstance()) { |
- ui::ResourceBundle::CleanupSharedInstance(); |
- } |
- base::FilePath pak_path; |
-#if defined(OS_ANDROID) |
- PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &pak_path); |
-#else |
- PathService::Get(base::DIR_MODULE, &pak_path); |
-#endif |
+ACTION_P2(PassFetch, width, height) { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(arg2, arg0, gfx::test::CreateImage(width, height), |
+ image_fetcher::RequestMetadata())); |
+} |
- base::FilePath ui_test_pak_path; |
- ASSERT_TRUE(PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path)); |
- ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path); |
+ACTION_P(Quit, run_loop) { |
+ run_loop->Quit(); |
+} |
- ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath( |
- pak_path.AppendASCII("components_tests_resources.pak"), |
- ui::SCALE_FACTOR_NONE); |
+// TODO(jkrcal): Split off large_icon_service.h and large_icon_service_impl.h. |
+// Use then mocks of FaviconService and LargeIconService instead of the real |
+// things. |
+class IconCacherTestBase : public ::testing::Test { |
+ protected: |
+ IconCacherTestBase() |
+ : favicon_service_(/*favicon_client=*/nullptr, &history_service_) { |
+ CHECK(history_dir_.CreateUniqueTempDir()); |
+ CHECK(history_service_.Init( |
+ history::HistoryDatabaseParams(history_dir_.GetPath(), 0, 0))); |
} |
void PreloadIcon(const GURL& url, |
@@ -176,41 +160,76 @@ class IconCacherTest : public ::testing::Test { |
return image; |
} |
- void WaitForTasksToFinish() { task_runner_->RunUntilIdle(); } |
+ void WaitForHistoryThreadTasksToFinish() { |
+ base::RunLoop loop; |
+ base::MockCallback<base::Closure> done; |
+ EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
+ history_service_.FlushForTest(done.Get()); |
+ loop.Run(); |
+ } |
+ |
+ void WaitForMainThreadTasksToFinish() { |
+ base::RunLoop loop; |
+ loop.RunUntilIdle(); |
+ } |
base::test::ScopedTaskEnvironment scoped_task_environment_; |
- PopularSites::Site site_; |
- std::unique_ptr<MockImageFetcher> image_fetcher_; |
- std::unique_ptr<MockImageDecoder> image_decoder_; |
base::ScopedTempDir history_dir_; |
history::HistoryService history_service_; |
favicon::FaviconServiceImpl favicon_service_; |
- scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
- NiceMock<MockResourceDelegate> mock_resource_delegate_; |
}; |
-ACTION(FailFetch) { |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, |
- base::Bind(arg2, arg0, gfx::Image(), image_fetcher::RequestMetadata())); |
-} |
+class IconCacherTestPopularSites : public IconCacherTestBase { |
+ protected: |
+ IconCacherTestPopularSites() |
+ : site_(base::string16(), // title, unused |
+ GURL("http://url.google/"), |
+ GURL("http://url.google/icon.png"), |
+ GURL("http://url.google/favicon.ico"), |
+ GURL()), // thumbnail, unused |
+ image_fetcher_(new ::testing::StrictMock<MockImageFetcher>), |
+ image_decoder_(new ::testing::StrictMock<MockImageDecoder>) {} |
-ACTION_P2(DecodeSuccessfully, width, height) { |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(arg2, gfx::test::CreateImage(width, height))); |
-} |
+ void SetUp() override { |
+ if (ui::ResourceBundle::HasSharedInstance()) { |
+ ui::ResourceBundle::CleanupSharedInstance(); |
+ } |
+ ON_CALL(mock_resource_delegate_, GetPathForResourcePack(_, _)) |
+ .WillByDefault(ReturnArg<0>()); |
+ ON_CALL(mock_resource_delegate_, GetPathForLocalePack(_, _)) |
+ .WillByDefault(ReturnArg<0>()); |
+ ui::ResourceBundle::InitSharedInstanceWithLocale( |
+ "en-US", &mock_resource_delegate_, |
+ ui::ResourceBundle::LOAD_COMMON_RESOURCES); |
+ } |
-ACTION_P2(PassFetch, width, height) { |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(arg2, arg0, gfx::test::CreateImage(width, height), |
- image_fetcher::RequestMetadata())); |
-} |
+ void TearDown() override { |
+ if (ui::ResourceBundle::HasSharedInstance()) { |
+ ui::ResourceBundle::CleanupSharedInstance(); |
+ } |
+ base::FilePath pak_path; |
+#if defined(OS_ANDROID) |
+ PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &pak_path); |
+#else |
+ PathService::Get(base::DIR_MODULE, &pak_path); |
+#endif |
-ACTION_P(Quit, run_loop) { |
- run_loop->Quit(); |
-} |
+ base::FilePath ui_test_pak_path; |
+ ASSERT_TRUE(PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path)); |
+ ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path); |
+ |
+ ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath( |
+ pak_path.AppendASCII("components_tests_resources.pak"), |
+ ui::SCALE_FACTOR_NONE); |
+ } |
+ |
+ PopularSites::Site site_; |
+ std::unique_ptr<MockImageFetcher> image_fetcher_; |
+ std::unique_ptr<MockImageDecoder> image_decoder_; |
+ NiceMock<MockResourceDelegate> mock_resource_delegate_; |
+}; |
-TEST_F(IconCacherTest, LargeCached) { |
+TEST_F(IconCacherTestPopularSites, LargeCached) { |
base::MockCallback<base::Closure> done; |
EXPECT_CALL(done, Run()).Times(0); |
base::RunLoop loop; |
@@ -223,14 +242,14 @@ TEST_F(IconCacherTest, LargeCached) { |
} |
PreloadIcon(site_.url, site_.large_icon_url, favicon_base::TOUCH_ICON, 128, |
128); |
- IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
- cacher.StartFetch(site_, done.Get(), done.Get()); |
- WaitForTasksToFinish(); |
+ IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
+ cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
+ WaitForMainThreadTasksToFinish(); |
EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
} |
-TEST_F(IconCacherTest, LargeNotCachedAndFetchSucceeded) { |
+TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchSucceeded) { |
base::MockCallback<base::Closure> done; |
base::RunLoop loop; |
{ |
@@ -245,14 +264,14 @@ TEST_F(IconCacherTest, LargeNotCachedAndFetchSucceeded) { |
EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
} |
- IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
- cacher.StartFetch(site_, done.Get(), done.Get()); |
+ IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
+ cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
loop.Run(); |
EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
} |
-TEST_F(IconCacherTest, SmallNotCachedAndFetchSucceeded) { |
+TEST_F(IconCacherTestPopularSites, SmallNotCachedAndFetchSucceeded) { |
site_.large_icon_url = GURL(); |
base::MockCallback<base::Closure> done; |
@@ -269,14 +288,14 @@ TEST_F(IconCacherTest, SmallNotCachedAndFetchSucceeded) { |
EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
} |
- IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
- cacher.StartFetch(site_, done.Get(), done.Get()); |
+ IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
+ cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
loop.Run(); |
EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
} |
-TEST_F(IconCacherTest, LargeNotCachedAndFetchFailed) { |
+TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchFailed) { |
base::MockCallback<base::Closure> done; |
EXPECT_CALL(done, Run()).Times(0); |
{ |
@@ -290,24 +309,28 @@ TEST_F(IconCacherTest, LargeNotCachedAndFetchFailed) { |
.WillOnce(FailFetch()); |
} |
- IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
- cacher.StartFetch(site_, done.Get(), done.Get()); |
- WaitForTasksToFinish(); |
+ IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
+ cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); |
+ WaitForMainThreadTasksToFinish(); |
EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
} |
-TEST_F(IconCacherTest, HandlesEmptyCallbacksNicely) { |
+TEST_F(IconCacherTestPopularSites, HandlesEmptyCallbacksNicely) { |
EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_)); |
EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_)); |
- ON_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _)) |
- .WillByDefault(PassFetch(128, 128)); |
- IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
- cacher.StartFetch(site_, base::Closure(), base::Closure()); |
- WaitForTasksToFinish(); |
+ EXPECT_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _)) |
+ .WillOnce(PassFetch(128, 128)); |
+ IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
+ cacher.StartFetchPopularSites(site_, base::Closure(), base::Closure()); |
+ WaitForHistoryThreadTasksToFinish(); // Writing the icon into the DB. |
+ WaitForMainThreadTasksToFinish(); // Finishing tasks after the DB write. |
+ // Even though the callbacks are not called, the icon gets written out. |
+ EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); |
+ EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); |
} |
-TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) { |
+TEST_F(IconCacherTestPopularSites, ProvidesDefaultIconAndSucceedsWithFetching) { |
// The returned data string is not used by the mocked decoder. |
ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) |
.WillByDefault(Return("")); |
@@ -338,10 +361,10 @@ TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) { |
EXPECT_CALL(icon_available, Run()).WillOnce(Quit(&fetch_loop)); |
} |
- IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_)); |
+ IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); |
site_.default_icon_resource = 12345; |
- cacher.StartFetch(site_, icon_available.Get(), |
- preliminary_icon_available.Get()); |
+ cacher.StartFetchPopularSites(site_, icon_available.Get(), |
+ preliminary_icon_available.Get()); |
default_loop.Run(); // Wait for the default image. |
EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), |
@@ -353,5 +376,141 @@ TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) { |
Eq(gfx::Size(128, 128))); // Compares dimensions, not objects. |
} |
+class IconCacherTestMostLikely : public IconCacherTestBase { |
+ protected: |
+ IconCacherTestMostLikely() |
+ : large_icon_service_background_task_runner_( |
+ new base::TestSimpleTaskRunner()), |
+ fetcher_for_large_icon_service_( |
+ base::MakeUnique<::testing::StrictMock<MockImageFetcher>>()), |
+ fetcher_for_icon_cacher_( |
+ base::MakeUnique<::testing::StrictMock<MockImageFetcher>>()) { |
+ // Expect uninteresting calls here, |fetcher_for_icon_cacher_| is not |
+ // related to these tests. Keep it strict to make sure we do not use it in |
+ // any other way. |
+ EXPECT_CALL(*fetcher_for_icon_cacher_, |
+ SetDataUseServiceName( |
+ data_use_measurement::DataUseUserData::NTP_TILES)); |
+ EXPECT_CALL(*fetcher_for_icon_cacher_, |
+ SetDesiredImageFrameSize(gfx::Size(128, 128))); |
+ } |
+ |
+ scoped_refptr<base::TestSimpleTaskRunner> |
+ large_icon_service_background_task_runner_; |
+ std::unique_ptr<MockImageFetcher> fetcher_for_large_icon_service_; |
+ std::unique_ptr<MockImageFetcher> fetcher_for_icon_cacher_; |
+}; |
+ |
+TEST_F(IconCacherTestMostLikely, Cached) { |
+ GURL page_url("http://www.site.com"); |
+ GURL icon_url("http://www.site.com/favicon.png"); |
+ PreloadIcon(page_url, icon_url, favicon_base::TOUCH_ICON, 128, 128); |
+ |
+ favicon::LargeIconService large_icon_service( |
+ &favicon_service_, large_icon_service_background_task_runner_, |
+ std::move(fetcher_for_large_icon_service_)); |
+ IconCacherImpl cacher(&favicon_service_, &large_icon_service, |
+ std::move(fetcher_for_icon_cacher_)); |
+ |
+ base::MockCallback<base::Closure> done; |
+ EXPECT_CALL(done, Run()).Times(0); |
+ cacher.StartFetchMostLikely(page_url, done.Get()); |
+ WaitForMainThreadTasksToFinish(); |
+ |
+ EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); |
+ EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); |
+} |
+ |
+TEST_F(IconCacherTestMostLikely, NotCachedAndFetchSucceeded) { |
+ GURL page_url("http://www.site.com"); |
+ |
+ base::MockCallback<base::Closure> done; |
+ base::RunLoop loop; |
+ { |
+ InSequence s; |
+ EXPECT_CALL(*fetcher_for_large_icon_service_, |
+ SetDataUseServiceName( |
+ data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE)); |
+ EXPECT_CALL(*fetcher_for_large_icon_service_, |
+ StartOrQueueNetworkRequest(_, _, _)) |
+ .WillOnce(PassFetch(128, 128)); |
+ EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); |
+ } |
+ |
+ favicon::LargeIconService large_icon_service( |
+ &favicon_service_, large_icon_service_background_task_runner_, |
+ std::move(fetcher_for_large_icon_service_)); |
+ IconCacherImpl cacher(&favicon_service_, &large_icon_service, |
+ std::move(fetcher_for_icon_cacher_)); |
+ |
+ cacher.StartFetchMostLikely(page_url, done.Get()); |
+ // Both these task runners need to be flushed in order to get |done| called by |
+ // running the main loop. |
+ WaitForHistoryThreadTasksToFinish(); |
+ large_icon_service_background_task_runner_->RunUntilIdle(); |
+ |
+ loop.Run(); |
+ EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); |
+ EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); |
+} |
+ |
+TEST_F(IconCacherTestMostLikely, NotCachedAndFetchFailed) { |
+ GURL page_url("http://www.site.com"); |
+ |
+ base::MockCallback<base::Closure> done; |
+ { |
+ InSequence s; |
+ EXPECT_CALL(*fetcher_for_large_icon_service_, |
+ SetDataUseServiceName( |
+ data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE)); |
+ EXPECT_CALL(*fetcher_for_large_icon_service_, |
+ StartOrQueueNetworkRequest(_, _, _)) |
+ .WillOnce(FailFetch()); |
+ EXPECT_CALL(done, Run()).Times(0); |
+ } |
+ |
+ favicon::LargeIconService large_icon_service( |
+ &favicon_service_, large_icon_service_background_task_runner_, |
+ std::move(fetcher_for_large_icon_service_)); |
+ IconCacherImpl cacher(&favicon_service_, &large_icon_service, |
+ std::move(fetcher_for_icon_cacher_)); |
+ |
+ cacher.StartFetchMostLikely(page_url, done.Get()); |
+ // Both these task runners need to be flushed before flushing the main thread |
+ // queue in order to finish the work. |
+ WaitForHistoryThreadTasksToFinish(); |
+ large_icon_service_background_task_runner_->RunUntilIdle(); |
+ WaitForMainThreadTasksToFinish(); |
+ |
+ EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); |
+ EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); |
+} |
+ |
+TEST_F(IconCacherTestMostLikely, HandlesEmptyCallbacksNicely) { |
+ GURL page_url("http://www.site.com"); |
+ |
+ EXPECT_CALL(*fetcher_for_large_icon_service_, SetDataUseServiceName(_)); |
+ EXPECT_CALL(*fetcher_for_large_icon_service_, |
+ StartOrQueueNetworkRequest(_, _, _)) |
+ .WillOnce(PassFetch(128, 128)); |
+ |
+ favicon::LargeIconService large_icon_service( |
+ &favicon_service_, large_icon_service_background_task_runner_, |
+ std::move(fetcher_for_large_icon_service_)); |
+ IconCacherImpl cacher(&favicon_service_, &large_icon_service, |
+ std::move(fetcher_for_icon_cacher_)); |
+ |
+ cacher.StartFetchMostLikely(page_url, base::Closure()); |
+ // Both these task runners need to be flushed before flushing the main thread |
+ // queue in order to finish the work. |
+ WaitForHistoryThreadTasksToFinish(); |
+ large_icon_service_background_task_runner_->RunUntilIdle(); |
+ WaitForMainThreadTasksToFinish(); |
+ |
+ // Even though the callbacks are not called, the icon gets written out. |
+ EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); |
+ EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); |
+} |
+ |
} // namespace |
} // namespace ntp_tiles |