OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/callback.h" | 6 #include "base/callback.h" |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 using base::TimeTicks; | 25 using base::TimeTicks; |
26 using testing::_; | 26 using testing::_; |
27 using testing::AtLeast; | 27 using testing::AtLeast; |
28 using testing::DoAll; | 28 using testing::DoAll; |
29 using testing::Eq; | 29 using testing::Eq; |
30 using testing::Invoke; | 30 using testing::Invoke; |
31 using testing::Mock; | 31 using testing::Mock; |
32 using testing::Not; | 32 using testing::Not; |
33 using testing::Return; | 33 using testing::Return; |
34 using testing::WithArg; | 34 using testing::WithArg; |
| 35 using testing::WithArgs; |
35 | 36 |
36 namespace syncer { | 37 namespace syncer { |
37 using sessions::SyncSession; | 38 using sessions::SyncSession; |
38 using sessions::SyncSessionContext; | 39 using sessions::SyncSessionContext; |
39 using sessions::SyncSessionSnapshot; | 40 using sessions::SyncSessionSnapshot; |
40 using sync_pb::GetUpdatesCallerInfo; | 41 using sync_pb::GetUpdatesCallerInfo; |
41 | 42 |
42 class MockSyncer : public Syncer { | 43 class MockSyncer : public Syncer { |
43 public: | 44 public: |
44 MOCK_METHOD3(SyncShare, bool(sessions::SyncSession*, SyncerStep, | 45 MOCK_METHOD3(NormalSyncShare, bool(sessions::SyncSession*, |
45 SyncerStep)); | 46 ModelTypeSet, |
| 47 const sessions::NudgeTracker&)); |
| 48 MOCK_METHOD2(ConfigureSyncShare, bool(sessions::SyncSession*, ModelTypeSet)); |
| 49 MOCK_METHOD2(PollSyncShare, bool(sessions::SyncSession*, ModelTypeSet)); |
46 }; | 50 }; |
47 | 51 |
48 // Used when tests want to record syncing activity to examine later. | 52 // Used when tests want to record syncing activity to examine later. |
49 struct SyncShareRecords { | 53 struct SyncShareRecords { |
50 std::vector<TimeTicks> times; | 54 std::vector<TimeTicks> times; |
51 std::vector<SyncSessionSnapshot> snapshots; | 55 std::vector<SyncSessionSnapshot> snapshots; |
52 }; | 56 }; |
53 | 57 |
54 void QuitLoopNow() { | 58 void QuitLoopNow() { |
55 // We use QuitNow() instead of Quit() as the latter may get stalled | 59 // We use QuitNow() instead of Quit() as the latter may get stalled |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 ACTION(QuitLoopNowAction) { | 276 ACTION(QuitLoopNowAction) { |
273 QuitLoopNow(); | 277 QuitLoopNow(); |
274 return true; | 278 return true; |
275 } | 279 } |
276 | 280 |
277 // Test nudge scheduling. | 281 // Test nudge scheduling. |
278 TEST_F(SyncSchedulerTest, Nudge) { | 282 TEST_F(SyncSchedulerTest, Nudge) { |
279 SyncShareRecords records; | 283 SyncShareRecords records; |
280 ModelTypeSet model_types(BOOKMARKS); | 284 ModelTypeSet model_types(BOOKMARKS); |
281 | 285 |
282 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 286 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
283 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 287 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
284 WithArg<0>(RecordSyncShare(&records)))) | 288 WithArg<0>(RecordSyncShare(&records)))) |
285 .RetiresOnSaturation(); | 289 .RetiresOnSaturation(); |
286 | 290 |
287 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 291 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
288 | 292 |
289 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); | 293 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); |
290 RunLoop(); | 294 RunLoop(); |
291 | 295 |
292 ASSERT_EQ(1U, records.snapshots.size()); | 296 ASSERT_EQ(1U, records.snapshots.size()); |
293 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 297 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( |
294 model_types, | 298 model_types, |
295 records.snapshots[0].source().types)); | 299 records.snapshots[0].source().types)); |
296 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 300 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
297 records.snapshots[0].source().updates_source); | 301 records.snapshots[0].source().updates_source); |
298 | 302 |
299 Mock::VerifyAndClearExpectations(syncer()); | 303 Mock::VerifyAndClearExpectations(syncer()); |
300 | 304 |
301 // Make sure a second, later, nudge is unaffected by first (no coalescing). | 305 // Make sure a second, later, nudge is unaffected by first (no coalescing). |
302 SyncShareRecords records2; | 306 SyncShareRecords records2; |
303 model_types.Remove(BOOKMARKS); | 307 model_types.Remove(BOOKMARKS); |
304 model_types.Put(AUTOFILL); | 308 model_types.Put(AUTOFILL); |
305 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 309 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
306 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 310 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
307 WithArg<0>(RecordSyncShare(&records2)))); | 311 WithArg<0>(RecordSyncShare(&records2)))); |
308 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); | 312 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); |
309 RunLoop(); | 313 RunLoop(); |
310 | 314 |
311 ASSERT_EQ(1U, records2.snapshots.size()); | 315 ASSERT_EQ(1U, records2.snapshots.size()); |
312 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 316 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( |
313 model_types, | 317 model_types, |
314 records2.snapshots[0].source().types)); | 318 records2.snapshots[0].source().types)); |
315 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 319 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
316 records2.snapshots[0].source().updates_source); | 320 records2.snapshots[0].source().updates_source); |
317 } | 321 } |
318 | 322 |
319 // Make sure a regular config command is scheduled fine in the absence of any | 323 // Make sure a regular config command is scheduled fine in the absence of any |
320 // errors. | 324 // errors. |
321 TEST_F(SyncSchedulerTest, Config) { | 325 TEST_F(SyncSchedulerTest, Config) { |
322 SyncShareRecords records; | 326 SyncShareRecords records; |
323 const ModelTypeSet model_types(BOOKMARKS); | 327 const ModelTypeSet model_types(BOOKMARKS); |
324 | 328 |
325 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 329 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
326 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 330 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
327 WithArg<0>(RecordSyncShare(&records)))); | 331 WithArg<0>(RecordSyncShare(&records)))); |
328 | 332 |
329 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 333 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
330 | 334 |
331 CallbackCounter counter; | 335 CallbackCounter counter; |
332 ConfigurationParams params( | 336 ConfigurationParams params( |
333 GetUpdatesCallerInfo::RECONFIGURATION, | 337 GetUpdatesCallerInfo::RECONFIGURATION, |
334 model_types, | 338 model_types, |
335 TypesToRoutingInfo(model_types), | 339 TypesToRoutingInfo(model_types), |
336 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 340 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
337 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 341 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); |
338 ASSERT_EQ(1, counter.times_called()); | 342 ASSERT_EQ(1, counter.times_called()); |
339 | 343 |
340 ASSERT_EQ(1U, records.snapshots.size()); | 344 ASSERT_EQ(1U, records.snapshots.size()); |
341 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 345 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( |
342 model_types, | 346 model_types, |
343 records.snapshots[0].source().types)); | 347 records.snapshots[0].source().types)); |
344 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 348 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, |
345 records.snapshots[0].source().updates_source); | 349 records.snapshots[0].source().updates_source); |
346 } | 350 } |
347 | 351 |
348 // Simulate a failure and make sure the config request is retried. | 352 // Simulate a failure and make sure the config request is retried. |
349 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { | 353 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { |
350 UseMockDelayProvider(); | 354 UseMockDelayProvider(); |
351 EXPECT_CALL(*delay(), GetDelay(_)) | 355 EXPECT_CALL(*delay(), GetDelay(_)) |
352 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 356 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); |
353 SyncShareRecords records; | 357 SyncShareRecords records; |
354 const ModelTypeSet model_types(BOOKMARKS); | 358 const ModelTypeSet model_types(BOOKMARKS); |
355 | 359 |
356 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 360 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
357 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 361 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed), |
358 WithArg<0>(RecordSyncShare(&records)))) | 362 WithArg<0>(RecordSyncShare(&records)))) |
359 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 363 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
360 WithArg<0>(RecordSyncShare(&records)))); | 364 WithArg<0>(RecordSyncShare(&records)))); |
361 | 365 |
362 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 366 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
363 | 367 |
364 ASSERT_EQ(0U, records.snapshots.size()); | 368 ASSERT_EQ(0U, records.snapshots.size()); |
365 CallbackCounter counter; | 369 CallbackCounter counter; |
366 ConfigurationParams params( | 370 ConfigurationParams params( |
367 GetUpdatesCallerInfo::RECONFIGURATION, | 371 GetUpdatesCallerInfo::RECONFIGURATION, |
368 model_types, | 372 model_types, |
369 TypesToRoutingInfo(model_types), | 373 TypesToRoutingInfo(model_types), |
(...skipping 15 matching lines...) Expand all Loading... |
385 | 389 |
386 // Issue a nudge when the config has failed. Make sure both the config and | 390 // Issue a nudge when the config has failed. Make sure both the config and |
387 // nudge are executed. | 391 // nudge are executed. |
388 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { | 392 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { |
389 const ModelTypeSet model_types(BOOKMARKS); | 393 const ModelTypeSet model_types(BOOKMARKS); |
390 UseMockDelayProvider(); | 394 UseMockDelayProvider(); |
391 EXPECT_CALL(*delay(), GetDelay(_)) | 395 EXPECT_CALL(*delay(), GetDelay(_)) |
392 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(50))); | 396 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(50))); |
393 SyncShareRecords records; | 397 SyncShareRecords records; |
394 | 398 |
395 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 399 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
396 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 400 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed), |
397 WithArg<0>(RecordSyncShare(&records)))) | 401 WithArg<0>(RecordSyncShare(&records)))) |
398 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 402 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed), |
399 WithArg<0>(RecordSyncShare(&records)))) | 403 WithArg<0>(RecordSyncShare(&records)))) |
400 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 404 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
401 WithArg<0>(RecordSyncShare(&records)))) | 405 WithArg<0>(RecordSyncShare(&records)))); |
402 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 406 |
| 407 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
| 408 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
403 WithArg<0>(RecordSyncShare(&records)))); | 409 WithArg<0>(RecordSyncShare(&records)))); |
404 | 410 |
405 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 411 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
406 | 412 |
407 ASSERT_EQ(0U, records.snapshots.size()); | 413 ASSERT_EQ(0U, records.snapshots.size()); |
408 CallbackCounter counter; | 414 CallbackCounter counter; |
409 ConfigurationParams params( | 415 ConfigurationParams params( |
410 GetUpdatesCallerInfo::RECONFIGURATION, | 416 GetUpdatesCallerInfo::RECONFIGURATION, |
411 model_types, | 417 model_types, |
412 TypesToRoutingInfo(model_types), | 418 TypesToRoutingInfo(model_types), |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 453 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
448 records.snapshots[3].source().updates_source); | 454 records.snapshots[3].source().updates_source); |
449 | 455 |
450 } | 456 } |
451 | 457 |
452 // Test that nudges are coalesced. | 458 // Test that nudges are coalesced. |
453 TEST_F(SyncSchedulerTest, NudgeCoalescing) { | 459 TEST_F(SyncSchedulerTest, NudgeCoalescing) { |
454 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 460 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
455 | 461 |
456 SyncShareRecords r; | 462 SyncShareRecords r; |
457 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 463 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
458 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 464 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
459 WithArg<0>(RecordSyncShare(&r)))); | 465 WithArg<0>(RecordSyncShare(&r)))); |
460 const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES); | 466 const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES); |
461 TimeDelta delay = zero(); | 467 TimeDelta delay = zero(); |
462 TimeTicks optimal_time = TimeTicks::Now() + delay; | 468 TimeTicks optimal_time = TimeTicks::Now() + delay; |
463 scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE); | 469 scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE); |
464 scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE); | 470 scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE); |
465 RunLoop(); | 471 RunLoop(); |
466 | 472 |
467 ASSERT_EQ(1U, r.snapshots.size()); | 473 ASSERT_EQ(1U, r.snapshots.size()); |
468 EXPECT_GE(r.times[0], optimal_time); | 474 EXPECT_GE(r.times[0], optimal_time); |
469 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 475 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( |
470 Union(types1, types2), | 476 Union(types1, types2), |
471 r.snapshots[0].source().types)); | 477 r.snapshots[0].source().types)); |
472 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 478 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
473 r.snapshots[0].source().updates_source); | 479 r.snapshots[0].source().updates_source); |
474 | 480 |
475 Mock::VerifyAndClearExpectations(syncer()); | 481 Mock::VerifyAndClearExpectations(syncer()); |
476 | 482 |
477 SyncShareRecords r2; | 483 SyncShareRecords r2; |
478 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 484 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
479 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 485 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
480 WithArg<0>(RecordSyncShare(&r2)))); | 486 WithArg<0>(RecordSyncShare(&r2)))); |
481 scheduler()->ScheduleLocalNudge(zero(), types3, FROM_HERE); | 487 scheduler()->ScheduleLocalNudge(zero(), types3, FROM_HERE); |
482 RunLoop(); | 488 RunLoop(); |
483 | 489 |
484 ASSERT_EQ(1U, r2.snapshots.size()); | 490 ASSERT_EQ(1U, r2.snapshots.size()); |
485 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 491 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( |
486 types3, | 492 types3, |
487 r2.snapshots[0].source().types)); | 493 r2.snapshots[0].source().types)); |
488 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 494 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
489 r2.snapshots[0].source().updates_source); | 495 r2.snapshots[0].source().updates_source); |
490 } | 496 } |
491 | 497 |
492 // Test that nudges are coalesced. | 498 // Test that nudges are coalesced. |
493 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { | 499 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { |
494 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 500 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
495 | 501 |
496 SyncShareRecords r; | 502 SyncShareRecords r; |
497 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 503 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
498 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 504 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
499 WithArg<0>(RecordSyncShare(&r)))); | 505 WithArg<0>(RecordSyncShare(&r)))); |
500 ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3; | 506 ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3; |
501 | 507 |
502 // Create a huge time delay. | 508 // Create a huge time delay. |
503 TimeDelta delay = TimeDelta::FromDays(1); | 509 TimeDelta delay = TimeDelta::FromDays(1); |
504 | 510 |
505 scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE); | 511 scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE); |
506 scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE); | 512 scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE); |
507 | 513 |
508 TimeTicks min_time = TimeTicks::Now(); | 514 TimeTicks min_time = TimeTicks::Now(); |
(...skipping 14 matching lines...) Expand all Loading... |
523 | 529 |
524 // Test nudge scheduling. | 530 // Test nudge scheduling. |
525 TEST_F(SyncSchedulerTest, NudgeWithStates) { | 531 TEST_F(SyncSchedulerTest, NudgeWithStates) { |
526 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 532 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
527 | 533 |
528 SyncShareRecords records; | 534 SyncShareRecords records; |
529 const ModelTypeSet types(BOOKMARKS); | 535 const ModelTypeSet types(BOOKMARKS); |
530 ModelTypeInvalidationMap invalidation_map = | 536 ModelTypeInvalidationMap invalidation_map = |
531 ModelTypeSetToInvalidationMap(types, "test"); | 537 ModelTypeSetToInvalidationMap(types, "test"); |
532 | 538 |
533 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 539 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
534 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 540 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
535 WithArg<0>(RecordSyncShare(&records)))) | 541 WithArg<0>(RecordSyncShare(&records)))) |
536 .RetiresOnSaturation(); | 542 .RetiresOnSaturation(); |
537 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); | 543 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); |
538 RunLoop(); | 544 RunLoop(); |
539 | 545 |
540 ASSERT_EQ(1U, records.snapshots.size()); | 546 ASSERT_EQ(1U, records.snapshots.size()); |
541 EXPECT_THAT(invalidation_map, Eq(records.snapshots[0].source().types)); | 547 EXPECT_THAT(invalidation_map, Eq(records.snapshots[0].source().types)); |
542 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, | 548 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, |
543 records.snapshots[0].source().updates_source); | 549 records.snapshots[0].source().updates_source); |
544 | 550 |
545 Mock::VerifyAndClearExpectations(syncer()); | 551 Mock::VerifyAndClearExpectations(syncer()); |
546 | 552 |
547 // Make sure a second, later, nudge is unaffected by first (no coalescing). | 553 // Make sure a second, later, nudge is unaffected by first (no coalescing). |
548 SyncShareRecords records2; | 554 SyncShareRecords records2; |
549 invalidation_map.erase(BOOKMARKS); | 555 invalidation_map.erase(BOOKMARKS); |
550 invalidation_map[AUTOFILL].payload = "test2"; | 556 invalidation_map[AUTOFILL].payload = "test2"; |
551 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 557 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
552 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 558 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
553 WithArg<0>(RecordSyncShare(&records2)))); | 559 WithArg<0>(RecordSyncShare(&records2)))); |
554 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); | 560 scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); |
555 RunLoop(); | 561 RunLoop(); |
556 | 562 |
557 ASSERT_EQ(1U, records2.snapshots.size()); | 563 ASSERT_EQ(1U, records2.snapshots.size()); |
558 EXPECT_THAT(invalidation_map, Eq(records2.snapshots[0].source().types)); | 564 EXPECT_THAT(invalidation_map, Eq(records2.snapshots[0].source().types)); |
559 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, | 565 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, |
560 records2.snapshots[0].source().updates_source); | 566 records2.snapshots[0].source().updates_source); |
561 } | 567 } |
562 | 568 |
563 // Test that polling works as expected. | 569 // Test that polling works as expected. |
564 TEST_F(SyncSchedulerTest, Polling) { | 570 TEST_F(SyncSchedulerTest, Polling) { |
565 SyncShareRecords records; | 571 SyncShareRecords records; |
566 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); | 572 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
567 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) | 573 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
568 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 574 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
569 WithArg<0>(RecordSyncShareMultiple(&records, kMinNumSamples)))); | 575 WithArg<0>(RecordSyncShareMultiple(&records, kMinNumSamples)))); |
570 | 576 |
571 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); | 577 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
572 | 578 |
573 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; | 579 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
574 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 580 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
575 | 581 |
576 // Run again to wait for polling. | 582 // Run again to wait for polling. |
577 RunLoop(); | 583 RunLoop(); |
578 | 584 |
579 StopSyncScheduler(); | 585 StopSyncScheduler(); |
580 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); | 586 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); |
581 } | 587 } |
582 | 588 |
583 // Test that the short poll interval is used. | 589 // Test that the short poll interval is used. |
584 TEST_F(SyncSchedulerTest, PollNotificationsDisabled) { | 590 TEST_F(SyncSchedulerTest, PollNotificationsDisabled) { |
585 SyncShareRecords records; | 591 SyncShareRecords records; |
586 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); | 592 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
587 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) | 593 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
588 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 594 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
589 WithArg<0>(RecordSyncShareMultiple(&records, kMinNumSamples)))); | 595 WithArg<0>(RecordSyncShareMultiple(&records, kMinNumSamples)))); |
590 | 596 |
591 scheduler()->OnReceivedShortPollIntervalUpdate(poll_interval); | 597 scheduler()->OnReceivedShortPollIntervalUpdate(poll_interval); |
592 scheduler()->SetNotificationsEnabled(false); | 598 scheduler()->SetNotificationsEnabled(false); |
593 | 599 |
594 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; | 600 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
595 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 601 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
596 | 602 |
597 // Run again to wait for polling. | 603 // Run again to wait for polling. |
598 RunLoop(); | 604 RunLoop(); |
599 | 605 |
600 StopSyncScheduler(); | 606 StopSyncScheduler(); |
601 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); | 607 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll_interval); |
602 } | 608 } |
603 | 609 |
604 // Test that polling intervals are updated when needed. | 610 // Test that polling intervals are updated when needed. |
605 TEST_F(SyncSchedulerTest, PollIntervalUpdate) { | 611 TEST_F(SyncSchedulerTest, PollIntervalUpdate) { |
606 SyncShareRecords records; | 612 SyncShareRecords records; |
607 TimeDelta poll1(TimeDelta::FromMilliseconds(120)); | 613 TimeDelta poll1(TimeDelta::FromMilliseconds(120)); |
608 TimeDelta poll2(TimeDelta::FromMilliseconds(30)); | 614 TimeDelta poll2(TimeDelta::FromMilliseconds(30)); |
609 scheduler()->OnReceivedLongPollIntervalUpdate(poll1); | 615 scheduler()->OnReceivedLongPollIntervalUpdate(poll1); |
610 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) | 616 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
611 .WillOnce(DoAll( | 617 .WillOnce(DoAll( |
612 WithArg<0>( | 618 WithArgs<0,1>( |
613 sessions::test_util::SimulatePollIntervalUpdate(poll2)), | 619 sessions::test_util::SimulatePollIntervalUpdate(poll2)), |
614 Return(true))) | 620 Return(true))) |
615 .WillRepeatedly( | 621 .WillRepeatedly( |
616 DoAll(Invoke(sessions::test_util::SimulateSuccess), | 622 DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
617 WithArg<0>( | 623 WithArg<0>( |
618 RecordSyncShareMultiple(&records, kMinNumSamples)))); | 624 RecordSyncShareMultiple(&records, kMinNumSamples)))); |
619 | 625 |
620 TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2; | 626 TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2; |
621 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 627 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
622 | 628 |
623 // Run again to wait for polling. | 629 // Run again to wait for polling. |
624 RunLoop(); | 630 RunLoop(); |
625 | 631 |
626 StopSyncScheduler(); | 632 StopSyncScheduler(); |
627 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll2); | 633 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll2); |
628 } | 634 } |
629 | 635 |
630 // Test that the sessions commit delay is updated when needed. | 636 // Test that the sessions commit delay is updated when needed. |
631 TEST_F(SyncSchedulerTest, SessionsCommitDelay) { | 637 TEST_F(SyncSchedulerTest, SessionsCommitDelay) { |
632 SyncShareRecords records; | 638 SyncShareRecords records; |
633 TimeDelta delay1(TimeDelta::FromMilliseconds(120)); | 639 TimeDelta delay1(TimeDelta::FromMilliseconds(120)); |
634 TimeDelta delay2(TimeDelta::FromMilliseconds(30)); | 640 TimeDelta delay2(TimeDelta::FromMilliseconds(30)); |
635 scheduler()->OnReceivedSessionsCommitDelay(delay1); | 641 scheduler()->OnReceivedSessionsCommitDelay(delay1); |
636 | 642 |
637 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 643 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
638 .WillOnce( | 644 .WillOnce( |
639 DoAll( | 645 DoAll( |
640 WithArg<0>( | 646 WithArgs<0,1,2>( |
641 sessions::test_util::SimulateSessionsCommitDelayUpdate( | 647 sessions::test_util::SimulateSessionsCommitDelayUpdate( |
642 delay2)), | 648 delay2)), |
643 Invoke(sessions::test_util::SimulateSuccess), | 649 Invoke(sessions::test_util::SimulateNormalSuccess), |
644 QuitLoopNowAction())); | 650 QuitLoopNowAction())); |
645 | 651 |
646 EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); | 652 EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); |
647 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 653 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
648 | 654 |
649 EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); | 655 EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); |
650 const ModelTypeSet model_types(BOOKMARKS); | 656 const ModelTypeSet model_types(BOOKMARKS); |
651 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); | 657 scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); |
652 RunLoop(); | 658 RunLoop(); |
653 | 659 |
654 EXPECT_EQ(delay2, scheduler()->GetSessionsCommitDelay()); | 660 EXPECT_EQ(delay2, scheduler()->GetSessionsCommitDelay()); |
655 StopSyncScheduler(); | 661 StopSyncScheduler(); |
656 } | 662 } |
657 | 663 |
658 // Test that no syncing occurs when throttled. | 664 // Test that no syncing occurs when throttled. |
659 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { | 665 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { |
660 const ModelTypeSet types(BOOKMARKS); | 666 const ModelTypeSet types(BOOKMARKS); |
661 TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 667 TimeDelta poll(TimeDelta::FromMilliseconds(5)); |
662 TimeDelta throttle(TimeDelta::FromMinutes(10)); | 668 TimeDelta throttle(TimeDelta::FromMinutes(10)); |
663 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 669 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
664 | 670 |
665 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 671 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
666 .WillOnce(DoAll( | 672 .WillOnce(DoAll( |
667 WithArg<0>(sessions::test_util::SimulateThrottled(throttle)), | 673 WithArg<0>(sessions::test_util::SimulateThrottled(throttle)), |
668 Return(true))) | 674 Return(true))) |
669 .WillRepeatedly(AddFailureAndQuitLoopNow()); | 675 .WillRepeatedly(AddFailureAndQuitLoopNow()); |
670 | 676 |
671 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 677 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
672 | 678 |
673 scheduler()->ScheduleLocalNudge( | 679 scheduler()->ScheduleLocalNudge( |
674 TimeDelta::FromMicroseconds(1), types, FROM_HERE); | 680 TimeDelta::FromMicroseconds(1), types, FROM_HERE); |
675 PumpLoop(); | 681 PumpLoop(); |
(...skipping 10 matching lines...) Expand all Loading... |
686 ASSERT_EQ(0, counter.times_called()); | 692 ASSERT_EQ(0, counter.times_called()); |
687 } | 693 } |
688 | 694 |
689 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromPoll) { | 695 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromPoll) { |
690 SyncShareRecords records; | 696 SyncShareRecords records; |
691 TimeDelta poll(TimeDelta::FromMilliseconds(15)); | 697 TimeDelta poll(TimeDelta::FromMilliseconds(15)); |
692 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); | 698 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); |
693 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 699 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
694 | 700 |
695 ::testing::InSequence seq; | 701 ::testing::InSequence seq; |
696 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 702 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
697 .WillOnce(DoAll( | 703 .WillOnce(DoAll( |
698 WithArg<0>(sessions::test_util::SimulateThrottled(throttle1)), | 704 WithArg<0>(sessions::test_util::SimulateThrottled(throttle1)), |
699 Return(true))) | 705 Return(true))) |
700 .RetiresOnSaturation(); | 706 .RetiresOnSaturation(); |
701 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 707 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
702 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 708 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
703 WithArg<0>(RecordSyncShareMultiple(&records, kMinNumSamples)))); | 709 WithArg<0>(RecordSyncShareMultiple(&records, kMinNumSamples)))); |
704 | 710 |
705 TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; | 711 TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; |
706 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 712 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
707 | 713 |
708 // Run again to wait for polling. | 714 // Run again to wait for polling. |
709 RunLoop(); | 715 RunLoop(); |
710 | 716 |
711 StopSyncScheduler(); | 717 StopSyncScheduler(); |
712 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); | 718 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); |
713 } | 719 } |
714 | 720 |
715 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromNudge) { | 721 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromNudge) { |
716 SyncShareRecords records; | 722 SyncShareRecords records; |
717 TimeDelta poll(TimeDelta::FromDays(1)); | 723 TimeDelta poll(TimeDelta::FromDays(1)); |
718 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); | 724 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); |
719 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 725 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
720 | 726 |
721 ::testing::InSequence seq; | 727 ::testing::InSequence seq; |
722 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 728 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
723 .WillOnce(DoAll( | 729 .WillOnce(DoAll( |
724 WithArg<0>(sessions::test_util::SimulateThrottled(throttle1)), | 730 WithArg<0>(sessions::test_util::SimulateThrottled(throttle1)), |
725 Return(true))) | 731 Return(true))) |
726 .RetiresOnSaturation(); | 732 .RetiresOnSaturation(); |
727 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 733 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
728 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 734 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
729 QuitLoopNowAction())); | 735 QuitLoopNowAction())); |
730 | 736 |
731 const ModelTypeSet types(BOOKMARKS); | 737 const ModelTypeSet types(BOOKMARKS); |
732 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 738 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
733 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); | 739 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); |
734 | 740 |
735 PumpLoop(); | 741 PumpLoop(); |
736 EXPECT_TRUE(scheduler()->IsCurrentlyThrottled()); | 742 EXPECT_TRUE(scheduler()->IsCurrentlyThrottled()); |
737 RunLoop(); | 743 RunLoop(); |
738 EXPECT_FALSE(scheduler()->IsCurrentlyThrottled()); | 744 EXPECT_FALSE(scheduler()->IsCurrentlyThrottled()); |
739 | 745 |
740 StopSyncScheduler(); | 746 StopSyncScheduler(); |
741 } | 747 } |
742 | 748 |
743 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromConfigure) { | 749 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromConfigure) { |
744 SyncShareRecords records; | 750 SyncShareRecords records; |
745 TimeDelta poll(TimeDelta::FromDays(1)); | 751 TimeDelta poll(TimeDelta::FromDays(1)); |
746 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); | 752 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); |
747 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 753 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
748 | 754 |
749 ::testing::InSequence seq; | 755 ::testing::InSequence seq; |
750 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 756 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
751 .WillOnce(DoAll( | 757 .WillOnce(DoAll( |
752 WithArg<0>(sessions::test_util::SimulateThrottled(throttle1)), | 758 WithArg<0>(sessions::test_util::SimulateThrottled(throttle1)), |
753 Return(true))) | 759 Return(true))) |
754 .RetiresOnSaturation(); | 760 .RetiresOnSaturation(); |
755 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 761 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
756 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 762 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
757 QuitLoopNowAction())); | 763 QuitLoopNowAction())); |
758 | 764 |
759 const ModelTypeSet types(BOOKMARKS); | 765 const ModelTypeSet types(BOOKMARKS); |
760 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 766 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
761 | 767 |
762 CallbackCounter counter; | 768 CallbackCounter counter; |
763 ConfigurationParams params( | 769 ConfigurationParams params( |
764 GetUpdatesCallerInfo::RECONFIGURATION, | 770 GetUpdatesCallerInfo::RECONFIGURATION, |
765 types, | 771 types, |
766 TypesToRoutingInfo(types), | 772 TypesToRoutingInfo(types), |
(...skipping 13 matching lines...) Expand all Loading... |
780 EXPECT_CALL(*delay(), GetDelay(_)) | 786 EXPECT_CALL(*delay(), GetDelay(_)) |
781 .WillRepeatedly(Return(zero())); | 787 .WillRepeatedly(Return(zero())); |
782 | 788 |
783 TimeDelta poll(TimeDelta::FromDays(1)); | 789 TimeDelta poll(TimeDelta::FromDays(1)); |
784 TimeDelta throttle1(TimeDelta::FromSeconds(60)); | 790 TimeDelta throttle1(TimeDelta::FromSeconds(60)); |
785 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 791 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
786 | 792 |
787 const ModelTypeSet types(BOOKMARKS); | 793 const ModelTypeSet types(BOOKMARKS); |
788 | 794 |
789 ::testing::InSequence seq; | 795 ::testing::InSequence seq; |
790 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 796 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
791 .WillOnce(DoAll( | 797 .WillOnce(DoAll( |
792 WithArg<0>( | 798 WithArg<0>( |
793 sessions::test_util::SimulateTypesThrottled(types, throttle1)), | 799 sessions::test_util::SimulateTypesThrottled(types, throttle1)), |
794 Return(true))) | 800 Return(true))) |
795 .RetiresOnSaturation(); | 801 .RetiresOnSaturation(); |
796 | 802 |
797 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 803 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
798 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); | 804 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); |
799 PumpLoop(); | 805 PumpLoop(); |
800 EXPECT_TRUE(GetThrottledTypes().HasAll(types)); | 806 EXPECT_TRUE(GetThrottledTypes().HasAll(types)); |
(...skipping 12 matching lines...) Expand all Loading... |
813 | 819 |
814 SyncShareRecords records; | 820 SyncShareRecords records; |
815 TimeDelta poll(TimeDelta::FromDays(1)); | 821 TimeDelta poll(TimeDelta::FromDays(1)); |
816 TimeDelta throttle1(TimeDelta::FromSeconds(60)); | 822 TimeDelta throttle1(TimeDelta::FromSeconds(60)); |
817 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 823 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
818 | 824 |
819 const ModelTypeSet throttled_types(BOOKMARKS); | 825 const ModelTypeSet throttled_types(BOOKMARKS); |
820 const ModelTypeSet unthrottled_types(PREFERENCES); | 826 const ModelTypeSet unthrottled_types(PREFERENCES); |
821 | 827 |
822 ::testing::InSequence seq; | 828 ::testing::InSequence seq; |
823 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 829 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
824 .WillOnce(DoAll( | 830 .WillOnce(DoAll( |
825 WithArg<0>( | 831 WithArg<0>( |
826 sessions::test_util::SimulateTypesThrottled( | 832 sessions::test_util::SimulateTypesThrottled( |
827 throttled_types, throttle1)), | 833 throttled_types, throttle1)), |
828 Return(true))) | 834 Return(true))) |
829 .RetiresOnSaturation(); | 835 .RetiresOnSaturation(); |
830 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 836 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
831 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 837 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
832 WithArg<0>(RecordSyncShare(&records)))); | 838 WithArg<0>(RecordSyncShare(&records)))); |
833 | 839 |
834 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 840 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
835 scheduler()->ScheduleLocalNudge(zero(), throttled_types, FROM_HERE); | 841 scheduler()->ScheduleLocalNudge(zero(), throttled_types, FROM_HERE); |
836 PumpLoop(); | 842 PumpLoop(); |
837 EXPECT_EQ(0U, records.snapshots.size()); | 843 EXPECT_EQ(0U, records.snapshots.size()); |
838 EXPECT_TRUE(GetThrottledTypes().HasAll(throttled_types)); | 844 EXPECT_TRUE(GetThrottledTypes().HasAll(throttled_types)); |
839 | 845 |
840 // Ignore invalidations for throttled types. | 846 // Ignore invalidations for throttled types. |
841 ModelTypeInvalidationMap invalidation_map = | 847 ModelTypeInvalidationMap invalidation_map = |
(...skipping 13 matching lines...) Expand all Loading... |
855 EXPECT_EQ(1U, records.snapshots.size()); | 861 EXPECT_EQ(1U, records.snapshots.size()); |
856 | 862 |
857 StopSyncScheduler(); | 863 StopSyncScheduler(); |
858 } | 864 } |
859 | 865 |
860 // Test nudges / polls don't run in config mode and config tasks do. | 866 // Test nudges / polls don't run in config mode and config tasks do. |
861 TEST_F(SyncSchedulerTest, ConfigurationMode) { | 867 TEST_F(SyncSchedulerTest, ConfigurationMode) { |
862 TimeDelta poll(TimeDelta::FromMilliseconds(15)); | 868 TimeDelta poll(TimeDelta::FromMilliseconds(15)); |
863 SyncShareRecords records; | 869 SyncShareRecords records; |
864 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 870 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
865 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 871 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
866 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 872 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
867 WithArg<0>(RecordSyncShare(&records)))) | 873 WithArg<0>(RecordSyncShare(&records)))) |
868 .RetiresOnSaturation(); | 874 .RetiresOnSaturation(); |
869 | 875 |
870 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 876 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
871 | 877 |
872 const ModelTypeSet nudge_types(AUTOFILL); | 878 const ModelTypeSet nudge_types(AUTOFILL); |
873 scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); | 879 scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); |
874 scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); | 880 scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); |
875 | 881 |
876 const ModelTypeSet config_types(BOOKMARKS); | 882 const ModelTypeSet config_types(BOOKMARKS); |
(...skipping 10 matching lines...) Expand all Loading... |
887 ASSERT_EQ(1U, records.snapshots.size()); | 893 ASSERT_EQ(1U, records.snapshots.size()); |
888 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 894 EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( |
889 config_types, | 895 config_types, |
890 records.snapshots[0].source().types)); | 896 records.snapshots[0].source().types)); |
891 | 897 |
892 // Switch to NORMAL_MODE to ensure NUDGES were properly saved and run. | 898 // Switch to NORMAL_MODE to ensure NUDGES were properly saved and run. |
893 // SyncSchedulerWhiteboxTest also provides coverage for this, but much | 899 // SyncSchedulerWhiteboxTest also provides coverage for this, but much |
894 // more targeted ('whitebox' style). | 900 // more targeted ('whitebox' style). |
895 scheduler()->OnReceivedLongPollIntervalUpdate(TimeDelta::FromDays(1)); | 901 scheduler()->OnReceivedLongPollIntervalUpdate(TimeDelta::FromDays(1)); |
896 SyncShareRecords records2; | 902 SyncShareRecords records2; |
897 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 903 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
898 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 904 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
899 WithArg<0>(RecordSyncShare(&records2)))); | 905 WithArg<0>(RecordSyncShare(&records2)))); |
900 | 906 |
901 // TODO(tim): Figure out how to remove this dangerous need to reset | 907 // TODO(tim): Figure out how to remove this dangerous need to reset |
902 // routing info between mode switches. | 908 // routing info between mode switches. |
903 context()->set_routing_info(routing_info()); | 909 context()->set_routing_info(routing_info()); |
904 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 910 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
905 | 911 |
906 ASSERT_EQ(1U, records2.snapshots.size()); | 912 ASSERT_EQ(1U, records2.snapshots.size()); |
907 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 913 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
908 records2.snapshots[0].source().updates_source); | 914 records2.snapshots[0].source().updates_source); |
(...skipping 13 matching lines...) Expand all Loading... |
922 | 928 |
923 virtual void TearDown() { | 929 virtual void TearDown() { |
924 StopSyncScheduler(); | 930 StopSyncScheduler(); |
925 SyncSchedulerTest::TearDown(); | 931 SyncSchedulerTest::TearDown(); |
926 } | 932 } |
927 }; | 933 }; |
928 | 934 |
929 // Have the sycner fail during commit. Expect that the scheduler enters | 935 // Have the sycner fail during commit. Expect that the scheduler enters |
930 // backoff. | 936 // backoff. |
931 TEST_F(BackoffTriggersSyncSchedulerTest, FailCommitOnce) { | 937 TEST_F(BackoffTriggersSyncSchedulerTest, FailCommitOnce) { |
932 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 938 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
933 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 939 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
934 QuitLoopNowAction())); | 940 QuitLoopNowAction())); |
935 EXPECT_TRUE(RunAndGetBackoff()); | 941 EXPECT_TRUE(RunAndGetBackoff()); |
936 } | 942 } |
937 | 943 |
938 // Have the syncer fail during download updates and succeed on the first | 944 // Have the syncer fail during download updates and succeed on the first |
939 // retry. Expect that this clears the backoff state. | 945 // retry. Expect that this clears the backoff state. |
940 TEST_F(BackoffTriggersSyncSchedulerTest, FailDownloadOnceThenSucceed) { | 946 TEST_F(BackoffTriggersSyncSchedulerTest, FailDownloadOnceThenSucceed) { |
941 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 947 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
942 .WillOnce(DoAll( | 948 .WillOnce(DoAll( |
943 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), | 949 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
944 Return(true))) | 950 Return(true))) |
945 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 951 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
946 QuitLoopNowAction())); | 952 QuitLoopNowAction())); |
947 EXPECT_FALSE(RunAndGetBackoff()); | 953 EXPECT_FALSE(RunAndGetBackoff()); |
948 } | 954 } |
949 | 955 |
950 // Have the syncer fail during commit and succeed on the first retry. Expect | 956 // Have the syncer fail during commit and succeed on the first retry. Expect |
951 // that this clears the backoff state. | 957 // that this clears the backoff state. |
952 TEST_F(BackoffTriggersSyncSchedulerTest, FailCommitOnceThenSucceed) { | 958 TEST_F(BackoffTriggersSyncSchedulerTest, FailCommitOnceThenSucceed) { |
953 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 959 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
954 .WillOnce(DoAll( | 960 .WillOnce(DoAll( |
955 Invoke(sessions::test_util::SimulateCommitFailed), | 961 Invoke(sessions::test_util::SimulateCommitFailed), |
956 Return(true))) | 962 Return(true))) |
957 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 963 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
958 QuitLoopNowAction())); | 964 QuitLoopNowAction())); |
959 EXPECT_FALSE(RunAndGetBackoff()); | 965 EXPECT_FALSE(RunAndGetBackoff()); |
960 } | 966 } |
961 | 967 |
962 // Have the syncer fail to download updates and fail again on the retry. | 968 // Have the syncer fail to download updates and fail again on the retry. |
963 // Expect this will leave the scheduler in backoff. | 969 // Expect this will leave the scheduler in backoff. |
964 TEST_F(BackoffTriggersSyncSchedulerTest, FailDownloadTwice) { | 970 TEST_F(BackoffTriggersSyncSchedulerTest, FailDownloadTwice) { |
965 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 971 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
966 .WillOnce(DoAll( | 972 .WillOnce(DoAll( |
967 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), | 973 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
968 Return(true))) | 974 Return(true))) |
969 .WillRepeatedly(DoAll( | 975 .WillRepeatedly(DoAll( |
970 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), | 976 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
971 QuitLoopNowAction())); | 977 QuitLoopNowAction())); |
972 EXPECT_TRUE(RunAndGetBackoff()); | 978 EXPECT_TRUE(RunAndGetBackoff()); |
973 } | 979 } |
974 | 980 |
975 // Have the syncer fail to get the encryption key yet succeed in downloading | 981 // Have the syncer fail to get the encryption key yet succeed in downloading |
976 // updates. Expect this will leave the scheduler in backoff. | 982 // updates. Expect this will leave the scheduler in backoff. |
977 TEST_F(BackoffTriggersSyncSchedulerTest, FailGetEncryptionKey) { | 983 TEST_F(BackoffTriggersSyncSchedulerTest, FailGetEncryptionKey) { |
978 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 984 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
979 .WillOnce(DoAll( | 985 .WillOnce(DoAll( |
980 Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), | 986 Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), |
981 Return(true))) | 987 Return(true))) |
982 .WillRepeatedly(DoAll( | 988 .WillRepeatedly(DoAll( |
983 Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), | 989 Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), |
984 QuitLoopNowAction())); | 990 QuitLoopNowAction())); |
985 EXPECT_TRUE(RunAndGetBackoff()); | 991 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
| 992 |
| 993 ModelTypeSet types(BOOKMARKS); |
| 994 CallbackCounter counter; |
| 995 ConfigurationParams params( |
| 996 GetUpdatesCallerInfo::RECONFIGURATION, |
| 997 types, |
| 998 TypesToRoutingInfo(types), |
| 999 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
| 1000 scheduler()->ScheduleConfiguration(params); |
| 1001 RunLoop(); |
| 1002 |
| 1003 EXPECT_TRUE(scheduler()->IsBackingOff()); |
986 } | 1004 } |
987 | 1005 |
988 // Test that no polls or extraneous nudges occur when in backoff. | 1006 // Test that no polls or extraneous nudges occur when in backoff. |
989 TEST_F(SyncSchedulerTest, BackoffDropsJobs) { | 1007 TEST_F(SyncSchedulerTest, BackoffDropsJobs) { |
990 SyncShareRecords r; | 1008 SyncShareRecords r; |
991 TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 1009 TimeDelta poll(TimeDelta::FromMilliseconds(5)); |
992 const ModelTypeSet types(BOOKMARKS); | 1010 const ModelTypeSet types(BOOKMARKS); |
993 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 1011 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
994 UseMockDelayProvider(); | 1012 UseMockDelayProvider(); |
995 | 1013 |
996 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1014 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
997 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 1015 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
998 RecordSyncShareMultiple(&r, 1U))); | 1016 RecordSyncShareMultiple(&r, 1U))); |
999 EXPECT_CALL(*delay(), GetDelay(_)). | 1017 EXPECT_CALL(*delay(), GetDelay(_)). |
1000 WillRepeatedly(Return(TimeDelta::FromDays(1))); | 1018 WillRepeatedly(Return(TimeDelta::FromDays(1))); |
1001 | 1019 |
1002 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1020 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
1003 | 1021 |
1004 // This nudge should fail and put us into backoff. Thanks to our mock | 1022 // This nudge should fail and put us into backoff. Thanks to our mock |
1005 // GetDelay() setup above, this will be a long backoff. | 1023 // GetDelay() setup above, this will be a long backoff. |
1006 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); | 1024 scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); |
(...skipping 30 matching lines...) Expand all Loading... |
1037 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 1055 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
1038 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); | 1056 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); |
1039 ASSERT_EQ(0, counter.times_called()); | 1057 ASSERT_EQ(0, counter.times_called()); |
1040 } | 1058 } |
1041 | 1059 |
1042 // Test that backoff is shaping traffic properly with consecutive errors. | 1060 // Test that backoff is shaping traffic properly with consecutive errors. |
1043 TEST_F(SyncSchedulerTest, BackoffElevation) { | 1061 TEST_F(SyncSchedulerTest, BackoffElevation) { |
1044 SyncShareRecords r; | 1062 SyncShareRecords r; |
1045 UseMockDelayProvider(); | 1063 UseMockDelayProvider(); |
1046 | 1064 |
1047 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(kMinNumSamples) | 1065 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)).Times(kMinNumSamples) |
1048 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 1066 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
1049 RecordSyncShareMultiple(&r, kMinNumSamples))); | 1067 RecordSyncShareMultiple(&r, kMinNumSamples))); |
1050 | 1068 |
1051 const TimeDelta first = TimeDelta::FromSeconds(kInitialBackoffRetrySeconds); | 1069 const TimeDelta first = TimeDelta::FromSeconds(kInitialBackoffRetrySeconds); |
1052 const TimeDelta second = TimeDelta::FromMilliseconds(2); | 1070 const TimeDelta second = TimeDelta::FromMilliseconds(2); |
1053 const TimeDelta third = TimeDelta::FromMilliseconds(3); | 1071 const TimeDelta third = TimeDelta::FromMilliseconds(3); |
1054 const TimeDelta fourth = TimeDelta::FromMilliseconds(4); | 1072 const TimeDelta fourth = TimeDelta::FromMilliseconds(4); |
1055 const TimeDelta fifth = TimeDelta::FromMilliseconds(5); | 1073 const TimeDelta fifth = TimeDelta::FromMilliseconds(5); |
1056 const TimeDelta sixth = TimeDelta::FromDays(1); | 1074 const TimeDelta sixth = TimeDelta::FromDays(1); |
1057 | 1075 |
(...skipping 22 matching lines...) Expand all Loading... |
1080 | 1098 |
1081 // Test that things go back to normal once a retry makes forward progress. | 1099 // Test that things go back to normal once a retry makes forward progress. |
1082 TEST_F(SyncSchedulerTest, BackoffRelief) { | 1100 TEST_F(SyncSchedulerTest, BackoffRelief) { |
1083 SyncShareRecords r; | 1101 SyncShareRecords r; |
1084 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); | 1102 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); |
1085 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 1103 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
1086 UseMockDelayProvider(); | 1104 UseMockDelayProvider(); |
1087 | 1105 |
1088 const TimeDelta backoff = TimeDelta::FromMilliseconds(5); | 1106 const TimeDelta backoff = TimeDelta::FromMilliseconds(5); |
1089 | 1107 |
1090 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1108 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
1091 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 1109 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
1092 RecordSyncShareMultiple(&r, kMinNumSamples))) | 1110 RecordSyncShareMultiple(&r, kMinNumSamples))) |
1093 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1111 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
| 1112 RecordSyncShareMultiple(&r, kMinNumSamples))); |
| 1113 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
| 1114 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
1094 RecordSyncShareMultiple(&r, kMinNumSamples))); | 1115 RecordSyncShareMultiple(&r, kMinNumSamples))); |
1095 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); | 1116 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); |
1096 | 1117 |
1097 // Optimal start for the post-backoff poll party. | 1118 // Optimal start for the post-backoff poll party. |
1098 TimeTicks optimal_start = TimeTicks::Now(); | 1119 TimeTicks optimal_start = TimeTicks::Now(); |
1099 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1120 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
1100 | 1121 |
1101 // Run again to wait for polling. | 1122 // Run again to wait for polling. |
1102 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 1123 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); |
1103 RunLoop(); | 1124 RunLoop(); |
(...skipping 24 matching lines...) Expand all Loading... |
1128 } | 1149 } |
1129 | 1150 |
1130 // Test that poll failures are ignored. They should have no effect on | 1151 // Test that poll failures are ignored. They should have no effect on |
1131 // subsequent poll attempts, nor should they trigger a backoff/retry. | 1152 // subsequent poll attempts, nor should they trigger a backoff/retry. |
1132 TEST_F(SyncSchedulerTest, TransientPollFailure) { | 1153 TEST_F(SyncSchedulerTest, TransientPollFailure) { |
1133 SyncShareRecords r; | 1154 SyncShareRecords r; |
1134 const TimeDelta poll_interval(TimeDelta::FromMilliseconds(1)); | 1155 const TimeDelta poll_interval(TimeDelta::FromMilliseconds(1)); |
1135 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); | 1156 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
1136 UseMockDelayProvider(); // Will cause test failure if backoff is initiated. | 1157 UseMockDelayProvider(); // Will cause test failure if backoff is initiated. |
1137 | 1158 |
1138 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1159 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
1139 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 1160 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollFailed), |
1140 RecordSyncShare(&r))) | 1161 RecordSyncShare(&r))) |
1141 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1162 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
1142 RecordSyncShare(&r))); | 1163 RecordSyncShare(&r))); |
1143 | 1164 |
1144 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1165 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
1145 | 1166 |
1146 // Run the unsucessful poll. The failed poll should not trigger backoff. | 1167 // Run the unsucessful poll. The failed poll should not trigger backoff. |
1147 RunLoop(); | 1168 RunLoop(); |
1148 EXPECT_FALSE(scheduler()->IsBackingOff()); | 1169 EXPECT_FALSE(scheduler()->IsBackingOff()); |
1149 | 1170 |
1150 // Run the successful poll. | 1171 // Run the successful poll. |
1151 RunLoop(); | 1172 RunLoop(); |
1152 EXPECT_FALSE(scheduler()->IsBackingOff()); | 1173 EXPECT_FALSE(scheduler()->IsBackingOff()); |
1153 } | 1174 } |
1154 | 1175 |
1155 // Test that appropriate syncer steps are requested for each job type. | |
1156 TEST_F(SyncSchedulerTest, SyncerSteps) { | |
1157 // Nudges. | |
1158 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) | |
1159 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | |
1160 Return(true))); | |
1161 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | |
1162 | |
1163 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | |
1164 PumpLoop(); | |
1165 // Pump again to run job. | |
1166 PumpLoop(); | |
1167 | |
1168 StopSyncScheduler(); | |
1169 Mock::VerifyAndClearExpectations(syncer()); | |
1170 | |
1171 // Configuration. | |
1172 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | |
1173 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | |
1174 Return(true))); | |
1175 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | |
1176 | |
1177 ModelTypeSet model_types(BOOKMARKS); | |
1178 CallbackCounter counter; | |
1179 ConfigurationParams params( | |
1180 GetUpdatesCallerInfo::RECONFIGURATION, | |
1181 model_types, | |
1182 TypesToRoutingInfo(model_types), | |
1183 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | |
1184 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | |
1185 ASSERT_EQ(1, counter.times_called()); | |
1186 // Runs directly so no need to pump the loop. | |
1187 StopSyncScheduler(); | |
1188 Mock::VerifyAndClearExpectations(syncer()); | |
1189 | |
1190 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | |
1191 | |
1192 // Poll. | |
1193 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | |
1194 .Times(AtLeast(1)) | |
1195 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | |
1196 QuitLoopNowAction())); | |
1197 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); | |
1198 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | |
1199 | |
1200 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | |
1201 | |
1202 // Run again to wait for polling. | |
1203 RunLoop(); | |
1204 | |
1205 StopSyncScheduler(); | |
1206 Mock::VerifyAndClearExpectations(syncer()); | |
1207 } | |
1208 | |
1209 // Test that starting the syncer thread without a valid connection doesn't | 1176 // Test that starting the syncer thread without a valid connection doesn't |
1210 // break things when a connection is detected. | 1177 // break things when a connection is detected. |
1211 TEST_F(SyncSchedulerTest, StartWhenNotConnected) { | 1178 TEST_F(SyncSchedulerTest, StartWhenNotConnected) { |
1212 connection()->SetServerNotReachable(); | 1179 connection()->SetServerNotReachable(); |
1213 connection()->UpdateConnectionStatus(); | 1180 connection()->UpdateConnectionStatus(); |
1214 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1181 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
1215 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 1182 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), |
1216 Return(true))) | 1183 Return(true))) |
1217 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1184 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
1218 Return(true))); | 1185 Return(true))); |
1219 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1186 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
1220 | 1187 |
1221 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 1188 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); |
1222 // Should save the nudge for until after the server is reachable. | 1189 // Should save the nudge for until after the server is reachable. |
1223 base::MessageLoop::current()->RunUntilIdle(); | 1190 base::MessageLoop::current()->RunUntilIdle(); |
1224 | 1191 |
1225 scheduler()->OnConnectionStatusChange(); | 1192 scheduler()->OnConnectionStatusChange(); |
1226 connection()->SetServerReachable(); | 1193 connection()->SetServerReachable(); |
1227 connection()->UpdateConnectionStatus(); | 1194 connection()->UpdateConnectionStatus(); |
1228 base::MessageLoop::current()->RunUntilIdle(); | 1195 base::MessageLoop::current()->RunUntilIdle(); |
1229 } | 1196 } |
1230 | 1197 |
1231 TEST_F(SyncSchedulerTest, ServerConnectionChangeDuringBackoff) { | 1198 TEST_F(SyncSchedulerTest, ServerConnectionChangeDuringBackoff) { |
1232 UseMockDelayProvider(); | 1199 UseMockDelayProvider(); |
1233 EXPECT_CALL(*delay(), GetDelay(_)) | 1200 EXPECT_CALL(*delay(), GetDelay(_)) |
1234 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); | 1201 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); |
1235 | 1202 |
1236 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1203 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
1237 connection()->SetServerNotReachable(); | 1204 connection()->SetServerNotReachable(); |
1238 connection()->UpdateConnectionStatus(); | 1205 connection()->UpdateConnectionStatus(); |
1239 | 1206 |
1240 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1207 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
1241 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 1208 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), |
1242 Return(true))) | 1209 Return(true))) |
1243 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1210 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
1244 Return(true))); | 1211 Return(true))); |
1245 | 1212 |
1246 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 1213 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); |
1247 | 1214 |
1248 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. | 1215 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. |
1249 ASSERT_TRUE(scheduler()->IsBackingOff()); | 1216 ASSERT_TRUE(scheduler()->IsBackingOff()); |
1250 | 1217 |
1251 // Before we run the scheduled canary, trigger a server connection change. | 1218 // Before we run the scheduled canary, trigger a server connection change. |
1252 scheduler()->OnConnectionStatusChange(); | 1219 scheduler()->OnConnectionStatusChange(); |
1253 connection()->SetServerReachable(); | 1220 connection()->SetServerReachable(); |
1254 connection()->UpdateConnectionStatus(); | 1221 connection()->UpdateConnectionStatus(); |
1255 base::MessageLoop::current()->RunUntilIdle(); | 1222 base::MessageLoop::current()->RunUntilIdle(); |
1256 } | 1223 } |
1257 | 1224 |
1258 // This was supposed to test the scenario where we receive a nudge while a | 1225 // This was supposed to test the scenario where we receive a nudge while a |
1259 // connection change canary is scheduled, but has not run yet. Since we've made | 1226 // connection change canary is scheduled, but has not run yet. Since we've made |
1260 // the connection change canary synchronous, this is no longer possible. | 1227 // the connection change canary synchronous, this is no longer possible. |
1261 TEST_F(SyncSchedulerTest, ConnectionChangeCanaryPreemptedByNudge) { | 1228 TEST_F(SyncSchedulerTest, ConnectionChangeCanaryPreemptedByNudge) { |
1262 UseMockDelayProvider(); | 1229 UseMockDelayProvider(); |
1263 EXPECT_CALL(*delay(), GetDelay(_)) | 1230 EXPECT_CALL(*delay(), GetDelay(_)) |
1264 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); | 1231 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); |
1265 | 1232 |
1266 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1233 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
1267 connection()->SetServerNotReachable(); | 1234 connection()->SetServerNotReachable(); |
1268 connection()->UpdateConnectionStatus(); | 1235 connection()->UpdateConnectionStatus(); |
1269 | 1236 |
1270 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1237 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
1271 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 1238 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), |
1272 Return(true))) | 1239 Return(true))) |
1273 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1240 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
1274 Return(true))) | 1241 Return(true))) |
1275 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1242 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
1276 QuitLoopNowAction())); | 1243 QuitLoopNowAction())); |
1277 | 1244 |
1278 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 1245 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); |
1279 | 1246 |
1280 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. | 1247 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. |
1281 ASSERT_TRUE(scheduler()->IsBackingOff()); | 1248 ASSERT_TRUE(scheduler()->IsBackingOff()); |
1282 | 1249 |
1283 // Before we run the scheduled canary, trigger a server connection change. | 1250 // Before we run the scheduled canary, trigger a server connection change. |
1284 scheduler()->OnConnectionStatusChange(); | 1251 scheduler()->OnConnectionStatusChange(); |
1285 connection()->SetServerReachable(); | 1252 connection()->SetServerReachable(); |
1286 connection()->UpdateConnectionStatus(); | 1253 connection()->UpdateConnectionStatus(); |
1287 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 1254 scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); |
1288 base::MessageLoop::current()->RunUntilIdle(); | 1255 base::MessageLoop::current()->RunUntilIdle(); |
1289 } | 1256 } |
1290 | 1257 |
1291 // Tests that we don't crash trying to run two canaries at once if we receive | 1258 // Tests that we don't crash trying to run two canaries at once if we receive |
1292 // extra connection status change notifications. See crbug.com/190085. | 1259 // extra connection status change notifications. See crbug.com/190085. |
1293 TEST_F(SyncSchedulerTest, DoubleCanaryInConfigure) { | 1260 TEST_F(SyncSchedulerTest, DoubleCanaryInConfigure) { |
1294 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | 1261 EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_)) |
1295 .WillRepeatedly(DoAll( | 1262 .WillRepeatedly(DoAll( |
1296 Invoke(sessions::test_util::SimulateConnectionFailure), | 1263 Invoke(sessions::test_util::SimulateConfigureConnectionFailure), |
1297 Return(true))); | 1264 Return(true))); |
1298 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 1265 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
1299 connection()->SetServerNotReachable(); | 1266 connection()->SetServerNotReachable(); |
1300 connection()->UpdateConnectionStatus(); | 1267 connection()->UpdateConnectionStatus(); |
1301 | 1268 |
1302 ModelTypeSet model_types(BOOKMARKS); | 1269 ModelTypeSet model_types(BOOKMARKS); |
1303 CallbackCounter counter; | 1270 CallbackCounter counter; |
1304 ConfigurationParams params( | 1271 ConfigurationParams params( |
1305 GetUpdatesCallerInfo::RECONFIGURATION, | 1272 GetUpdatesCallerInfo::RECONFIGURATION, |
1306 model_types, | 1273 model_types, |
1307 TypesToRoutingInfo(model_types), | 1274 TypesToRoutingInfo(model_types), |
1308 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 1275 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
1309 scheduler()->ScheduleConfiguration(params); | 1276 scheduler()->ScheduleConfiguration(params); |
1310 | 1277 |
1311 scheduler()->OnConnectionStatusChange(); | 1278 scheduler()->OnConnectionStatusChange(); |
1312 scheduler()->OnConnectionStatusChange(); | 1279 scheduler()->OnConnectionStatusChange(); |
1313 | 1280 |
1314 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. | 1281 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. |
1315 } | 1282 } |
1316 | 1283 |
1317 } // namespace syncer | 1284 } // namespace syncer |
OLD | NEW |