Chromium Code Reviews| Index: components/favicon/core/favicon_handler_unittest.cc |
| diff --git a/components/favicon/core/favicon_handler_unittest.cc b/components/favicon/core/favicon_handler_unittest.cc |
| index 5e651a646febcaca5d9b28ba8b03e129f4fb5da8..5775b4fbfacb536658f027914720a187214004a6 100644 |
| --- a/components/favicon/core/favicon_handler_unittest.cc |
| +++ b/components/favicon/core/favicon_handler_unittest.cc |
| @@ -51,6 +51,11 @@ MATCHER_P2(ImageSizeIs, width, height, "") { |
| return arg.Size() == gfx::Size(width, height); |
| } |
| +ACTION_P2(PostDownloadReply, status_code, candidates) { |
| + base::ThreadTaskRunnerHandle::Get()->PostTask( |
| + FROM_HERE, base::Bind(arg1, status_code, candidates)); |
| +} |
| + |
| // Fill the given bmp with some test data. |
| SkBitmap CreateBitmapWithEdgeSize(int size) { |
| SkBitmap bmp; |
| @@ -202,6 +207,8 @@ class MockDelegate : public FaviconHandler::Delegate { |
| int(const GURL& url, |
| int max_image_size, |
| ImageDownloadCallback callback)); |
| + MOCK_METHOD2(DownloadManifest, |
| + void(const GURL& url, ManifestDownloadCallback callback)); |
| MOCK_METHOD0(IsOffTheRecord, bool()); |
| MOCK_METHOD1(IsBookmarked, bool(const GURL& url)); |
| MOCK_METHOD5(OnFaviconUpdated, |
| @@ -350,14 +357,15 @@ class FaviconHandlerTest : public testing::Test { |
| // Returns the handler in case tests want to exercise further steps. |
| std::unique_ptr<FaviconHandler> RunHandlerWithCandidates( |
| FaviconDriverObserver::NotificationIconType handler_type, |
| - const std::vector<favicon::FaviconURL>& candidates) { |
| + const std::vector<favicon::FaviconURL>& candidates, |
| + const base::Optional<GURL>& manifest_url = base::nullopt) { |
| auto handler = base::MakeUnique<FaviconHandler>(&favicon_service_, |
| &delegate_, handler_type); |
| handler->FetchFavicon(kPageURL); |
| // The first RunUntilIdle() causes the FaviconService lookups be faster than |
| - // OnUpdateFaviconURL(), which is the most likely scenario. |
| + // OnUpdateCandidates(), which is the most likely scenario. |
| base::RunLoop().RunUntilIdle(); |
| - handler->OnUpdateFaviconURL(kPageURL, candidates); |
| + handler->OnUpdateCandidates(kPageURL, candidates, manifest_url); |
| base::RunLoop().RunUntilIdle(); |
| return handler; |
| } |
| @@ -365,13 +373,14 @@ class FaviconHandlerTest : public testing::Test { |
| // Same as above, but for the simplest case where all types are FAVICON and |
| // no sizes are provided, using a FaviconHandler of type NON_TOUCH_16_DIP. |
| std::unique_ptr<FaviconHandler> RunHandlerWithSimpleFaviconCandidates( |
| - const std::vector<GURL>& urls) { |
| + const std::vector<GURL>& urls, |
| + const base::Optional<GURL>& manifest_url = base::nullopt) { |
| std::vector<favicon::FaviconURL> candidates; |
| for (const GURL& url : urls) { |
| candidates.emplace_back(url, FAVICON, kEmptySizes); |
| } |
| return RunHandlerWithCandidates(FaviconDriverObserver::NON_TOUCH_16_DIP, |
| - candidates); |
| + candidates, manifest_url); |
| } |
| base::MessageLoopForUI message_loop_; |
| @@ -409,7 +418,7 @@ TEST_F(FaviconHandlerTest, UpdateFaviconMappingsAndFetch) { |
| // - There is data in the database for neither the page URL nor the icon URL. |
| // AND |
| // - FaviconService::GetFaviconForPageURL() callback returns before |
| -// FaviconHandler::OnUpdateFaviconURL() is called. |
| +// FaviconHandler::OnUpdateCandidates() is called. |
| TEST_F(FaviconHandlerTest, DownloadUnknownFaviconIfCandidatesSlower) { |
| EXPECT_CALL(favicon_service_, SetFavicons(kPageURL, kIconURL16x16, FAVICON, |
| ImageSizeIs(16, 16))); |
| @@ -420,10 +429,11 @@ TEST_F(FaviconHandlerTest, DownloadUnknownFaviconIfCandidatesSlower) { |
| FaviconHandler handler(&favicon_service_, &delegate_, |
| FaviconDriverObserver::NON_TOUCH_16_DIP); |
| handler.FetchFavicon(kPageURL); |
| - // Causes FaviconService lookups be faster than OnUpdateFaviconURL(). |
| + // Causes FaviconService lookups be faster than OnUpdateCandidates(). |
| base::RunLoop().RunUntilIdle(); |
| - handler.OnUpdateFaviconURL(kPageURL, |
| - {FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)}); |
| + handler.OnUpdateCandidates(kPageURL, |
| + {FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)}, |
| + base::nullopt); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL16x16)); |
| @@ -435,7 +445,7 @@ TEST_F(FaviconHandlerTest, DownloadUnknownFaviconIfCandidatesSlower) { |
| // - There is data in the database for neither the page URL nor the icon URL. |
| // AND |
| // - FaviconService::GetFaviconForPageURL() callback returns after |
| -// FaviconHandler::OnUpdateFaviconURL() is called. |
| +// FaviconHandler::OnUpdateCandidates() is called. |
| TEST_F(FaviconHandlerTest, DownloadUnknownFaviconIfCandidatesFaster) { |
| EXPECT_CALL(favicon_service_, SetFavicons(kPageURL, kIconURL16x16, FAVICON, |
| ImageSizeIs(16, 16))); |
| @@ -447,8 +457,9 @@ TEST_F(FaviconHandlerTest, DownloadUnknownFaviconIfCandidatesFaster) { |
| ASSERT_THAT(favicon_service_.fake()->db_requests(), ElementsAre(kPageURL)); |
| // Feed in favicons without processing posted tasks (RunUntilIdle()). |
| - handler.OnUpdateFaviconURL(kPageURL, |
| - {FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)}); |
| + handler.OnUpdateCandidates(kPageURL, |
| + {FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)}, |
| + base::nullopt); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL16x16)); |
| @@ -609,7 +620,7 @@ TEST_F(FaviconHandlerTest, Download2ndFaviconURLCandidate) { |
| // Test that download data for icon URLs other than the current favicon |
| // candidate URLs is ignored. This test tests the scenario where a download is |
| -// in flight when FaviconHandler::OnUpdateFaviconURL() is called. |
| +// in flight when FaviconHandler::OnUpdateCandidates() is called. |
| // TODO(mastiz): Make this test deal with FaviconURLs of type |
| // favicon_base::FAVICON and add new ones like OnlyDownloadMatchingIconType and |
| // CallSetFaviconsWithCorrectIconType. |
| @@ -635,8 +646,8 @@ TEST_F(FaviconHandlerTest, UpdateDuringDownloading) { |
| EXPECT_CALL(favicon_service_, SetFavicons(_, kIconURL3, _, _)); |
| EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL3, _, _)); |
| - handler->OnUpdateFaviconURL(kPageURL, |
| - {FaviconURL(kIconURL3, FAVICON, kEmptySizes)}); |
| + handler->OnUpdateCandidates( |
| + kPageURL, {FaviconURL(kIconURL3, FAVICON, kEmptySizes)}, base::nullopt); |
| // Finalizes download, which should be thrown away as the favicon URLs were |
| // updated. |
| @@ -670,9 +681,9 @@ TEST_F(FaviconHandlerTest, UpdateSameIconURLsWhileProcessingShouldBeNoop) { |
| ASSERT_TRUE(VerifyAndClearExpectations()); |
| ASSERT_TRUE(delegate_.fake_downloader().HasPendingManualCallback()); |
| - // Calling OnUpdateFaviconURL() with the same icon URLs should have no effect, |
| + // Calling OnUpdateCandidates() with the same icon URLs should have no effect, |
| // despite the ongoing download. |
| - handler->OnUpdateFaviconURL(kPageURL, favicon_urls); |
| + handler->OnUpdateCandidates(kPageURL, favicon_urls, base::nullopt); |
| base::RunLoop().RunUntilIdle(); |
| // Complete the download. |
| @@ -697,11 +708,11 @@ TEST_F(FaviconHandlerTest, UpdateSameIconURLsAfterFinishedShouldBeNoop) { |
| ASSERT_TRUE(VerifyAndClearExpectations()); |
| - // Calling OnUpdateFaviconURL() with identical data should be a no-op. |
| + // Calling OnUpdateCandidates() with identical data should be a no-op. |
| EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, _, _, _)).Times(0); |
| EXPECT_CALL(favicon_service_, SetFavicons(_, _, _, _)).Times(0); |
| - handler->OnUpdateFaviconURL(kPageURL, favicon_urls); |
| + handler->OnUpdateCandidates(kPageURL, favicon_urls, base::nullopt); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_THAT(favicon_service_.fake()->db_requests(), IsEmpty()); |
| EXPECT_THAT(delegate_.downloads(), IsEmpty()); |
| @@ -743,8 +754,8 @@ TEST_F(FaviconHandlerTest, |
| // Simulate the page changing it's icon URL to just |kIconURL2| via |
| // Javascript. |
| EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kIconURL2, _, _)); |
| - handler->OnUpdateFaviconURL(kPageURL, |
| - {FaviconURL(kIconURL2, FAVICON, kEmptySizes)}); |
| + handler->OnUpdateCandidates( |
| + kPageURL, {FaviconURL(kIconURL2, FAVICON, kEmptySizes)}, base::nullopt); |
| base::RunLoop().RunUntilIdle(); |
| } |
| @@ -1031,5 +1042,200 @@ TEST_F(FaviconHandlerTest, TestKeepDownloadedLargestFavicon) { |
| FaviconURL(kIconURL16x16, FAVICON, kEmptySizes)}); |
| } |
| +TEST_F(FaviconHandlerTest, GetFaviconFromManifestInHistory) { |
| + const GURL kManifestURL("http://www.google.com/manifest.json"); |
| + |
| + favicon_service_.fake()->Store(kManifestURL, kIconURL16x16, |
| + CreateRawBitmapResult(kIconURL16x16)); |
|
pkotwicz
2017/04/12 22:10:07
This test looks like it is left over from when the
mastiz
2017/04/20 18:06:33
Done.
|
| + |
| + EXPECT_CALL(delegate_, DownloadManifest(_, _)).Times(0); |
| + EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); |
| + |
| + EXPECT_CALL(favicon_service_, UpdateFaviconMappingsAndFetch( |
| + kPageURL, URLVector{kManifestURL}, FAVICON, |
| + /*desired_size_in_dip=*/16, _, _)); |
| + EXPECT_CALL(delegate_, OnFaviconUpdated( |
| + kPageURL, FaviconDriverObserver::NON_TOUCH_16_DIP, |
| + kManifestURL, /*icon_url_changed=*/true, _)); |
| + |
| + RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| + EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| + ElementsAre(kPageURL, kManifestURL)); |
| + EXPECT_THAT(delegate_.downloads(), IsEmpty()); |
| +} |
| + |
| +TEST_F(FaviconHandlerTest, GetFaviconFromManifestInHistoryIfCandidatesFaster) { |
|
pkotwicz
2017/04/12 22:10:07
This test looks like it is left over from when the
mastiz
2017/04/20 18:06:33
Done.
|
| + const GURL kManifestURL("http://www.google.com/manifest.json"); |
| + |
| + favicon_service_.fake()->Store(kManifestURL, kIconURL16x16, |
| + CreateRawBitmapResult(kIconURL16x16)); |
| + |
| + EXPECT_CALL(delegate_, DownloadManifest(_, _)).Times(0); |
| + EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); |
| + |
| + EXPECT_CALL(favicon_service_, UpdateFaviconMappingsAndFetch( |
| + kPageURL, URLVector{kManifestURL}, FAVICON, |
| + /*desired_size_in_dip=*/16, _, _)); |
| + EXPECT_CALL(delegate_, OnFaviconUpdated( |
| + kPageURL, FaviconDriverObserver::NON_TOUCH_16_DIP, |
| + kManifestURL, /*icon_url_changed=*/true, _)); |
| + |
| + FaviconHandler handler(&favicon_service_, &delegate_, |
| + FaviconDriverObserver::NON_TOUCH_16_DIP); |
| + handler.FetchFavicon(kPageURL); |
| + // Feed in candidates without processing posted tasks (RunUntilIdle()). |
| + handler.OnUpdateCandidates(kPageURL, |
| + {FaviconURL(kIconURL12x12, FAVICON, kEmptySizes)}, |
| + kManifestURL); |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| + ElementsAre(kPageURL, kManifestURL)); |
| + EXPECT_THAT(delegate_.downloads(), IsEmpty()); |
| +} |
| + |
| +TEST_F(FaviconHandlerTest, GetFaviconFromUnknownManifest) { |
| + const GURL kManifestURL("http://www.google.com/manifest.json"); |
| + const std::vector<favicon::FaviconURL> kManifestIcons = { |
| + FaviconURL(kIconURL16x16, FAVICON, kEmptySizes), |
| + }; |
| + |
| + EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); |
| + |
| + EXPECT_CALL(delegate_, DownloadManifest(kManifestURL, _)) |
| + .WillOnce(PostDownloadReply(200, kManifestIcons)); |
| + EXPECT_CALL(favicon_service_, |
| + SetFavicons(kPageURL, kManifestURL, FAVICON, _)); |
| + EXPECT_CALL(delegate_, OnFaviconUpdated(kPageURL, _, kManifestURL, _, _)); |
| + |
| + RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| + EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| + ElementsAre(kPageURL, kManifestURL)); |
| + EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL16x16)); |
| +} |
| + |
| +TEST_F(FaviconHandlerTest, GetFaviconFromExpiredManifestIcon) { |
| + const GURL kManifestURL("http://www.google.com/manifest.json"); |
| + const std::vector<favicon::FaviconURL> kManifestIcons = { |
| + FaviconURL(kIconURL64x64, FAVICON, kEmptySizes), |
| + }; |
| + |
| + favicon_service_.fake()->Store(kPageURL, kManifestURL, |
| + CreateRawBitmapResult(kManifestURL, FAVICON, |
| + /*expired=*/true)); |
| + |
| + EXPECT_CALL(delegate_, OnFaviconUpdated(kPageURL, _, kManifestURL, _, _)) |
| + .Times(2); |
| + EXPECT_CALL(delegate_, DownloadManifest(kManifestURL, _)) |
| + .WillOnce(PostDownloadReply(200, kManifestIcons)); |
| + EXPECT_CALL(favicon_service_, SetFavicons(kPageURL, kManifestURL, _, _)); |
| + |
| + RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| + EXPECT_THAT(favicon_service_.fake()->db_requests(), ElementsAre(kPageURL)); |
| + EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL64x64)); |
| +} |
| + |
| +TEST_F(FaviconHandlerTest, UnknownManifestReturning404) { |
| + const GURL kManifestURL("http://www.google.com/manifest.json"); |
| + |
| + ON_CALL(delegate_, DownloadManifest(kManifestURL, _)) |
| + .WillByDefault( |
| + PostDownloadReply(404, std::vector<favicon::FaviconURL>())); |
| + |
| + EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(kManifestURL)); |
| + EXPECT_CALL(favicon_service_, |
| + SetFavicons(kPageURL, kIconURL12x12, FAVICON, _)); |
| + |
| + RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| + EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| + ElementsAre(kPageURL, kManifestURL, kIconURL12x12)); |
| + EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL12x12)); |
| +} |
| + |
| +TEST_F(FaviconHandlerTest, UnknownManifestReturning503) { |
| + const GURL kManifestURL("http://www.google.com/manifest.json"); |
| + |
| + ON_CALL(delegate_, DownloadManifest(kManifestURL, _)) |
| + .WillByDefault( |
| + PostDownloadReply(503, std::vector<favicon::FaviconURL>())); |
| + |
| + EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(_)).Times(0); |
| + |
| + RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| +} |
| + |
| +TEST_F(FaviconHandlerTest, IgnoreManifestWithPrior404) { |
| + const GURL kManifestURL("http://www.google.com/manifest.json"); |
| + |
| + ON_CALL(favicon_service_, WasUnableToDownloadFavicon(kManifestURL)) |
| + .WillByDefault(Return(true)); |
| + |
| + EXPECT_CALL(delegate_, DownloadManifest(_, _)).Times(0); |
| + EXPECT_CALL(favicon_service_, |
| + SetFavicons(kPageURL, kIconURL12x12, FAVICON, _)); |
| + |
| + RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| + EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| + ElementsAre(kPageURL, kIconURL12x12)); |
| + EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL12x12)); |
| +} |
| + |
| +TEST_F(FaviconHandlerTest, UnknownManifestWithoutIcons) { |
| + const GURL kManifestURL("http://www.google.com/manifest.json"); |
| + |
| + ON_CALL(delegate_, DownloadManifest(kManifestURL, _)) |
| + .WillByDefault( |
| + PostDownloadReply(200, std::vector<favicon::FaviconURL>())); |
| + |
| + // UnableToDownloadFavicon() is expected to prevent repeated downloads of the |
| + // same manifest (which is not otherwise cached, since it doesn't contain |
| + // icons). |
| + EXPECT_CALL(favicon_service_, UnableToDownloadFavicon(kManifestURL)); |
| + EXPECT_CALL(favicon_service_, |
| + SetFavicons(kPageURL, kIconURL12x12, FAVICON, _)); |
| + |
| + RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL); |
| + EXPECT_THAT(favicon_service_.fake()->db_requests(), |
| + ElementsAre(kPageURL, kManifestURL, kIconURL12x12)); |
| + EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL12x12)); |
| +} |
| + |
| +TEST_F(FaviconHandlerTest, ManifestUpdateViaJavascript) { |
| + const GURL kManifestURL1("http://www.google.com/manifest1.json"); |
| + const GURL kManifestURL2("http://www.google.com/manifest2.json"); |
| + const std::vector<favicon::FaviconURL> kManifestIcons1 = { |
| + FaviconURL(kIconURL64x64, FAVICON, kEmptySizes), |
| + }; |
| + const std::vector<favicon::FaviconURL> kManifestIcons2 = { |
| + FaviconURL(kIconURL10x10, FAVICON, kEmptySizes), |
| + }; |
| + |
| + ON_CALL(delegate_, DownloadManifest(kManifestURL1, _)) |
| + .WillByDefault(PostDownloadReply(200, kManifestIcons1)); |
| + ON_CALL(delegate_, DownloadManifest(kManifestURL2, _)) |
| + .WillByDefault(PostDownloadReply(200, kManifestIcons2)); |
| + |
| + EXPECT_CALL(delegate_, DownloadManifest(kManifestURL1, _)); |
| + std::unique_ptr<FaviconHandler> handler = |
| + RunHandlerWithSimpleFaviconCandidates({kIconURL12x12}, kManifestURL1); |
| + ASSERT_THAT(favicon_service_.fake()->db_requests(), |
| + ElementsAre(kPageURL, kManifestURL1)); |
| + EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL64x64)); |
| + ASSERT_TRUE(VerifyAndClearExpectations()); |
| + |
| + // Simulate the page changing it's manifest URL via Javascript. |
| + EXPECT_CALL(delegate_, DownloadManifest(kManifestURL2, _)); |
| + EXPECT_CALL(delegate_, OnFaviconUpdated(_, _, kManifestURL2, _, _)); |
| + handler->OnUpdateCandidates(kPageURL, |
| + {FaviconURL(kIconURL12x12, FAVICON, kEmptySizes)}, |
| + kManifestURL2); |
| + base::RunLoop().RunUntilIdle(); |
| + ASSERT_THAT(favicon_service_.fake()->db_requests(), |
| + ElementsAre(kManifestURL2)); |
| + EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL10x10)); |
| +} |
| + |
| +// TODO(mastiz) / DONOTSUBMIT: Add missing tests. |
|
pkotwicz
2017/04/12 22:10:07
Can you please add a test for when:
- There is a W
mastiz
2017/04/20 18:06:33
Done, UnknownManifestWithoutIconsAndKnownRegularIc
|
| + |
| } // namespace |
| } // namespace favicon |