| 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/ntp_snippets_service.h" | 5 #include "components/ntp_snippets/ntp_snippets_service.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 public: | 236 public: |
| 237 MOCK_METHOD0(NTPSnippetsServiceLoaded, void()); | 237 MOCK_METHOD0(NTPSnippetsServiceLoaded, void()); |
| 238 MOCK_METHOD0(NTPSnippetsServiceShutdown, void()); | 238 MOCK_METHOD0(NTPSnippetsServiceShutdown, void()); |
| 239 MOCK_METHOD0(NTPSnippetsServiceDisabled, void()); | 239 MOCK_METHOD0(NTPSnippetsServiceDisabled, void()); |
| 240 }; | 240 }; |
| 241 | 241 |
| 242 class WaitForDBLoad : public NTPSnippetsServiceObserver { | 242 class WaitForDBLoad : public NTPSnippetsServiceObserver { |
| 243 public: | 243 public: |
| 244 WaitForDBLoad(NTPSnippetsService* service) : service_(service) { | 244 WaitForDBLoad(NTPSnippetsService* service) : service_(service) { |
| 245 service_->AddObserver(this); | 245 service_->AddObserver(this); |
| 246 if (!service_->loaded()) | 246 if (!service_->ready()) |
| 247 run_loop_.Run(); | 247 run_loop_.Run(); |
| 248 } | 248 } |
| 249 | 249 |
| 250 ~WaitForDBLoad() override { | 250 ~WaitForDBLoad() override { |
| 251 service_->RemoveObserver(this); | 251 service_->RemoveObserver(this); |
| 252 } | 252 } |
| 253 | 253 |
| 254 private: | 254 private: |
| 255 void NTPSnippetsServiceLoaded() override { | 255 void NTPSnippetsServiceLoaded() override { |
| 256 EXPECT_TRUE(service_->loaded()); | 256 EXPECT_TRUE(service_->ready()); |
| 257 run_loop_.Quit(); | 257 run_loop_.Quit(); |
| 258 } | 258 } |
| 259 | 259 |
| 260 void NTPSnippetsServiceShutdown() override {} | 260 void NTPSnippetsServiceShutdown() override {} |
| 261 void NTPSnippetsServiceDisabled() override {} | 261 void NTPSnippetsServiceDisabled() override {} |
| 262 | 262 |
| 263 NTPSnippetsService* service_; | 263 NTPSnippetsService* service_; |
| 264 base::RunLoop run_loop_; | 264 base::RunLoop run_loop_; |
| 265 | 265 |
| 266 DISALLOW_COPY_AND_ASSIGN(WaitForDBLoad); | 266 DISALLOW_COPY_AND_ASSIGN(WaitForDBLoad); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 294 service_->Shutdown(); | 294 service_->Shutdown(); |
| 295 | 295 |
| 296 // We need to run the message loop after deleting the database, because | 296 // We need to run the message loop after deleting the database, because |
| 297 // ProtoDatabaseImpl deletes the actual LevelDB asynchronously on the task | 297 // ProtoDatabaseImpl deletes the actual LevelDB asynchronously on the task |
| 298 // runner. Without this, we'd get reports of memory leaks. | 298 // runner. Without this, we'd get reports of memory leaks. |
| 299 service_.reset(); | 299 service_.reset(); |
| 300 base::RunLoop().RunUntilIdle(); | 300 base::RunLoop().RunUntilIdle(); |
| 301 } | 301 } |
| 302 | 302 |
| 303 void SetUp() override { | 303 void SetUp() override { |
| 304 ResetSyncServiceMock(); |
| 304 EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1); | 305 EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1); |
| 305 CreateSnippetsService(/*enabled=*/true); | 306 CreateSnippetsService(/*enabled=*/true); |
| 306 } | 307 } |
| 307 | 308 |
| 308 void CreateSnippetsService(bool enabled) { | 309 void CreateSnippetsService(bool enabled) { |
| 309 if (service_) | 310 if (service_) |
| 310 service_->Shutdown(); | 311 service_->Shutdown(); |
| 311 | 312 |
| 312 scoped_refptr<base::SingleThreadTaskRunner> task_runner( | 313 scoped_refptr<base::SingleThreadTaskRunner> task_runner( |
| 313 base::ThreadTaskRunnerHandle::Get()); | 314 base::ThreadTaskRunnerHandle::Get()); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 std::unique_ptr<NTPSnippetsService> service_; | 385 std::unique_ptr<NTPSnippetsService> service_; |
| 385 | 386 |
| 386 base::ScopedTempDir database_dir_; | 387 base::ScopedTempDir database_dir_; |
| 387 | 388 |
| 388 DISALLOW_COPY_AND_ASSIGN(NTPSnippetsServiceTest); | 389 DISALLOW_COPY_AND_ASSIGN(NTPSnippetsServiceTest); |
| 389 }; | 390 }; |
| 390 | 391 |
| 391 class NTPSnippetsServiceWithSyncTest : public NTPSnippetsServiceTest { | 392 class NTPSnippetsServiceWithSyncTest : public NTPSnippetsServiceTest { |
| 392 public: | 393 public: |
| 393 void SetUp() override { | 394 void SetUp() override { |
| 394 ResetSyncServiceMock(); | 395 // ResetSyncServiceMock(); |
| 395 NTPSnippetsServiceTest::SetUp(); | 396 NTPSnippetsServiceTest::SetUp(); |
| 396 } | 397 } |
| 397 }; | 398 }; |
| 398 | 399 |
| 399 class NTPSnippetsServiceDisabledTest : public NTPSnippetsServiceTest { | 400 class NTPSnippetsServiceDisabledTest : public NTPSnippetsServiceTest { |
| 400 public: | 401 public: |
| 401 void SetUp() override { | 402 void SetUp() override { |
| 402 EXPECT_CALL(mock_scheduler(), Unschedule()).Times(1); | 403 EXPECT_CALL(mock_scheduler(), Unschedule()).Times(1); |
| 403 CreateSnippetsService(/*enabled=*/false); | 404 CreateSnippetsService(/*enabled=*/false); |
| 404 } | 405 } |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"), | 839 EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"), |
| 839 ElementsAre(base::Bucket(/*min=*/0, /*count=*/3), | 840 ElementsAre(base::Bucket(/*min=*/0, /*count=*/3), |
| 840 base::Bucket(/*min=*/1, /*count=*/2))); | 841 base::Bucket(/*min=*/1, /*count=*/2))); |
| 841 // Discarded snippets shouldn't influence NumArticlesFetched. | 842 // Discarded snippets shouldn't influence NumArticlesFetched. |
| 842 EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"), | 843 EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"), |
| 843 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1), | 844 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1), |
| 844 base::Bucket(/*min=*/1, /*count=*/3))); | 845 base::Bucket(/*min=*/1, /*count=*/3))); |
| 845 EXPECT_THAT( | 846 EXPECT_THAT( |
| 846 tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"), | 847 tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"), |
| 847 ElementsAre(base::Bucket(/*min=*/1, /*count=*/1))); | 848 ElementsAre(base::Bucket(/*min=*/1, /*count=*/1))); |
| 849 |
| 848 // Recreating the service and loading from prefs shouldn't count as fetched | 850 // Recreating the service and loading from prefs shouldn't count as fetched |
| 849 // articles. | 851 // articles. |
| 850 EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1); | 852 EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1); |
| 851 CreateSnippetsService(/*enabled=*/true); | 853 CreateSnippetsService(/*enabled=*/true); |
| 852 tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 4); | 854 tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 4); |
| 853 } | 855 } |
| 854 | 856 |
| 855 TEST_F(NTPSnippetsServiceTest, DiscardShouldRespectAllKnownUrls) { | 857 TEST_F(NTPSnippetsServiceTest, DiscardShouldRespectAllKnownUrls) { |
| 856 const std::string creation = | 858 const std::string creation = |
| 857 NTPSnippet::TimeToJsonString(GetDefaultCreationTime()); | 859 NTPSnippet::TimeToJsonString(GetDefaultCreationTime()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 876 EXPECT_THAT(service()->snippets(), IsEmpty()); | 878 EXPECT_THAT(service()->snippets(), IsEmpty()); |
| 877 | 879 |
| 878 // The same article from the AOL domain should now be detected as discarded. | 880 // The same article from the AOL domain should now be detected as discarded. |
| 879 LoadFromJSONString(GetTestJson({GetSnippetWithUrlAndTimesAndSources( | 881 LoadFromJSONString(GetTestJson({GetSnippetWithUrlAndTimesAndSources( |
| 880 source_urls[1], creation, expiry, source_urls, publishers, amp_urls)})); | 882 source_urls[1], creation, expiry, source_urls, publishers, amp_urls)})); |
| 881 ASSERT_THAT(service()->snippets(), IsEmpty()); | 883 ASSERT_THAT(service()->snippets(), IsEmpty()); |
| 882 } | 884 } |
| 883 | 885 |
| 884 TEST_F(NTPSnippetsServiceWithSyncTest, SyncStateCompatibility) { | 886 TEST_F(NTPSnippetsServiceWithSyncTest, SyncStateCompatibility) { |
| 885 // The default test setup has a compatible sync state. | 887 // The default test setup has a compatible sync state. |
| 886 EXPECT_FALSE(service()->IsSyncStateIncompatible()); | 888 EXPECT_EQ(DisabledReason::NONE, service()->GetDisabledReason()); |
| 887 | 889 |
| 888 // History sync disabled. | 890 // History sync disabled. |
| 889 ON_CALL(*mock_sync_service(), GetActiveDataTypes()) | 891 ON_CALL(*mock_sync_service(), GetActiveDataTypes()) |
| 890 .WillByDefault(Return(syncer::ModelTypeSet())); | 892 .WillByDefault(Return(syncer::ModelTypeSet())); |
| 891 EXPECT_TRUE(service()->IsSyncStateIncompatible()); | 893 EXPECT_EQ(DisabledReason::HISTORY_SYNC_DISABLED, |
| 894 service()->GetDisabledReason()); |
| 892 ResetSyncServiceMock(); | 895 ResetSyncServiceMock(); |
| 893 | 896 |
| 894 // Not done loading. | 897 // Not done loading. |
| 895 ON_CALL(*mock_sync_service(), ConfigurationDone()) | 898 ON_CALL(*mock_sync_service(), ConfigurationDone()) |
| 896 .WillByDefault(Return(false)); | 899 .WillByDefault(Return(false)); |
| 897 ON_CALL(*mock_sync_service(), GetActiveDataTypes()) | 900 ON_CALL(*mock_sync_service(), GetActiveDataTypes()) |
| 898 .WillByDefault(Return(syncer::ModelTypeSet())); | 901 .WillByDefault(Return(syncer::ModelTypeSet())); |
| 899 EXPECT_FALSE(service()->IsSyncStateIncompatible()); | 902 EXPECT_EQ(DisabledReason::HISTORY_SYNC_STATE_UNKNOWN, |
| 903 service()->GetDisabledReason()); |
| 900 ResetSyncServiceMock(); | 904 ResetSyncServiceMock(); |
| 901 | 905 |
| 902 // Sync disabled. | 906 // Sync disabled. |
| 903 ON_CALL(*mock_sync_service(), CanSyncStart()).WillByDefault(Return(false)); | 907 ON_CALL(*mock_sync_service(), CanSyncStart()).WillByDefault(Return(false)); |
| 904 EXPECT_TRUE(service()->IsSyncStateIncompatible()); | 908 EXPECT_EQ(DisabledReason::HISTORY_SYNC_DISABLED, |
| 909 service()->GetDisabledReason()); |
| 905 ResetSyncServiceMock(); | 910 ResetSyncServiceMock(); |
| 906 | 911 |
| 907 // No service. | 912 // No service. |
| 908 service()->sync_service_ = nullptr; | 913 service()->sync_service_ = nullptr; |
| 909 EXPECT_TRUE(service()->IsSyncStateIncompatible()); | 914 EXPECT_EQ(DisabledReason::HISTORY_SYNC_DISABLED, |
| 915 service()->GetDisabledReason()); |
| 910 } | 916 } |
| 911 | 917 |
| 912 TEST_F(NTPSnippetsServiceWithSyncTest, HistorySyncStateChanges) { | 918 TEST_F(NTPSnippetsServiceWithSyncTest, HistorySyncStateChanges) { |
| 913 MockServiceObserver mock_observer; | 919 MockServiceObserver mock_observer; |
| 914 service()->AddObserver(&mock_observer); | 920 service()->AddObserver(&mock_observer); |
| 915 | 921 |
| 916 // Simulate user disabled sync. | 922 // Simulate user disabled sync. |
| 917 ON_CALL(*mock_sync_service(), CanSyncStart()).WillByDefault(Return(false)); | 923 ON_CALL(*mock_sync_service(), CanSyncStart()).WillByDefault(Return(false)); |
| 918 // The service should notify observers it's been disabled and clear the | 924 // The service should notify observers it's been disabled and clear the |
| 919 // snippets instead of pulling new ones. | 925 // snippets instead of pulling new ones. |
| 920 EXPECT_CALL(mock_observer, NTPSnippetsServiceDisabled()); | 926 EXPECT_CALL(mock_observer, NTPSnippetsServiceDisabled()); |
| 921 SetUpFetchResponse(GetTestJson({GetSnippet()})); | 927 SetUpFetchResponse(GetTestJson({GetSnippet()})); |
| 922 service()->OnStateChanged(); | 928 service()->OnStateChanged(); |
| 923 base::RunLoop().RunUntilIdle(); | 929 base::RunLoop().RunUntilIdle(); |
| 930 EXPECT_EQ(NTPSnippetsService::State::DISABLED, service()->state_); |
| 924 EXPECT_THAT(service()->snippets(), IsEmpty()); // No fetch should be made. | 931 EXPECT_THAT(service()->snippets(), IsEmpty()); // No fetch should be made. |
| 925 | 932 |
| 926 // Simulate user sign in. | 933 // Simulate user sign in. |
| 927 ResetSyncServiceMock(); | 934 ResetSyncServiceMock(); |
| 928 // The service should be ready again and load snippets. | 935 // The service should be ready again and load snippets. |
| 936 EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1); |
| 929 SetUpFetchResponse(GetTestJson({GetSnippet()})); | 937 SetUpFetchResponse(GetTestJson({GetSnippet()})); |
| 930 service()->OnStateChanged(); | 938 service()->OnStateChanged(); |
| 931 base::RunLoop().RunUntilIdle(); | 939 base::RunLoop().RunUntilIdle(); |
| 940 EXPECT_EQ(NTPSnippetsService::State::READY, service()->state_); |
| 932 EXPECT_FALSE(service()->snippets().empty()); | 941 EXPECT_FALSE(service()->snippets().empty()); |
| 933 | 942 |
| 934 service()->RemoveObserver(&mock_observer); | 943 service()->RemoveObserver(&mock_observer); |
| 935 } | 944 } |
| 936 | 945 |
| 937 } // namespace ntp_snippets | 946 } // namespace ntp_snippets |
| OLD | NEW |