| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_snippets/remote/remote_suggestions_provider_impl.h" | 5 #include "components/ntp_snippets/remote/remote_suggestions_provider_impl.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 #include "components/ntp_snippets/remote/remote_suggestions_scheduler.h" | 42 #include "components/ntp_snippets/remote/remote_suggestions_scheduler.h" |
| 43 #include "components/ntp_snippets/remote/test_utils.h" | 43 #include "components/ntp_snippets/remote/test_utils.h" |
| 44 #include "components/ntp_snippets/user_classifier.h" | 44 #include "components/ntp_snippets/user_classifier.h" |
| 45 #include "components/prefs/testing_pref_service.h" | 45 #include "components/prefs/testing_pref_service.h" |
| 46 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" | 46 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" |
| 47 #include "components/signin/core/browser/fake_signin_manager.h" | 47 #include "components/signin/core/browser/fake_signin_manager.h" |
| 48 #include "components/variations/variations_params_manager.h" | 48 #include "components/variations/variations_params_manager.h" |
| 49 #include "net/url_request/test_url_fetcher_factory.h" | 49 #include "net/url_request/test_url_fetcher_factory.h" |
| 50 #include "net/url_request/url_request_test_util.h" | 50 #include "net/url_request/url_request_test_util.h" |
| 51 #include "testing/gmock/include/gmock/gmock.h" | 51 #include "testing/gmock/include/gmock/gmock.h" |
| 52 #include "testing/gmock_mutant.h" |
| 52 #include "testing/gtest/include/gtest/gtest.h" | 53 #include "testing/gtest/include/gtest/gtest.h" |
| 53 #include "ui/gfx/geometry/size.h" | 54 #include "ui/gfx/geometry/size.h" |
| 54 #include "ui/gfx/image/image.h" | 55 #include "ui/gfx/image/image.h" |
| 55 #include "ui/gfx/image/image_unittest_util.h" | 56 #include "ui/gfx/image/image_unittest_util.h" |
| 56 | 57 |
| 57 using image_fetcher::ImageFetcher; | 58 using image_fetcher::ImageFetcher; |
| 58 using image_fetcher::ImageFetcherDelegate; | 59 using image_fetcher::ImageFetcherDelegate; |
| 59 using testing::_; | 60 using testing::_; |
| 61 using testing::CreateFunctor; |
| 60 using testing::ElementsAre; | 62 using testing::ElementsAre; |
| 61 using testing::Eq; | 63 using testing::Eq; |
| 62 using testing::InSequence; | 64 using testing::InSequence; |
| 63 using testing::Invoke; | 65 using testing::Invoke; |
| 64 using testing::IsEmpty; | 66 using testing::IsEmpty; |
| 65 using testing::Mock; | 67 using testing::Mock; |
| 66 using testing::MockFunction; | 68 using testing::MockFunction; |
| 67 using testing::NiceMock; | 69 using testing::NiceMock; |
| 68 using testing::Not; | 70 using testing::Not; |
| 69 using testing::Return; | 71 using testing::Return; |
| (...skipping 836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 906 LoadMoreFromJSONString(service.get(), articles_category(), | 908 LoadMoreFromJSONString(service.get(), articles_category(), |
| 907 GetTestJson({GetSuggestionWithUrl("http://second")}), | 909 GetTestJson({GetSuggestionWithUrl("http://second")}), |
| 908 /*known_ids=*/std::set<std::string>(), | 910 /*known_ids=*/std::set<std::string>(), |
| 909 expect_only_second_suggestion_received); | 911 expect_only_second_suggestion_received); |
| 910 | 912 |
| 911 // Verify we can resolve the image of the new suggestions. | 913 // Verify we can resolve the image of the new suggestions. |
| 912 ServeImageCallback cb = | 914 ServeImageCallback cb = |
| 913 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); | 915 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); |
| 914 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) | 916 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) |
| 915 .Times(2) | 917 .Times(2) |
| 916 .WillRepeatedly(WithArgs<0, 2>(Invoke(&cb, &ServeImageCallback::Run))); | 918 .WillRepeatedly(WithArgs<0, 2>(Invoke(CreateFunctor(cb)))); |
| 917 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); | 919 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); |
| 918 gfx::Image image = FetchImage(service.get(), MakeArticleID("http://first")); | 920 gfx::Image image = FetchImage(service.get(), MakeArticleID("http://first")); |
| 919 EXPECT_FALSE(image.IsEmpty()); | 921 EXPECT_FALSE(image.IsEmpty()); |
| 920 EXPECT_EQ(1, image.Width()); | 922 EXPECT_EQ(1, image.Width()); |
| 921 | 923 |
| 922 image = FetchImage(service.get(), MakeArticleID("http://second")); | 924 image = FetchImage(service.get(), MakeArticleID("http://second")); |
| 923 EXPECT_FALSE(image.IsEmpty()); | 925 EXPECT_FALSE(image.IsEmpty()); |
| 924 EXPECT_EQ(1, image.Width()); | 926 EXPECT_EQ(1, image.Width()); |
| 925 | 927 |
| 926 // Verify that the observer received the update as well. We should see the | 928 // Verify that the observer received the update as well. We should see the |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1009 GetSuggestionWithUrl("http://id-2")})); | 1011 GetSuggestionWithUrl("http://id-2")})); |
| 1010 LoadFromJSONString(service.get(), | 1012 LoadFromJSONString(service.get(), |
| 1011 GetTestJson({GetSuggestionWithUrl("http://new-id-1"), | 1013 GetTestJson({GetSuggestionWithUrl("http://new-id-1"), |
| 1012 GetSuggestionWithUrl("http://new-id-2")})); | 1014 GetSuggestionWithUrl("http://new-id-2")})); |
| 1013 // Make sure images of both batches are available. This is to sanity check our | 1015 // Make sure images of both batches are available. This is to sanity check our |
| 1014 // assumptions for the test are right. | 1016 // assumptions for the test are right. |
| 1015 ServeImageCallback cb = | 1017 ServeImageCallback cb = |
| 1016 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); | 1018 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); |
| 1017 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) | 1019 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) |
| 1018 .Times(2) | 1020 .Times(2) |
| 1019 .WillRepeatedly(WithArgs<0, 2>(Invoke(&cb, &ServeImageCallback::Run))); | 1021 .WillRepeatedly(WithArgs<0, 2>(Invoke(CreateFunctor(cb)))); |
| 1020 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); | 1022 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); |
| 1021 gfx::Image image = FetchImage(service.get(), MakeArticleID("http://id-1")); | 1023 gfx::Image image = FetchImage(service.get(), MakeArticleID("http://id-1")); |
| 1022 ASSERT_FALSE(image.IsEmpty()); | 1024 ASSERT_FALSE(image.IsEmpty()); |
| 1023 ASSERT_EQ(1, image.Width()); | 1025 ASSERT_EQ(1, image.Width()); |
| 1024 image = FetchImage(service.get(), MakeArticleID("http://new-id-1")); | 1026 image = FetchImage(service.get(), MakeArticleID("http://new-id-1")); |
| 1025 ASSERT_FALSE(image.IsEmpty()); | 1027 ASSERT_FALSE(image.IsEmpty()); |
| 1026 ASSERT_EQ(1, image.Width()); | 1028 ASSERT_EQ(1, image.Width()); |
| 1027 | 1029 |
| 1028 service->ClearHistory(base::Time::UnixEpoch(), base::Time::Max(), | 1030 service->ClearHistory(base::Time::UnixEpoch(), base::Time::Max(), |
| 1029 base::Callback<bool(const GURL& url)>()); | 1031 base::Callback<bool(const GURL& url)>()); |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1247 {GetSuggestionWithSources("http://site.com", "Source 1", "")})); | 1249 {GetSuggestionWithSources("http://site.com", "Source 1", "")})); |
| 1248 | 1250 |
| 1249 LoadFromJSONString(service.get(), json_str); | 1251 LoadFromJSONString(service.get(), json_str); |
| 1250 | 1252 |
| 1251 ASSERT_THAT(service->GetSuggestionsForTesting(articles_category()), | 1253 ASSERT_THAT(service->GetSuggestionsForTesting(articles_category()), |
| 1252 SizeIs(1)); | 1254 SizeIs(1)); |
| 1253 // Load the image to store it in the database. | 1255 // Load the image to store it in the database. |
| 1254 ServeImageCallback cb = | 1256 ServeImageCallback cb = |
| 1255 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); | 1257 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); |
| 1256 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) | 1258 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) |
| 1257 .WillOnce(WithArgs<0, 2>(Invoke(&cb, &ServeImageCallback::Run))); | 1259 .WillOnce(WithArgs<0, 2>(Invoke(CreateFunctor(cb)))); |
| 1258 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); | 1260 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); |
| 1259 gfx::Image image = FetchImage(service.get(), MakeArticleID(kSuggestionUrl)); | 1261 gfx::Image image = FetchImage(service.get(), MakeArticleID(kSuggestionUrl)); |
| 1260 EXPECT_FALSE(image.IsEmpty()); | 1262 EXPECT_FALSE(image.IsEmpty()); |
| 1261 EXPECT_EQ(1, image.Width()); | 1263 EXPECT_EQ(1, image.Width()); |
| 1262 | 1264 |
| 1263 // Dismissing a non-existent suggestion shouldn't do anything. | 1265 // Dismissing a non-existent suggestion shouldn't do anything. |
| 1264 service->DismissSuggestion(MakeArticleID("http://othersite.com")); | 1266 service->DismissSuggestion(MakeArticleID("http://othersite.com")); |
| 1265 EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()), | 1267 EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()), |
| 1266 SizeIs(1)); | 1268 SizeIs(1)); |
| 1267 | 1269 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1352 | 1354 |
| 1353 std::string json_str1(GetTestJson({GetExpiredSuggestion()})); | 1355 std::string json_str1(GetTestJson({GetExpiredSuggestion()})); |
| 1354 // Load it. | 1356 // Load it. |
| 1355 LoadFromJSONString(service.get(), json_str1); | 1357 LoadFromJSONString(service.get(), json_str1); |
| 1356 // Load the image to store it in the database. | 1358 // Load the image to store it in the database. |
| 1357 // TODO(tschumann): Introduce some abstraction to nicely work with image | 1359 // TODO(tschumann): Introduce some abstraction to nicely work with image |
| 1358 // fetching expectations. | 1360 // fetching expectations. |
| 1359 ServeImageCallback cb = | 1361 ServeImageCallback cb = |
| 1360 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); | 1362 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); |
| 1361 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) | 1363 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) |
| 1362 .WillOnce(WithArgs<0, 2>(Invoke(&cb, &ServeImageCallback::Run))); | 1364 .WillOnce(WithArgs<0, 2>(Invoke(CreateFunctor(cb)))); |
| 1363 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); | 1365 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); |
| 1364 gfx::Image image = FetchImage(service.get(), MakeArticleID(kSuggestionUrl)); | 1366 gfx::Image image = FetchImage(service.get(), MakeArticleID(kSuggestionUrl)); |
| 1365 EXPECT_FALSE(image.IsEmpty()); | 1367 EXPECT_FALSE(image.IsEmpty()); |
| 1366 EXPECT_EQ(1, image.Width()); | 1368 EXPECT_EQ(1, image.Width()); |
| 1367 | 1369 |
| 1368 // Dismiss the suggestion | 1370 // Dismiss the suggestion |
| 1369 service->DismissSuggestion( | 1371 service->DismissSuggestion( |
| 1370 ContentSuggestion::ID(articles_category(), kSuggestionUrl)); | 1372 ContentSuggestion::ID(articles_category(), kSuggestionUrl)); |
| 1371 | 1373 |
| 1372 // Load a different suggestion - this will clear the expired dismissed ones. | 1374 // Load a different suggestion - this will clear the expired dismissed ones. |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 | 1528 |
| 1527 LoadFromJSONString(service.get(), GetTestJson({GetSuggestion()})); | 1529 LoadFromJSONString(service.get(), GetTestJson({GetSuggestion()})); |
| 1528 | 1530 |
| 1529 gfx::Image image; | 1531 gfx::Image image; |
| 1530 MockFunction<void(const gfx::Image&)> image_fetched; | 1532 MockFunction<void(const gfx::Image&)> image_fetched; |
| 1531 ServeImageCallback cb = | 1533 ServeImageCallback cb = |
| 1532 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); | 1534 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); |
| 1533 { | 1535 { |
| 1534 InSequence s; | 1536 InSequence s; |
| 1535 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) | 1537 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) |
| 1536 .WillOnce(WithArgs<0, 2>(Invoke(&cb, &ServeImageCallback::Run))); | 1538 .WillOnce(WithArgs<0, 2>(Invoke(CreateFunctor(cb)))); |
| 1537 EXPECT_CALL(image_fetched, Call(_)).WillOnce(SaveArg<0>(&image)); | 1539 EXPECT_CALL(image_fetched, Call(_)).WillOnce(SaveArg<0>(&image)); |
| 1538 } | 1540 } |
| 1539 | 1541 |
| 1540 service->FetchSuggestionImage( | 1542 service->FetchSuggestionImage( |
| 1541 MakeArticleID(kSuggestionUrl), | 1543 MakeArticleID(kSuggestionUrl), |
| 1542 base::Bind(&MockFunction<void(const gfx::Image&)>::Call, | 1544 base::Bind(&MockFunction<void(const gfx::Image&)>::Call, |
| 1543 base::Unretained(&image_fetched))); | 1545 base::Unretained(&image_fetched))); |
| 1544 base::RunLoop().RunUntilIdle(); | 1546 base::RunLoop().RunUntilIdle(); |
| 1545 // Check that the image by ServeOneByOneImage is really served. | 1547 // Check that the image by ServeOneByOneImage is really served. |
| 1546 EXPECT_EQ(1, image.Width()); | 1548 EXPECT_EQ(1, image.Width()); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1633 } | 1635 } |
| 1634 | 1636 |
| 1635 TEST_F(RemoteSuggestionsProviderImplTest, ShouldClearOrphanedImagesOnRestart) { | 1637 TEST_F(RemoteSuggestionsProviderImplTest, ShouldClearOrphanedImagesOnRestart) { |
| 1636 auto service = MakeSuggestionsProvider(); | 1638 auto service = MakeSuggestionsProvider(); |
| 1637 | 1639 |
| 1638 LoadFromJSONString(service.get(), GetTestJson({GetSuggestion()})); | 1640 LoadFromJSONString(service.get(), GetTestJson({GetSuggestion()})); |
| 1639 ServeImageCallback cb = | 1641 ServeImageCallback cb = |
| 1640 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); | 1642 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); |
| 1641 | 1643 |
| 1642 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) | 1644 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) |
| 1643 .WillOnce(WithArgs<0, 2>(Invoke(&cb, &ServeImageCallback::Run))); | 1645 .WillOnce(WithArgs<0, 2>(Invoke(CreateFunctor(cb)))); |
| 1644 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); | 1646 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); |
| 1645 | 1647 |
| 1646 gfx::Image image = FetchImage(service.get(), MakeArticleID(kSuggestionUrl)); | 1648 gfx::Image image = FetchImage(service.get(), MakeArticleID(kSuggestionUrl)); |
| 1647 EXPECT_EQ(1, image.Width()); | 1649 EXPECT_EQ(1, image.Width()); |
| 1648 EXPECT_FALSE(image.IsEmpty()); | 1650 EXPECT_FALSE(image.IsEmpty()); |
| 1649 | 1651 |
| 1650 // Send new suggestion which don't include the suggestion referencing the | 1652 // Send new suggestion which don't include the suggestion referencing the |
| 1651 // image. | 1653 // image. |
| 1652 LoadFromJSONString(service.get(), | 1654 LoadFromJSONString(service.get(), |
| 1653 GetTestJson({GetSuggestionWithUrl( | 1655 GetTestJson({GetSuggestionWithUrl( |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1804 EXPECT_CALL(scheduler, OnProviderActivated()); | 1806 EXPECT_CALL(scheduler, OnProviderActivated()); |
| 1805 // The scheduler should be notified of clearing the history. | 1807 // The scheduler should be notified of clearing the history. |
| 1806 EXPECT_CALL(scheduler, OnSuggestionsCleared()); | 1808 EXPECT_CALL(scheduler, OnSuggestionsCleared()); |
| 1807 | 1809 |
| 1808 service->SetRemoteSuggestionsScheduler(&scheduler); | 1810 service->SetRemoteSuggestionsScheduler(&scheduler); |
| 1809 service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT, | 1811 service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT, |
| 1810 RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN); | 1812 RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN); |
| 1811 } | 1813 } |
| 1812 | 1814 |
| 1813 } // namespace ntp_snippets | 1815 } // namespace ntp_snippets |
| OLD | NEW |