Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: sync/engine/sync_scheduler_unittest.cc

Issue 10825439: sync: remove buggy freshness condition in SyncSchedulerImpl add defensive DCHECKs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: FIX Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sync/engine/sync_scheduler_impl.cc ('k') | sync/engine/sync_scheduler_whitebox_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « sync/engine/sync_scheduler_impl.cc ('k') | sync/engine/sync_scheduler_whitebox_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698