| 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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 80 } | 80 } | 
| 81 | 81 | 
| 82 ModelSafeRoutingInfo TypesToRoutingInfo(ModelTypeSet types) { | 82 ModelSafeRoutingInfo TypesToRoutingInfo(ModelTypeSet types) { | 
| 83   ModelSafeRoutingInfo routes; | 83   ModelSafeRoutingInfo routes; | 
| 84   for (ModelTypeSet::Iterator iter = types.First(); iter.Good(); iter.Inc()) { | 84   for (ModelTypeSet::Iterator iter = types.First(); iter.Good(); iter.Inc()) { | 
| 85     routes[iter.Get()] = GROUP_PASSIVE; | 85     routes[iter.Get()] = GROUP_PASSIVE; | 
| 86   } | 86   } | 
| 87   return routes; | 87   return routes; | 
| 88 } | 88 } | 
| 89 | 89 | 
|  | 90 // Compare a ModelTypeSet to a ModelTypeInvalidationMap, ignoring | 
|  | 91 // state values. | 
|  | 92 testing::AssertionResult ModelTypeSetMatchesInvalidationMap( | 
|  | 93     ModelTypeSet lhs, const ModelTypeInvalidationMap& rhs) { | 
|  | 94   ModelTypeSet rhs_set = ModelTypeInvalidationMapToSet(rhs); | 
|  | 95 | 
|  | 96   if (!rhs_set.Equals(rhs_set)) { | 
|  | 97     return testing::AssertionFailure() | 
|  | 98         << "ModelTypeSet: " << ModelTypeSetToString(lhs) | 
|  | 99         << " does not match ModelTypeInvalidationMap: " | 
|  | 100         << ModelTypeSetToString(rhs_set); | 
|  | 101   } else { | 
|  | 102     return testing::AssertionSuccess(); | 
|  | 103   } | 
|  | 104 } | 
|  | 105 | 
| 90 // Convenient to use in tests wishing to analyze SyncShare calls over time. | 106 // Convenient to use in tests wishing to analyze SyncShare calls over time. | 
| 91 static const size_t kMinNumSamples = 5; | 107 static const size_t kMinNumSamples = 5; | 
| 92 class SyncSchedulerTest : public testing::Test { | 108 class SyncSchedulerTest : public testing::Test { | 
| 93  public: | 109  public: | 
| 94   SyncSchedulerTest() | 110   SyncSchedulerTest() | 
| 95       : weak_ptr_factory_(this), | 111       : weak_ptr_factory_(this), | 
| 96         context_(NULL), | 112         context_(NULL), | 
| 97         syncer_(NULL), | 113         syncer_(NULL), | 
| 98         delay_(NULL) {} | 114         delay_(NULL) {} | 
| 99 | 115 | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 189   void StopSyncScheduler() { | 205   void StopSyncScheduler() { | 
| 190     scheduler()->RequestStop(base::Bind(&SyncSchedulerTest::DoQuitLoopNow, | 206     scheduler()->RequestStop(base::Bind(&SyncSchedulerTest::DoQuitLoopNow, | 
| 191                              weak_ptr_factory_.GetWeakPtr())); | 207                              weak_ptr_factory_.GetWeakPtr())); | 
| 192     RunLoop(); | 208     RunLoop(); | 
| 193   } | 209   } | 
| 194 | 210 | 
| 195   bool RunAndGetBackoff() { | 211   bool RunAndGetBackoff() { | 
| 196     ModelTypeSet nudge_types(BOOKMARKS); | 212     ModelTypeSet nudge_types(BOOKMARKS); | 
| 197     StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 213     StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 198 | 214 | 
| 199     scheduler()->ScheduleNudgeAsync( | 215     scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); | 
| 200         zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |  | 
| 201     RunLoop(); | 216     RunLoop(); | 
| 202 | 217 | 
| 203     return scheduler()->IsBackingOff(); | 218     return scheduler()->IsBackingOff(); | 
| 204   } | 219   } | 
| 205 | 220 | 
| 206   void UseMockDelayProvider() { | 221   void UseMockDelayProvider() { | 
| 207     delay_ = new MockDelayProvider(); | 222     delay_ = new MockDelayProvider(); | 
| 208     scheduler_->delay_provider_.reset(delay_); | 223     scheduler_->delay_provider_.reset(delay_); | 
| 209   } | 224   } | 
| 210 | 225 | 
| 211   // Compare a ModelTypeSet to a ModelTypeInvalidationMap, ignoring |  | 
| 212   // state values. |  | 
| 213   bool CompareModelTypeSetToModelTypeInvalidationMap( |  | 
| 214       ModelTypeSet lhs, |  | 
| 215       const ModelTypeInvalidationMap& rhs) { |  | 
| 216     size_t count = 0; |  | 
| 217     for (ModelTypeInvalidationMap::const_iterator i = rhs.begin(); |  | 
| 218          i != rhs.end(); ++i, ++count) { |  | 
| 219       if (!lhs.Has(i->first)) |  | 
| 220         return false; |  | 
| 221     } |  | 
| 222     if (lhs.Size() != count) |  | 
| 223       return false; |  | 
| 224     return true; |  | 
| 225   } |  | 
| 226 |  | 
| 227   SyncSessionContext* context() { return context_.get(); } | 226   SyncSessionContext* context() { return context_.get(); } | 
| 228 | 227 | 
| 229  private: | 228  private: | 
| 230   syncable::Directory* directory() { | 229   syncable::Directory* directory() { | 
| 231     return dir_maker_.directory(); | 230     return dir_maker_.directory(); | 
| 232   } | 231   } | 
| 233 | 232 | 
| 234   base::WeakPtrFactory<SyncSchedulerTest> weak_ptr_factory_; | 233   base::WeakPtrFactory<SyncSchedulerTest> weak_ptr_factory_; | 
| 235   base::MessageLoop message_loop_; | 234   base::MessageLoop message_loop_; | 
| 236   TestDirectorySetterUpper dir_maker_; | 235   TestDirectorySetterUpper dir_maker_; | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 283   SyncShareRecords records; | 282   SyncShareRecords records; | 
| 284   ModelTypeSet model_types(BOOKMARKS); | 283   ModelTypeSet model_types(BOOKMARKS); | 
| 285 | 284 | 
| 286   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 285   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 287       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 286       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 288                       WithArg<0>(RecordSyncShare(&records)))) | 287                       WithArg<0>(RecordSyncShare(&records)))) | 
| 289       .RetiresOnSaturation(); | 288       .RetiresOnSaturation(); | 
| 290 | 289 | 
| 291   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 290   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 292 | 291 | 
| 293   scheduler()->ScheduleNudgeAsync( | 292   scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); | 
| 294       zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); |  | 
| 295   RunLoop(); | 293   RunLoop(); | 
| 296 | 294 | 
| 297   ASSERT_EQ(1U, records.snapshots.size()); | 295   ASSERT_EQ(1U, records.snapshots.size()); | 
| 298   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(model_types, | 296   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 299       records.snapshots[0].source().types)); | 297           model_types, | 
|  | 298           records.snapshots[0].source().types)); | 
| 300   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 299   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 
| 301             records.snapshots[0].source().updates_source); | 300             records.snapshots[0].source().updates_source); | 
| 302 | 301 | 
| 303   Mock::VerifyAndClearExpectations(syncer()); | 302   Mock::VerifyAndClearExpectations(syncer()); | 
| 304 | 303 | 
| 305   // Make sure a second, later, nudge is unaffected by first (no coalescing). | 304   // Make sure a second, later, nudge is unaffected by first (no coalescing). | 
| 306   SyncShareRecords records2; | 305   SyncShareRecords records2; | 
| 307   model_types.Remove(BOOKMARKS); | 306   model_types.Remove(BOOKMARKS); | 
| 308   model_types.Put(AUTOFILL); | 307   model_types.Put(AUTOFILL); | 
| 309   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 308   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 310       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 309       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 311                       WithArg<0>(RecordSyncShare(&records2)))); | 310                       WithArg<0>(RecordSyncShare(&records2)))); | 
| 312   scheduler()->ScheduleNudgeAsync( | 311   scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); | 
| 313       zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); |  | 
| 314   RunLoop(); | 312   RunLoop(); | 
| 315 | 313 | 
| 316   ASSERT_EQ(1U, records2.snapshots.size()); | 314   ASSERT_EQ(1U, records2.snapshots.size()); | 
| 317   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(model_types, | 315   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 318       records2.snapshots[0].source().types)); | 316           model_types, | 
|  | 317           records2.snapshots[0].source().types)); | 
| 319   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 318   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 
| 320             records2.snapshots[0].source().updates_source); | 319             records2.snapshots[0].source().updates_source); | 
| 321 } | 320 } | 
| 322 | 321 | 
| 323 // Make sure a regular config command is scheduled fine in the absence of any | 322 // Make sure a regular config command is scheduled fine in the absence of any | 
| 324 // errors. | 323 // errors. | 
| 325 TEST_F(SyncSchedulerTest, Config) { | 324 TEST_F(SyncSchedulerTest, Config) { | 
| 326   SyncShareRecords records; | 325   SyncShareRecords records; | 
| 327   const ModelTypeSet model_types(BOOKMARKS); | 326   const ModelTypeSet model_types(BOOKMARKS); | 
| 328 | 327 | 
| 329   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 328   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 330       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 329       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 331                       WithArg<0>(RecordSyncShare(&records)))); | 330                       WithArg<0>(RecordSyncShare(&records)))); | 
| 332 | 331 | 
| 333   StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 332   StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 
| 334 | 333 | 
| 335   CallbackCounter counter; | 334   CallbackCounter counter; | 
| 336   ConfigurationParams params( | 335   ConfigurationParams params( | 
| 337       GetUpdatesCallerInfo::RECONFIGURATION, | 336       GetUpdatesCallerInfo::RECONFIGURATION, | 
| 338       model_types, | 337       model_types, | 
| 339       TypesToRoutingInfo(model_types), | 338       TypesToRoutingInfo(model_types), | 
| 340       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 339       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 
| 341   ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 340   ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 
| 342   ASSERT_EQ(1, counter.times_called()); | 341   ASSERT_EQ(1, counter.times_called()); | 
| 343 | 342 | 
| 344   ASSERT_EQ(1U, records.snapshots.size()); | 343   ASSERT_EQ(1U, records.snapshots.size()); | 
| 345   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(model_types, | 344   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 346       records.snapshots[0].source().types)); | 345           model_types, | 
|  | 346           records.snapshots[0].source().types)); | 
| 347   EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 347   EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 
| 348             records.snapshots[0].source().updates_source); | 348             records.snapshots[0].source().updates_source); | 
| 349 } | 349 } | 
| 350 | 350 | 
| 351 // Simulate a failure and make sure the config request is retried. | 351 // Simulate a failure and make sure the config request is retried. | 
| 352 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { | 352 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { | 
| 353   UseMockDelayProvider(); | 353   UseMockDelayProvider(); | 
| 354   EXPECT_CALL(*delay(), GetDelay(_)) | 354   EXPECT_CALL(*delay(), GetDelay(_)) | 
| 355       .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 355       .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 
| 356   SyncShareRecords records; | 356   SyncShareRecords records; | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 372       TypesToRoutingInfo(model_types), | 372       TypesToRoutingInfo(model_types), | 
| 373       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 373       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 
| 374   ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); | 374   ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); | 
| 375   ASSERT_EQ(0, counter.times_called()); | 375   ASSERT_EQ(0, counter.times_called()); | 
| 376 | 376 | 
| 377   ASSERT_EQ(1U, records.snapshots.size()); | 377   ASSERT_EQ(1U, records.snapshots.size()); | 
| 378   RunLoop(); | 378   RunLoop(); | 
| 379 | 379 | 
| 380   ASSERT_EQ(2U, records.snapshots.size()); | 380   ASSERT_EQ(2U, records.snapshots.size()); | 
| 381   ASSERT_EQ(1, counter.times_called()); | 381   ASSERT_EQ(1, counter.times_called()); | 
| 382   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(model_types, | 382   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 383       records.snapshots[1].source().types)); | 383           model_types, | 
|  | 384           records.snapshots[1].source().types)); | 
| 384   EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 385   EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 
| 385             records.snapshots[1].source().updates_source); | 386             records.snapshots[1].source().updates_source); | 
| 386 } | 387 } | 
| 387 | 388 | 
| 388 // Issue a nudge when the config has failed. Make sure both the config and | 389 // Issue a nudge when the config has failed. Make sure both the config and | 
| 389 // nudge are executed. | 390 // nudge are executed. | 
| 390 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { | 391 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { | 
| 391   const ModelTypeSet model_types(BOOKMARKS); | 392   const ModelTypeSet model_types(BOOKMARKS); | 
| 392   UseMockDelayProvider(); | 393   UseMockDelayProvider(); | 
| 393   EXPECT_CALL(*delay(), GetDelay(_)) | 394   EXPECT_CALL(*delay(), GetDelay(_)) | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 410   CallbackCounter counter; | 411   CallbackCounter counter; | 
| 411   ConfigurationParams params( | 412   ConfigurationParams params( | 
| 412       GetUpdatesCallerInfo::RECONFIGURATION, | 413       GetUpdatesCallerInfo::RECONFIGURATION, | 
| 413       model_types, | 414       model_types, | 
| 414       TypesToRoutingInfo(model_types), | 415       TypesToRoutingInfo(model_types), | 
| 415       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 416       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 
| 416   ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); | 417   ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); | 
| 417   ASSERT_EQ(0, counter.times_called()); | 418   ASSERT_EQ(0, counter.times_called()); | 
| 418   ASSERT_EQ(1U, records.snapshots.size()); | 419   ASSERT_EQ(1U, records.snapshots.size()); | 
| 419 | 420 | 
| 420   scheduler()->ScheduleNudgeAsync( | 421   scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); | 
| 421       zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); |  | 
| 422   RunLoop(); | 422   RunLoop(); | 
| 423   // Note that we're not RunLoop()ing for the NUDGE we just scheduled, but | 423   // Note that we're not RunLoop()ing for the NUDGE we just scheduled, but | 
| 424   // for the first retry attempt from the config job (after | 424   // for the first retry attempt from the config job (after | 
| 425   // waiting ~+/- 50ms). | 425   // waiting ~+/- 50ms). | 
| 426   ASSERT_EQ(2U, records.snapshots.size()); | 426   ASSERT_EQ(2U, records.snapshots.size()); | 
| 427   ASSERT_EQ(0, counter.times_called()); | 427   ASSERT_EQ(0, counter.times_called()); | 
| 428   EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 428   EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 
| 429             records.snapshots[1].source().updates_source); | 429             records.snapshots[1].source().updates_source); | 
| 430 | 430 | 
| 431   RunLoop(); | 431   RunLoop(); | 
| 432   // This is the 3rd attempt, which we've set up to SimulateSuccess. | 432   // This is the 3rd attempt, which we've set up to SimulateSuccess. | 
| 433   ASSERT_EQ(3U, records.snapshots.size()); | 433   ASSERT_EQ(3U, records.snapshots.size()); | 
| 434   ASSERT_EQ(1, counter.times_called()); | 434   ASSERT_EQ(1, counter.times_called()); | 
| 435 | 435 | 
| 436   // Now change the mode so nudge can execute. | 436   // Now change the mode so nudge can execute. | 
| 437   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 437   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 438 | 438 | 
| 439   ASSERT_EQ(4U, records.snapshots.size()); | 439   ASSERT_EQ(4U, records.snapshots.size()); | 
| 440 | 440 | 
| 441   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(model_types, | 441   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 442       records.snapshots[2].source().types)); | 442           model_types, | 
|  | 443           records.snapshots[2].source().types)); | 
| 443   EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 444   EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 
| 444             records.snapshots[2].source().updates_source); | 445             records.snapshots[2].source().updates_source); | 
| 445 | 446 | 
| 446   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(model_types, | 447   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 447       records.snapshots[3].source().types)); | 448           model_types, | 
|  | 449           records.snapshots[3].source().types)); | 
| 448   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 450   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 
| 449             records.snapshots[3].source().updates_source); | 451             records.snapshots[3].source().updates_source); | 
| 450 | 452 | 
| 451 } | 453 } | 
| 452 | 454 | 
| 453 // Test that nudges are coalesced. | 455 // Test that nudges are coalesced. | 
| 454 TEST_F(SyncSchedulerTest, NudgeCoalescing) { | 456 TEST_F(SyncSchedulerTest, NudgeCoalescing) { | 
| 455   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 457   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 456 | 458 | 
| 457   SyncShareRecords r; | 459   SyncShareRecords r; | 
| 458   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 460   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 459       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 461       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 460                       WithArg<0>(RecordSyncShare(&r)))); | 462                       WithArg<0>(RecordSyncShare(&r)))); | 
| 461   const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES); | 463   const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES); | 
| 462   TimeDelta delay = zero(); | 464   TimeDelta delay = zero(); | 
| 463   TimeTicks optimal_time = TimeTicks::Now() + delay; | 465   TimeTicks optimal_time = TimeTicks::Now() + delay; | 
| 464   scheduler()->ScheduleNudgeAsync( | 466   scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE); | 
| 465       delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); | 467   scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE); | 
| 466   scheduler()->ScheduleNudgeAsync( |  | 
| 467       zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE); |  | 
| 468   RunLoop(); | 468   RunLoop(); | 
| 469 | 469 | 
| 470   ASSERT_EQ(1U, r.snapshots.size()); | 470   ASSERT_EQ(1U, r.snapshots.size()); | 
| 471   EXPECT_GE(r.times[0], optimal_time); | 471   EXPECT_GE(r.times[0], optimal_time); | 
| 472   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap( | 472   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 473       Union(types1, types2), r.snapshots[0].source().types)); | 473           Union(types1, types2), | 
|  | 474           r.snapshots[0].source().types)); | 
| 474   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 475   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 
| 475             r.snapshots[0].source().updates_source); | 476             r.snapshots[0].source().updates_source); | 
| 476 | 477 | 
| 477   Mock::VerifyAndClearExpectations(syncer()); | 478   Mock::VerifyAndClearExpectations(syncer()); | 
| 478 | 479 | 
| 479   SyncShareRecords r2; | 480   SyncShareRecords r2; | 
| 480   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 481   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 481       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 482       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 482                       WithArg<0>(RecordSyncShare(&r2)))); | 483                       WithArg<0>(RecordSyncShare(&r2)))); | 
| 483   scheduler()->ScheduleNudgeAsync( | 484   scheduler()->ScheduleLocalNudge(zero(), types3, FROM_HERE); | 
| 484       zero(), NUDGE_SOURCE_NOTIFICATION, types3, FROM_HERE); |  | 
| 485   RunLoop(); | 485   RunLoop(); | 
| 486 | 486 | 
| 487   ASSERT_EQ(1U, r2.snapshots.size()); | 487   ASSERT_EQ(1U, r2.snapshots.size()); | 
| 488   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(types3, | 488   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 489       r2.snapshots[0].source().types)); | 489           types3, | 
| 490   EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, | 490           r2.snapshots[0].source().types)); | 
|  | 491   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 
| 491             r2.snapshots[0].source().updates_source); | 492             r2.snapshots[0].source().updates_source); | 
| 492 } | 493 } | 
| 493 | 494 | 
| 494 // Test that nudges are coalesced. | 495 // Test that nudges are coalesced. | 
| 495 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { | 496 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { | 
| 496   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 497   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 497 | 498 | 
| 498   SyncShareRecords r; | 499   SyncShareRecords r; | 
| 499   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 500   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 500       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 501       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 501                       WithArg<0>(RecordSyncShare(&r)))); | 502                       WithArg<0>(RecordSyncShare(&r)))); | 
| 502   ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3; | 503   ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3; | 
| 503 | 504 | 
| 504   // Create a huge time delay. | 505   // Create a huge time delay. | 
| 505   TimeDelta delay = TimeDelta::FromDays(1); | 506   TimeDelta delay = TimeDelta::FromDays(1); | 
| 506 | 507 | 
| 507   scheduler()->ScheduleNudgeAsync( | 508   scheduler()->ScheduleLocalNudge(delay, types1, FROM_HERE); | 
| 508       delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); | 509   scheduler()->ScheduleLocalNudge(zero(), types2, FROM_HERE); | 
| 509 |  | 
| 510   scheduler()->ScheduleNudgeAsync( |  | 
| 511       zero(), NUDGE_SOURCE_UNKNOWN, types2, FROM_HERE); |  | 
| 512 | 510 | 
| 513   TimeTicks min_time = TimeTicks::Now(); | 511   TimeTicks min_time = TimeTicks::Now(); | 
| 514   TimeTicks max_time = TimeTicks::Now() + delay; | 512   TimeTicks max_time = TimeTicks::Now() + delay; | 
| 515 | 513 | 
| 516   RunLoop(); | 514   RunLoop(); | 
| 517 | 515 | 
| 518   // Make sure the sync has happened. | 516   // Make sure the sync has happened. | 
| 519   ASSERT_EQ(1U, r.snapshots.size()); | 517   ASSERT_EQ(1U, r.snapshots.size()); | 
| 520   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap( | 518   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 521       Union(types1, types2), r.snapshots[0].source().types)); | 519           Union(types1, types2), | 
|  | 520           r.snapshots[0].source().types)); | 
| 522 | 521 | 
| 523   // Make sure the sync happened at the right time. | 522   // Make sure the sync happened at the right time. | 
| 524   EXPECT_GE(r.times[0], min_time); | 523   EXPECT_GE(r.times[0], min_time); | 
| 525   EXPECT_LE(r.times[0], max_time); | 524   EXPECT_LE(r.times[0], max_time); | 
| 526 } | 525 } | 
| 527 | 526 | 
| 528 // Test nudge scheduling. | 527 // Test nudge scheduling. | 
| 529 TEST_F(SyncSchedulerTest, NudgeWithStates) { | 528 TEST_F(SyncSchedulerTest, NudgeWithStates) { | 
| 530   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 529   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 531 | 530 | 
| 532   SyncShareRecords records; | 531   SyncShareRecords records; | 
| 533   const ModelTypeSet types(BOOKMARKS); | 532   const ModelTypeSet types(BOOKMARKS); | 
| 534   ModelTypeInvalidationMap invalidation_map = | 533   ModelTypeInvalidationMap invalidation_map = | 
| 535       ModelTypeSetToInvalidationMap(types, "test"); | 534       ModelTypeSetToInvalidationMap(types, "test"); | 
| 536 | 535 | 
| 537   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 536   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 538       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 537       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 539                       WithArg<0>(RecordSyncShare(&records)))) | 538                       WithArg<0>(RecordSyncShare(&records)))) | 
| 540       .RetiresOnSaturation(); | 539       .RetiresOnSaturation(); | 
| 541   scheduler()->ScheduleNudgeWithStatesAsync( | 540   scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); | 
| 542       zero(), NUDGE_SOURCE_LOCAL, invalidation_map, FROM_HERE); |  | 
| 543   RunLoop(); | 541   RunLoop(); | 
| 544 | 542 | 
| 545   ASSERT_EQ(1U, records.snapshots.size()); | 543   ASSERT_EQ(1U, records.snapshots.size()); | 
| 546   EXPECT_THAT(invalidation_map, Eq(records.snapshots[0].source().types)); | 544   EXPECT_THAT(invalidation_map, Eq(records.snapshots[0].source().types)); | 
| 547   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 545   EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, | 
| 548             records.snapshots[0].source().updates_source); | 546             records.snapshots[0].source().updates_source); | 
| 549 | 547 | 
| 550   Mock::VerifyAndClearExpectations(syncer()); | 548   Mock::VerifyAndClearExpectations(syncer()); | 
| 551 | 549 | 
| 552   // Make sure a second, later, nudge is unaffected by first (no coalescing). | 550   // Make sure a second, later, nudge is unaffected by first (no coalescing). | 
| 553   SyncShareRecords records2; | 551   SyncShareRecords records2; | 
| 554   invalidation_map.erase(BOOKMARKS); | 552   invalidation_map.erase(BOOKMARKS); | 
| 555   invalidation_map[AUTOFILL].payload = "test2"; | 553   invalidation_map[AUTOFILL].payload = "test2"; | 
| 556   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 554   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 557       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 555       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 558                       WithArg<0>(RecordSyncShare(&records2)))); | 556                       WithArg<0>(RecordSyncShare(&records2)))); | 
| 559   scheduler()->ScheduleNudgeWithStatesAsync( | 557   scheduler()->ScheduleInvalidationNudge(zero(), invalidation_map, FROM_HERE); | 
| 560       zero(), NUDGE_SOURCE_LOCAL, invalidation_map, FROM_HERE); |  | 
| 561   RunLoop(); | 558   RunLoop(); | 
| 562 | 559 | 
| 563   ASSERT_EQ(1U, records2.snapshots.size()); | 560   ASSERT_EQ(1U, records2.snapshots.size()); | 
| 564   EXPECT_THAT(invalidation_map, Eq(records2.snapshots[0].source().types)); | 561   EXPECT_THAT(invalidation_map, Eq(records2.snapshots[0].source().types)); | 
| 565   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 562   EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, | 
| 566             records2.snapshots[0].source().updates_source); | 563             records2.snapshots[0].source().updates_source); | 
| 567 } | 564 } | 
| 568 | 565 | 
| 569 // Test that nudges are coalesced. |  | 
| 570 TEST_F(SyncSchedulerTest, NudgeWithStatesCoalescing) { |  | 
| 571   StartSyncScheduler(SyncScheduler::NORMAL_MODE); |  | 
| 572 |  | 
| 573   SyncShareRecords r; |  | 
| 574   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |  | 
| 575       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |  | 
| 576                       WithArg<0>(RecordSyncShare(&r)))); |  | 
| 577   ModelTypeInvalidationMap types1, types2, types3; |  | 
| 578   types1[BOOKMARKS].payload = "test1"; |  | 
| 579   types2[AUTOFILL].payload = "test2"; |  | 
| 580   types3[THEMES].payload = "test3"; |  | 
| 581   TimeDelta delay = zero(); |  | 
| 582   TimeTicks optimal_time = TimeTicks::Now() + delay; |  | 
| 583   scheduler()->ScheduleNudgeWithStatesAsync( |  | 
| 584       delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); |  | 
| 585   scheduler()->ScheduleNudgeWithStatesAsync( |  | 
| 586       zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE); |  | 
| 587   RunLoop(); |  | 
| 588 |  | 
| 589   ASSERT_EQ(1U, r.snapshots.size()); |  | 
| 590   EXPECT_GE(r.times[0], optimal_time); |  | 
| 591   ModelTypeInvalidationMap coalesced_types; |  | 
| 592   CoalesceStates(types1, &coalesced_types); |  | 
| 593   CoalesceStates(types2, &coalesced_types); |  | 
| 594   EXPECT_THAT(coalesced_types, Eq(r.snapshots[0].source().types)); |  | 
| 595   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |  | 
| 596             r.snapshots[0].source().updates_source); |  | 
| 597 |  | 
| 598   Mock::VerifyAndClearExpectations(syncer()); |  | 
| 599 |  | 
| 600   SyncShareRecords r2; |  | 
| 601   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |  | 
| 602       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |  | 
| 603                       WithArg<0>(RecordSyncShare(&r2)))); |  | 
| 604   scheduler()->ScheduleNudgeWithStatesAsync( |  | 
| 605       zero(), NUDGE_SOURCE_NOTIFICATION, types3, FROM_HERE); |  | 
| 606   RunLoop(); |  | 
| 607 |  | 
| 608   ASSERT_EQ(1U, r2.snapshots.size()); |  | 
| 609   EXPECT_THAT(types3, Eq(r2.snapshots[0].source().types)); |  | 
| 610   EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, |  | 
| 611             r2.snapshots[0].source().updates_source); |  | 
| 612 } |  | 
| 613 |  | 
| 614 // Test that polling works as expected. | 566 // Test that polling works as expected. | 
| 615 TEST_F(SyncSchedulerTest, Polling) { | 567 TEST_F(SyncSchedulerTest, Polling) { | 
| 616   SyncShareRecords records; | 568   SyncShareRecords records; | 
| 617   TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); | 569   TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); | 
| 618   EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) | 570   EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) | 
| 619       .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 571       .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 620            WithArg<0>(RecordSyncShareMultiple(&records, kMinNumSamples)))); | 572            WithArg<0>(RecordSyncShareMultiple(&records, kMinNumSamples)))); | 
| 621 | 573 | 
| 622   scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); | 574   scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); | 
| 623 | 575 | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 692                   sessions::test_util::SimulateSessionsCommitDelayUpdate( | 644                   sessions::test_util::SimulateSessionsCommitDelayUpdate( | 
| 693                       delay2)), | 645                       delay2)), | 
| 694               Invoke(sessions::test_util::SimulateSuccess), | 646               Invoke(sessions::test_util::SimulateSuccess), | 
| 695               QuitLoopNowAction())); | 647               QuitLoopNowAction())); | 
| 696 | 648 | 
| 697   EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); | 649   EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); | 
| 698   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 650   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 699 | 651 | 
| 700   EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); | 652   EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); | 
| 701   const ModelTypeSet model_types(BOOKMARKS); | 653   const ModelTypeSet model_types(BOOKMARKS); | 
| 702   scheduler()->ScheduleNudgeAsync( | 654   scheduler()->ScheduleLocalNudge(zero(), model_types, FROM_HERE); | 
| 703       zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); |  | 
| 704   RunLoop(); | 655   RunLoop(); | 
| 705 | 656 | 
| 706   EXPECT_EQ(delay2, scheduler()->GetSessionsCommitDelay()); | 657   EXPECT_EQ(delay2, scheduler()->GetSessionsCommitDelay()); | 
| 707   StopSyncScheduler(); | 658   StopSyncScheduler(); | 
| 708 } | 659 } | 
| 709 | 660 | 
| 710 // Test that no syncing occurs when throttled. | 661 // Test that no syncing occurs when throttled. | 
| 711 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { | 662 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { | 
| 712   const ModelTypeSet types(BOOKMARKS); | 663   const ModelTypeSet types(BOOKMARKS); | 
| 713   TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 664   TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 
| 714   TimeDelta throttle(TimeDelta::FromMinutes(10)); | 665   TimeDelta throttle(TimeDelta::FromMinutes(10)); | 
| 715   scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 666   scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 
| 716 | 667 | 
| 717   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 668   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 718       .WillOnce(DoAll( | 669       .WillOnce(DoAll( | 
| 719           WithArg<0>(sessions::test_util::SimulateThrottled(throttle)), | 670           WithArg<0>(sessions::test_util::SimulateThrottled(throttle)), | 
| 720           Return(true))) | 671           Return(true))) | 
| 721       .WillRepeatedly(AddFailureAndQuitLoopNow()); | 672       .WillRepeatedly(AddFailureAndQuitLoopNow()); | 
| 722 | 673 | 
| 723   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 674   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 724 | 675 | 
| 725   scheduler()->ScheduleNudgeAsync( | 676   scheduler()->ScheduleLocalNudge( | 
| 726       TimeDelta::FromMicroseconds(1), NUDGE_SOURCE_LOCAL, types, FROM_HERE); | 677       TimeDelta::FromMicroseconds(1), types, FROM_HERE); | 
| 727   PumpLoop(); | 678   PumpLoop(); | 
| 728 | 679 | 
| 729   StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 680   StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 
| 730 | 681 | 
| 731   CallbackCounter counter; | 682   CallbackCounter counter; | 
| 732   ConfigurationParams params( | 683   ConfigurationParams params( | 
| 733       GetUpdatesCallerInfo::RECONFIGURATION, | 684       GetUpdatesCallerInfo::RECONFIGURATION, | 
| 734       types, | 685       types, | 
| 735       TypesToRoutingInfo(types), | 686       TypesToRoutingInfo(types), | 
| 736       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 687       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 775       .WillOnce(DoAll( | 726       .WillOnce(DoAll( | 
| 776           WithArg<0>(sessions::test_util::SimulateThrottled(throttle1)), | 727           WithArg<0>(sessions::test_util::SimulateThrottled(throttle1)), | 
| 777           Return(true))) | 728           Return(true))) | 
| 778       .RetiresOnSaturation(); | 729       .RetiresOnSaturation(); | 
| 779   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 730   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 780       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 731       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 781                       QuitLoopNowAction())); | 732                       QuitLoopNowAction())); | 
| 782 | 733 | 
| 783   const ModelTypeSet types(BOOKMARKS); | 734   const ModelTypeSet types(BOOKMARKS); | 
| 784   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 735   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 785   scheduler()->ScheduleNudgeAsync( | 736   scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); | 
| 786       zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE); |  | 
| 787 | 737 | 
| 788   PumpLoop(); | 738   PumpLoop(); | 
| 789   EXPECT_TRUE(scheduler()->IsSyncingCurrentlySilenced()); | 739   EXPECT_TRUE(scheduler()->IsSyncingCurrentlySilenced()); | 
| 790   RunLoop(); | 740   RunLoop(); | 
| 791   EXPECT_FALSE(scheduler()->IsSyncingCurrentlySilenced()); | 741   EXPECT_FALSE(scheduler()->IsSyncingCurrentlySilenced()); | 
| 792 | 742 | 
| 793   StopSyncScheduler(); | 743   StopSyncScheduler(); | 
| 794 } | 744 } | 
| 795 | 745 | 
| 796 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromConfigure) { | 746 TEST_F(SyncSchedulerTest, ThrottlingExpiresFromConfigure) { | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 834   SyncShareRecords records; | 784   SyncShareRecords records; | 
| 835   scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 785   scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 
| 836   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 786   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 837       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 787       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 838                       WithArg<0>(RecordSyncShare(&records)))) | 788                       WithArg<0>(RecordSyncShare(&records)))) | 
| 839       .RetiresOnSaturation(); | 789       .RetiresOnSaturation(); | 
| 840 | 790 | 
| 841   StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 791   StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 
| 842 | 792 | 
| 843   const ModelTypeSet nudge_types(AUTOFILL); | 793   const ModelTypeSet nudge_types(AUTOFILL); | 
| 844   scheduler()->ScheduleNudgeAsync( | 794   scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); | 
| 845       zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); | 795   scheduler()->ScheduleLocalNudge(zero(), nudge_types, FROM_HERE); | 
| 846   scheduler()->ScheduleNudgeAsync( |  | 
| 847       zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |  | 
| 848 | 796 | 
| 849   const ModelTypeSet config_types(BOOKMARKS); | 797   const ModelTypeSet config_types(BOOKMARKS); | 
| 850 | 798 | 
| 851   CallbackCounter counter; | 799   CallbackCounter counter; | 
| 852   ConfigurationParams params( | 800   ConfigurationParams params( | 
| 853       GetUpdatesCallerInfo::RECONFIGURATION, | 801       GetUpdatesCallerInfo::RECONFIGURATION, | 
| 854       config_types, | 802       config_types, | 
| 855       TypesToRoutingInfo(config_types), | 803       TypesToRoutingInfo(config_types), | 
| 856       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 804       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 
| 857   ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 805   ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 
| 858   ASSERT_EQ(1, counter.times_called()); | 806   ASSERT_EQ(1, counter.times_called()); | 
| 859 | 807 | 
| 860   ASSERT_EQ(1U, records.snapshots.size()); | 808   ASSERT_EQ(1U, records.snapshots.size()); | 
| 861   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(config_types, | 809   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 862       records.snapshots[0].source().types)); | 810           config_types, | 
|  | 811           records.snapshots[0].source().types)); | 
| 863 | 812 | 
| 864   // Switch to NORMAL_MODE to ensure NUDGES were properly saved and run. | 813   // Switch to NORMAL_MODE to ensure NUDGES were properly saved and run. | 
| 865   // SyncSchedulerWhiteboxTest also provides coverage for this, but much | 814   // SyncSchedulerWhiteboxTest also provides coverage for this, but much | 
| 866   // more targeted ('whitebox' style). | 815   // more targeted ('whitebox' style). | 
| 867   scheduler()->OnReceivedLongPollIntervalUpdate(TimeDelta::FromDays(1)); | 816   scheduler()->OnReceivedLongPollIntervalUpdate(TimeDelta::FromDays(1)); | 
| 868   SyncShareRecords records2; | 817   SyncShareRecords records2; | 
| 869   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 818   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 870       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 819       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 871                       WithArg<0>(RecordSyncShare(&records2)))); | 820                       WithArg<0>(RecordSyncShare(&records2)))); | 
| 872 | 821 | 
| 873   // TODO(tim): Figure out how to remove this dangerous need to reset | 822   // TODO(tim): Figure out how to remove this dangerous need to reset | 
| 874   // routing info between mode switches. | 823   // routing info between mode switches. | 
| 875   context()->set_routing_info(routing_info()); | 824   context()->set_routing_info(routing_info()); | 
| 876   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 825   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 877 | 826 | 
| 878   ASSERT_EQ(1U, records2.snapshots.size()); | 827   ASSERT_EQ(1U, records2.snapshots.size()); | 
| 879   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 828   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 
| 880             records2.snapshots[0].source().updates_source); | 829             records2.snapshots[0].source().updates_source); | 
| 881   EXPECT_TRUE(CompareModelTypeSetToModelTypeInvalidationMap(nudge_types, | 830   EXPECT_TRUE(ModelTypeSetMatchesInvalidationMap( | 
| 882       records2.snapshots[0].source().types)); | 831           nudge_types, | 
|  | 832           records2.snapshots[0].source().types)); | 
| 883   PumpLoop(); | 833   PumpLoop(); | 
| 884 } | 834 } | 
| 885 | 835 | 
| 886 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest { | 836 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest { | 
| 887   virtual void SetUp() { | 837   virtual void SetUp() { | 
| 888     SyncSchedulerTest::SetUp(); | 838     SyncSchedulerTest::SetUp(); | 
| 889     UseMockDelayProvider(); | 839     UseMockDelayProvider(); | 
| 890     EXPECT_CALL(*delay(), GetDelay(_)) | 840     EXPECT_CALL(*delay(), GetDelay(_)) | 
| 891         .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 841         .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 
| 892   } | 842   } | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 967   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 917   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 968       .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 918       .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 
| 969                             RecordSyncShareMultiple(&r, 1U))); | 919                             RecordSyncShareMultiple(&r, 1U))); | 
| 970   EXPECT_CALL(*delay(), GetDelay(_)). | 920   EXPECT_CALL(*delay(), GetDelay(_)). | 
| 971       WillRepeatedly(Return(TimeDelta::FromDays(1))); | 921       WillRepeatedly(Return(TimeDelta::FromDays(1))); | 
| 972 | 922 | 
| 973   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 923   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 974 | 924 | 
| 975   // This nudge should fail and put us into backoff.  Thanks to our mock | 925   // This nudge should fail and put us into backoff.  Thanks to our mock | 
| 976   // GetDelay() setup above, this will be a long backoff. | 926   // GetDelay() setup above, this will be a long backoff. | 
| 977   scheduler()->ScheduleNudgeAsync(zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE); | 927   scheduler()->ScheduleLocalNudge(zero(), types, FROM_HERE); | 
| 978   RunLoop(); | 928   RunLoop(); | 
| 979 | 929 | 
| 980   Mock::VerifyAndClearExpectations(syncer()); | 930   Mock::VerifyAndClearExpectations(syncer()); | 
| 981   ASSERT_EQ(1U, r.snapshots.size()); | 931   ASSERT_EQ(1U, r.snapshots.size()); | 
| 982   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 932   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 
| 983             r.snapshots[0].source().updates_source); | 933             r.snapshots[0].source().updates_source); | 
| 984 | 934 | 
| 985   // Wait a while (10x poll interval) so a few poll jobs will be attempted. | 935   // Wait a while (10x poll interval) so a few poll jobs will be attempted. | 
| 986   PumpLoopFor(poll * 10); | 936   PumpLoopFor(poll * 10); | 
| 987 | 937 | 
| 988   // Try (and fail) to schedule a nudge. | 938   // Try (and fail) to schedule a nudge. | 
| 989   scheduler()->ScheduleNudgeAsync( | 939   scheduler()->ScheduleLocalNudge( | 
| 990       base::TimeDelta::FromMilliseconds(1), | 940       base::TimeDelta::FromMilliseconds(1), | 
| 991       NUDGE_SOURCE_LOCAL, |  | 
| 992       types, | 941       types, | 
| 993       FROM_HERE); | 942       FROM_HERE); | 
| 994 | 943 | 
| 995   Mock::VerifyAndClearExpectations(syncer()); | 944   Mock::VerifyAndClearExpectations(syncer()); | 
| 996   Mock::VerifyAndClearExpectations(delay()); | 945   Mock::VerifyAndClearExpectations(delay()); | 
| 997 | 946 | 
| 998   ASSERT_EQ(1U, r.snapshots.size()); | 947   ASSERT_EQ(1U, r.snapshots.size()); | 
| 999 | 948 | 
| 1000   EXPECT_CALL(*delay(), GetDelay(_)).Times(0); | 949   EXPECT_CALL(*delay(), GetDelay(_)).Times(0); | 
| 1001 | 950 | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1033           .RetiresOnSaturation(); | 982           .RetiresOnSaturation(); | 
| 1034   EXPECT_CALL(*delay(), GetDelay(third)).WillOnce(Return(fourth)) | 983   EXPECT_CALL(*delay(), GetDelay(third)).WillOnce(Return(fourth)) | 
| 1035           .RetiresOnSaturation(); | 984           .RetiresOnSaturation(); | 
| 1036   EXPECT_CALL(*delay(), GetDelay(fourth)).WillOnce(Return(fifth)) | 985   EXPECT_CALL(*delay(), GetDelay(fourth)).WillOnce(Return(fifth)) | 
| 1037           .RetiresOnSaturation(); | 986           .RetiresOnSaturation(); | 
| 1038   EXPECT_CALL(*delay(), GetDelay(fifth)).WillOnce(Return(sixth)); | 987   EXPECT_CALL(*delay(), GetDelay(fifth)).WillOnce(Return(sixth)); | 
| 1039 | 988 | 
| 1040   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 989   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 1041 | 990 | 
| 1042   // Run again with a nudge. | 991   // Run again with a nudge. | 
| 1043   scheduler()->ScheduleNudgeAsync( | 992   scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 
| 1044       zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |  | 
| 1045   RunLoop(); | 993   RunLoop(); | 
| 1046 | 994 | 
| 1047   ASSERT_EQ(kMinNumSamples, r.snapshots.size()); | 995   ASSERT_EQ(kMinNumSamples, r.snapshots.size()); | 
| 1048   EXPECT_GE(r.times[1] - r.times[0], second); | 996   EXPECT_GE(r.times[1] - r.times[0], second); | 
| 1049   EXPECT_GE(r.times[2] - r.times[1], third); | 997   EXPECT_GE(r.times[2] - r.times[1], third); | 
| 1050   EXPECT_GE(r.times[3] - r.times[2], fourth); | 998   EXPECT_GE(r.times[3] - r.times[2], fourth); | 
| 1051   EXPECT_GE(r.times[4] - r.times[3], fifth); | 999   EXPECT_GE(r.times[4] - r.times[3], fifth); | 
| 1052 } | 1000 } | 
| 1053 | 1001 | 
| 1054 // Test that things go back to normal once a retry makes forward progress. | 1002 // Test that things go back to normal once a retry makes forward progress. | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 1065                       RecordSyncShareMultiple(&r, kMinNumSamples))) | 1013                       RecordSyncShareMultiple(&r, kMinNumSamples))) | 
| 1066       .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1014       .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 1067                             RecordSyncShareMultiple(&r, kMinNumSamples))); | 1015                             RecordSyncShareMultiple(&r, kMinNumSamples))); | 
| 1068   EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); | 1016   EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); | 
| 1069 | 1017 | 
| 1070   // Optimal start for the post-backoff poll party. | 1018   // Optimal start for the post-backoff poll party. | 
| 1071   TimeTicks optimal_start = TimeTicks::Now(); | 1019   TimeTicks optimal_start = TimeTicks::Now(); | 
| 1072   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1020   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 1073 | 1021 | 
| 1074   // Run again to wait for polling. | 1022   // Run again to wait for polling. | 
| 1075   scheduler()->ScheduleNudgeAsync(zero(), NUDGE_SOURCE_LOCAL, | 1023   scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 
| 1076                                   ModelTypeSet(BOOKMARKS), FROM_HERE); |  | 
| 1077   RunLoop(); | 1024   RunLoop(); | 
| 1078 | 1025 | 
| 1079   StopSyncScheduler(); | 1026   StopSyncScheduler(); | 
| 1080 | 1027 | 
| 1081   EXPECT_EQ(kMinNumSamples, r.times.size()); | 1028   EXPECT_EQ(kMinNumSamples, r.times.size()); | 
| 1082 | 1029 | 
| 1083   // The first nudge ran as soon as possible.  It failed. | 1030   // The first nudge ran as soon as possible.  It failed. | 
| 1084   TimeTicks optimal_job_time = optimal_start; | 1031   TimeTicks optimal_job_time = optimal_start; | 
| 1085   EXPECT_GE(r.times[0], optimal_job_time); | 1032   EXPECT_GE(r.times[0], optimal_job_time); | 
| 1086   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 1033   EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1127 } | 1074 } | 
| 1128 | 1075 | 
| 1129 // Test that appropriate syncer steps are requested for each job type. | 1076 // Test that appropriate syncer steps are requested for each job type. | 
| 1130 TEST_F(SyncSchedulerTest, SyncerSteps) { | 1077 TEST_F(SyncSchedulerTest, SyncerSteps) { | 
| 1131   // Nudges. | 1078   // Nudges. | 
| 1132   EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) | 1079   EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) | 
| 1133       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1080       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 1134                       Return(true))); | 1081                       Return(true))); | 
| 1135   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1082   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 1136 | 1083 | 
| 1137   scheduler()->ScheduleNudgeAsync( | 1084   scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 
| 1138       zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |  | 
| 1139   PumpLoop(); | 1085   PumpLoop(); | 
| 1140   // Pump again to run job. | 1086   // Pump again to run job. | 
| 1141   PumpLoop(); | 1087   PumpLoop(); | 
| 1142 | 1088 | 
| 1143   StopSyncScheduler(); | 1089   StopSyncScheduler(); | 
| 1144   Mock::VerifyAndClearExpectations(syncer()); | 1090   Mock::VerifyAndClearExpectations(syncer()); | 
| 1145 | 1091 | 
| 1146   // Configuration. | 1092   // Configuration. | 
| 1147   EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | 1093   EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | 
| 1148       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1094       .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1186 TEST_F(SyncSchedulerTest, StartWhenNotConnected) { | 1132 TEST_F(SyncSchedulerTest, StartWhenNotConnected) { | 
| 1187   connection()->SetServerNotReachable(); | 1133   connection()->SetServerNotReachable(); | 
| 1188   connection()->UpdateConnectionStatus(); | 1134   connection()->UpdateConnectionStatus(); | 
| 1189   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1135   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 1190     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 1136     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 
| 1191                     Return(true))) | 1137                     Return(true))) | 
| 1192     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1138     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 1193                     Return(true))); | 1139                     Return(true))); | 
| 1194   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1140   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 1195 | 1141 | 
| 1196   scheduler()->ScheduleNudgeAsync( | 1142   scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 
| 1197       zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |  | 
| 1198   // Should save the nudge for until after the server is reachable. | 1143   // Should save the nudge for until after the server is reachable. | 
| 1199   base::MessageLoop::current()->RunUntilIdle(); | 1144   base::MessageLoop::current()->RunUntilIdle(); | 
| 1200 | 1145 | 
| 1201   scheduler()->OnConnectionStatusChange(); | 1146   scheduler()->OnConnectionStatusChange(); | 
| 1202   connection()->SetServerReachable(); | 1147   connection()->SetServerReachable(); | 
| 1203   connection()->UpdateConnectionStatus(); | 1148   connection()->UpdateConnectionStatus(); | 
| 1204   base::MessageLoop::current()->RunUntilIdle(); | 1149   base::MessageLoop::current()->RunUntilIdle(); | 
| 1205 } | 1150 } | 
| 1206 | 1151 | 
| 1207 TEST_F(SyncSchedulerTest, ServerConnectionChangeDuringBackoff) { | 1152 TEST_F(SyncSchedulerTest, ServerConnectionChangeDuringBackoff) { | 
| 1208   UseMockDelayProvider(); | 1153   UseMockDelayProvider(); | 
| 1209   EXPECT_CALL(*delay(), GetDelay(_)) | 1154   EXPECT_CALL(*delay(), GetDelay(_)) | 
| 1210       .WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); | 1155       .WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); | 
| 1211 | 1156 | 
| 1212   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1157   StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 
| 1213   connection()->SetServerNotReachable(); | 1158   connection()->SetServerNotReachable(); | 
| 1214   connection()->UpdateConnectionStatus(); | 1159   connection()->UpdateConnectionStatus(); | 
| 1215 | 1160 | 
| 1216   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1161   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 1217     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 1162     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 
| 1218                     Return(true))) | 1163                     Return(true))) | 
| 1219     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1164     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 1220                     Return(true))); | 1165                     Return(true))); | 
| 1221 | 1166 | 
| 1222   scheduler()->ScheduleNudgeAsync( | 1167   scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 
| 1223       zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |  | 
| 1224 | 1168 | 
| 1225   PumpLoop();  // Run the nudge, that will fail and schedule a quick retry. | 1169   PumpLoop();  // Run the nudge, that will fail and schedule a quick retry. | 
| 1226   ASSERT_TRUE(scheduler()->IsBackingOff()); | 1170   ASSERT_TRUE(scheduler()->IsBackingOff()); | 
| 1227 | 1171 | 
| 1228   // Before we run the scheduled canary, trigger a server connection change. | 1172   // Before we run the scheduled canary, trigger a server connection change. | 
| 1229   scheduler()->OnConnectionStatusChange(); | 1173   scheduler()->OnConnectionStatusChange(); | 
| 1230   connection()->SetServerReachable(); | 1174   connection()->SetServerReachable(); | 
| 1231   connection()->UpdateConnectionStatus(); | 1175   connection()->UpdateConnectionStatus(); | 
| 1232   base::MessageLoop::current()->RunUntilIdle(); | 1176   base::MessageLoop::current()->RunUntilIdle(); | 
| 1233 } | 1177 } | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 1245   connection()->UpdateConnectionStatus(); | 1189   connection()->UpdateConnectionStatus(); | 
| 1246 | 1190 | 
| 1247   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 1191   EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 
| 1248     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 1192     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), | 
| 1249                     Return(true))) | 1193                     Return(true))) | 
| 1250     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1194     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 1251                     Return(true))) | 1195                     Return(true))) | 
| 1252     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1196     .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 
| 1253                     QuitLoopNowAction())); | 1197                     QuitLoopNowAction())); | 
| 1254 | 1198 | 
| 1255   scheduler()->ScheduleNudgeAsync( | 1199   scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 
| 1256       zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); |  | 
| 1257 | 1200 | 
| 1258   PumpLoop();  // Run the nudge, that will fail and schedule a quick retry. | 1201   PumpLoop();  // Run the nudge, that will fail and schedule a quick retry. | 
| 1259   ASSERT_TRUE(scheduler()->IsBackingOff()); | 1202   ASSERT_TRUE(scheduler()->IsBackingOff()); | 
| 1260 | 1203 | 
| 1261   // Before we run the scheduled canary, trigger a server connection change. | 1204   // Before we run the scheduled canary, trigger a server connection change. | 
| 1262   scheduler()->OnConnectionStatusChange(); | 1205   scheduler()->OnConnectionStatusChange(); | 
| 1263   connection()->SetServerReachable(); | 1206   connection()->SetServerReachable(); | 
| 1264   connection()->UpdateConnectionStatus(); | 1207   connection()->UpdateConnectionStatus(); | 
| 1265   scheduler()->ScheduleNudgeAsync( | 1208   scheduler()->ScheduleLocalNudge(zero(), ModelTypeSet(BOOKMARKS), FROM_HERE); | 
| 1266       zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE); | 1209   MessageLoop::current()->RunUntilIdle(); | 
| 1267   base::MessageLoop::current()->RunUntilIdle(); |  | 
| 1268 } | 1210 } | 
| 1269 | 1211 | 
| 1270 // Tests that we don't crash trying to run two canaries at once if we receive | 1212 // Tests that we don't crash trying to run two canaries at once if we receive | 
| 1271 // extra connection status change notifications.  See crbug.com/190085. | 1213 // extra connection status change notifications.  See crbug.com/190085. | 
| 1272 TEST_F(SyncSchedulerTest, DoubleCanaryInConfigure) { | 1214 TEST_F(SyncSchedulerTest, DoubleCanaryInConfigure) { | 
| 1273   EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | 1215   EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | 
| 1274       .WillRepeatedly(DoAll( | 1216       .WillRepeatedly(DoAll( | 
| 1275               Invoke(sessions::test_util::SimulateConnectionFailure), | 1217               Invoke(sessions::test_util::SimulateConnectionFailure), | 
| 1276               Return(true))); | 1218               Return(true))); | 
| 1277   StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 1219   StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 
| 1278   connection()->SetServerNotReachable(); | 1220   connection()->SetServerNotReachable(); | 
| 1279   connection()->UpdateConnectionStatus(); | 1221   connection()->UpdateConnectionStatus(); | 
| 1280 | 1222 | 
| 1281   ModelTypeSet model_types(BOOKMARKS); | 1223   ModelTypeSet model_types(BOOKMARKS); | 
| 1282   CallbackCounter counter; | 1224   CallbackCounter counter; | 
| 1283   ConfigurationParams params( | 1225   ConfigurationParams params( | 
| 1284       GetUpdatesCallerInfo::RECONFIGURATION, | 1226       GetUpdatesCallerInfo::RECONFIGURATION, | 
| 1285       model_types, | 1227       model_types, | 
| 1286       TypesToRoutingInfo(model_types), | 1228       TypesToRoutingInfo(model_types), | 
| 1287       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 1229       base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 
| 1288   scheduler()->ScheduleConfiguration(params); | 1230   scheduler()->ScheduleConfiguration(params); | 
| 1289 | 1231 | 
| 1290   scheduler()->OnConnectionStatusChange(); | 1232   scheduler()->OnConnectionStatusChange(); | 
| 1291   scheduler()->OnConnectionStatusChange(); | 1233   scheduler()->OnConnectionStatusChange(); | 
| 1292 | 1234 | 
| 1293   PumpLoop();  // Run the nudge, that will fail and schedule a quick retry. | 1235   PumpLoop();  // Run the nudge, that will fail and schedule a quick retry. | 
| 1294 } | 1236 } | 
| 1295 | 1237 | 
| 1296 }  // namespace syncer | 1238 }  // namespace syncer | 
| OLD | NEW | 
|---|