| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/callback.h" | 6 #include "base/callback.h" |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 } | 98 } |
| 99 | 99 |
| 100 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&)); | 100 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&)); |
| 101 }; | 101 }; |
| 102 | 102 |
| 103 virtual void SetUp() { | 103 virtual void SetUp() { |
| 104 dir_maker_.SetUp(); | 104 dir_maker_.SetUp(); |
| 105 syncer_ = new MockSyncer(); | 105 syncer_ = new MockSyncer(); |
| 106 delay_ = NULL; | 106 delay_ = NULL; |
| 107 | 107 |
| 108 ModelSafeRoutingInfo routing_info; | 108 routing_info_[BOOKMARKS] = GROUP_UI; |
| 109 routing_info[BOOKMARKS] = GROUP_UI; | 109 routing_info_[AUTOFILL] = GROUP_DB; |
| 110 routing_info[AUTOFILL] = GROUP_DB; | 110 routing_info_[THEMES] = GROUP_UI; |
| 111 routing_info[THEMES] = GROUP_UI; | 111 routing_info_[NIGORI] = GROUP_PASSIVE; |
| 112 routing_info[NIGORI] = GROUP_PASSIVE; | |
| 113 | 112 |
| 114 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_UI))); | 113 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_UI))); |
| 115 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB))); | 114 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB))); |
| 116 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_PASSIVE))); | 115 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_PASSIVE))); |
| 117 | 116 |
| 118 std::vector<ModelSafeWorker*> workers; | 117 std::vector<ModelSafeWorker*> workers; |
| 119 for (std::vector<scoped_refptr<FakeModelWorker> >::iterator it = | 118 for (std::vector<scoped_refptr<FakeModelWorker> >::iterator it = |
| 120 workers_.begin(); it != workers_.end(); ++it) { | 119 workers_.begin(); it != workers_.end(); ++it) { |
| 121 workers.push_back(it->get()); | 120 workers.push_back(it->get()); |
| 122 } | 121 } |
| 123 | 122 |
| 124 connection_.reset(new MockConnectionManager(directory())); | 123 connection_.reset(new MockConnectionManager(directory())); |
| 125 connection_->SetServerReachable(); | 124 connection_->SetServerReachable(); |
| 126 throttled_data_type_tracker_.reset(new ThrottledDataTypeTracker(NULL)); | 125 throttled_data_type_tracker_.reset(new ThrottledDataTypeTracker(NULL)); |
| 127 context_.reset(new SyncSessionContext( | 126 context_.reset(new SyncSessionContext( |
| 128 connection_.get(), directory(), workers, | 127 connection_.get(), directory(), workers, |
| 129 &extensions_activity_monitor_, throttled_data_type_tracker_.get(), | 128 &extensions_activity_monitor_, throttled_data_type_tracker_.get(), |
| 130 std::vector<SyncEngineEventListener*>(), NULL, NULL, | 129 std::vector<SyncEngineEventListener*>(), NULL, NULL, |
| 131 true /* enable keystore encryption */)); | 130 true /* enable keystore encryption */)); |
| 132 context_->set_routing_info(routing_info); | 131 context_->set_routing_info(routing_info_); |
| 133 context_->set_notifications_enabled(true); | 132 context_->set_notifications_enabled(true); |
| 134 context_->set_account_name("Test"); | 133 context_->set_account_name("Test"); |
| 135 scheduler_.reset( | 134 scheduler_.reset( |
| 136 new SyncSchedulerImpl("TestSyncScheduler", | 135 new SyncSchedulerImpl("TestSyncScheduler", |
| 137 BackoffDelayProvider::FromDefaults(), | 136 BackoffDelayProvider::FromDefaults(), |
| 138 context(), | 137 context(), |
| 139 syncer_)); | 138 syncer_)); |
| 140 } | 139 } |
| 141 | 140 |
| 142 SyncSchedulerImpl* scheduler() { return scheduler_.get(); } | 141 SyncSchedulerImpl* scheduler() { return scheduler_.get(); } |
| 142 const ModelSafeRoutingInfo& routing_info() { return routing_info_; } |
| 143 MockSyncer* syncer() { return syncer_; } | 143 MockSyncer* syncer() { return syncer_; } |
| 144 MockDelayProvider* delay() { return delay_; } | 144 MockDelayProvider* delay() { return delay_; } |
| 145 MockConnectionManager* connection() { return connection_.get(); } | 145 MockConnectionManager* connection() { return connection_.get(); } |
| 146 TimeDelta zero() { return TimeDelta::FromSeconds(0); } | 146 TimeDelta zero() { return TimeDelta::FromSeconds(0); } |
| 147 TimeDelta timeout() { | 147 TimeDelta timeout() { |
| 148 return TestTimeouts::action_timeout(); | 148 return TestTimeouts::action_timeout(); |
| 149 } | 149 } |
| 150 | 150 |
| 151 virtual void TearDown() { | 151 virtual void TearDown() { |
| 152 PumpLoop(); | 152 PumpLoop(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 177 } | 177 } |
| 178 | 178 |
| 179 // This stops the scheduler synchronously. | 179 // This stops the scheduler synchronously. |
| 180 void StopSyncScheduler() { | 180 void StopSyncScheduler() { |
| 181 scheduler()->RequestStop(base::Bind(&SyncSchedulerTest::DoQuitLoopNow, | 181 scheduler()->RequestStop(base::Bind(&SyncSchedulerTest::DoQuitLoopNow, |
| 182 weak_ptr_factory_.GetWeakPtr())); | 182 weak_ptr_factory_.GetWeakPtr())); |
| 183 RunLoop(); | 183 RunLoop(); |
| 184 } | 184 } |
| 185 | 185 |
| 186 bool RunAndGetBackoff() { | 186 bool RunAndGetBackoff() { |
| 187 ModelTypeSet nudge_types; | 187 ModelTypeSet nudge_types(BOOKMARKS); |
| 188 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 188 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 189 | 189 |
| 190 scheduler()->ScheduleNudgeAsync( | 190 scheduler()->ScheduleNudgeAsync( |
| 191 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); | 191 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |
| 192 RunLoop(); | 192 RunLoop(); |
| 193 | 193 |
| 194 return scheduler()->IsBackingOff(); | 194 return scheduler()->IsBackingOff(); |
| 195 } | 195 } |
| 196 | 196 |
| 197 void UseMockDelayProvider() { | 197 void UseMockDelayProvider() { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 226 MessageLoop message_loop_; | 226 MessageLoop message_loop_; |
| 227 TestDirectorySetterUpper dir_maker_; | 227 TestDirectorySetterUpper dir_maker_; |
| 228 scoped_ptr<MockConnectionManager> connection_; | 228 scoped_ptr<MockConnectionManager> connection_; |
| 229 scoped_ptr<SyncSessionContext> context_; | 229 scoped_ptr<SyncSessionContext> context_; |
| 230 scoped_ptr<SyncSchedulerImpl> scheduler_; | 230 scoped_ptr<SyncSchedulerImpl> scheduler_; |
| 231 MockSyncer* syncer_; | 231 MockSyncer* syncer_; |
| 232 MockDelayProvider* delay_; | 232 MockDelayProvider* delay_; |
| 233 std::vector<scoped_refptr<FakeModelWorker> > workers_; | 233 std::vector<scoped_refptr<FakeModelWorker> > workers_; |
| 234 FakeExtensionsActivityMonitor extensions_activity_monitor_; | 234 FakeExtensionsActivityMonitor extensions_activity_monitor_; |
| 235 scoped_ptr<ThrottledDataTypeTracker> throttled_data_type_tracker_; | 235 scoped_ptr<ThrottledDataTypeTracker> throttled_data_type_tracker_; |
| 236 ModelSafeRoutingInfo routing_info_; |
| 236 }; | 237 }; |
| 237 | 238 |
| 238 void RecordSyncShareImpl(SyncSession* s, SyncShareRecords* record) { | 239 void RecordSyncShareImpl(SyncSession* s, SyncShareRecords* record) { |
| 239 record->times.push_back(TimeTicks::Now()); | 240 record->times.push_back(TimeTicks::Now()); |
| 240 record->snapshots.push_back(s->TakeSnapshot()); | 241 record->snapshots.push_back(s->TakeSnapshot()); |
| 241 } | 242 } |
| 242 | 243 |
| 243 ACTION_P(RecordSyncShare, record) { | 244 ACTION_P(RecordSyncShare, record) { |
| 244 RecordSyncShareImpl(arg0, record); | 245 RecordSyncShareImpl(arg0, record); |
| 245 if (MessageLoop::current()->is_running()) | 246 if (MessageLoop::current()->is_running()) |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 model_types, | 400 model_types, |
| 400 TypesToRoutingInfo(model_types), | 401 TypesToRoutingInfo(model_types), |
| 401 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 402 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
| 402 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); | 403 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); |
| 403 ASSERT_EQ(0, counter.times_called()); | 404 ASSERT_EQ(0, counter.times_called()); |
| 404 ASSERT_EQ(1U, records.snapshots.size()); | 405 ASSERT_EQ(1U, records.snapshots.size()); |
| 405 | 406 |
| 406 scheduler()->ScheduleNudgeAsync( | 407 scheduler()->ScheduleNudgeAsync( |
| 407 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); | 408 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); |
| 408 RunLoop(); | 409 RunLoop(); |
| 410 // Note that we're not RunLoop()ing for the NUDGE we just scheduled, but |
| 411 // for the first retry attempt from the config job (after |
| 412 // waiting ~+/- 50ms). |
| 409 ASSERT_EQ(2U, records.snapshots.size()); | 413 ASSERT_EQ(2U, records.snapshots.size()); |
| 410 ASSERT_EQ(0, counter.times_called()); | 414 ASSERT_EQ(0, counter.times_called()); |
| 415 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, |
| 416 records.snapshots[1].source().updates_source); |
| 411 | 417 |
| 412 RunLoop(); | 418 RunLoop(); |
| 419 // This is the 3rd attempt, which we've set up to SimulateSuccess. |
| 413 ASSERT_EQ(3U, records.snapshots.size()); | 420 ASSERT_EQ(3U, records.snapshots.size()); |
| 414 ASSERT_EQ(1, counter.times_called()); | 421 ASSERT_EQ(1, counter.times_called()); |
| 415 | 422 |
| 416 // Now change the mode so nudge can execute. | 423 // Now change the mode so nudge can execute. |
| 417 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 424 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 418 | 425 |
| 419 ASSERT_EQ(4U, records.snapshots.size()); | 426 ASSERT_EQ(4U, records.snapshots.size()); |
| 420 | 427 |
| 421 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(model_types, | 428 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(model_types, |
| 422 records.snapshots[2].source().types)); | 429 records.snapshots[2].source().types)); |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 | 693 |
| 687 // Test that a sync session is run through to completion. | 694 // Test that a sync session is run through to completion. |
| 688 TEST_F(SyncSchedulerTest, HasMoreToSync) { | 695 TEST_F(SyncSchedulerTest, HasMoreToSync) { |
| 689 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 696 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 690 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync)) | 697 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync)) |
| 691 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 698 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 692 QuitLoopNowAction())); | 699 QuitLoopNowAction())); |
| 693 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 700 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 694 | 701 |
| 695 scheduler()->ScheduleNudgeAsync( | 702 scheduler()->ScheduleNudgeAsync( |
| 696 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 703 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |
| 697 RunLoop(); | 704 RunLoop(); |
| 698 // If more nudges are scheduled, they'll be waited on by TearDown, and would | 705 // If more nudges are scheduled, they'll be waited on by TearDown, and would |
| 699 // cause our expectation to break. | 706 // cause our expectation to break. |
| 700 } | 707 } |
| 701 | 708 |
| 702 // Test that continuations can go into backoff. | 709 // Test that continuations can go into backoff. |
| 703 TEST_F(SyncSchedulerTest, HasMoreToSyncThenFails) { | 710 TEST_F(SyncSchedulerTest, HasMoreToSyncThenFails) { |
| 704 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 711 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 705 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync)) | 712 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync)) |
| 706 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 713 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
| 707 QuitLoopNowAction())); | 714 QuitLoopNowAction())); |
| 708 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 715 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 709 | 716 |
| 710 scheduler()->ScheduleNudgeAsync( | 717 scheduler()->ScheduleNudgeAsync( |
| 711 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 718 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |
| 712 | 719 |
| 713 // We should detect the failure on the second sync share, and go into backoff. | 720 // We should detect the failure on the second sync share, and go into backoff. |
| 714 EXPECT_TRUE(RunAndGetBackoff()); | 721 EXPECT_TRUE(RunAndGetBackoff()); |
| 715 } | 722 } |
| 716 | 723 |
| 717 // Test that no syncing occurs when throttled. | 724 // Test that no syncing occurs when throttled. |
| 718 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { | 725 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { |
| 719 const ModelTypeSet types(BOOKMARKS); | 726 const ModelTypeSet types(BOOKMARKS); |
| 720 TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 727 TimeDelta poll(TimeDelta::FromMilliseconds(5)); |
| 721 TimeDelta throttle(TimeDelta::FromMinutes(10)); | 728 TimeDelta throttle(TimeDelta::FromMinutes(10)); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); | 774 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); |
| 768 } | 775 } |
| 769 | 776 |
| 770 // Test nudges / polls don't run in config mode and config tasks do. | 777 // Test nudges / polls don't run in config mode and config tasks do. |
| 771 TEST_F(SyncSchedulerTest, ConfigurationMode) { | 778 TEST_F(SyncSchedulerTest, ConfigurationMode) { |
| 772 TimeDelta poll(TimeDelta::FromMilliseconds(15)); | 779 TimeDelta poll(TimeDelta::FromMilliseconds(15)); |
| 773 SyncShareRecords records; | 780 SyncShareRecords records; |
| 774 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 781 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
| 775 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 782 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 776 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 783 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 777 WithArg<0>(RecordSyncShare(&records)))); | 784 WithArg<0>(RecordSyncShare(&records)))) |
| 785 .RetiresOnSaturation(); |
| 778 | 786 |
| 779 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 787 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
| 780 | 788 |
| 781 const ModelTypeSet nudge_types(AUTOFILL); | 789 const ModelTypeSet nudge_types(AUTOFILL); |
| 782 scheduler()->ScheduleNudgeAsync( | 790 scheduler()->ScheduleNudgeAsync( |
| 783 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); | 791 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |
| 784 scheduler()->ScheduleNudgeAsync( | 792 scheduler()->ScheduleNudgeAsync( |
| 785 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); | 793 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |
| 786 | 794 |
| 787 const ModelTypeSet config_types(BOOKMARKS); | 795 const ModelTypeSet config_types(BOOKMARKS); |
| 788 | 796 |
| 789 CallbackCounter counter; | 797 CallbackCounter counter; |
| 790 ConfigurationParams params( | 798 ConfigurationParams params( |
| 791 GetUpdatesCallerInfo::RECONFIGURATION, | 799 GetUpdatesCallerInfo::RECONFIGURATION, |
| 792 config_types, | 800 config_types, |
| 793 TypesToRoutingInfo(config_types), | 801 TypesToRoutingInfo(config_types), |
| 794 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 802 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
| 795 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 803 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); |
| 796 ASSERT_EQ(1, counter.times_called()); | 804 ASSERT_EQ(1, counter.times_called()); |
| 797 | 805 |
| 798 ASSERT_EQ(1U, records.snapshots.size()); | 806 ASSERT_EQ(1U, records.snapshots.size()); |
| 799 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(config_types, | 807 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(config_types, |
| 800 records.snapshots[0].source().types)); | 808 records.snapshots[0].source().types)); |
| 809 |
| 810 // Switch to NORMAL_MODE to ensure NUDGES were properly saved and run. |
| 811 // SyncSchedulerWhiteboxTest also provides coverage for this, but much |
| 812 // more targeted ('whitebox' style). |
| 813 scheduler()->OnReceivedLongPollIntervalUpdate(TimeDelta::FromDays(1)); |
| 814 SyncShareRecords records2; |
| 815 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 816 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 817 WithArg<0>(RecordSyncShare(&records2)))); |
| 818 |
| 819 // TODO(tim): Figure out how to remove this dangerous need to reset |
| 820 // routing info between mode switches. |
| 821 context()->set_routing_info(routing_info()); |
| 822 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 823 |
| 824 ASSERT_EQ(1U, records2.snapshots.size()); |
| 825 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 826 records2.snapshots[0].source().updates_source); |
| 827 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(nudge_types, |
| 828 records2.snapshots[0].source().types)); |
| 829 PumpLoop(); |
| 801 } | 830 } |
| 802 | 831 |
| 803 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest { | 832 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest { |
| 804 void SetUp() { | 833 void SetUp() { |
| 805 SyncSchedulerTest::SetUp(); | 834 SyncSchedulerTest::SetUp(); |
| 806 UseMockDelayProvider(); | 835 UseMockDelayProvider(); |
| 807 EXPECT_CALL(*delay(), GetDelay(_)) | 836 EXPECT_CALL(*delay(), GetDelay(_)) |
| 808 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 837 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); |
| 809 } | 838 } |
| 810 | 839 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 912 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 941 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
| 913 | 942 |
| 914 CallbackCounter counter; | 943 CallbackCounter counter; |
| 915 ConfigurationParams params( | 944 ConfigurationParams params( |
| 916 GetUpdatesCallerInfo::RECONFIGURATION, | 945 GetUpdatesCallerInfo::RECONFIGURATION, |
| 917 types, | 946 types, |
| 918 TypesToRoutingInfo(types), | 947 TypesToRoutingInfo(types), |
| 919 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 948 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
| 920 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); | 949 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); |
| 921 ASSERT_EQ(0, counter.times_called()); | 950 ASSERT_EQ(0, counter.times_called()); |
| 922 | |
| 923 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | |
| 924 | |
| 925 scheduler()->ScheduleNudgeAsync( | |
| 926 zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE); | |
| 927 scheduler()->ScheduleNudgeAsync( | |
| 928 zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE); | |
| 929 PumpLoop(); | |
| 930 } | 951 } |
| 931 | 952 |
| 932 // Test that backoff is shaping traffic properly with consecutive errors. | 953 // Test that backoff is shaping traffic properly with consecutive errors. |
| 933 TEST_F(SyncSchedulerTest, BackoffElevation) { | 954 TEST_F(SyncSchedulerTest, BackoffElevation) { |
| 934 SyncShareRecords r; | 955 SyncShareRecords r; |
| 935 UseMockDelayProvider(); | 956 UseMockDelayProvider(); |
| 936 | 957 |
| 937 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(kMinNumSamples) | 958 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(kMinNumSamples) |
| 938 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 959 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
| 939 RecordSyncShareMultiple(&r, kMinNumSamples))); | 960 RecordSyncShareMultiple(&r, kMinNumSamples))); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 952 EXPECT_CALL(*delay(), GetDelay(third)).WillOnce(Return(fourth)) | 973 EXPECT_CALL(*delay(), GetDelay(third)).WillOnce(Return(fourth)) |
| 953 .RetiresOnSaturation(); | 974 .RetiresOnSaturation(); |
| 954 EXPECT_CALL(*delay(), GetDelay(fourth)).WillOnce(Return(fifth)) | 975 EXPECT_CALL(*delay(), GetDelay(fourth)).WillOnce(Return(fifth)) |
| 955 .RetiresOnSaturation(); | 976 .RetiresOnSaturation(); |
| 956 EXPECT_CALL(*delay(), GetDelay(fifth)).WillOnce(Return(sixth)); | 977 EXPECT_CALL(*delay(), GetDelay(fifth)).WillOnce(Return(sixth)); |
| 957 | 978 |
| 958 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 979 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 959 | 980 |
| 960 // Run again with a nudge. | 981 // Run again with a nudge. |
| 961 scheduler()->ScheduleNudgeAsync( | 982 scheduler()->ScheduleNudgeAsync( |
| 962 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 983 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |
| 963 RunLoop(); | 984 RunLoop(); |
| 964 | 985 |
| 965 ASSERT_EQ(kMinNumSamples, r.snapshots.size()); | 986 ASSERT_EQ(kMinNumSamples, r.snapshots.size()); |
| 966 EXPECT_GE(r.times[1] - r.times[0], second); | 987 EXPECT_GE(r.times[1] - r.times[0], second); |
| 967 EXPECT_GE(r.times[2] - r.times[1], third); | 988 EXPECT_GE(r.times[2] - r.times[1], third); |
| 968 EXPECT_GE(r.times[3] - r.times[2], fourth); | 989 EXPECT_GE(r.times[3] - r.times[2], fourth); |
| 969 EXPECT_GE(r.times[4] - r.times[3], fifth); | 990 EXPECT_GE(r.times[4] - r.times[3], fifth); |
| 970 } | 991 } |
| 971 | 992 |
| 972 // Test that things go back to normal once a retry makes forward progress. | 993 // Test that things go back to normal once a retry makes forward progress. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 984 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1005 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 985 RecordSyncShareMultiple(&r, kMinNumSamples))); | 1006 RecordSyncShareMultiple(&r, kMinNumSamples))); |
| 986 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); | 1007 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); |
| 987 | 1008 |
| 988 // Optimal start for the post-backoff poll party. | 1009 // Optimal start for the post-backoff poll party. |
| 989 TimeTicks optimal_start = TimeTicks::Now(); | 1010 TimeTicks optimal_start = TimeTicks::Now(); |
| 990 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1011 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 991 | 1012 |
| 992 // Run again to wait for polling. | 1013 // Run again to wait for polling. |
| 993 scheduler()->ScheduleNudgeAsync(zero(), NUDGE_SOURCE_LOCAL, | 1014 scheduler()->ScheduleNudgeAsync(zero(), NUDGE_SOURCE_LOCAL, |
| 994 ModelTypeSet(), FROM_HERE); | 1015 ModelTypeSet(BOOKMARKS), FROM_HERE); |
| 995 RunLoop(); | 1016 RunLoop(); |
| 996 | 1017 |
| 997 StopSyncScheduler(); | 1018 StopSyncScheduler(); |
| 998 | 1019 |
| 999 EXPECT_EQ(kMinNumSamples, r.times.size()); | 1020 EXPECT_EQ(kMinNumSamples, r.times.size()); |
| 1000 | 1021 |
| 1001 // The first nudge ran as soon as possible. It failed. | 1022 // The first nudge ran as soon as possible. It failed. |
| 1002 TimeTicks optimal_job_time = optimal_start; | 1023 TimeTicks optimal_job_time = optimal_start; |
| 1003 EXPECT_GE(r.times[0], optimal_job_time); | 1024 EXPECT_GE(r.times[0], optimal_job_time); |
| 1004 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 1025 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 } | 1066 } |
| 1046 | 1067 |
| 1047 // Test that appropriate syncer steps are requested for each job type. | 1068 // Test that appropriate syncer steps are requested for each job type. |
| 1048 TEST_F(SyncSchedulerTest, SyncerSteps) { | 1069 TEST_F(SyncSchedulerTest, SyncerSteps) { |
| 1049 // Nudges. | 1070 // Nudges. |
| 1050 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) | 1071 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) |
| 1051 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); | 1072 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
| 1052 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1073 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1053 | 1074 |
| 1054 scheduler()->ScheduleNudgeAsync( | 1075 scheduler()->ScheduleNudgeAsync( |
| 1055 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 1076 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |
| 1056 PumpLoop(); | 1077 PumpLoop(); |
| 1057 // Pump again to run job. | 1078 // Pump again to run job. |
| 1058 PumpLoop(); | 1079 PumpLoop(); |
| 1059 | 1080 |
| 1060 StopSyncScheduler(); | 1081 StopSyncScheduler(); |
| 1061 Mock::VerifyAndClearExpectations(syncer()); | 1082 Mock::VerifyAndClearExpectations(syncer()); |
| 1062 | 1083 |
| 1063 // Configuration. | 1084 // Configuration. |
| 1064 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | 1085 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) |
| 1065 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); | 1086 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1090 | 1111 |
| 1091 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1112 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1092 | 1113 |
| 1093 // Run again to wait for polling. | 1114 // Run again to wait for polling. |
| 1094 RunLoop(); | 1115 RunLoop(); |
| 1095 | 1116 |
| 1096 StopSyncScheduler(); | 1117 StopSyncScheduler(); |
| 1097 Mock::VerifyAndClearExpectations(syncer()); | 1118 Mock::VerifyAndClearExpectations(syncer()); |
| 1098 } | 1119 } |
| 1099 | 1120 |
| 1100 // Test config tasks don't run during normal mode. | |
| 1101 // TODO(tim): Implement this test and then the functionality! | |
| 1102 TEST_F(SyncSchedulerTest, DISABLED_NoConfigDuringNormal) { | |
| 1103 } | |
| 1104 | |
| 1105 // Test that starting the syncer thread without a valid connection doesn't | 1121 // Test that starting the syncer thread without a valid connection doesn't |
| 1106 // break things when a connection is detected. | 1122 // break things when a connection is detected. |
| 1107 TEST_F(SyncSchedulerTest, StartWhenNotConnected) { | 1123 TEST_F(SyncSchedulerTest, StartWhenNotConnected) { |
| 1108 connection()->SetServerNotReachable(); | 1124 connection()->SetServerNotReachable(); |
| 1109 connection()->UpdateConnectionStatus(); | 1125 connection()->UpdateConnectionStatus(); |
| 1110 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1126 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 1111 .WillOnce(Invoke(sessions::test_util::SimulateConnectionFailure)) | 1127 .WillOnce(Invoke(sessions::test_util::SimulateConnectionFailure)) |
| 1112 .WillOnce(QuitLoopNowAction()); | 1128 .WillOnce(QuitLoopNowAction()); |
| 1113 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1129 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1114 | 1130 |
| 1115 scheduler()->ScheduleNudgeAsync( | 1131 scheduler()->ScheduleNudgeAsync( |
| 1116 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 1132 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |
| 1117 // Should save the nudge for until after the server is reachable. | 1133 // Should save the nudge for until after the server is reachable. |
| 1118 MessageLoop::current()->RunAllPending(); | 1134 MessageLoop::current()->RunAllPending(); |
| 1119 | 1135 |
| 1120 connection()->SetServerReachable(); | 1136 connection()->SetServerReachable(); |
| 1121 connection()->UpdateConnectionStatus(); | 1137 connection()->UpdateConnectionStatus(); |
| 1122 scheduler()->OnConnectionStatusChange(); | 1138 scheduler()->OnConnectionStatusChange(); |
| 1123 MessageLoop::current()->RunAllPending(); | 1139 MessageLoop::current()->RunAllPending(); |
| 1124 } | 1140 } |
| 1125 | 1141 |
| 1126 } // namespace syncer | 1142 } // namespace syncer |
| OLD | NEW |