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