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

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

Issue 19982002: sync: Remove SyncSourceInfo (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Convert SyncShareRecords to typedef Created 7 years, 4 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/syncer.h » ('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/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/test/test_timeouts.h" 10 #include "base/test/test_timeouts.h"
11 #include "sync/engine/backoff_delay_provider.h" 11 #include "sync/engine/backoff_delay_provider.h"
12 #include "sync/engine/sync_scheduler_impl.h" 12 #include "sync/engine/sync_scheduler_impl.h"
13 #include "sync/engine/syncer.h" 13 #include "sync/engine/syncer.h"
14 #include "sync/internal_api/public/base/model_type_invalidation_map_test_util.h"
15 #include "sync/sessions/test_util.h" 14 #include "sync/sessions/test_util.h"
16 #include "sync/test/callback_counter.h" 15 #include "sync/test/callback_counter.h"
17 #include "sync/test/engine/fake_model_worker.h" 16 #include "sync/test/engine/fake_model_worker.h"
18 #include "sync/test/engine/mock_connection_manager.h" 17 #include "sync/test/engine/mock_connection_manager.h"
19 #include "sync/test/engine/test_directory_setter_upper.h" 18 #include "sync/test/engine/test_directory_setter_upper.h"
20 #include "sync/test/fake_extensions_activity_monitor.h" 19 #include "sync/test/fake_extensions_activity_monitor.h"
21 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
23 22
24 using base::TimeDelta; 23 using base::TimeDelta;
25 using base::TimeTicks; 24 using base::TimeTicks;
26 using testing::_; 25 using testing::_;
27 using testing::AtLeast; 26 using testing::AtLeast;
28 using testing::DoAll; 27 using testing::DoAll;
29 using testing::Eq;
30 using testing::Invoke; 28 using testing::Invoke;
31 using testing::Mock; 29 using testing::Mock;
32 using testing::Not;
33 using testing::Return; 30 using testing::Return;
34 using testing::WithArg; 31 using testing::WithArg;
35 using testing::WithArgs; 32 using testing::WithArgs;
36 33
37 namespace syncer { 34 namespace syncer {
38 using sessions::SyncSession; 35 using sessions::SyncSession;
39 using sessions::SyncSessionContext; 36 using sessions::SyncSessionContext;
40 using sessions::SyncSessionSnapshot;
41 using sync_pb::GetUpdatesCallerInfo; 37 using sync_pb::GetUpdatesCallerInfo;
42 38
43 class MockSyncer : public Syncer { 39 class MockSyncer : public Syncer {
44 public: 40 public:
45 MOCK_METHOD3(NormalSyncShare, bool(ModelTypeSet, 41 MOCK_METHOD3(NormalSyncShare, bool(ModelTypeSet,
46 const sessions::NudgeTracker&, 42 const sessions::NudgeTracker&,
47 sessions::SyncSession*)); 43 sessions::SyncSession*));
48 MOCK_METHOD2(ConfigureSyncShare, bool(ModelTypeSet, sessions::SyncSession*)); 44 MOCK_METHOD3(ConfigureSyncShare,
45 bool(ModelTypeSet,
46 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource,
47 SyncSession*));
49 MOCK_METHOD2(PollSyncShare, bool(ModelTypeSet, sessions::SyncSession*)); 48 MOCK_METHOD2(PollSyncShare, bool(ModelTypeSet, sessions::SyncSession*));
50 }; 49 };
51 50
52 // Used when tests want to record syncing activity to examine later. 51 typedef std::vector<TimeTicks> SyncShareTimes;
53 struct SyncShareRecords {
54 std::vector<TimeTicks> times;
55 std::vector<SyncSessionSnapshot> snapshots;
56 };
57 52
58 void QuitLoopNow() { 53 void QuitLoopNow() {
59 // We use QuitNow() instead of Quit() as the latter may get stalled 54 // We use QuitNow() instead of Quit() as the latter may get stalled
60 // indefinitely in the presence of repeated timers with low delays 55 // indefinitely in the presence of repeated timers with low delays
61 // and a slow test (e.g., ThrottlingDoesThrottle [which has a poll 56 // and a slow test (e.g., ThrottlingDoesThrottle [which has a poll
62 // delay of 5ms] run under TSAN on the trybots). 57 // delay of 5ms] run under TSAN on the trybots).
63 base::MessageLoop::current()->QuitNow(); 58 base::MessageLoop::current()->QuitNow();
64 } 59 }
65 60
66 void RunLoop() { 61 void RunLoop() {
(...skipping 16 matching lines...) Expand all
83 } 78 }
84 79
85 ModelSafeRoutingInfo TypesToRoutingInfo(ModelTypeSet types) { 80 ModelSafeRoutingInfo TypesToRoutingInfo(ModelTypeSet types) {
86 ModelSafeRoutingInfo routes; 81 ModelSafeRoutingInfo routes;
87 for (ModelTypeSet::Iterator iter = types.First(); iter.Good(); iter.Inc()) { 82 for (ModelTypeSet::Iterator iter = types.First(); iter.Good(); iter.Inc()) {
88 routes[iter.Get()] = GROUP_PASSIVE; 83 routes[iter.Get()] = GROUP_PASSIVE;
89 } 84 }
90 return routes; 85 return routes;
91 } 86 }
92 87
93 // Compare a ModelTypeSet to a ModelTypeInvalidationMap, ignoring
94 // state values.
95 testing::AssertionResult ModelTypeSetMatchesInvalidationMap(
96 ModelTypeSet lhs, const ModelTypeInvalidationMap& rhs) {
97 ModelTypeSet rhs_set = ModelTypeInvalidationMapToSet(rhs);
98
99 if (!rhs_set.Equals(rhs_set)) {
100 return testing::AssertionFailure()
101 << "ModelTypeSet: " << ModelTypeSetToString(lhs)
102 << " does not match ModelTypeInvalidationMap: "
103 << ModelTypeSetToString(rhs_set);
104 } else {
105 return testing::AssertionSuccess();
106 }
107 }
108
109 // Convenient to use in tests wishing to analyze SyncShare calls over time. 88 // Convenient to use in tests wishing to analyze SyncShare calls over time.
110 static const size_t kMinNumSamples = 5; 89 static const size_t kMinNumSamples = 5;
111 class SyncSchedulerTest : public testing::Test { 90 class SyncSchedulerTest : public testing::Test {
112 public: 91 public:
113 SyncSchedulerTest() : weak_ptr_factory_(this), syncer_(NULL), delay_(NULL) {} 92 SyncSchedulerTest() : weak_ptr_factory_(this), syncer_(NULL), delay_(NULL) {}
114 93
115 class MockDelayProvider : public BackoffDelayProvider { 94 class MockDelayProvider : public BackoffDelayProvider {
116 public: 95 public:
117 MockDelayProvider() : BackoffDelayProvider( 96 MockDelayProvider() : BackoffDelayProvider(
118 TimeDelta::FromSeconds(kInitialBackoffRetrySeconds), 97 TimeDelta::FromSeconds(kInitialBackoffRetrySeconds),
119 TimeDelta::FromSeconds(kInitialBackoffImmediateRetrySeconds)) { 98 TimeDelta::FromSeconds(kInitialBackoffImmediateRetrySeconds)) {
120 } 99 }
121 100
122 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&)); 101 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&));
123 }; 102 };
124 103
125 virtual void SetUp() { 104 virtual void SetUp() {
126 dir_maker_.SetUp(); 105 dir_maker_.SetUp();
127 syncer_ = new MockSyncer(); 106 syncer_ = new testing::StrictMock<MockSyncer>();
128 delay_ = NULL; 107 delay_ = NULL;
129 108
130 routing_info_[BOOKMARKS] = GROUP_UI; 109 routing_info_[BOOKMARKS] = GROUP_UI;
131 routing_info_[AUTOFILL] = GROUP_DB; 110 routing_info_[AUTOFILL] = GROUP_DB;
132 routing_info_[THEMES] = GROUP_UI; 111 routing_info_[THEMES] = GROUP_UI;
133 routing_info_[NIGORI] = GROUP_PASSIVE; 112 routing_info_[NIGORI] = GROUP_PASSIVE;
134 113
135 workers_.clear(); 114 workers_.clear();
136 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_UI))); 115 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_UI)));
137 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB))); 116 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB)));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 return TestTimeouts::action_timeout(); 151 return TestTimeouts::action_timeout();
173 } 152 }
174 153
175 virtual void TearDown() { 154 virtual void TearDown() {
176 PumpLoop(); 155 PumpLoop();
177 scheduler_.reset(); 156 scheduler_.reset();
178 PumpLoop(); 157 PumpLoop();
179 dir_maker_.TearDown(); 158 dir_maker_.TearDown();
180 } 159 }
181 160
182 void AnalyzePollRun(const SyncShareRecords& records, size_t min_num_samples, 161 void AnalyzePollRun(const SyncShareTimes& times, size_t min_num_samples,
183 const TimeTicks& optimal_start, const TimeDelta& poll_interval) { 162 const TimeTicks& optimal_start, const TimeDelta& poll_interval) {
184 const std::vector<TimeTicks>& data(records.times); 163 EXPECT_GE(times.size(), min_num_samples);
185 EXPECT_GE(data.size(), min_num_samples); 164 for (size_t i = 0; i < times.size(); i++) {
186 for (size_t i = 0; i < data.size(); i++) {
187 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); 165 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")");
188 TimeTicks optimal_next_sync = optimal_start + poll_interval * i; 166 TimeTicks optimal_next_sync = optimal_start + poll_interval * i;
189 EXPECT_GE(data[i], optimal_next_sync); 167 EXPECT_GE(times[i], optimal_next_sync);
190 EXPECT_EQ(GetUpdatesCallerInfo::PERIODIC,
191 records.snapshots[i].source().updates_source);
192 } 168 }
193 } 169 }
194 170
195 void DoQuitLoopNow() { 171 void DoQuitLoopNow() {
196 QuitLoopNow(); 172 QuitLoopNow();
197 } 173 }
198 174
199 void StartSyncScheduler(SyncScheduler::Mode mode) { 175 void StartSyncScheduler(SyncScheduler::Mode mode) {
200 scheduler()->Start(mode); 176 scheduler()->Start(mode);
201 } 177 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 scoped_ptr<MockConnectionManager> connection_; 215 scoped_ptr<MockConnectionManager> connection_;
240 scoped_ptr<SyncSessionContext> context_; 216 scoped_ptr<SyncSessionContext> context_;
241 scoped_ptr<SyncSchedulerImpl> scheduler_; 217 scoped_ptr<SyncSchedulerImpl> scheduler_;
242 MockSyncer* syncer_; 218 MockSyncer* syncer_;
243 MockDelayProvider* delay_; 219 MockDelayProvider* delay_;
244 std::vector<scoped_refptr<FakeModelWorker> > workers_; 220 std::vector<scoped_refptr<FakeModelWorker> > workers_;
245 FakeExtensionsActivityMonitor extensions_activity_monitor_; 221 FakeExtensionsActivityMonitor extensions_activity_monitor_;
246 ModelSafeRoutingInfo routing_info_; 222 ModelSafeRoutingInfo routing_info_;
247 }; 223 };
248 224
249 void RecordSyncShareImpl(SyncSession* s, SyncShareRecords* record) { 225 void RecordSyncShareImpl(SyncShareTimes* times) {
250 record->times.push_back(TimeTicks::Now()); 226 times->push_back(TimeTicks::Now());
251 record->snapshots.push_back(s->TakeSnapshot());
252 } 227 }
253 228
254 ACTION_P(RecordSyncShare, record) { 229 ACTION_P(RecordSyncShare, times) {
255 RecordSyncShareImpl(arg0, record); 230 RecordSyncShareImpl(times);
256 if (base::MessageLoop::current()->is_running()) 231 if (base::MessageLoop::current()->is_running())
257 QuitLoopNow(); 232 QuitLoopNow();
258 return true; 233 return true;
259 } 234 }
260 235
261 ACTION_P2(RecordSyncShareMultiple, record, quit_after) { 236 ACTION_P2(RecordSyncShareMultiple, times, quit_after) {
262 RecordSyncShareImpl(arg0, record); 237 RecordSyncShareImpl(times);
263 EXPECT_LE(record->times.size(), quit_after); 238 EXPECT_LE(times->size(), quit_after);
264 if (record->times.size() >= quit_after && 239 if (times->size() >= quit_after &&
265 base::MessageLoop::current()->is_running()) { 240 base::MessageLoop::current()->is_running()) {
266 QuitLoopNow(); 241 QuitLoopNow();
267 } 242 }
268 return true; 243 return true;
269 } 244 }
270 245
271 ACTION(AddFailureAndQuitLoopNow) { 246 ACTION(AddFailureAndQuitLoopNow) {
272 ADD_FAILURE(); 247 ADD_FAILURE();
273 QuitLoopNow(); 248 QuitLoopNow();
274 return true; 249 return true;
275 } 250 }
276 251
277 ACTION(QuitLoopNowAction) { 252 ACTION(QuitLoopNowAction) {
278 QuitLoopNow(); 253 QuitLoopNow();
279 return true; 254 return true;
280 } 255 }
281 256
282 // Test nudge scheduling. 257 // Test nudge scheduling.
283 TEST_F(SyncSchedulerTest, Nudge) { 258 TEST_F(SyncSchedulerTest, Nudge) {
284 SyncShareRecords records; 259 SyncShareTimes times;
285 ModelTypeSet model_types(BOOKMARKS); 260 ModelTypeSet model_types(BOOKMARKS);
286 261
287 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 262 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
288 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 263 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
289 WithArg<2>(RecordSyncShare(&records)))) 264 RecordSyncShare(&times)))
290 .RetiresOnSaturation(); 265 .RetiresOnSaturation();
291 266
292 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 267 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
293 268
294 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); 269 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE);
295 RunLoop(); 270 RunLoop();
296 271
297 ASSERT_EQ(1U, records.snapshots.size());
298 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
299 model_types,
300 records.snapshots[0].source().types));
301 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
302 records.snapshots[0].source().updates_source);
303
304 Mock::VerifyAndClearExpectations(syncer()); 272 Mock::VerifyAndClearExpectations(syncer());
305 273
306 // Make sure a second, later, nudge is unaffected by first (no coalescing). 274 // Make sure a second, later, nudge is unaffected by first (no coalescing).
307 SyncShareRecords records2; 275 SyncShareTimes times2;
308 model_types.Remove(BOOKMARKS); 276 model_types.Remove(BOOKMARKS);
309 model_types.Put(AUTOFILL); 277 model_types.Put(AUTOFILL);
310 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 278 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
311 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 279 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
312 WithArg<2>(RecordSyncShare(&records2)))); 280 RecordSyncShare(&times2)));
313 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); 281 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE);
314 RunLoop(); 282 RunLoop();
315
316 ASSERT_EQ(1U, records2.snapshots.size());
317 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
318 model_types,
319 records2.snapshots[0].source().types));
320 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
321 records2.snapshots[0].source().updates_source);
322 } 283 }
323 284
324 // Make sure a regular config command is scheduled fine in the absence of any 285 // Make sure a regular config command is scheduled fine in the absence of any
325 // errors. 286 // errors.
326 TEST_F(SyncSchedulerTest, Config) { 287 TEST_F(SyncSchedulerTest, Config) {
327 SyncShareRecords records; 288 SyncShareTimes times;
328 const ModelTypeSet model_types(BOOKMARKS); 289 const ModelTypeSet model_types(BOOKMARKS);
329 290
330 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) 291 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
331 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), 292 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess),
332 WithArg<1>(RecordSyncShare(&records)))); 293 RecordSyncShare(&times)));
333 294
334 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 295 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
335 296
336 CallbackCounter counter; 297 CallbackCounter counter;
337 ConfigurationParams params( 298 ConfigurationParams params(
338 GetUpdatesCallerInfo::RECONFIGURATION, 299 GetUpdatesCallerInfo::RECONFIGURATION,
339 model_types, 300 model_types,
340 TypesToRoutingInfo(model_types), 301 TypesToRoutingInfo(model_types),
341 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 302 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
342 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); 303 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params));
343 ASSERT_EQ(1, counter.times_called()); 304 ASSERT_EQ(1, counter.times_called());
344
345 ASSERT_EQ(1U, records.snapshots.size());
346 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
347 model_types,
348 records.snapshots[0].source().types));
349 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION,
350 records.snapshots[0].source().updates_source);
351 } 305 }
352 306
353 // Simulate a failure and make sure the config request is retried. 307 // Simulate a failure and make sure the config request is retried.
354 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { 308 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) {
355 UseMockDelayProvider(); 309 UseMockDelayProvider();
356 EXPECT_CALL(*delay(), GetDelay(_)) 310 EXPECT_CALL(*delay(), GetDelay(_))
357 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); 311 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1)));
358 SyncShareRecords records; 312 SyncShareTimes times;
359 const ModelTypeSet model_types(BOOKMARKS); 313 const ModelTypeSet model_types(BOOKMARKS);
360 314
361 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_))
362 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed),
363 WithArg<1>(RecordSyncShare(&records))))
364 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess),
365 WithArg<1>(RecordSyncShare(&records))));
366
367 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 315 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
368 316
369 ASSERT_EQ(0U, records.snapshots.size()); 317 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
318 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed),
319 RecordSyncShare(&times)));
320
370 CallbackCounter counter; 321 CallbackCounter counter;
371 ConfigurationParams params( 322 ConfigurationParams params(
372 GetUpdatesCallerInfo::RECONFIGURATION, 323 GetUpdatesCallerInfo::RECONFIGURATION,
373 model_types, 324 model_types,
374 TypesToRoutingInfo(model_types), 325 TypesToRoutingInfo(model_types),
375 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 326 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
376 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); 327 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params));
377 ASSERT_EQ(0, counter.times_called()); 328 ASSERT_EQ(0, counter.times_called());
378 329
379 ASSERT_EQ(1U, records.snapshots.size()); 330 Mock::VerifyAndClearExpectations(syncer());
331
332 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
333 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess),
334 RecordSyncShare(&times)));
380 RunLoop(); 335 RunLoop();
381 336
382 ASSERT_EQ(2U, records.snapshots.size());
383 ASSERT_EQ(1, counter.times_called()); 337 ASSERT_EQ(1, counter.times_called());
384 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
385 model_types,
386 records.snapshots[1].source().types));
387 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION,
388 records.snapshots[1].source().updates_source);
389 } 338 }
390 339
391 // Issue a nudge when the config has failed. Make sure both the config and 340 // Issue a nudge when the config has failed. Make sure both the config and
392 // nudge are executed. 341 // nudge are executed.
393 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { 342 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) {
394 const ModelTypeSet model_types(BOOKMARKS); 343 const ModelTypeSet model_types(BOOKMARKS);
395 UseMockDelayProvider(); 344 UseMockDelayProvider();
396 EXPECT_CALL(*delay(), GetDelay(_)) 345 EXPECT_CALL(*delay(), GetDelay(_))
397 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(50))); 346 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(50)));
398 SyncShareRecords records; 347 SyncShareTimes times;
399
400 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_))
401 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed),
402 WithArg<1>(RecordSyncShare(&records))))
403 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed),
404 WithArg<1>(RecordSyncShare(&records))))
405 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess),
406 WithArg<1>(RecordSyncShare(&records))));
407
408 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
409 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
410 WithArg<2>(RecordSyncShare(&records))));
411 348
412 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 349 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
413 350
414 ASSERT_EQ(0U, records.snapshots.size()); 351 // Request a configure and make sure it fails.
352 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
353 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed),
354 RecordSyncShare(&times)));
415 CallbackCounter counter; 355 CallbackCounter counter;
416 ConfigurationParams params( 356 ConfigurationParams params(
417 GetUpdatesCallerInfo::RECONFIGURATION, 357 GetUpdatesCallerInfo::RECONFIGURATION,
418 model_types, 358 model_types,
419 TypesToRoutingInfo(model_types), 359 TypesToRoutingInfo(model_types),
420 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 360 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
421 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); 361 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params));
422 ASSERT_EQ(0, counter.times_called()); 362 ASSERT_EQ(0, counter.times_called());
423 ASSERT_EQ(1U, records.snapshots.size()); 363 Mock::VerifyAndClearExpectations(syncer());
424 364
365 // Ask for a nudge while dealing with repeated configure failure.
366 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
367 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed),
368 RecordSyncShare(&times)));
425 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); 369 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE);
426 RunLoop(); 370 RunLoop();
427 // Note that we're not RunLoop()ing for the NUDGE we just scheduled, but 371 // Note that we're not RunLoop()ing for the NUDGE we just scheduled, but
428 // for the first retry attempt from the config job (after 372 // for the first retry attempt from the config job (after
429 // waiting ~+/- 50ms). 373 // waiting ~+/- 50ms).
430 ASSERT_EQ(2U, records.snapshots.size()); 374 Mock::VerifyAndClearExpectations(syncer());
431 ASSERT_EQ(0, counter.times_called()); 375 ASSERT_EQ(0, counter.times_called());
432 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION,
433 records.snapshots[1].source().updates_source);
434 376
377 // Let the next configure retry succeed.
378 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
379 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess),
380 RecordSyncShare(&times)));
435 RunLoop(); 381 RunLoop();
436 // This is the 3rd attempt, which we've set up to SimulateSuccess.
437 ASSERT_EQ(3U, records.snapshots.size());
438 ASSERT_EQ(1, counter.times_called());
439 382
440 // Now change the mode so nudge can execute. 383 // Now change the mode so nudge can execute.
384 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
385 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
386 RecordSyncShare(&times)));
441 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 387 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
442
443 ASSERT_EQ(4U, records.snapshots.size());
444
445 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
446 model_types,
447 records.snapshots[2].source().types));
448 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION,
449 records.snapshots[2].source().updates_source);
450
451 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
452 model_types,
453 records.snapshots[3].source().types));
454 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
455 records.snapshots[3].source().updates_source);
456
457 } 388 }
458 389
459 // Test that nudges are coalesced. 390 // Test that nudges are coalesced.
460 TEST_F(SyncSchedulerTest, NudgeCoalescing) { 391 TEST_F(SyncSchedulerTest, NudgeCoalescing) {
461 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 392 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
462 393
463 SyncShareRecords r; 394 SyncShareTimes times;
464 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 395 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
465 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 396 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
466 WithArg<2>(RecordSyncShare(&r)))); 397 RecordSyncShare(&times)));
467 const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES); 398 const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES);
468 TimeDelta delay = zero(); 399 TimeDelta delay = zero();
469 TimeTicks optimal_time = TimeTicks::Now() + delay; 400 TimeTicks optimal_time = TimeTicks::Now() + delay;
470 scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE); 401 scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE);
471 scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE); 402 scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE);
472 RunLoop(); 403 RunLoop();
473 404
474 ASSERT_EQ(1U, r.snapshots.size()); 405 ASSERT_EQ(1U, times.size());
475 EXPECT_GE(r.times[0], optimal_time); 406 EXPECT_GE(times[0], optimal_time);
476 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
477 Union(types1, types2),
478 r.snapshots[0].source().types));
479 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
480 r.snapshots[0].source().updates_source);
481 407
482 Mock::VerifyAndClearExpectations(syncer()); 408 Mock::VerifyAndClearExpectations(syncer());
483 409
484 SyncShareRecords r2; 410 SyncShareTimes times2;
485 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 411 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
486 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 412 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
487 WithArg<2>(RecordSyncShare(&r2)))); 413 RecordSyncShare(&times2)));
488 scheduler()->ScheduleLocalNudge(zero(), types3, FROM_HERE); 414 scheduler()->ScheduleLocalNudge(zero(), types3, FROM_HERE);
489 RunLoop(); 415 RunLoop();
490
491 ASSERT_EQ(1U, r2.snapshots.size());
492 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
493 types3,
494 r2.snapshots[0].source().types));
495 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
496 r2.snapshots[0].source().updates_source);
497 } 416 }
498 417
499 // Test that nudges are coalesced. 418 // Test that nudges are coalesced.
500 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { 419 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) {
501 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 420 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
502 421
503 SyncShareRecords r; 422 SyncShareTimes times;
504 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 423 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
505 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 424 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
506 WithArg<2>(RecordSyncShare(&r)))); 425 RecordSyncShare(&times)));
507 ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3; 426 ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3;
508 427
509 // Create a huge time delay. 428 // Create a huge time delay.
510 TimeDelta delay = TimeDelta::FromDays(1); 429 TimeDelta delay = TimeDelta::FromDays(1);
511 430
512 scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE); 431 scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE);
513 scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE); 432 scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE);
514 433
515 TimeTicks min_time = TimeTicks::Now(); 434 TimeTicks min_time = TimeTicks::Now();
516 TimeTicks max_time = TimeTicks::Now() + delay; 435 TimeTicks max_time = TimeTicks::Now() + delay;
517 436
518 RunLoop(); 437 RunLoop();
519 438 Mock::VerifyAndClearExpectations(syncer());
520 // Make sure the sync has happened.
521 ASSERT_EQ(1U, r.snapshots.size());
522 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
523 Union(types1, types2),
524 r.snapshots[0].source().types));
525 439
526 // Make sure the sync happened at the right time. 440 // Make sure the sync happened at the right time.
527 EXPECT_GE(r.times[0], min_time); 441 ASSERT_EQ(1U, times.size());
528 EXPECT_LE(r.times[0], max_time); 442 EXPECT_GE(times[0], min_time);
443 EXPECT_LE(times[0], max_time);
529 } 444 }
530 445
531 // Test nudge scheduling. 446 // Test nudge scheduling.
532 TEST_F(SyncSchedulerTest, NudgeWithStates) { 447 TEST_F(SyncSchedulerTest, NudgeWithStates) {
533 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 448 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
534 449
535 SyncShareRecords records; 450 SyncShareTimes times;
536 const ModelTypeSet types(BOOKMARKS); 451 const ModelTypeSet types(BOOKMARKS);
537 ModelTypeInvalidationMap invalidation_map = 452 ModelTypeInvalidationMap invalidation_map =
538 ModelTypeSetToInvalidationMap(types, "test"); 453 ModelTypeSetToInvalidationMap(types, "test");
539 454
540 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 455 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
541 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 456 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
542 WithArg<2>(RecordSyncShare(&records)))) 457 RecordSyncShare(&times)))
543 .RetiresOnSaturation(); 458 .RetiresOnSaturation();
544 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); 459 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE);
545 RunLoop(); 460 RunLoop();
546 461
547 ASSERT_EQ(1U, records.snapshots.size());
548 EXPECT_THAT(invalidation_map, Eq(records.snapshots[0].source().types));
549 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION,
550 records.snapshots[0].source().updates_source);
551
552 Mock::VerifyAndClearExpectations(syncer()); 462 Mock::VerifyAndClearExpectations(syncer());
553 463
554 // Make sure a second, later, nudge is unaffected by first (no coalescing). 464 // Make sure a second, later, nudge is unaffected by first (no coalescing).
555 SyncShareRecords records2; 465 SyncShareTimes times2;
556 invalidation_map.erase(BOOKMARKS); 466 invalidation_map.erase(BOOKMARKS);
557 invalidation_map[AUTOFILL].payload = "test2"; 467 invalidation_map[AUTOFILL].payload = "test2";
558 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 468 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
559 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 469 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
560 WithArg<2>(RecordSyncShare(&records2)))); 470 RecordSyncShare(&times2)));
561 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); 471 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE);
562 RunLoop(); 472 RunLoop();
563
564 ASSERT_EQ(1U, records2.snapshots.size());
565 EXPECT_THAT(invalidation_map, Eq(records2.snapshots[0].source().types));
566 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION,
567 records2.snapshots[0].source().updates_source);
568 } 473 }
569 474
570 // Test that polling works as expected. 475 // Test that polling works as expected.
571 TEST_F(SyncSchedulerTest, Polling) { 476 TEST_F(SyncSchedulerTest, Polling) {
572 SyncShareRecords records; 477 SyncShareTimes times;
573 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); 478 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30));
574 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) 479 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples))
575 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), 480 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess),
576 WithArg<1>(RecordSyncShareMultiple(&records, kMinNumSamples)))); 481 RecordSyncShareMultiple(&times, kMinNumSamples)));
577 482
578 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); 483 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval);
579 484
580 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; 485 TimeTicks optimal_start = TimeTicks::Now() + poll_interval;
581 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 486 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
582 487
583 // Run again to wait for polling. 488 // Run again to wait for polling.
584 RunLoop(); 489 RunLoop();
585 490
586 StopSyncScheduler(); 491 StopSyncScheduler();
587 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); 492 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval);
588 } 493 }
589 494
590 // Test that the short poll interval is used. 495 // Test that the short poll interval is used.
591 TEST_F(SyncSchedulerTest, PollNotificationsDisabled) { 496 TEST_F(SyncSchedulerTest, PollNotificationsDisabled) {
592 SyncShareRecords records; 497 SyncShareTimes times;
593 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); 498 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30));
594 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) 499 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples))
595 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), 500 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess),
596 WithArg<1>(RecordSyncShareMultiple(&records, kMinNumSamples)))); 501 RecordSyncShareMultiple(&times, kMinNumSamples)));
597 502
598 scheduler()->OnReceivedShortPollIntervalUpdate(poll_interval); 503 scheduler()->OnReceivedShortPollIntervalUpdate(poll_interval);
599 scheduler()->SetNotificationsEnabled(false); 504 scheduler()->SetNotificationsEnabled(false);
600 505
601 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; 506 TimeTicks optimal_start = TimeTicks::Now() + poll_interval;
602 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 507 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
603 508
604 // Run again to wait for polling. 509 // Run again to wait for polling.
605 RunLoop(); 510 RunLoop();
606 511
607 StopSyncScheduler(); 512 StopSyncScheduler();
608 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); 513 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval);
609 } 514 }
610 515
611 // Test that polling intervals are updated when needed. 516 // Test that polling intervals are updated when needed.
612 TEST_F(SyncSchedulerTest, PollIntervalUpdate) { 517 TEST_F(SyncSchedulerTest, PollIntervalUpdate) {
613 SyncShareRecords records; 518 SyncShareTimes times;
614 TimeDelta poll1(TimeDelta::FromMilliseconds(120)); 519 TimeDelta poll1(TimeDelta::FromMilliseconds(120));
615 TimeDelta poll2(TimeDelta::FromMilliseconds(30)); 520 TimeDelta poll2(TimeDelta::FromMilliseconds(30));
616 scheduler()->OnReceivedLongPollIntervalUpdate(poll1); 521 scheduler()->OnReceivedLongPollIntervalUpdate(poll1);
617 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) 522 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples))
618 .WillOnce(DoAll( 523 .WillOnce(DoAll(
619 WithArgs<0,1>( 524 WithArgs<0,1>(
620 sessions::test_util::SimulatePollIntervalUpdate(poll2)), 525 sessions::test_util::SimulatePollIntervalUpdate(poll2)),
621 Return(true))) 526 Return(true)))
622 .WillRepeatedly( 527 .WillRepeatedly(
623 DoAll(Invoke(sessions::test_util::SimulatePollSuccess), 528 DoAll(Invoke(sessions::test_util::SimulatePollSuccess),
624 WithArg<1>( 529 WithArg<1>(
625 RecordSyncShareMultiple(&records, kMinNumSamples)))); 530 RecordSyncShareMultiple(&times, kMinNumSamples))));
626 531
627 TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2; 532 TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2;
628 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 533 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
629 534
630 // Run again to wait for polling. 535 // Run again to wait for polling.
631 RunLoop(); 536 RunLoop();
632 537
633 StopSyncScheduler(); 538 StopSyncScheduler();
634 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll2); 539 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll2);
635 } 540 }
636 541
637 // Test that the sessions commit delay is updated when needed. 542 // Test that the sessions commit delay is updated when needed.
638 TEST_F(SyncSchedulerTest, SessionsCommitDelay) { 543 TEST_F(SyncSchedulerTest, SessionsCommitDelay) {
639 SyncShareRecords records; 544 SyncShareTimes times;
640 TimeDelta delay1(TimeDelta::FromMilliseconds(120)); 545 TimeDelta delay1(TimeDelta::FromMilliseconds(120));
641 TimeDelta delay2(TimeDelta::FromMilliseconds(30)); 546 TimeDelta delay2(TimeDelta::FromMilliseconds(30));
642 scheduler()->OnReceivedSessionsCommitDelay(delay1); 547 scheduler()->OnReceivedSessionsCommitDelay(delay1);
643 548
644 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 549 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
645 .WillOnce( 550 .WillOnce(
646 DoAll( 551 DoAll(
647 WithArgs<0,1,2>( 552 WithArgs<0,1,2>(
648 sessions::test_util::SimulateSessionsCommitDelayUpdate( 553 sessions::test_util::SimulateSessionsCommitDelayUpdate(
649 delay2)), 554 delay2)),
(...skipping 12 matching lines...) Expand all
662 StopSyncScheduler(); 567 StopSyncScheduler();
663 } 568 }
664 569
665 // Test that no syncing occurs when throttled. 570 // Test that no syncing occurs when throttled.
666 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { 571 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) {
667 const ModelTypeSet types(BOOKMARKS); 572 const ModelTypeSet types(BOOKMARKS);
668 TimeDelta poll(TimeDelta::FromMilliseconds(5)); 573 TimeDelta poll(TimeDelta::FromMilliseconds(5));
669 TimeDelta throttle(TimeDelta::FromMinutes(10)); 574 TimeDelta throttle(TimeDelta::FromMinutes(10));
670 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 575 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
671 576
672 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) 577 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
673 .WillOnce(DoAll( 578 .WillOnce(DoAll(
674 WithArg<1>(sessions::test_util::SimulateThrottled(throttle)), 579 WithArg<2>(sessions::test_util::SimulateThrottled(throttle)),
675 Return(true))) 580 Return(true)))
676 .WillRepeatedly(AddFailureAndQuitLoopNow()); 581 .WillRepeatedly(AddFailureAndQuitLoopNow());
677 582
678 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 583 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
679 584
680 scheduler()->ScheduleLocalNudge( 585 scheduler()->ScheduleLocalNudge(
681 TimeDelta::FromMicroseconds(1), types, FROM_HERE); 586 TimeDelta::FromMicroseconds(1), types, FROM_HERE);
682 PumpLoop(); 587 PumpLoop();
683 588
684 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 589 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
685 590
686 CallbackCounter counter; 591 CallbackCounter counter;
687 ConfigurationParams params( 592 ConfigurationParams params(
688 GetUpdatesCallerInfo::RECONFIGURATION, 593 GetUpdatesCallerInfo::RECONFIGURATION,
689 types, 594 types,
690 TypesToRoutingInfo(types), 595 TypesToRoutingInfo(types),
691 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 596 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
692 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); 597 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params));
693 ASSERT_EQ(0, counter.times_called()); 598 ASSERT_EQ(0, counter.times_called());
694 } 599 }
695 600
696 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromPoll) { 601 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromPoll) {
697 SyncShareRecords records; 602 SyncShareTimes times;
698 TimeDelta poll(TimeDelta::FromMilliseconds(15)); 603 TimeDelta poll(TimeDelta::FromMilliseconds(15));
699 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); 604 TimeDelta throttle1(TimeDelta::FromMilliseconds(150));
700 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 605 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
701 606
702 ::testing::InSequence seq; 607 ::testing::InSequence seq;
703 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) 608 EXPECT_CALL(*syncer(), PollSyncShare(_,_))
704 .WillOnce(DoAll( 609 .WillOnce(DoAll(
705 WithArg<1>(sessions::test_util::SimulateThrottled(throttle1)), 610 WithArg<1>(sessions::test_util::SimulateThrottled(throttle1)),
706 Return(true))) 611 Return(true)))
707 .RetiresOnSaturation(); 612 .RetiresOnSaturation();
708 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) 613 EXPECT_CALL(*syncer(), PollSyncShare(_,_))
709 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), 614 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess),
710 WithArg<1>(RecordSyncShareMultiple(&records, kMinNumSamples)))); 615 RecordSyncShareMultiple(&times, kMinNumSamples)));
711 616
712 TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; 617 TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1;
713 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 618 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
714 619
715 // Run again to wait for polling. 620 // Run again to wait for polling.
716 RunLoop(); 621 RunLoop();
717 622
718 StopSyncScheduler(); 623 StopSyncScheduler();
719 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); 624 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll);
720 } 625 }
721 626
722 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromNudge) { 627 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromNudge) {
723 SyncShareRecords records; 628 SyncShareTimes times;
724 TimeDelta poll(TimeDelta::FromDays(1)); 629 TimeDelta poll(TimeDelta::FromDays(1));
725 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); 630 TimeDelta throttle1(TimeDelta::FromMilliseconds(150));
726 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 631 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
727 632
728 ::testing::InSequence seq; 633 ::testing::InSequence seq;
729 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 634 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
730 .WillOnce(DoAll( 635 .WillOnce(DoAll(
731 WithArg<2>(sessions::test_util::SimulateThrottled(throttle1)), 636 WithArg<2>(sessions::test_util::SimulateThrottled(throttle1)),
732 Return(true))) 637 Return(true)))
733 .RetiresOnSaturation(); 638 .RetiresOnSaturation();
734 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 639 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
735 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 640 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
736 QuitLoopNowAction())); 641 QuitLoopNowAction()));
737 642
738 const ModelTypeSet types(BOOKMARKS); 643 const ModelTypeSet types(BOOKMARKS);
739 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 644 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
740 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); 645 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE);
741 646
742 PumpLoop(); 647 PumpLoop();
743 EXPECT_TRUE(scheduler()->IsCurrentlyThrottled()); 648 EXPECT_TRUE(scheduler()->IsCurrentlyThrottled());
744 RunLoop(); 649 RunLoop();
745 EXPECT_FALSE(scheduler()->IsCurrentlyThrottled()); 650 EXPECT_FALSE(scheduler()->IsCurrentlyThrottled());
746 651
747 StopSyncScheduler(); 652 StopSyncScheduler();
748 } 653 }
749 654
750 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromConfigure) { 655 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromConfigure) {
751 SyncShareRecords records; 656 SyncShareTimes times;
752 TimeDelta poll(TimeDelta::FromDays(1)); 657 TimeDelta poll(TimeDelta::FromDays(1));
753 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); 658 TimeDelta throttle1(TimeDelta::FromMilliseconds(150));
754 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 659 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
755 660
756 ::testing::InSequence seq; 661 ::testing::InSequence seq;
757 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) 662 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
758 .WillOnce(DoAll( 663 .WillOnce(DoAll(
759 WithArg<1>(sessions::test_util::SimulateThrottled(throttle1)), 664 WithArg<2>(sessions::test_util::SimulateThrottled(throttle1)),
760 Return(true))) 665 Return(true)))
761 .RetiresOnSaturation(); 666 .RetiresOnSaturation();
762 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) 667 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
763 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), 668 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess),
764 QuitLoopNowAction())); 669 QuitLoopNowAction()));
765 670
766 const ModelTypeSet types(BOOKMARKS); 671 const ModelTypeSet types(BOOKMARKS);
767 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 672 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
768 673
769 CallbackCounter counter; 674 CallbackCounter counter;
770 ConfigurationParams params( 675 ConfigurationParams params(
771 GetUpdatesCallerInfo::RECONFIGURATION, 676 GetUpdatesCallerInfo::RECONFIGURATION,
772 types, 677 types,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 PumpLoop(); 716 PumpLoop();
812 717
813 StopSyncScheduler(); 718 StopSyncScheduler();
814 } 719 }
815 720
816 TEST_F(SyncSchedulerTest, TypeThrottlingDoesBlockOtherSources) { 721 TEST_F(SyncSchedulerTest, TypeThrottlingDoesBlockOtherSources) {
817 UseMockDelayProvider(); 722 UseMockDelayProvider();
818 EXPECT_CALL(*delay(), GetDelay(_)) 723 EXPECT_CALL(*delay(), GetDelay(_))
819 .WillRepeatedly(Return(zero())); 724 .WillRepeatedly(Return(zero()));
820 725
821 SyncShareRecords records; 726 SyncShareTimes times;
822 TimeDelta poll(TimeDelta::FromDays(1)); 727 TimeDelta poll(TimeDelta::FromDays(1));
823 TimeDelta throttle1(TimeDelta::FromSeconds(60)); 728 TimeDelta throttle1(TimeDelta::FromSeconds(60));
824 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 729 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
825 730
826 const ModelTypeSet throttled_types(BOOKMARKS); 731 const ModelTypeSet throttled_types(BOOKMARKS);
827 const ModelTypeSet unthrottled_types(PREFERENCES); 732 const ModelTypeSet unthrottled_types(PREFERENCES);
828 733
829 ::testing::InSequence seq; 734 ::testing::InSequence seq;
830 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 735 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
831 .WillOnce(DoAll( 736 .WillOnce(DoAll(
832 WithArg<2>( 737 WithArg<2>(
833 sessions::test_util::SimulateTypesThrottled( 738 sessions::test_util::SimulateTypesThrottled(
834 throttled_types, throttle1)), 739 throttled_types, throttle1)),
835 Return(true))) 740 Return(true)))
836 .RetiresOnSaturation(); 741 .RetiresOnSaturation();
837 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
838 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
839 WithArg<2>(RecordSyncShare(&records))));
840 742
841 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 743 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
842 scheduler()->ScheduleLocalNudge(zero(), throttled_types, FROM_HERE); 744 scheduler()->ScheduleLocalNudge(zero(), throttled_types, FROM_HERE);
843 PumpLoop(); 745 PumpLoop();
844 EXPECT_EQ(0U, records.snapshots.size());
845 EXPECT_TRUE(GetThrottledTypes().HasAll(throttled_types)); 746 EXPECT_TRUE(GetThrottledTypes().HasAll(throttled_types));
846 747
847 // Ignore invalidations for throttled types. 748 // Ignore invalidations for throttled types.
848 ModelTypeInvalidationMap invalidation_map = 749 ModelTypeInvalidationMap invalidation_map =
849 ModelTypeSetToInvalidationMap(throttled_types, "test"); 750 ModelTypeSetToInvalidationMap(throttled_types, "test");
850 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); 751 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE);
851 PumpLoop(); 752 PumpLoop();
852 EXPECT_EQ(0U, records.snapshots.size());
853 753
854 // Ignore refresh requests for throttled types. 754 // Ignore refresh requests for throttled types.
855 scheduler()->ScheduleLocalRefreshRequest(zero(), throttled_types, FROM_HERE); 755 scheduler()->ScheduleLocalRefreshRequest(zero(), throttled_types, FROM_HERE);
856 PumpLoop(); 756 PumpLoop();
857 EXPECT_EQ(0U, records.snapshots.size()); 757
758 Mock::VerifyAndClearExpectations(syncer());
858 759
859 // Local nudges for non-throttled types will trigger a sync. 760 // Local nudges for non-throttled types will trigger a sync.
761 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
762 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
763 RecordSyncShare(&times)));
860 scheduler()->ScheduleLocalNudge(zero(), unthrottled_types, FROM_HERE); 764 scheduler()->ScheduleLocalNudge(zero(), unthrottled_types, FROM_HERE);
861 RunLoop(); 765 RunLoop();
862 EXPECT_EQ(1U, records.snapshots.size()); 766 Mock::VerifyAndClearExpectations(syncer());
863 767
864 StopSyncScheduler(); 768 StopSyncScheduler();
865 } 769 }
866 770
867 // Test nudges / polls don't run in config mode and config tasks do. 771 // Test nudges / polls don't run in config mode and config tasks do.
868 TEST_F(SyncSchedulerTest, ConfigurationMode) { 772 TEST_F(SyncSchedulerTest, ConfigurationMode) {
869 TimeDelta poll(TimeDelta::FromMilliseconds(15)); 773 TimeDelta poll(TimeDelta::FromMilliseconds(15));
870 SyncShareRecords records; 774 SyncShareTimes times;
871 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 775 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
872 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_))
873 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess),
874 WithArg<1>(RecordSyncShare(&records))))
875 .RetiresOnSaturation();
876 776
877 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 777 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
878 778
879 const ModelTypeSet nudge_types(AUTOFILL); 779 const ModelTypeSet nudge_types(AUTOFILL);
880 scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); 780 scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE);
881 scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); 781 scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE);
882 782
883 const ModelTypeSet config_types(BOOKMARKS); 783 const ModelTypeSet config_types(BOOKMARKS);
884 784
785 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
786 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess),
787 RecordSyncShare(&times)))
788 .RetiresOnSaturation();
885 CallbackCounter counter; 789 CallbackCounter counter;
886 ConfigurationParams params( 790 ConfigurationParams params(
887 GetUpdatesCallerInfo::RECONFIGURATION, 791 GetUpdatesCallerInfo::RECONFIGURATION,
888 config_types, 792 config_types,
889 TypesToRoutingInfo(config_types), 793 TypesToRoutingInfo(config_types),
890 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 794 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
891 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); 795 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params));
892 ASSERT_EQ(1, counter.times_called()); 796 ASSERT_EQ(1, counter.times_called());
893 797 Mock::VerifyAndClearExpectations(syncer());
894 ASSERT_EQ(1U, records.snapshots.size());
895 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
896 config_types,
897 records.snapshots[0].source().types));
898 798
899 // Switch to NORMAL_MODE to ensure NUDGES were properly saved and run. 799 // Switch to NORMAL_MODE to ensure NUDGES were properly saved and run.
900 // SyncSchedulerWhiteboxTest also provides coverage for this, but much
901 // more targeted ('whitebox' style).
902 scheduler()->OnReceivedLongPollIntervalUpdate(TimeDelta::FromDays(1)); 800 scheduler()->OnReceivedLongPollIntervalUpdate(TimeDelta::FromDays(1));
903 SyncShareRecords records2; 801 SyncShareTimes times2;
904 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 802 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
905 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), 803 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess),
906 WithArg<2>(RecordSyncShare(&records2)))); 804 RecordSyncShare(&times2)));
907 805
908 // TODO(tim): Figure out how to remove this dangerous need to reset 806 // TODO(tim): Figure out how to remove this dangerous need to reset
909 // routing info between mode switches. 807 // routing info between mode switches.
910 context()->set_routing_info(routing_info()); 808 context()->set_routing_info(routing_info());
911 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 809 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
912 810
913 ASSERT_EQ(1U, records2.snapshots.size());
914 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
915 records2.snapshots[0].source().updates_source);
916 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap(
917 nudge_types,
918 records2.snapshots[0].source().types));
919 PumpLoop(); 811 PumpLoop();
920 } 812 }
921 813
922 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest { 814 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest {
923 virtual void SetUp() { 815 virtual void SetUp() {
924 SyncSchedulerTest::SetUp(); 816 SyncSchedulerTest::SetUp();
925 UseMockDelayProvider(); 817 UseMockDelayProvider();
926 EXPECT_CALL(*delay(), GetDelay(_)) 818 EXPECT_CALL(*delay(), GetDelay(_))
927 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); 819 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1)));
928 } 820 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 Return(true))) 867 Return(true)))
976 .WillRepeatedly(DoAll( 868 .WillRepeatedly(DoAll(
977 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), 869 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed),
978 QuitLoopNowAction())); 870 QuitLoopNowAction()));
979 EXPECT_TRUE(RunAndGetBackoff()); 871 EXPECT_TRUE(RunAndGetBackoff());
980 } 872 }
981 873
982 // Have the syncer fail to get the encryption key yet succeed in downloading 874 // Have the syncer fail to get the encryption key yet succeed in downloading
983 // updates. Expect this will leave the scheduler in backoff. 875 // updates. Expect this will leave the scheduler in backoff.
984 TEST_F(BackoffTriggersSyncSchedulerTest, FailGetEncryptionKey) { 876 TEST_F(BackoffTriggersSyncSchedulerTest, FailGetEncryptionKey) {
985 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) 877 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
986 .WillOnce(DoAll( 878 .WillOnce(DoAll(
987 Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), 879 Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed),
988 Return(true))) 880 Return(true)))
989 .WillRepeatedly(DoAll( 881 .WillRepeatedly(DoAll(
990 Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), 882 Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed),
991 QuitLoopNowAction())); 883 QuitLoopNowAction()));
992 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 884 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
993 885
994 ModelTypeSet types(BOOKMARKS); 886 ModelTypeSet types(BOOKMARKS);
995 CallbackCounter counter; 887 CallbackCounter counter;
996 ConfigurationParams params( 888 ConfigurationParams params(
997 GetUpdatesCallerInfo::RECONFIGURATION, 889 GetUpdatesCallerInfo::RECONFIGURATION,
998 types, 890 types,
999 TypesToRoutingInfo(types), 891 TypesToRoutingInfo(types),
1000 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 892 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
1001 scheduler()->ScheduleConfiguration(params); 893 scheduler()->ScheduleConfiguration(params);
1002 RunLoop(); 894 RunLoop();
1003 895
1004 EXPECT_TRUE(scheduler()->IsBackingOff()); 896 EXPECT_TRUE(scheduler()->IsBackingOff());
1005 } 897 }
1006 898
1007 // Test that no polls or extraneous nudges occur when in backoff. 899 // Test that no polls or extraneous nudges occur when in backoff.
1008 TEST_F(SyncSchedulerTest, BackoffDropsJobs) { 900 TEST_F(SyncSchedulerTest, BackoffDropsJobs) {
1009 SyncShareRecords r; 901 SyncShareTimes times;
1010 TimeDelta poll(TimeDelta::FromMilliseconds(5)); 902 TimeDelta poll(TimeDelta::FromMilliseconds(5));
1011 const ModelTypeSet types(BOOKMARKS); 903 const ModelTypeSet types(BOOKMARKS);
1012 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 904 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
1013 UseMockDelayProvider(); 905 UseMockDelayProvider();
1014 906
1015 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) 907 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
1016 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), 908 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
1017 WithArg<2>(RecordSyncShareMultiple(&r, 1U)))); 909 RecordSyncShareMultiple(&times, 1U)));
1018 EXPECT_CALL(*delay(), GetDelay(_)). 910 EXPECT_CALL(*delay(), GetDelay(_)).
1019 WillRepeatedly(Return(TimeDelta::FromDays(1))); 911 WillRepeatedly(Return(TimeDelta::FromDays(1)));
1020 912
1021 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 913 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1022 914
1023 // This nudge should fail and put us into backoff. Thanks to our mock 915 // This nudge should fail and put us into backoff. Thanks to our mock
1024 // GetDelay() setup above, this will be a long backoff. 916 // GetDelay() setup above, this will be a long backoff.
1025 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); 917 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE);
1026 RunLoop(); 918 RunLoop();
1027 919
920 // From this point forward, no SyncShare functions should be invoked.
1028 Mock::VerifyAndClearExpectations(syncer()); 921 Mock::VerifyAndClearExpectations(syncer());
1029 ASSERT_EQ(1U, r.snapshots.size());
1030 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
1031 r.snapshots[0].source().updates_source);
1032 922
1033 // Wait a while (10x poll interval) so a few poll jobs will be attempted. 923 // Wait a while (10x poll interval) so a few poll jobs will be attempted.
1034 PumpLoopFor(poll * 10); 924 PumpLoopFor(poll * 10);
1035 925
1036 // Try (and fail) to schedule a nudge. 926 // Try (and fail) to schedule a nudge.
1037 scheduler()->ScheduleLocalNudge( 927 scheduler()->ScheduleLocalNudge(
1038 base::TimeDelta::FromMilliseconds(1), 928 base::TimeDelta::FromMilliseconds(1),
1039 types, 929 types,
1040 FROM_HERE); 930 FROM_HERE);
1041 931
1042 Mock::VerifyAndClearExpectations(syncer()); 932 Mock::VerifyAndClearExpectations(syncer());
1043 Mock::VerifyAndClearExpectations(delay()); 933 Mock::VerifyAndClearExpectations(delay());
1044 934
1045 ASSERT_EQ(1U, r.snapshots.size());
1046
1047 EXPECT_CALL(*delay(), GetDelay(_)).Times(0); 935 EXPECT_CALL(*delay(), GetDelay(_)).Times(0);
1048 936
1049 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 937 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
1050 938
1051 CallbackCounter counter; 939 CallbackCounter counter;
1052 ConfigurationParams params( 940 ConfigurationParams params(
1053 GetUpdatesCallerInfo::RECONFIGURATION, 941 GetUpdatesCallerInfo::RECONFIGURATION,
1054 types, 942 types,
1055 TypesToRoutingInfo(types), 943 TypesToRoutingInfo(types),
1056 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 944 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
1057 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); 945 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params));
1058 ASSERT_EQ(0, counter.times_called()); 946 ASSERT_EQ(0, counter.times_called());
1059 } 947 }
1060 948
1061 // Test that backoff is shaping traffic properly with consecutive errors. 949 // Test that backoff is shaping traffic properly with consecutive errors.
1062 TEST_F(SyncSchedulerTest, BackoffElevation) { 950 TEST_F(SyncSchedulerTest, BackoffElevation) {
1063 SyncShareRecords r; 951 SyncShareTimes times;
1064 UseMockDelayProvider(); 952 UseMockDelayProvider();
1065 953
1066 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)).Times(kMinNumSamples) 954 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)).Times(kMinNumSamples)
1067 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), 955 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
1068 WithArg<2>(RecordSyncShareMultiple(&r, kMinNumSamples)))); 956 RecordSyncShareMultiple(&times, kMinNumSamples)));
1069 957
1070 const TimeDelta first = TimeDelta::FromSeconds(kInitialBackoffRetrySeconds); 958 const TimeDelta first = TimeDelta::FromSeconds(kInitialBackoffRetrySeconds);
1071 const TimeDelta second = TimeDelta::FromMilliseconds(2); 959 const TimeDelta second = TimeDelta::FromMilliseconds(2);
1072 const TimeDelta third = TimeDelta::FromMilliseconds(3); 960 const TimeDelta third = TimeDelta::FromMilliseconds(3);
1073 const TimeDelta fourth = TimeDelta::FromMilliseconds(4); 961 const TimeDelta fourth = TimeDelta::FromMilliseconds(4);
1074 const TimeDelta fifth = TimeDelta::FromMilliseconds(5); 962 const TimeDelta fifth = TimeDelta::FromMilliseconds(5);
1075 const TimeDelta sixth = TimeDelta::FromDays(1); 963 const TimeDelta sixth = TimeDelta::FromDays(1);
1076 964
1077 EXPECT_CALL(*delay(), GetDelay(first)).WillOnce(Return(second)) 965 EXPECT_CALL(*delay(), GetDelay(first)).WillOnce(Return(second))
1078 .RetiresOnSaturation(); 966 .RetiresOnSaturation();
1079 EXPECT_CALL(*delay(), GetDelay(second)).WillOnce(Return(third)) 967 EXPECT_CALL(*delay(), GetDelay(second)).WillOnce(Return(third))
1080 .RetiresOnSaturation(); 968 .RetiresOnSaturation();
1081 EXPECT_CALL(*delay(), GetDelay(third)).WillOnce(Return(fourth)) 969 EXPECT_CALL(*delay(), GetDelay(third)).WillOnce(Return(fourth))
1082 .RetiresOnSaturation(); 970 .RetiresOnSaturation();
1083 EXPECT_CALL(*delay(), GetDelay(fourth)).WillOnce(Return(fifth)) 971 EXPECT_CALL(*delay(), GetDelay(fourth)).WillOnce(Return(fifth))
1084 .RetiresOnSaturation(); 972 .RetiresOnSaturation();
1085 EXPECT_CALL(*delay(), GetDelay(fifth)).WillOnce(Return(sixth)); 973 EXPECT_CALL(*delay(), GetDelay(fifth)).WillOnce(Return(sixth));
1086 974
1087 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 975 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1088 976
1089 // Run again with a nudge. 977 // Run again with a nudge.
1090 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); 978 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE);
1091 RunLoop(); 979 RunLoop();
1092 980
1093 ASSERT_EQ(kMinNumSamples, r.snapshots.size()); 981 ASSERT_EQ(kMinNumSamples, times.size());
1094 EXPECT_GE(r.times[1] - r.times[0], second); 982 EXPECT_GE(times[1] - times[0], second);
1095 EXPECT_GE(r.times[2] - r.times[1], third); 983 EXPECT_GE(times[2] - times[1], third);
1096 EXPECT_GE(r.times[3] - r.times[2], fourth); 984 EXPECT_GE(times[3] - times[2], fourth);
1097 EXPECT_GE(r.times[4] - r.times[3], fifth); 985 EXPECT_GE(times[4] - times[3], fifth);
1098 } 986 }
1099 987
1100 // Test that things go back to normal once a retry makes forward progress. 988 // Test that things go back to normal once a retry makes forward progress.
1101 TEST_F(SyncSchedulerTest, BackoffRelief) { 989 TEST_F(SyncSchedulerTest, BackoffRelief) {
1102 SyncShareRecords r; 990 SyncShareTimes times;
1103 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); 991 const TimeDelta poll(TimeDelta::FromMilliseconds(10));
1104 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 992 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
1105 UseMockDelayProvider(); 993 UseMockDelayProvider();
1106 994
1107 const TimeDelta backoff = TimeDelta::FromMilliseconds(5); 995 const TimeDelta backoff = TimeDelta::FromMilliseconds(5);
1108
1109 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
1110 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
1111 WithArg<2>(RecordSyncShareMultiple(&r, kMinNumSamples))))
1112 .WillRepeatedly(DoAll(
1113 Invoke(sessions::test_util::SimulateNormalSuccess),
1114 WithArg<2>(RecordSyncShareMultiple(&r, kMinNumSamples))));
1115 EXPECT_CALL(*syncer(), PollSyncShare(_,_))
1116 .WillRepeatedly(DoAll(
1117 Invoke(sessions::test_util::SimulatePollSuccess),
1118 WithArg<1>(RecordSyncShareMultiple(&r, kMinNumSamples))));
1119 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); 996 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff));
1120 997
1121 // Optimal start for the post-backoff poll party. 998 // Optimal start for the post-backoff poll party.
1122 TimeTicks optimal_start = TimeTicks::Now(); 999 TimeTicks optimal_start = TimeTicks::Now();
1123 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 1000 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1124 1001
1125 // Run again to wait for polling. 1002 // Kick off the test with a failed nudge.
1003 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
1004 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
1005 RecordSyncShare(&times)));
1126 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); 1006 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE);
1127 RunLoop(); 1007 RunLoop();
1008 Mock::VerifyAndClearExpectations(syncer());
1009 TimeTicks optimal_job_time = optimal_start;
1010 ASSERT_EQ(1U, times.size());
1011 EXPECT_GE(times[0], optimal_job_time);
1012
1013 // The retry succeeds.
1014 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_))
1015 .WillOnce(DoAll(
1016 Invoke(sessions::test_util::SimulateNormalSuccess),
1017 RecordSyncShare(&times)));
1018 RunLoop();
1019 Mock::VerifyAndClearExpectations(syncer());
1020 optimal_job_time = optimal_job_time + backoff;
1021 ASSERT_EQ(2U, times.size());
1022 EXPECT_GE(times[1], optimal_job_time);
1023
1024 // Now let the Poll timer do its thing.
1025 EXPECT_CALL(*syncer(), PollSyncShare(_,_))
1026 .WillRepeatedly(DoAll(
1027 Invoke(sessions::test_util::SimulatePollSuccess),
1028 RecordSyncShareMultiple(&times, kMinNumSamples)));
1029 RunLoop();
1030 Mock::VerifyAndClearExpectations(syncer());
1031 ASSERT_EQ(kMinNumSamples, times.size());
1032 for (size_t i = 2; i < times.size(); i++) {
1033 optimal_job_time = optimal_job_time + poll;
1034 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")");
1035 EXPECT_GE(times[i], optimal_job_time);
1036 }
1128 1037
1129 StopSyncScheduler(); 1038 StopSyncScheduler();
1130
1131 EXPECT_EQ(kMinNumSamples, r.times.size());
1132
1133 // The first nudge ran as soon as possible. It failed.
1134 TimeTicks optimal_job_time = optimal_start;
1135 EXPECT_GE(r.times[0], optimal_job_time);
1136 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
1137 r.snapshots[0].source().updates_source);
1138
1139 // It was followed by a successful retry nudge shortly afterward.
1140 optimal_job_time = optimal_job_time + backoff;
1141 EXPECT_GE(r.times[1], optimal_job_time);
1142 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
1143 r.snapshots[1].source().updates_source);
1144 // After that, we went back to polling.
1145 for (size_t i = 2; i < r.snapshots.size(); i++) {
1146 optimal_job_time = optimal_job_time + poll;
1147 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")");
1148 EXPECT_GE(r.times[i], optimal_job_time);
1149 EXPECT_EQ(GetUpdatesCallerInfo::PERIODIC,
1150 r.snapshots[i].source().updates_source);
1151 }
1152 } 1039 }
1153 1040
1154 // Test that poll failures are ignored. They should have no effect on 1041 // Test that poll failures are ignored. They should have no effect on
1155 // subsequent poll attempts, nor should they trigger a backoff/retry. 1042 // subsequent poll attempts, nor should they trigger a backoff/retry.
1156 TEST_F(SyncSchedulerTest, TransientPollFailure) { 1043 TEST_F(SyncSchedulerTest, TransientPollFailure) {
1157 SyncShareRecords r; 1044 SyncShareTimes times;
1158 const TimeDelta poll_interval(TimeDelta::FromMilliseconds(1)); 1045 const TimeDelta poll_interval(TimeDelta::FromMilliseconds(1));
1159 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); 1046 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval);
1160 UseMockDelayProvider(); // Will cause test failure if backoff is initiated. 1047 UseMockDelayProvider(); // Will cause test failure if backoff is initiated.
1161 1048
1162 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) 1049 EXPECT_CALL(*syncer(), PollSyncShare(_,_))
1163 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollFailed), 1050 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollFailed),
1164 WithArg<1>(RecordSyncShare(&r)))) 1051 RecordSyncShare(&times)))
1165 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), 1052 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess),
1166 WithArg<1>(RecordSyncShare(&r)))); 1053 RecordSyncShare(&times)));
1167 1054
1168 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 1055 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1169 1056
1170 // Run the unsucessful poll. The failed poll should not trigger backoff. 1057 // Run the unsucessful poll. The failed poll should not trigger backoff.
1171 RunLoop(); 1058 RunLoop();
1172 EXPECT_FALSE(scheduler()->IsBackingOff()); 1059 EXPECT_FALSE(scheduler()->IsBackingOff());
1173 1060
1174 // Run the successful poll. 1061 // Run the successful poll.
1175 RunLoop(); 1062 RunLoop();
1176 EXPECT_FALSE(scheduler()->IsBackingOff()); 1063 EXPECT_FALSE(scheduler()->IsBackingOff());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 scheduler()->OnConnectionStatusChange(); 1141 scheduler()->OnConnectionStatusChange();
1255 connection()->SetServerReachable(); 1142 connection()->SetServerReachable();
1256 connection()->UpdateConnectionStatus(); 1143 connection()->UpdateConnectionStatus();
1257 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); 1144 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE);
1258 base::MessageLoop::current()->RunUntilIdle(); 1145 base::MessageLoop::current()->RunUntilIdle();
1259 } 1146 }
1260 1147
1261 // Tests that we don't crash trying to run two canaries at once if we receive 1148 // Tests that we don't crash trying to run two canaries at once if we receive
1262 // extra connection status change notifications. See crbug.com/190085. 1149 // extra connection status change notifications. See crbug.com/190085.
1263 TEST_F(SyncSchedulerTest, DoubleCanaryInConfigure) { 1150 TEST_F(SyncSchedulerTest, DoubleCanaryInConfigure) {
1264 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) 1151 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_))
1265 .WillRepeatedly(DoAll( 1152 .WillRepeatedly(DoAll(
1266 Invoke(sessions::test_util::SimulateConfigureConnectionFailure), 1153 Invoke(sessions::test_util::SimulateConfigureConnectionFailure),
1267 Return(true))); 1154 Return(true)));
1268 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 1155 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
1269 connection()->SetServerNotReachable(); 1156 connection()->SetServerNotReachable();
1270 connection()->UpdateConnectionStatus(); 1157 connection()->UpdateConnectionStatus();
1271 1158
1272 ModelTypeSet model_types(BOOKMARKS); 1159 ModelTypeSet model_types(BOOKMARKS);
1273 CallbackCounter counter; 1160 CallbackCounter counter;
1274 ConfigurationParams params( 1161 ConfigurationParams params(
1275 GetUpdatesCallerInfo::RECONFIGURATION, 1162 GetUpdatesCallerInfo::RECONFIGURATION,
1276 model_types, 1163 model_types,
1277 TypesToRoutingInfo(model_types), 1164 TypesToRoutingInfo(model_types),
1278 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 1165 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
1279 scheduler()->ScheduleConfiguration(params); 1166 scheduler()->ScheduleConfiguration(params);
1280 1167
1281 scheduler()->OnConnectionStatusChange(); 1168 scheduler()->OnConnectionStatusChange();
1282 scheduler()->OnConnectionStatusChange(); 1169 scheduler()->OnConnectionStatusChange();
1283 1170
1284 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. 1171 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry.
1285 } 1172 }
1286 1173
1287 TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { 1174 TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) {
1288 SyncShareRecords records; 1175 SyncShareTimes times;
1289 TimeDelta poll(TimeDelta::FromMilliseconds(15)); 1176 TimeDelta poll(TimeDelta::FromMilliseconds(15));
1290 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 1177 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
1291 1178
1292 ::testing::InSequence seq; 1179 ::testing::InSequence seq;
1293 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) 1180 EXPECT_CALL(*syncer(), PollSyncShare(_,_))
1294 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), 1181 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess),
1295 WithArg<1>(RecordSyncShareMultiple(&records, kMinNumSamples)))); 1182 RecordSyncShareMultiple(&times, kMinNumSamples)));
1296 1183
1297 connection()->SetServerStatus(HttpResponse::SYNC_AUTH_ERROR); 1184 connection()->SetServerStatus(HttpResponse::SYNC_AUTH_ERROR);
1298 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 1185 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1299 1186
1300 // Run to wait for polling. 1187 // Run to wait for polling.
1301 RunLoop(); 1188 RunLoop();
1302 1189
1303 // Normally OnCredentialsUpdated calls TryCanaryJob that doesn't run Poll, 1190 // Normally OnCredentialsUpdated calls TryCanaryJob that doesn't run Poll,
1304 // but after poll finished with auth error from poll timer it should retry 1191 // but after poll finished with auth error from poll timer it should retry
1305 // poll once more 1192 // poll once more
1306 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) 1193 EXPECT_CALL(*syncer(), PollSyncShare(_,_))
1307 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), 1194 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess),
1308 WithArg<1>(RecordSyncShare(&records)))); 1195 RecordSyncShare(&times)));
1309 scheduler()->OnCredentialsUpdated(); 1196 scheduler()->OnCredentialsUpdated();
1310 connection()->SetServerStatus(HttpResponse::SERVER_CONNECTION_OK); 1197 connection()->SetServerStatus(HttpResponse::SERVER_CONNECTION_OK);
1311 StopSyncScheduler(); 1198 StopSyncScheduler();
1312 } 1199 }
1313 1200
1314 } // namespace syncer 1201 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/engine/sync_scheduler_impl.cc ('k') | sync/engine/syncer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698