Chromium Code Reviews| 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()); | |
|
Marc Treib
2016/06/06 08:38:33
Any reason for removing this line?
dgn
2016/06/06 15:44:39
That was related to the order between the db loadi
Marc Treib
2016/06/07 08:55:39
Acknowledged.
| |
| 257 run_loop_.Quit(); | 256 run_loop_.Quit(); |
| 258 } | 257 } |
| 259 | 258 |
| 260 void NTPSnippetsServiceShutdown() override {} | 259 void NTPSnippetsServiceShutdown() override {} |
| 261 void NTPSnippetsServiceDisabled() override {} | 260 void NTPSnippetsServiceDisabled() override {} |
| 262 | 261 |
| 263 NTPSnippetsService* service_; | 262 NTPSnippetsService* service_; |
| 264 base::RunLoop run_loop_; | 263 base::RunLoop run_loop_; |
| 265 | 264 |
| 266 DISALLOW_COPY_AND_ASSIGN(WaitForDBLoad); | 265 DISALLOW_COPY_AND_ASSIGN(WaitForDBLoad); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 294 service_->Shutdown(); | 293 service_->Shutdown(); |
| 295 | 294 |
| 296 // We need to run the message loop after deleting the database, because | 295 // We need to run the message loop after deleting the database, because |
| 297 // ProtoDatabaseImpl deletes the actual LevelDB asynchronously on the task | 296 // ProtoDatabaseImpl deletes the actual LevelDB asynchronously on the task |
| 298 // runner. Without this, we'd get reports of memory leaks. | 297 // runner. Without this, we'd get reports of memory leaks. |
| 299 service_.reset(); | 298 service_.reset(); |
| 300 base::RunLoop().RunUntilIdle(); | 299 base::RunLoop().RunUntilIdle(); |
| 301 } | 300 } |
| 302 | 301 |
| 303 void SetUp() override { | 302 void SetUp() override { |
| 303 ResetSyncServiceMock(); | |
| 304 EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1); | 304 EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1); |
| 305 CreateSnippetsService(/*enabled=*/true); | 305 CreateSnippetsService(/*enabled=*/true); |
| 306 } | 306 } |
| 307 | 307 |
| 308 void CreateSnippetsService(bool enabled) { | 308 void CreateSnippetsService(bool enabled) { |
| 309 if (service_) | 309 if (service_) |
| 310 service_->Shutdown(); | 310 service_->Shutdown(); |
| 311 | 311 |
| 312 scoped_refptr<base::SingleThreadTaskRunner> task_runner( | 312 scoped_refptr<base::SingleThreadTaskRunner> task_runner( |
| 313 base::ThreadTaskRunnerHandle::Get()); | 313 base::ThreadTaskRunnerHandle::Get()); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 384 std::unique_ptr<NTPSnippetsService> service_; | 384 std::unique_ptr<NTPSnippetsService> service_; |
| 385 | 385 |
| 386 base::ScopedTempDir database_dir_; | 386 base::ScopedTempDir database_dir_; |
| 387 | 387 |
| 388 DISALLOW_COPY_AND_ASSIGN(NTPSnippetsServiceTest); | 388 DISALLOW_COPY_AND_ASSIGN(NTPSnippetsServiceTest); |
| 389 }; | 389 }; |
| 390 | 390 |
| 391 class NTPSnippetsServiceWithSyncTest : public NTPSnippetsServiceTest { | 391 class NTPSnippetsServiceWithSyncTest : public NTPSnippetsServiceTest { |
| 392 public: | 392 public: |
| 393 void SetUp() override { | 393 void SetUp() override { |
| 394 ResetSyncServiceMock(); | 394 // ResetSyncServiceMock(); |
| 395 NTPSnippetsServiceTest::SetUp(); | 395 NTPSnippetsServiceTest::SetUp(); |
| 396 } | 396 } |
| 397 }; | 397 }; |
| 398 | 398 |
| 399 class NTPSnippetsServiceDisabledTest : public NTPSnippetsServiceTest { | 399 class NTPSnippetsServiceDisabledTest : public NTPSnippetsServiceTest { |
| 400 public: | 400 public: |
| 401 void SetUp() override { | 401 void SetUp() override { |
| 402 EXPECT_CALL(mock_scheduler(), Unschedule()).Times(1); | 402 EXPECT_CALL(mock_scheduler(), Unschedule()).Times(1); |
| 403 CreateSnippetsService(/*enabled=*/false); | 403 CreateSnippetsService(/*enabled=*/false); |
| 404 } | 404 } |
| 405 }; | 405 }; |
| 406 | 406 |
| 407 TEST_F(NTPSnippetsServiceTest, ScheduleIfEnabled) { | 407 TEST_F(NTPSnippetsServiceTest, ScheduleIfEnabled) { |
| 408 // SetUp() checks that Schedule is called. | 408 // SetUp() checks that Schedule is called. |
| 409 } | 409 } |
| 410 | 410 |
| 411 TEST_F(NTPSnippetsServiceDisabledTest, Unschedule) { | 411 TEST_F(NTPSnippetsServiceDisabledTest, Unschedule) { |
| 412 // SetUp() checks that Unschedule is called. | 412 // SetUp() checks that Unschedule is called. |
| 413 } | 413 } |
| 414 | 414 |
| 415 TEST_F(NTPSnippetsServiceTest, Full) { | 415 TEST_F(NTPSnippetsServiceTest, Full) { |
| 416 EXPECT_TRUE(service()->ready()); | |
| 416 std::string json_str(GetTestJson({GetSnippet()})); | 417 std::string json_str(GetTestJson({GetSnippet()})); |
| 417 | 418 |
| 418 LoadFromJSONString(json_str); | 419 LoadFromJSONString(json_str); |
| 419 ASSERT_THAT(service()->snippets(), SizeIs(1)); | 420 ASSERT_THAT(service()->snippets(), SizeIs(1)); |
| 420 const NTPSnippet& snippet = *service()->snippets().front(); | 421 const NTPSnippet& snippet = *service()->snippets().front(); |
| 421 | 422 |
| 422 EXPECT_EQ(snippet.id(), kSnippetUrl); | 423 EXPECT_EQ(snippet.id(), kSnippetUrl); |
| 423 EXPECT_EQ(snippet.title(), kSnippetTitle); | 424 EXPECT_EQ(snippet.title(), kSnippetTitle); |
| 424 EXPECT_EQ(snippet.snippet(), kSnippetText); | 425 EXPECT_EQ(snippet.snippet(), kSnippetText); |
| 425 EXPECT_EQ(snippet.salient_image_url(), GURL(kSnippetSalientImage)); | 426 EXPECT_EQ(snippet.salient_image_url(), GURL(kSnippetSalientImage)); |
| (...skipping 412 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 |