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

Side by Side Diff: chrome/browser/sync/engine/syncer_thread2_unittest.cc

Issue 6690020: sync: hook up ServerConnectionManager <> SyncerThread2 and tie up more loose ends (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/debug
Patch Set: rebase Created 9 years, 9 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
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698