Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Unified Diff: components/ntp_tiles/icon_cacher_impl_unittest.cc

Issue 2866033002: [NTP Tiles] Fetch missing MostLikely tiles from a Google server (Closed)
Patch Set: Comments #3 Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698