| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/synchronization/waitable_event.h" | 5 #include "base/synchronization/waitable_event.h" |
| 6 #include "base/test/test_timeouts.h" | 6 #include "base/test/test_timeouts.h" |
| 7 #include "chrome/browser/sync/engine/mock_model_safe_workers.h" | 7 #include "chrome/browser/sync/engine/mock_model_safe_workers.h" |
| 8 #include "chrome/browser/sync/engine/syncer.h" | 8 #include "chrome/browser/sync/engine/syncer.h" |
| 9 #include "chrome/browser/sync/engine/syncer_thread2.h" | 9 #include "chrome/browser/sync/engine/syncer_thread2.h" |
| 10 #include "chrome/browser/sync/sessions/test_util.h" | 10 #include "chrome/browser/sync/sessions/test_util.h" |
| 11 #include "chrome/test/sync/engine/mock_connection_manager.h" |
| 11 #include "chrome/test/sync/engine/test_directory_setter_upper.h" | 12 #include "chrome/test/sync/engine/test_directory_setter_upper.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
| 14 | 15 |
| 15 using base::TimeDelta; | 16 using base::TimeDelta; |
| 16 using base::TimeTicks; | 17 using base::TimeTicks; |
| 17 using testing::_; | 18 using testing::_; |
| 18 using testing::AtLeast; | 19 using testing::AtLeast; |
| 19 using testing::DoAll; | 20 using testing::DoAll; |
| 20 using testing::Eq; | 21 using testing::Eq; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 class MockDelayProvider : public SyncerThread::DelayProvider { | 53 class MockDelayProvider : public SyncerThread::DelayProvider { |
| 53 public: | 54 public: |
| 54 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&)); | 55 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&)); |
| 55 }; | 56 }; |
| 56 | 57 |
| 57 virtual void SetUp() { | 58 virtual void SetUp() { |
| 58 syncdb_.SetUp(); | 59 syncdb_.SetUp(); |
| 59 syncer_ = new MockSyncer(); | 60 syncer_ = new MockSyncer(); |
| 60 delay_ = NULL; | 61 delay_ = NULL; |
| 61 registrar_.reset(MockModelSafeWorkerRegistrar::PassiveBookmarks()); | 62 registrar_.reset(MockModelSafeWorkerRegistrar::PassiveBookmarks()); |
| 62 context_ = new SyncSessionContext(NULL, syncdb_.manager(), | 63 connection_.reset(new MockConnectionManager(syncdb_.manager(), "Test")); |
| 64 connection_->SetServerReachable(); |
| 65 context_ = new SyncSessionContext(connection_.get(), syncdb_.manager(), |
| 63 registrar_.get(), std::vector<SyncEngineEventListener*>()); | 66 registrar_.get(), std::vector<SyncEngineEventListener*>()); |
| 64 context_->set_notifications_enabled(true); | 67 context_->set_notifications_enabled(true); |
| 65 context_->set_account_name("Test"); | 68 context_->set_account_name("Test"); |
| 66 syncer_thread_.reset(new SyncerThread(context_, syncer_)); | 69 syncer_thread_.reset(new SyncerThread(context_, syncer_)); |
| 67 // TODO(tim): Once the SCM is hooked up, remove this. | |
| 68 syncer_thread_->server_connection_ok_ = true; | |
| 69 } | 70 } |
| 70 | 71 |
| 71 SyncerThread* syncer_thread() { return syncer_thread_.get(); } | 72 SyncerThread* syncer_thread() { return syncer_thread_.get(); } |
| 72 MockSyncer* syncer() { return syncer_; } | 73 MockSyncer* syncer() { return syncer_; } |
| 73 MockDelayProvider* delay() { return delay_; } | 74 MockDelayProvider* delay() { return delay_; } |
| 75 MockConnectionManager* connection() { return connection_.get(); } |
| 74 TimeDelta zero() { return TimeDelta::FromSeconds(0); } | 76 TimeDelta zero() { return TimeDelta::FromSeconds(0); } |
| 75 TimeDelta timeout() { | 77 TimeDelta timeout() { |
| 76 return TimeDelta::FromMilliseconds(TestTimeouts::action_timeout_ms()); | 78 return TimeDelta::FromMilliseconds(TestTimeouts::action_timeout_ms()); |
| 77 } | 79 } |
| 78 | 80 |
| 79 virtual void TearDown() { | 81 virtual void TearDown() { |
| 80 syncer_thread()->Stop(); | 82 syncer_thread()->Stop(); |
| 81 syncdb_.TearDown(); | 83 syncdb_.TearDown(); |
| 82 } | 84 } |
| 83 | 85 |
| 84 void AnalyzePollRun(const SyncShareRecords& records, size_t min_num_samples, | 86 void AnalyzePollRun(const SyncShareRecords& records, size_t min_num_samples, |
| 85 const TimeTicks& optimal_start, const TimeDelta& poll_interval) { | 87 const TimeTicks& optimal_start, const TimeDelta& poll_interval) { |
| 86 const std::vector<TimeTicks>& data(records.times); | 88 const std::vector<TimeTicks>& data(records.times); |
| 87 EXPECT_GE(data.size(), min_num_samples); | 89 EXPECT_GE(data.size(), min_num_samples); |
| 88 for (size_t i = 0; i < data.size(); i++) { | 90 for (size_t i = 0; i < data.size(); i++) { |
| 89 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); | 91 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); |
| 90 TimeTicks optimal_next_sync = optimal_start + poll_interval * i; | 92 TimeTicks optimal_next_sync = optimal_start + poll_interval * i; |
| 91 EXPECT_GE(data[i], optimal_next_sync); | 93 EXPECT_GE(data[i], optimal_next_sync); |
| 92 EXPECT_EQ(GetUpdatesCallerInfo::PERIODIC, | 94 EXPECT_EQ(GetUpdatesCallerInfo::PERIODIC, |
| 93 records.snapshots[i]->source.updates_source); | 95 records.snapshots[i]->source.updates_source); |
| 94 } | 96 } |
| 95 } | 97 } |
| 96 | 98 |
| 97 bool GetBackoffAndResetTest(base::WaitableEvent* done) { | 99 bool GetBackoffAndResetTest(base::WaitableEvent* done) { |
| 98 syncable::ModelTypeBitSet nudge_types; | 100 syncable::ModelTypeBitSet nudge_types; |
| 99 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 101 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 100 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, nudge_types); | 102 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, nudge_types); |
| 101 done->TimedWait(timeout()); | 103 done->TimedWait(timeout()); |
| 102 TearDown(); | 104 TearDown(); |
| 103 done->Reset(); | 105 done->Reset(); |
| 104 Mock::VerifyAndClearExpectations(syncer()); | 106 Mock::VerifyAndClearExpectations(syncer()); |
| 105 bool backing_off = syncer_thread()->IsBackingOff(); | 107 bool backing_off = syncer_thread()->IsBackingOff(); |
| 106 SetUp(); | 108 SetUp(); |
| 107 UseMockDelayProvider(); | 109 UseMockDelayProvider(); |
| 108 EXPECT_CALL(*delay(), GetDelay(_)) | 110 EXPECT_CALL(*delay(), GetDelay(_)) |
| 109 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 111 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 139 for (syncable::ModelTypePayloadMap::const_iterator i = rhs.begin(); | 141 for (syncable::ModelTypePayloadMap::const_iterator i = rhs.begin(); |
| 140 i != rhs.end(); ++i, ++count) { | 142 i != rhs.end(); ++i, ++count) { |
| 141 if (!lhs.test(i->first)) | 143 if (!lhs.test(i->first)) |
| 142 return false; | 144 return false; |
| 143 } | 145 } |
| 144 if (lhs.count() != count) | 146 if (lhs.count() != count) |
| 145 return false; | 147 return false; |
| 146 return true; | 148 return true; |
| 147 } | 149 } |
| 148 | 150 |
| 151 SyncSessionContext* context() { return context_; } |
| 152 |
| 149 private: | 153 private: |
| 150 scoped_ptr<SyncerThread> syncer_thread_; | 154 scoped_ptr<SyncerThread> syncer_thread_; |
| 155 scoped_ptr<MockConnectionManager> connection_; |
| 151 SyncSessionContext* context_; | 156 SyncSessionContext* context_; |
| 152 MockSyncer* syncer_; | 157 MockSyncer* syncer_; |
| 153 MockDelayProvider* delay_; | 158 MockDelayProvider* delay_; |
| 154 scoped_ptr<MockModelSafeWorkerRegistrar> registrar_; | 159 scoped_ptr<MockModelSafeWorkerRegistrar> registrar_; |
| 155 MockDirectorySetterUpper syncdb_; | 160 MockDirectorySetterUpper syncdb_; |
| 156 }; | 161 }; |
| 157 | 162 |
| 158 bool RecordSyncShareImpl(SyncSession* s, SyncShareRecords* record, | 163 bool RecordSyncShareImpl(SyncSession* s, SyncShareRecords* record, |
| 159 size_t signal_after) { | 164 size_t signal_after) { |
| 160 record->times.push_back(TimeTicks::Now()); | 165 record->times.push_back(TimeTicks::Now()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 172 if (RecordSyncShareImpl(arg0, record, signal_after) && event) | 177 if (RecordSyncShareImpl(arg0, record, signal_after) && event) |
| 173 event->Signal(); | 178 event->Signal(); |
| 174 } | 179 } |
| 175 | 180 |
| 176 ACTION_P(SignalEvent, event) { | 181 ACTION_P(SignalEvent, event) { |
| 177 SyncerThread2Test::SignalWaitableEvent(event); | 182 SyncerThread2Test::SignalWaitableEvent(event); |
| 178 } | 183 } |
| 179 | 184 |
| 180 // Test nudge scheduling. | 185 // Test nudge scheduling. |
| 181 TEST_F(SyncerThread2Test, Nudge) { | 186 TEST_F(SyncerThread2Test, Nudge) { |
| 182 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 187 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 183 base::WaitableEvent done(false, false); | 188 base::WaitableEvent done(false, false); |
| 184 SyncShareRecords records; | 189 SyncShareRecords records; |
| 185 syncable::ModelTypeBitSet model_types; | 190 syncable::ModelTypeBitSet model_types; |
| 186 model_types[syncable::BOOKMARKS] = true; | 191 model_types[syncable::BOOKMARKS] = true; |
| 187 | 192 |
| 188 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 193 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 189 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 194 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 190 WithArg<0>(RecordSyncShare(&records, 1U, &done)))) | 195 WithArg<0>(RecordSyncShare(&records, 1U, &done)))) |
| 191 .RetiresOnSaturation(); | 196 .RetiresOnSaturation(); |
| 192 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, model_types); | 197 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, model_types); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 210 | 215 |
| 211 EXPECT_EQ(1U, records2.snapshots.size()); | 216 EXPECT_EQ(1U, records2.snapshots.size()); |
| 212 EXPECT_TRUE(CompareModelTypeBitSetToModelTypePayloadMap(model_types, | 217 EXPECT_TRUE(CompareModelTypeBitSetToModelTypePayloadMap(model_types, |
| 213 records2.snapshots[0]->source.types)); | 218 records2.snapshots[0]->source.types)); |
| 214 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 219 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 215 records2.snapshots[0]->source.updates_source); | 220 records2.snapshots[0]->source.updates_source); |
| 216 } | 221 } |
| 217 | 222 |
| 218 // Test that nudges are coalesced. | 223 // Test that nudges are coalesced. |
| 219 TEST_F(SyncerThread2Test, NudgeCoalescing) { | 224 TEST_F(SyncerThread2Test, NudgeCoalescing) { |
| 220 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 225 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 221 base::WaitableEvent done(false, false); | 226 base::WaitableEvent done(false, false); |
| 222 SyncShareRecords r; | 227 SyncShareRecords r; |
| 223 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 228 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 224 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 229 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 225 WithArg<0>(RecordSyncShare(&r, 1U, &done)))); | 230 WithArg<0>(RecordSyncShare(&r, 1U, &done)))); |
| 226 syncable::ModelTypeBitSet types1, types2, types3; | 231 syncable::ModelTypeBitSet types1, types2, types3; |
| 227 types1[syncable::BOOKMARKS] = true; | 232 types1[syncable::BOOKMARKS] = true; |
| 228 types2[syncable::AUTOFILL] = true; | 233 types2[syncable::AUTOFILL] = true; |
| 229 types3[syncable::THEMES] = true; | 234 types3[syncable::THEMES] = true; |
| 230 TimeDelta delay = TimeDelta::FromMilliseconds(20); | 235 TimeDelta delay = TimeDelta::FromMilliseconds(20); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 250 done.TimedWait(timeout()); | 255 done.TimedWait(timeout()); |
| 251 EXPECT_EQ(1U, r2.snapshots.size()); | 256 EXPECT_EQ(1U, r2.snapshots.size()); |
| 252 EXPECT_TRUE(CompareModelTypeBitSetToModelTypePayloadMap(types3, | 257 EXPECT_TRUE(CompareModelTypeBitSetToModelTypePayloadMap(types3, |
| 253 r2.snapshots[0]->source.types)); | 258 r2.snapshots[0]->source.types)); |
| 254 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, | 259 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, |
| 255 r2.snapshots[0]->source.updates_source); | 260 r2.snapshots[0]->source.updates_source); |
| 256 } | 261 } |
| 257 | 262 |
| 258 // Test nudge scheduling. | 263 // Test nudge scheduling. |
| 259 TEST_F(SyncerThread2Test, NudgeWithPayloads) { | 264 TEST_F(SyncerThread2Test, NudgeWithPayloads) { |
| 260 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 265 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 261 base::WaitableEvent done(false, false); | 266 base::WaitableEvent done(false, false); |
| 262 SyncShareRecords records; | 267 SyncShareRecords records; |
| 263 syncable::ModelTypePayloadMap model_types_with_payloads; | 268 syncable::ModelTypePayloadMap model_types_with_payloads; |
| 264 model_types_with_payloads[syncable::BOOKMARKS] = "test"; | 269 model_types_with_payloads[syncable::BOOKMARKS] = "test"; |
| 265 | 270 |
| 266 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 271 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 267 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 272 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 268 WithArg<0>(RecordSyncShare(&records, 1U, &done)))) | 273 WithArg<0>(RecordSyncShare(&records, 1U, &done)))) |
| 269 .RetiresOnSaturation(); | 274 .RetiresOnSaturation(); |
| 270 syncer_thread()->ScheduleNudgeWithPayloads(zero(), NUDGE_SOURCE_LOCAL, | 275 syncer_thread()->ScheduleNudgeWithPayloads(zero(), NUDGE_SOURCE_LOCAL, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 288 done.TimedWait(timeout()); | 293 done.TimedWait(timeout()); |
| 289 | 294 |
| 290 EXPECT_EQ(1U, records2.snapshots.size()); | 295 EXPECT_EQ(1U, records2.snapshots.size()); |
| 291 EXPECT_EQ(model_types_with_payloads, records2.snapshots[0]->source.types); | 296 EXPECT_EQ(model_types_with_payloads, records2.snapshots[0]->source.types); |
| 292 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 297 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 293 records2.snapshots[0]->source.updates_source); | 298 records2.snapshots[0]->source.updates_source); |
| 294 } | 299 } |
| 295 | 300 |
| 296 // Test that nudges are coalesced. | 301 // Test that nudges are coalesced. |
| 297 TEST_F(SyncerThread2Test, NudgeWithPayloadsCoalescing) { | 302 TEST_F(SyncerThread2Test, NudgeWithPayloadsCoalescing) { |
| 298 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 303 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 299 base::WaitableEvent done(false, false); | 304 base::WaitableEvent done(false, false); |
| 300 SyncShareRecords r; | 305 SyncShareRecords r; |
| 301 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 306 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 302 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 307 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 303 WithArg<0>(RecordSyncShare(&r, 1U, &done)))); | 308 WithArg<0>(RecordSyncShare(&r, 1U, &done)))); |
| 304 syncable::ModelTypePayloadMap types1, types2, types3; | 309 syncable::ModelTypePayloadMap types1, types2, types3; |
| 305 types1[syncable::BOOKMARKS] = "test1"; | 310 types1[syncable::BOOKMARKS] = "test1"; |
| 306 types2[syncable::AUTOFILL] = "test2"; | 311 types2[syncable::AUTOFILL] = "test2"; |
| 307 types3[syncable::THEMES] = "test3"; | 312 types3[syncable::THEMES] = "test3"; |
| 308 TimeDelta delay = TimeDelta::FromMilliseconds(20); | 313 TimeDelta delay = TimeDelta::FromMilliseconds(20); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 TEST_F(SyncerThread2Test, Polling) { | 347 TEST_F(SyncerThread2Test, Polling) { |
| 343 SyncShareRecords records; | 348 SyncShareRecords records; |
| 344 base::WaitableEvent done(false, false); | 349 base::WaitableEvent done(false, false); |
| 345 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); | 350 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
| 346 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll_interval); | 351 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll_interval); |
| 347 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) | 352 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) |
| 348 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 353 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 349 WithArg<0>(RecordSyncShare(&records, kMinNumSamples, &done)))); | 354 WithArg<0>(RecordSyncShare(&records, kMinNumSamples, &done)))); |
| 350 | 355 |
| 351 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; | 356 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
| 352 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 357 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 353 done.TimedWait(timeout()); | 358 done.TimedWait(timeout()); |
| 354 syncer_thread()->Stop(); | 359 syncer_thread()->Stop(); |
| 355 | 360 |
| 356 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); | 361 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); |
| 357 } | 362 } |
| 358 | 363 |
| 359 // Test that the short poll interval is used. | 364 // Test that the short poll interval is used. |
| 360 TEST_F(SyncerThread2Test, PollNotificationsDisabled) { | 365 TEST_F(SyncerThread2Test, PollNotificationsDisabled) { |
| 361 SyncShareRecords records; | 366 SyncShareRecords records; |
| 362 base::WaitableEvent done(false, false); | 367 base::WaitableEvent done(false, false); |
| 363 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); | 368 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
| 364 syncer_thread()->OnReceivedShortPollIntervalUpdate(poll_interval); | 369 syncer_thread()->OnReceivedShortPollIntervalUpdate(poll_interval); |
| 365 syncer_thread()->set_notifications_enabled(false); | 370 syncer_thread()->set_notifications_enabled(false); |
| 366 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) | 371 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) |
| 367 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 372 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 368 WithArg<0>(RecordSyncShare(&records, kMinNumSamples, &done)))); | 373 WithArg<0>(RecordSyncShare(&records, kMinNumSamples, &done)))); |
| 369 | 374 |
| 370 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; | 375 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
| 371 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 376 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 372 done.TimedWait(timeout()); | 377 done.TimedWait(timeout()); |
| 373 syncer_thread()->Stop(); | 378 syncer_thread()->Stop(); |
| 374 | 379 |
| 375 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); | 380 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); |
| 376 } | 381 } |
| 377 | 382 |
| 378 // Test that polling intervals are updated when needed. | 383 // Test that polling intervals are updated when needed. |
| 379 TEST_F(SyncerThread2Test, PollIntervalUpdate) { | 384 TEST_F(SyncerThread2Test, PollIntervalUpdate) { |
| 380 SyncShareRecords records; | 385 SyncShareRecords records; |
| 381 base::WaitableEvent done(false, false); | 386 base::WaitableEvent done(false, false); |
| 382 TimeDelta poll1(TimeDelta::FromMilliseconds(120)); | 387 TimeDelta poll1(TimeDelta::FromMilliseconds(120)); |
| 383 TimeDelta poll2(TimeDelta::FromMilliseconds(30)); | 388 TimeDelta poll2(TimeDelta::FromMilliseconds(30)); |
| 384 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll1); | 389 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll1); |
| 385 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) | 390 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) |
| 386 .WillOnce(WithArg<0>( | 391 .WillOnce(WithArg<0>( |
| 387 sessions::test_util::SimulatePollIntervalUpdate(poll2))) | 392 sessions::test_util::SimulatePollIntervalUpdate(poll2))) |
| 388 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 393 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 389 WithArg<0>(RecordSyncShare(&records, kMinNumSamples, &done)))); | 394 WithArg<0>(RecordSyncShare(&records, kMinNumSamples, &done)))); |
| 390 | 395 |
| 391 TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2; | 396 TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2; |
| 392 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 397 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 393 done.TimedWait(timeout()); | 398 done.TimedWait(timeout()); |
| 394 syncer_thread()->Stop(); | 399 syncer_thread()->Stop(); |
| 395 | 400 |
| 396 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll2); | 401 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll2); |
| 397 } | 402 } |
| 398 | 403 |
| 399 // Test that a sync session is run through to completion. | 404 // Test that a sync session is run through to completion. |
| 400 TEST_F(SyncerThread2Test, HasMoreToSync) { | 405 TEST_F(SyncerThread2Test, HasMoreToSync) { |
| 401 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 406 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 402 base::WaitableEvent done(false, false); | 407 base::WaitableEvent done(false, false); |
| 403 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 408 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 404 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync)) | 409 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync)) |
| 405 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 410 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 406 SignalEvent(&done))); | 411 SignalEvent(&done))); |
| 407 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, ModelTypeBitSet()); | 412 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, ModelTypeBitSet()); |
| 408 done.TimedWait(timeout()); | 413 done.TimedWait(timeout()); |
| 409 // If more nudges are scheduled, they'll be waited on by TearDown, and would | 414 // If more nudges are scheduled, they'll be waited on by TearDown, and would |
| 410 // cause our expectation to break. | 415 // cause our expectation to break. |
| 411 } | 416 } |
| 412 | 417 |
| 413 // Test that no syncing occurs when throttled. | 418 // Test that no syncing occurs when throttled. |
| 414 TEST_F(SyncerThread2Test, ThrottlingDoesThrottle) { | 419 TEST_F(SyncerThread2Test, ThrottlingDoesThrottle) { |
| 415 syncable::ModelTypeBitSet types; | 420 syncable::ModelTypeBitSet types; |
| 416 types[syncable::BOOKMARKS] = true; | 421 types[syncable::BOOKMARKS] = true; |
| 417 base::WaitableEvent done(false, false); | 422 base::WaitableEvent done(false, false); |
| 418 TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 423 TimeDelta poll(TimeDelta::FromMilliseconds(5)); |
| 419 TimeDelta throttle(TimeDelta::FromMinutes(10)); | 424 TimeDelta throttle(TimeDelta::FromMinutes(10)); |
| 420 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); | 425 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); |
| 421 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 426 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 422 .WillOnce(WithArg<0>(sessions::test_util::SimulateThrottled(throttle))); | 427 .WillOnce(WithArg<0>(sessions::test_util::SimulateThrottled(throttle))); |
| 423 | 428 |
| 424 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 429 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 425 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, types); | 430 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, types); |
| 426 FlushLastTask(&done); | 431 FlushLastTask(&done); |
| 427 | 432 |
| 428 syncer_thread()->Start(SyncerThread::CONFIGURATION_MODE); | 433 syncer_thread()->Start(SyncerThread::CONFIGURATION_MODE, NULL); |
| 429 syncer_thread()->ScheduleConfig(types); | 434 syncer_thread()->ScheduleConfig(types); |
| 430 FlushLastTask(&done); | 435 FlushLastTask(&done); |
| 431 } | 436 } |
| 432 | 437 |
| 433 TEST_F(SyncerThread2Test, ThrottlingExpires) { | 438 TEST_F(SyncerThread2Test, ThrottlingExpires) { |
| 434 SyncShareRecords records; | 439 SyncShareRecords records; |
| 435 base::WaitableEvent done(false, false); | 440 base::WaitableEvent done(false, false); |
| 436 TimeDelta poll(TimeDelta::FromMilliseconds(15)); | 441 TimeDelta poll(TimeDelta::FromMilliseconds(15)); |
| 437 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); | 442 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); |
| 438 TimeDelta throttle2(TimeDelta::FromMinutes(10)); | 443 TimeDelta throttle2(TimeDelta::FromMinutes(10)); |
| 439 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); | 444 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); |
| 440 | 445 |
| 441 ::testing::InSequence seq; | 446 ::testing::InSequence seq; |
| 442 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 447 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 443 .WillOnce(WithArg<0>(sessions::test_util::SimulateThrottled(throttle1))) | 448 .WillOnce(WithArg<0>(sessions::test_util::SimulateThrottled(throttle1))) |
| 444 .RetiresOnSaturation(); | 449 .RetiresOnSaturation(); |
| 445 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 450 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 446 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 451 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 447 WithArg<0>(RecordSyncShare(&records, kMinNumSamples, &done)))); | 452 WithArg<0>(RecordSyncShare(&records, kMinNumSamples, &done)))); |
| 448 | 453 |
| 449 TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; | 454 TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; |
| 450 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 455 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 451 done.TimedWait(timeout()); | 456 done.TimedWait(timeout()); |
| 452 syncer_thread()->Stop(); | 457 syncer_thread()->Stop(); |
| 453 | 458 |
| 454 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); | 459 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); |
| 455 } | 460 } |
| 456 | 461 |
| 457 // Test nudges / polls don't run in config mode and config tasks do. | 462 // Test nudges / polls don't run in config mode and config tasks do. |
| 458 TEST_F(SyncerThread2Test, ConfigurationMode) { | 463 TEST_F(SyncerThread2Test, ConfigurationMode) { |
| 459 TimeDelta poll(TimeDelta::FromMilliseconds(15)); | 464 TimeDelta poll(TimeDelta::FromMilliseconds(15)); |
| 460 SyncShareRecords records; | 465 SyncShareRecords records; |
| 461 base::WaitableEvent done(false, false); | 466 base::WaitableEvent done(false, false); |
| 462 base::WaitableEvent* dummy = NULL; | 467 base::WaitableEvent* dummy = NULL; |
| 463 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); | 468 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); |
| 464 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 469 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 465 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 470 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 466 WithArg<0>(RecordSyncShare(&records, 1U, dummy)))); | 471 WithArg<0>(RecordSyncShare(&records, 1U, dummy)))); |
| 467 syncer_thread()->Start(SyncerThread::CONFIGURATION_MODE); | 472 syncer_thread()->Start(SyncerThread::CONFIGURATION_MODE, NULL); |
| 468 syncable::ModelTypeBitSet nudge_types; | 473 syncable::ModelTypeBitSet nudge_types; |
| 469 nudge_types[syncable::AUTOFILL] = true; | 474 nudge_types[syncable::AUTOFILL] = true; |
| 470 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, nudge_types); | 475 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, nudge_types); |
| 471 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, nudge_types); | 476 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, nudge_types); |
| 472 | 477 |
| 473 syncable::ModelTypeBitSet config_types; | 478 syncable::ModelTypeBitSet config_types; |
| 474 config_types[syncable::BOOKMARKS] = true; | 479 config_types[syncable::BOOKMARKS] = true; |
| 475 // TODO(tim): This will fail once CONFIGURATION tasks are implemented. Update | 480 // TODO(tim): This will fail once CONFIGURATION tasks are implemented. Update |
| 476 // the EXPECT when that happens. | 481 // the EXPECT when that happens. |
| 477 syncer_thread()->ScheduleConfig(config_types); | 482 syncer_thread()->ScheduleConfig(config_types); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 types[syncable::BOOKMARKS] = true; | 538 types[syncable::BOOKMARKS] = true; |
| 534 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); | 539 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); |
| 535 UseMockDelayProvider(); | 540 UseMockDelayProvider(); |
| 536 | 541 |
| 537 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(2) | 542 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(2) |
| 538 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 543 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
| 539 RecordSyncShareAndPostSignal(&r, 2U, this, &done))); | 544 RecordSyncShareAndPostSignal(&r, 2U, this, &done))); |
| 540 EXPECT_CALL(*delay(), GetDelay(_)) | 545 EXPECT_CALL(*delay(), GetDelay(_)) |
| 541 .WillRepeatedly(Return(TimeDelta::FromDays(1))); | 546 .WillRepeatedly(Return(TimeDelta::FromDays(1))); |
| 542 | 547 |
| 543 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 548 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 544 ASSERT_TRUE(done.TimedWait(timeout())); | 549 ASSERT_TRUE(done.TimedWait(timeout())); |
| 545 done.Reset(); | 550 done.Reset(); |
| 546 | 551 |
| 547 Mock::VerifyAndClearExpectations(syncer()); | 552 Mock::VerifyAndClearExpectations(syncer()); |
| 548 EXPECT_EQ(2U, r.snapshots.size()); | 553 EXPECT_EQ(2U, r.snapshots.size()); |
| 549 EXPECT_EQ(GetUpdatesCallerInfo::PERIODIC, | 554 EXPECT_EQ(GetUpdatesCallerInfo::PERIODIC, |
| 550 r.snapshots[0]->source.updates_source); | 555 r.snapshots[0]->source.updates_source); |
| 551 EXPECT_EQ(GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION, | 556 EXPECT_EQ(GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION, |
| 552 r.snapshots[1]->source.updates_source); | 557 r.snapshots[1]->source.updates_source); |
| 553 | 558 |
| 554 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1) | 559 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1) |
| 555 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 560 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
| 556 RecordSyncShareAndPostSignal(&r, 1U, this, &done))); | 561 RecordSyncShareAndPostSignal(&r, 1U, this, &done))); |
| 557 | 562 |
| 558 // We schedule a nudge with enough delay (10X poll interval) that at least | 563 // We schedule a nudge with enough delay (10X poll interval) that at least |
| 559 // one or two polls would have taken place. The nudge should succeed. | 564 // one or two polls would have taken place. The nudge should succeed. |
| 560 syncer_thread()->ScheduleNudge(poll * 10, NUDGE_SOURCE_LOCAL, types); | 565 syncer_thread()->ScheduleNudge(poll * 10, NUDGE_SOURCE_LOCAL, types); |
| 561 ASSERT_TRUE(done.TimedWait(timeout())); | 566 ASSERT_TRUE(done.TimedWait(timeout())); |
| 562 done.Reset(); | 567 done.Reset(); |
| 563 | 568 |
| 564 Mock::VerifyAndClearExpectations(syncer()); | 569 Mock::VerifyAndClearExpectations(syncer()); |
| 565 Mock::VerifyAndClearExpectations(delay()); | 570 Mock::VerifyAndClearExpectations(delay()); |
| 566 EXPECT_EQ(3U, r.snapshots.size()); | 571 EXPECT_EQ(3U, r.snapshots.size()); |
| 567 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 572 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 568 r.snapshots[2]->source.updates_source); | 573 r.snapshots[2]->source.updates_source); |
| 569 | 574 |
| 570 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(0); | 575 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(0); |
| 571 EXPECT_CALL(*delay(), GetDelay(_)).Times(0); | 576 EXPECT_CALL(*delay(), GetDelay(_)).Times(0); |
| 572 | 577 |
| 573 syncer_thread()->Start(SyncerThread::CONFIGURATION_MODE); | 578 syncer_thread()->Start(SyncerThread::CONFIGURATION_MODE, NULL); |
| 574 syncer_thread()->ScheduleConfig(types); | 579 syncer_thread()->ScheduleConfig(types); |
| 575 FlushLastTask(&done); | 580 FlushLastTask(&done); |
| 576 | 581 |
| 577 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 582 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 578 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, types); | 583 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, types); |
| 579 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, types); | 584 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, types); |
| 580 FlushLastTask(&done); | 585 FlushLastTask(&done); |
| 581 } | 586 } |
| 582 | 587 |
| 583 // Test that backoff is shaping traffic properly with consecutive errors. | 588 // Test that backoff is shaping traffic properly with consecutive errors. |
| 584 TEST_F(SyncerThread2Test, BackoffElevation) { | 589 TEST_F(SyncerThread2Test, BackoffElevation) { |
| 585 SyncShareRecords r; | 590 SyncShareRecords r; |
| 586 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); | 591 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); |
| 587 base::WaitableEvent done(false, false); | 592 base::WaitableEvent done(false, false); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 599 RecordSyncShareAndPostSignal(&r, kMinNumSamples, this, &done))); | 604 RecordSyncShareAndPostSignal(&r, kMinNumSamples, this, &done))); |
| 600 | 605 |
| 601 EXPECT_CALL(*delay(), GetDelay(Eq(first))).WillOnce(Return(second)) | 606 EXPECT_CALL(*delay(), GetDelay(Eq(first))).WillOnce(Return(second)) |
| 602 .RetiresOnSaturation(); | 607 .RetiresOnSaturation(); |
| 603 EXPECT_CALL(*delay(), GetDelay(Eq(second))).WillOnce(Return(third)) | 608 EXPECT_CALL(*delay(), GetDelay(Eq(second))).WillOnce(Return(third)) |
| 604 .RetiresOnSaturation(); | 609 .RetiresOnSaturation(); |
| 605 EXPECT_CALL(*delay(), GetDelay(Eq(third))).WillOnce(Return(fourth)) | 610 EXPECT_CALL(*delay(), GetDelay(Eq(third))).WillOnce(Return(fourth)) |
| 606 .RetiresOnSaturation(); | 611 .RetiresOnSaturation(); |
| 607 EXPECT_CALL(*delay(), GetDelay(Eq(fourth))).WillOnce(Return(fifth)); | 612 EXPECT_CALL(*delay(), GetDelay(Eq(fourth))).WillOnce(Return(fifth)); |
| 608 | 613 |
| 609 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 614 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 610 ASSERT_TRUE(done.TimedWait(timeout())); | 615 ASSERT_TRUE(done.TimedWait(timeout())); |
| 611 | 616 |
| 612 EXPECT_GE(r.times[2] - r.times[1], second); | 617 EXPECT_GE(r.times[2] - r.times[1], second); |
| 613 EXPECT_GE(r.times[3] - r.times[2], third); | 618 EXPECT_GE(r.times[3] - r.times[2], third); |
| 614 EXPECT_GE(r.times[4] - r.times[3], fourth); | 619 EXPECT_GE(r.times[4] - r.times[3], fourth); |
| 615 } | 620 } |
| 616 | 621 |
| 617 // Test that things go back to normal once a canary task makes forward progress | 622 // Test that things go back to normal once a canary task makes forward progress |
| 618 // following a succession of failures. | 623 // following a succession of failures. |
| 619 TEST_F(SyncerThread2Test, BackoffRelief) { | 624 TEST_F(SyncerThread2Test, BackoffRelief) { |
| 620 SyncShareRecords r; | 625 SyncShareRecords r; |
| 621 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); | 626 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); |
| 622 base::WaitableEvent done(false, false); | 627 base::WaitableEvent done(false, false); |
| 623 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); | 628 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); |
| 624 UseMockDelayProvider(); | 629 UseMockDelayProvider(); |
| 625 | 630 |
| 626 const TimeDelta backoff = TimeDelta::FromMilliseconds(100); | 631 const TimeDelta backoff = TimeDelta::FromMilliseconds(100); |
| 627 | 632 |
| 628 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 633 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 629 .WillOnce(Invoke(sessions::test_util::SimulateCommitFailed)) | 634 .WillOnce(Invoke(sessions::test_util::SimulateCommitFailed)) |
| 630 .WillOnce(Invoke(sessions::test_util::SimulateCommitFailed)) | 635 .WillOnce(Invoke(sessions::test_util::SimulateCommitFailed)) |
| 631 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 636 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 632 RecordSyncShareAndPostSignal(&r, kMinNumSamples, this, &done))); | 637 RecordSyncShareAndPostSignal(&r, kMinNumSamples, this, &done))); |
| 633 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); | 638 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); |
| 634 | 639 |
| 635 // Optimal start for the post-backoff poll party. | 640 // Optimal start for the post-backoff poll party. |
| 636 TimeTicks optimal_start = TimeTicks::Now() + poll + backoff; | 641 TimeTicks optimal_start = TimeTicks::Now() + poll + backoff; |
| 637 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 642 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 638 done.TimedWait(timeout()); | 643 done.TimedWait(timeout()); |
| 639 syncer_thread()->Stop(); | 644 syncer_thread()->Stop(); |
| 640 | 645 |
| 641 // Check for healthy polling after backoff is relieved. | 646 // Check for healthy polling after backoff is relieved. |
| 642 // Can't use AnalyzePollRun because first sync is a continuation. Bleh. | 647 // Can't use AnalyzePollRun because first sync is a continuation. Bleh. |
| 643 for (size_t i = 0; i < r.times.size(); i++) { | 648 for (size_t i = 0; i < r.times.size(); i++) { |
| 644 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); | 649 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); |
| 645 TimeTicks optimal_next_sync = optimal_start + poll * i; | 650 TimeTicks optimal_next_sync = optimal_start + poll * i; |
| 646 EXPECT_GE(r.times[i], optimal_next_sync); | 651 EXPECT_GE(r.times[i], optimal_next_sync); |
| 647 EXPECT_EQ(i == 0 ? GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION | 652 EXPECT_EQ(i == 0 ? GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION |
| (...skipping 18 matching lines...) Expand all Loading... |
| 666 SyncerThread::GetRecommendedDelay( | 671 SyncerThread::GetRecommendedDelay( |
| 667 TimeDelta::FromSeconds(kMaxBackoffSeconds + 1))); | 672 TimeDelta::FromSeconds(kMaxBackoffSeconds + 1))); |
| 668 } | 673 } |
| 669 | 674 |
| 670 // Test that appropriate syncer steps are requested for each job type. | 675 // Test that appropriate syncer steps are requested for each job type. |
| 671 TEST_F(SyncerThread2Test, SyncerSteps) { | 676 TEST_F(SyncerThread2Test, SyncerSteps) { |
| 672 // Nudges. | 677 // Nudges. |
| 673 base::WaitableEvent done(false, false); | 678 base::WaitableEvent done(false, false); |
| 674 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) | 679 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) |
| 675 .Times(1); | 680 .Times(1); |
| 676 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 681 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 677 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, ModelTypeBitSet()); | 682 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, ModelTypeBitSet()); |
| 678 FlushLastTask(&done); | 683 FlushLastTask(&done); |
| 679 syncer_thread()->Stop(); | 684 syncer_thread()->Stop(); |
| 680 Mock::VerifyAndClearExpectations(syncer()); | 685 Mock::VerifyAndClearExpectations(syncer()); |
| 681 | 686 |
| 682 // ClearUserData. | 687 // ClearUserData. |
| 683 EXPECT_CALL(*syncer(), SyncShare(_, CLEAR_PRIVATE_DATA, SYNCER_END)) | 688 EXPECT_CALL(*syncer(), SyncShare(_, CLEAR_PRIVATE_DATA, SYNCER_END)) |
| 684 .Times(1); | 689 .Times(1); |
| 685 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 690 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 686 syncer_thread()->ScheduleClearUserData(); | 691 syncer_thread()->ScheduleClearUserData(); |
| 687 FlushLastTask(&done); | 692 FlushLastTask(&done); |
| 688 syncer_thread()->Stop(); | 693 syncer_thread()->Stop(); |
| 689 Mock::VerifyAndClearExpectations(syncer()); | 694 Mock::VerifyAndClearExpectations(syncer()); |
| 690 | 695 |
| 691 // Configuration. | 696 // Configuration. |
| 692 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)); | 697 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)); |
| 693 syncer_thread()->Start(SyncerThread::CONFIGURATION_MODE); | 698 syncer_thread()->Start(SyncerThread::CONFIGURATION_MODE, NULL); |
| 694 syncer_thread()->ScheduleConfig(ModelTypeBitSet()); | 699 syncer_thread()->ScheduleConfig(ModelTypeBitSet()); |
| 695 FlushLastTask(&done); | 700 FlushLastTask(&done); |
| 696 syncer_thread()->Stop(); | 701 syncer_thread()->Stop(); |
| 697 Mock::VerifyAndClearExpectations(syncer()); | 702 Mock::VerifyAndClearExpectations(syncer()); |
| 698 | 703 |
| 699 // Poll. | 704 // Poll. |
| 700 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) | 705 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) |
| 701 .Times(AtLeast(1)) | 706 .Times(AtLeast(1)) |
| 702 .WillRepeatedly(SignalEvent(&done)); | 707 .WillRepeatedly(SignalEvent(&done)); |
| 703 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); | 708 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); |
| 704 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); | 709 syncer_thread()->OnReceivedLongPollIntervalUpdate(poll); |
| 705 syncer_thread()->Start(SyncerThread::NORMAL_MODE); | 710 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 706 done.TimedWait(timeout()); | 711 done.TimedWait(timeout()); |
| 707 syncer_thread()->Stop(); | 712 syncer_thread()->Stop(); |
| 708 Mock::VerifyAndClearExpectations(syncer()); | 713 Mock::VerifyAndClearExpectations(syncer()); |
| 709 done.Reset(); | 714 done.Reset(); |
| 710 } | 715 } |
| 711 | 716 |
| 712 // Test config tasks don't run during normal mode. | 717 // Test config tasks don't run during normal mode. |
| 713 // TODO(tim): Implement this test and then the functionality! | 718 // TODO(tim): Implement this test and then the functionality! |
| 714 TEST_F(SyncerThread2Test, DISABLED_NoConfigDuringNormal) { | 719 TEST_F(SyncerThread2Test, DISABLED_NoConfigDuringNormal) { |
| 715 } | 720 } |
| 716 | 721 |
| 717 // Test that starting the syncer thread without a valid connection doesn't | 722 // Test that starting the syncer thread without a valid connection doesn't |
| 718 // break things when a connection is detected. | 723 // break things when a connection is detected. |
| 719 // Test config tasks don't run during normal mode. | 724 TEST_F(SyncerThread2Test, StartWhenNotConnected) { |
| 720 // TODO(tim): Implement this test and then the functionality! | 725 base::WaitableEvent done(false, false); |
| 721 TEST_F(SyncerThread2Test, DISABLED_StartWhenNotConnected) { | 726 connection()->SetServerNotReachable(); |
| 727 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 728 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, ModelTypeBitSet()); |
| 729 FlushLastTask(&done); |
| 722 | 730 |
| 731 connection()->SetServerReachable(); |
| 732 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1); |
| 733 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, ModelTypeBitSet()); |
| 734 FlushLastTask(&done); |
| 735 } |
| 736 |
| 737 TEST_F(SyncerThread2Test, SetsPreviousRoutingInfo) { |
| 738 base::WaitableEvent done(false, false); |
| 739 ModelSafeRoutingInfo info; |
| 740 EXPECT_TRUE(info == context()->previous_session_routing_info()); |
| 741 ModelSafeRoutingInfo expected; |
| 742 context()->registrar()->GetModelSafeRoutingInfo(&expected); |
| 743 ASSERT_FALSE(expected.empty()); |
| 744 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1); |
| 745 |
| 746 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 747 syncer_thread()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, ModelTypeBitSet()); |
| 748 FlushLastTask(&done); |
| 749 syncer_thread()->Stop(); |
| 750 |
| 751 EXPECT_TRUE(expected == context()->previous_session_routing_info()); |
| 723 } | 752 } |
| 724 | 753 |
| 725 } // namespace s3 | 754 } // namespace s3 |
| 726 } // namespace browser_sync | 755 } // namespace browser_sync |
| 727 | 756 |
| 728 // SyncerThread won't outlive the test! | 757 // SyncerThread won't outlive the test! |
| 729 DISABLE_RUNNABLE_METHOD_REFCOUNT(browser_sync::s3::SyncerThread2Test); | 758 DISABLE_RUNNABLE_METHOD_REFCOUNT(browser_sync::s3::SyncerThread2Test); |
| 730 | 759 |
| OLD | NEW |