| 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 public: | 92 public: |
| 93 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&)); | 93 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&)); |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 virtual void SetUp() { | 96 virtual void SetUp() { |
| 97 dir_maker_.SetUp(); | 97 dir_maker_.SetUp(); |
| 98 syncer_ = new MockSyncer(); | 98 syncer_ = new MockSyncer(); |
| 99 delay_ = NULL; | 99 delay_ = NULL; |
| 100 | 100 |
| 101 ModelSafeRoutingInfo routing_info; | 101 ModelSafeRoutingInfo routing_info; |
| 102 routing_info[syncer::BOOKMARKS] = GROUP_UI; | 102 routing_info[BOOKMARKS] = GROUP_UI; |
| 103 routing_info[syncer::AUTOFILL] = GROUP_DB; | 103 routing_info[AUTOFILL] = GROUP_DB; |
| 104 routing_info[syncer::THEMES] = GROUP_UI; | 104 routing_info[THEMES] = GROUP_UI; |
| 105 routing_info[syncer::NIGORI] = GROUP_PASSIVE; | 105 routing_info[NIGORI] = GROUP_PASSIVE; |
| 106 | 106 |
| 107 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_UI))); | 107 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_UI))); |
| 108 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB))); | 108 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB))); |
| 109 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_PASSIVE))); | 109 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_PASSIVE))); |
| 110 | 110 |
| 111 std::vector<ModelSafeWorker*> workers; | 111 std::vector<ModelSafeWorker*> workers; |
| 112 for (std::vector<scoped_refptr<FakeModelWorker> >::iterator it = | 112 for (std::vector<scoped_refptr<FakeModelWorker> >::iterator it = |
| 113 workers_.begin(); it != workers_.end(); ++it) { | 113 workers_.begin(); it != workers_.end(); ++it) { |
| 114 workers.push_back(it->get()); | 114 workers.push_back(it->get()); |
| 115 } | 115 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 | 184 |
| 185 void UseMockDelayProvider() { | 185 void UseMockDelayProvider() { |
| 186 delay_ = new MockDelayProvider(); | 186 delay_ = new MockDelayProvider(); |
| 187 scheduler_->delay_provider_.reset(delay_); | 187 scheduler_->delay_provider_.reset(delay_); |
| 188 } | 188 } |
| 189 | 189 |
| 190 // Compare a ModelTypeSet to a ModelTypePayloadMap, ignoring | 190 // Compare a ModelTypeSet to a ModelTypePayloadMap, ignoring |
| 191 // payload values. | 191 // payload values. |
| 192 bool CompareModelTypeSetToModelTypePayloadMap( | 192 bool CompareModelTypeSetToModelTypePayloadMap( |
| 193 ModelTypeSet lhs, | 193 ModelTypeSet lhs, |
| 194 const syncer::ModelTypePayloadMap& rhs) { | 194 const ModelTypePayloadMap& rhs) { |
| 195 size_t count = 0; | 195 size_t count = 0; |
| 196 for (syncer::ModelTypePayloadMap::const_iterator i = rhs.begin(); | 196 for (ModelTypePayloadMap::const_iterator i = rhs.begin(); |
| 197 i != rhs.end(); ++i, ++count) { | 197 i != rhs.end(); ++i, ++count) { |
| 198 if (!lhs.Has(i->first)) | 198 if (!lhs.Has(i->first)) |
| 199 return false; | 199 return false; |
| 200 } | 200 } |
| 201 if (lhs.Size() != count) | 201 if (lhs.Size() != count) |
| 202 return false; | 202 return false; |
| 203 return true; | 203 return true; |
| 204 } | 204 } |
| 205 | 205 |
| 206 SyncSessionContext* context() { return context_.get(); } | 206 SyncSessionContext* context() { return context_.get(); } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 QuitLoopNow(); | 248 QuitLoopNow(); |
| 249 } | 249 } |
| 250 | 250 |
| 251 ACTION(QuitLoopNowAction) { | 251 ACTION(QuitLoopNowAction) { |
| 252 QuitLoopNow(); | 252 QuitLoopNow(); |
| 253 } | 253 } |
| 254 | 254 |
| 255 // Test nudge scheduling. | 255 // Test nudge scheduling. |
| 256 TEST_F(SyncSchedulerTest, Nudge) { | 256 TEST_F(SyncSchedulerTest, Nudge) { |
| 257 SyncShareRecords records; | 257 SyncShareRecords records; |
| 258 ModelTypeSet model_types(syncer::BOOKMARKS); | 258 ModelTypeSet model_types(BOOKMARKS); |
| 259 | 259 |
| 260 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 260 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 261 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 261 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 262 WithArg<0>(RecordSyncShare(&records)))) | 262 WithArg<0>(RecordSyncShare(&records)))) |
| 263 .RetiresOnSaturation(); | 263 .RetiresOnSaturation(); |
| 264 | 264 |
| 265 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 265 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 266 | 266 |
| 267 scheduler()->ScheduleNudgeAsync( | 267 scheduler()->ScheduleNudgeAsync( |
| 268 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); | 268 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); |
| 269 RunLoop(); | 269 RunLoop(); |
| 270 | 270 |
| 271 ASSERT_EQ(1U, records.snapshots.size()); | 271 ASSERT_EQ(1U, records.snapshots.size()); |
| 272 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, | 272 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, |
| 273 records.snapshots[0].source().types)); | 273 records.snapshots[0].source().types)); |
| 274 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 274 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 275 records.snapshots[0].source().updates_source); | 275 records.snapshots[0].source().updates_source); |
| 276 | 276 |
| 277 Mock::VerifyAndClearExpectations(syncer()); | 277 Mock::VerifyAndClearExpectations(syncer()); |
| 278 | 278 |
| 279 // Make sure a second, later, nudge is unaffected by first (no coalescing). | 279 // Make sure a second, later, nudge is unaffected by first (no coalescing). |
| 280 SyncShareRecords records2; | 280 SyncShareRecords records2; |
| 281 model_types.Remove(syncer::BOOKMARKS); | 281 model_types.Remove(BOOKMARKS); |
| 282 model_types.Put(syncer::AUTOFILL); | 282 model_types.Put(AUTOFILL); |
| 283 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 283 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 284 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 284 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 285 WithArg<0>(RecordSyncShare(&records2)))); | 285 WithArg<0>(RecordSyncShare(&records2)))); |
| 286 scheduler()->ScheduleNudgeAsync( | 286 scheduler()->ScheduleNudgeAsync( |
| 287 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); | 287 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); |
| 288 RunLoop(); | 288 RunLoop(); |
| 289 | 289 |
| 290 ASSERT_EQ(1U, records2.snapshots.size()); | 290 ASSERT_EQ(1U, records2.snapshots.size()); |
| 291 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, | 291 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, |
| 292 records2.snapshots[0].source().types)); | 292 records2.snapshots[0].source().types)); |
| 293 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 293 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 294 records2.snapshots[0].source().updates_source); | 294 records2.snapshots[0].source().updates_source); |
| 295 } | 295 } |
| 296 | 296 |
| 297 // Make sure a regular config command is scheduled fine in the absence of any | 297 // Make sure a regular config command is scheduled fine in the absence of any |
| 298 // errors. | 298 // errors. |
| 299 TEST_F(SyncSchedulerTest, Config) { | 299 TEST_F(SyncSchedulerTest, Config) { |
| 300 SyncShareRecords records; | 300 SyncShareRecords records; |
| 301 const ModelTypeSet model_types(syncer::BOOKMARKS); | 301 const ModelTypeSet model_types(BOOKMARKS); |
| 302 | 302 |
| 303 EXPECT_CALL(*syncer(), | 303 EXPECT_CALL(*syncer(), |
| 304 SyncShare(_,_,_)) | 304 SyncShare(_,_,_)) |
| 305 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) | 305 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) |
| 306 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 306 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 307 WithArg<0>(RecordSyncShare(&records)))); | 307 WithArg<0>(RecordSyncShare(&records)))); |
| 308 | 308 |
| 309 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 309 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
| 310 | 310 |
| 311 CallbackCounter counter; | 311 CallbackCounter counter; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 324 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 324 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, |
| 325 records.snapshots[0].source().updates_source); | 325 records.snapshots[0].source().updates_source); |
| 326 } | 326 } |
| 327 | 327 |
| 328 // Simulate a failure and make sure the config request is retried. | 328 // Simulate a failure and make sure the config request is retried. |
| 329 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { | 329 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { |
| 330 UseMockDelayProvider(); | 330 UseMockDelayProvider(); |
| 331 EXPECT_CALL(*delay(), GetDelay(_)) | 331 EXPECT_CALL(*delay(), GetDelay(_)) |
| 332 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 332 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); |
| 333 SyncShareRecords records; | 333 SyncShareRecords records; |
| 334 const ModelTypeSet model_types(syncer::BOOKMARKS); | 334 const ModelTypeSet model_types(BOOKMARKS); |
| 335 | 335 |
| 336 EXPECT_CALL(*syncer(), | 336 EXPECT_CALL(*syncer(), |
| 337 SyncShare(_,_,_)) | 337 SyncShare(_,_,_)) |
| 338 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) | 338 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) |
| 339 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 339 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
| 340 WithArg<0>(RecordSyncShare(&records)))) | 340 WithArg<0>(RecordSyncShare(&records)))) |
| 341 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 341 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 342 WithArg<0>(RecordSyncShare(&records)))); | 342 WithArg<0>(RecordSyncShare(&records)))); |
| 343 | 343 |
| 344 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 344 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 361 ASSERT_EQ(1, counter.times_called()); | 361 ASSERT_EQ(1, counter.times_called()); |
| 362 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, | 362 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, |
| 363 records.snapshots[1].source().types)); | 363 records.snapshots[1].source().types)); |
| 364 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, | 364 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, |
| 365 records.snapshots[1].source().updates_source); | 365 records.snapshots[1].source().updates_source); |
| 366 } | 366 } |
| 367 | 367 |
| 368 // Issue a nudge when the config has failed. Make sure both the config and | 368 // Issue a nudge when the config has failed. Make sure both the config and |
| 369 // nudge are executed. | 369 // nudge are executed. |
| 370 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { | 370 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { |
| 371 const ModelTypeSet model_types(syncer::BOOKMARKS); | 371 const ModelTypeSet model_types(BOOKMARKS); |
| 372 UseMockDelayProvider(); | 372 UseMockDelayProvider(); |
| 373 EXPECT_CALL(*delay(), GetDelay(_)) | 373 EXPECT_CALL(*delay(), GetDelay(_)) |
| 374 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(50))); | 374 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(50))); |
| 375 SyncShareRecords records; | 375 SyncShareRecords records; |
| 376 | 376 |
| 377 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 377 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 378 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 378 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
| 379 WithArg<0>(RecordSyncShare(&records)))) | 379 WithArg<0>(RecordSyncShare(&records)))) |
| 380 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 380 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
| 381 WithArg<0>(RecordSyncShare(&records)))) | 381 WithArg<0>(RecordSyncShare(&records)))) |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 } | 426 } |
| 427 | 427 |
| 428 // Test that nudges are coalesced. | 428 // Test that nudges are coalesced. |
| 429 TEST_F(SyncSchedulerTest, NudgeCoalescing) { | 429 TEST_F(SyncSchedulerTest, NudgeCoalescing) { |
| 430 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 430 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 431 | 431 |
| 432 SyncShareRecords r; | 432 SyncShareRecords r; |
| 433 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 433 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 434 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 434 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 435 WithArg<0>(RecordSyncShare(&r)))); | 435 WithArg<0>(RecordSyncShare(&r)))); |
| 436 const ModelTypeSet | 436 const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES); |
| 437 types1(syncer::BOOKMARKS), | |
| 438 types2(syncer::AUTOFILL), | |
| 439 types3(syncer::THEMES); | |
| 440 TimeDelta delay = zero(); | 437 TimeDelta delay = zero(); |
| 441 TimeTicks optimal_time = TimeTicks::Now() + delay; | 438 TimeTicks optimal_time = TimeTicks::Now() + delay; |
| 442 scheduler()->ScheduleNudgeAsync( | 439 scheduler()->ScheduleNudgeAsync( |
| 443 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); | 440 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); |
| 444 scheduler()->ScheduleNudgeAsync( | 441 scheduler()->ScheduleNudgeAsync( |
| 445 zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE); | 442 zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE); |
| 446 RunLoop(); | 443 RunLoop(); |
| 447 | 444 |
| 448 ASSERT_EQ(1U, r.snapshots.size()); | 445 ASSERT_EQ(1U, r.snapshots.size()); |
| 449 EXPECT_GE(r.times[0], optimal_time); | 446 EXPECT_GE(r.times[0], optimal_time); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 470 } | 467 } |
| 471 | 468 |
| 472 // Test that nudges are coalesced. | 469 // Test that nudges are coalesced. |
| 473 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { | 470 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { |
| 474 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 471 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 475 | 472 |
| 476 SyncShareRecords r; | 473 SyncShareRecords r; |
| 477 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 474 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 478 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 475 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 479 WithArg<0>(RecordSyncShare(&r)))); | 476 WithArg<0>(RecordSyncShare(&r)))); |
| 480 syncer::ModelTypeSet types1(syncer::BOOKMARKS), | 477 ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3; |
| 481 types2(syncer::AUTOFILL), types3; | |
| 482 | 478 |
| 483 // Create a huge time delay. | 479 // Create a huge time delay. |
| 484 TimeDelta delay = TimeDelta::FromDays(1); | 480 TimeDelta delay = TimeDelta::FromDays(1); |
| 485 | 481 |
| 486 scheduler()->ScheduleNudgeAsync( | 482 scheduler()->ScheduleNudgeAsync( |
| 487 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); | 483 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); |
| 488 | 484 |
| 489 scheduler()->ScheduleNudgeAsync( | 485 scheduler()->ScheduleNudgeAsync( |
| 490 zero(), NUDGE_SOURCE_UNKNOWN, types2, FROM_HERE); | 486 zero(), NUDGE_SOURCE_UNKNOWN, types2, FROM_HERE); |
| 491 | 487 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 502 // Make sure the sync happened at the right time. | 498 // Make sure the sync happened at the right time. |
| 503 EXPECT_GE(r.times[0], min_time); | 499 EXPECT_GE(r.times[0], min_time); |
| 504 EXPECT_LE(r.times[0], max_time); | 500 EXPECT_LE(r.times[0], max_time); |
| 505 } | 501 } |
| 506 | 502 |
| 507 // Test nudge scheduling. | 503 // Test nudge scheduling. |
| 508 TEST_F(SyncSchedulerTest, NudgeWithPayloads) { | 504 TEST_F(SyncSchedulerTest, NudgeWithPayloads) { |
| 509 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 505 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 510 | 506 |
| 511 SyncShareRecords records; | 507 SyncShareRecords records; |
| 512 syncer::ModelTypePayloadMap model_types_with_payloads; | 508 ModelTypePayloadMap model_types_with_payloads; |
| 513 model_types_with_payloads[syncer::BOOKMARKS] = "test"; | 509 model_types_with_payloads[BOOKMARKS] = "test"; |
| 514 | 510 |
| 515 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 511 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 516 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 512 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 517 WithArg<0>(RecordSyncShare(&records)))) | 513 WithArg<0>(RecordSyncShare(&records)))) |
| 518 .RetiresOnSaturation(); | 514 .RetiresOnSaturation(); |
| 519 scheduler()->ScheduleNudgeWithPayloadsAsync( | 515 scheduler()->ScheduleNudgeWithPayloadsAsync( |
| 520 zero(), NUDGE_SOURCE_LOCAL, model_types_with_payloads, FROM_HERE); | 516 zero(), NUDGE_SOURCE_LOCAL, model_types_with_payloads, FROM_HERE); |
| 521 RunLoop(); | 517 RunLoop(); |
| 522 | 518 |
| 523 ASSERT_EQ(1U, records.snapshots.size()); | 519 ASSERT_EQ(1U, records.snapshots.size()); |
| 524 EXPECT_EQ(model_types_with_payloads, records.snapshots[0].source().types); | 520 EXPECT_EQ(model_types_with_payloads, records.snapshots[0].source().types); |
| 525 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 521 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 526 records.snapshots[0].source().updates_source); | 522 records.snapshots[0].source().updates_source); |
| 527 | 523 |
| 528 Mock::VerifyAndClearExpectations(syncer()); | 524 Mock::VerifyAndClearExpectations(syncer()); |
| 529 | 525 |
| 530 // Make sure a second, later, nudge is unaffected by first (no coalescing). | 526 // Make sure a second, later, nudge is unaffected by first (no coalescing). |
| 531 SyncShareRecords records2; | 527 SyncShareRecords records2; |
| 532 model_types_with_payloads.erase(syncer::BOOKMARKS); | 528 model_types_with_payloads.erase(BOOKMARKS); |
| 533 model_types_with_payloads[syncer::AUTOFILL] = "test2"; | 529 model_types_with_payloads[AUTOFILL] = "test2"; |
| 534 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 530 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 535 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 531 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 536 WithArg<0>(RecordSyncShare(&records2)))); | 532 WithArg<0>(RecordSyncShare(&records2)))); |
| 537 scheduler()->ScheduleNudgeWithPayloadsAsync( | 533 scheduler()->ScheduleNudgeWithPayloadsAsync( |
| 538 zero(), NUDGE_SOURCE_LOCAL, model_types_with_payloads, FROM_HERE); | 534 zero(), NUDGE_SOURCE_LOCAL, model_types_with_payloads, FROM_HERE); |
| 539 RunLoop(); | 535 RunLoop(); |
| 540 | 536 |
| 541 ASSERT_EQ(1U, records2.snapshots.size()); | 537 ASSERT_EQ(1U, records2.snapshots.size()); |
| 542 EXPECT_EQ(model_types_with_payloads, records2.snapshots[0].source().types); | 538 EXPECT_EQ(model_types_with_payloads, records2.snapshots[0].source().types); |
| 543 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 539 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 544 records2.snapshots[0].source().updates_source); | 540 records2.snapshots[0].source().updates_source); |
| 545 } | 541 } |
| 546 | 542 |
| 547 // Test that nudges are coalesced. | 543 // Test that nudges are coalesced. |
| 548 TEST_F(SyncSchedulerTest, NudgeWithPayloadsCoalescing) { | 544 TEST_F(SyncSchedulerTest, NudgeWithPayloadsCoalescing) { |
| 549 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 545 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 550 | 546 |
| 551 SyncShareRecords r; | 547 SyncShareRecords r; |
| 552 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 548 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 553 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 549 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 554 WithArg<0>(RecordSyncShare(&r)))); | 550 WithArg<0>(RecordSyncShare(&r)))); |
| 555 syncer::ModelTypePayloadMap types1, types2, types3; | 551 ModelTypePayloadMap types1, types2, types3; |
| 556 types1[syncer::BOOKMARKS] = "test1"; | 552 types1[BOOKMARKS] = "test1"; |
| 557 types2[syncer::AUTOFILL] = "test2"; | 553 types2[AUTOFILL] = "test2"; |
| 558 types3[syncer::THEMES] = "test3"; | 554 types3[THEMES] = "test3"; |
| 559 TimeDelta delay = zero(); | 555 TimeDelta delay = zero(); |
| 560 TimeTicks optimal_time = TimeTicks::Now() + delay; | 556 TimeTicks optimal_time = TimeTicks::Now() + delay; |
| 561 scheduler()->ScheduleNudgeWithPayloadsAsync( | 557 scheduler()->ScheduleNudgeWithPayloadsAsync( |
| 562 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); | 558 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); |
| 563 scheduler()->ScheduleNudgeWithPayloadsAsync( | 559 scheduler()->ScheduleNudgeWithPayloadsAsync( |
| 564 zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE); | 560 zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE); |
| 565 RunLoop(); | 561 RunLoop(); |
| 566 | 562 |
| 567 ASSERT_EQ(1U, r.snapshots.size()); | 563 ASSERT_EQ(1U, r.snapshots.size()); |
| 568 EXPECT_GE(r.times[0], optimal_time); | 564 EXPECT_GE(r.times[0], optimal_time); |
| 569 syncer::ModelTypePayloadMap coalesced_types; | 565 ModelTypePayloadMap coalesced_types; |
| 570 syncer::CoalescePayloads(&coalesced_types, types1); | 566 CoalescePayloads(&coalesced_types, types1); |
| 571 syncer::CoalescePayloads(&coalesced_types, types2); | 567 CoalescePayloads(&coalesced_types, types2); |
| 572 EXPECT_EQ(coalesced_types, r.snapshots[0].source().types); | 568 EXPECT_EQ(coalesced_types, r.snapshots[0].source().types); |
| 573 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 569 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
| 574 r.snapshots[0].source().updates_source); | 570 r.snapshots[0].source().updates_source); |
| 575 | 571 |
| 576 Mock::VerifyAndClearExpectations(syncer()); | 572 Mock::VerifyAndClearExpectations(syncer()); |
| 577 | 573 |
| 578 SyncShareRecords r2; | 574 SyncShareRecords r2; |
| 579 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 575 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 580 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 576 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 581 WithArg<0>(RecordSyncShare(&r2)))); | 577 WithArg<0>(RecordSyncShare(&r2)))); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 WithArg<0>( | 663 WithArg<0>( |
| 668 sessions::test_util::SimulateSessionsCommitDelayUpdate( | 664 sessions::test_util::SimulateSessionsCommitDelayUpdate( |
| 669 delay2)), | 665 delay2)), |
| 670 Invoke(sessions::test_util::SimulateSuccess), | 666 Invoke(sessions::test_util::SimulateSuccess), |
| 671 QuitLoopNowAction())); | 667 QuitLoopNowAction())); |
| 672 | 668 |
| 673 EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); | 669 EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); |
| 674 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 670 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 675 | 671 |
| 676 EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); | 672 EXPECT_EQ(delay1, scheduler()->GetSessionsCommitDelay()); |
| 677 const ModelTypeSet model_types(syncer::BOOKMARKS); | 673 const ModelTypeSet model_types(BOOKMARKS); |
| 678 scheduler()->ScheduleNudgeAsync( | 674 scheduler()->ScheduleNudgeAsync( |
| 679 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); | 675 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); |
| 680 RunLoop(); | 676 RunLoop(); |
| 681 | 677 |
| 682 EXPECT_EQ(delay2, scheduler()->GetSessionsCommitDelay()); | 678 EXPECT_EQ(delay2, scheduler()->GetSessionsCommitDelay()); |
| 683 StopSyncScheduler(); | 679 StopSyncScheduler(); |
| 684 } | 680 } |
| 685 | 681 |
| 686 // Test that a sync session is run through to completion. | 682 // Test that a sync session is run through to completion. |
| 687 TEST_F(SyncSchedulerTest, HasMoreToSync) { | 683 TEST_F(SyncSchedulerTest, HasMoreToSync) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 709 scheduler()->ScheduleNudgeAsync( | 705 scheduler()->ScheduleNudgeAsync( |
| 710 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 706 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); |
| 711 | 707 |
| 712 // We should detect the failure on the second sync share, and go into backoff. | 708 // We should detect the failure on the second sync share, and go into backoff. |
| 713 EXPECT_TRUE(RunAndGetBackoff()); | 709 EXPECT_TRUE(RunAndGetBackoff()); |
| 714 } | 710 } |
| 715 | 711 |
| 716 // Test that no syncing occurs when throttled (although CleanupDisabledTypes | 712 // Test that no syncing occurs when throttled (although CleanupDisabledTypes |
| 717 // is allowed). | 713 // is allowed). |
| 718 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { | 714 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { |
| 719 const ModelTypeSet types(syncer::BOOKMARKS); | 715 const ModelTypeSet types(BOOKMARKS); |
| 720 TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 716 TimeDelta poll(TimeDelta::FromMilliseconds(5)); |
| 721 TimeDelta throttle(TimeDelta::FromMinutes(10)); | 717 TimeDelta throttle(TimeDelta::FromMinutes(10)); |
| 722 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 718 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
| 723 | 719 |
| 724 EXPECT_CALL(*syncer(), | 720 EXPECT_CALL(*syncer(), |
| 725 SyncShare(_, CLEANUP_DISABLED_TYPES, CLEANUP_DISABLED_TYPES)) | 721 SyncShare(_, CLEANUP_DISABLED_TYPES, CLEANUP_DISABLED_TYPES)) |
| 726 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); | 722 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
| 727 EXPECT_CALL(*syncer(), SyncShare(_,Not(CLEANUP_DISABLED_TYPES), | 723 EXPECT_CALL(*syncer(), SyncShare(_,Not(CLEANUP_DISABLED_TYPES), |
| 728 Not(CLEANUP_DISABLED_TYPES))) | 724 Not(CLEANUP_DISABLED_TYPES))) |
| 729 .WillOnce(WithArg<0>(sessions::test_util::SimulateThrottled(throttle))) | 725 .WillOnce(WithArg<0>(sessions::test_util::SimulateThrottled(throttle))) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 777 TimeDelta poll(TimeDelta::FromMilliseconds(15)); | 773 TimeDelta poll(TimeDelta::FromMilliseconds(15)); |
| 778 SyncShareRecords records; | 774 SyncShareRecords records; |
| 779 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 775 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
| 780 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 776 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 781 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) | 777 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) |
| 782 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 778 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
| 783 WithArg<0>(RecordSyncShare(&records)))); | 779 WithArg<0>(RecordSyncShare(&records)))); |
| 784 | 780 |
| 785 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 781 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
| 786 | 782 |
| 787 const ModelTypeSet nudge_types(syncer::AUTOFILL); | 783 const ModelTypeSet nudge_types(AUTOFILL); |
| 788 scheduler()->ScheduleNudgeAsync( | 784 scheduler()->ScheduleNudgeAsync( |
| 789 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); | 785 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |
| 790 scheduler()->ScheduleNudgeAsync( | 786 scheduler()->ScheduleNudgeAsync( |
| 791 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); | 787 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |
| 792 | 788 |
| 793 const ModelTypeSet config_types(syncer::BOOKMARKS); | 789 const ModelTypeSet config_types(BOOKMARKS); |
| 794 | 790 |
| 795 CallbackCounter counter; | 791 CallbackCounter counter; |
| 796 ConfigurationParams params( | 792 ConfigurationParams params( |
| 797 GetUpdatesCallerInfo::RECONFIGURATION, | 793 GetUpdatesCallerInfo::RECONFIGURATION, |
| 798 config_types, | 794 config_types, |
| 799 TypesToRoutingInfo(config_types), | 795 TypesToRoutingInfo(config_types), |
| 800 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, | 796 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, |
| 801 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 797 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
| 802 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 798 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); |
| 803 ASSERT_EQ(1, counter.times_called()); | 799 ASSERT_EQ(1, counter.times_called()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 .WillRepeatedly(DoAll( | 854 .WillRepeatedly(DoAll( |
| 859 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), | 855 Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
| 860 QuitLoopNowAction())); | 856 QuitLoopNowAction())); |
| 861 EXPECT_TRUE(RunAndGetBackoff()); | 857 EXPECT_TRUE(RunAndGetBackoff()); |
| 862 } | 858 } |
| 863 | 859 |
| 864 // Test that no polls or extraneous nudges occur when in backoff. | 860 // Test that no polls or extraneous nudges occur when in backoff. |
| 865 TEST_F(SyncSchedulerTest, BackoffDropsJobs) { | 861 TEST_F(SyncSchedulerTest, BackoffDropsJobs) { |
| 866 SyncShareRecords r; | 862 SyncShareRecords r; |
| 867 TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 863 TimeDelta poll(TimeDelta::FromMilliseconds(5)); |
| 868 const ModelTypeSet types(syncer::BOOKMARKS); | 864 const ModelTypeSet types(BOOKMARKS); |
| 869 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 865 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
| 870 UseMockDelayProvider(); | 866 UseMockDelayProvider(); |
| 871 | 867 |
| 872 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 868 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 873 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 869 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
| 874 RecordSyncShareMultiple(&r, 1U))); | 870 RecordSyncShareMultiple(&r, 1U))); |
| 875 EXPECT_CALL(*delay(), GetDelay(_)). | 871 EXPECT_CALL(*delay(), GetDelay(_)). |
| 876 WillRepeatedly(Return(TimeDelta::FromDays(1))); | 872 WillRepeatedly(Return(TimeDelta::FromDays(1))); |
| 877 | 873 |
| 878 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 874 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 Mock::VerifyAndClearExpectations(syncer()); | 1077 Mock::VerifyAndClearExpectations(syncer()); |
| 1082 | 1078 |
| 1083 // Configuration (always includes a cleanup disabled types). | 1079 // Configuration (always includes a cleanup disabled types). |
| 1084 EXPECT_CALL(*syncer(), | 1080 EXPECT_CALL(*syncer(), |
| 1085 SyncShare(_, CLEANUP_DISABLED_TYPES, CLEANUP_DISABLED_TYPES)) | 1081 SyncShare(_, CLEANUP_DISABLED_TYPES, CLEANUP_DISABLED_TYPES)) |
| 1086 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); | 1082 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
| 1087 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | 1083 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) |
| 1088 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); | 1084 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
| 1089 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 1085 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
| 1090 | 1086 |
| 1091 syncer::ModelTypeSet model_types(syncer::BOOKMARKS); | 1087 ModelTypeSet model_types(BOOKMARKS); |
| 1092 CallbackCounter counter; | 1088 CallbackCounter counter; |
| 1093 ConfigurationParams params( | 1089 ConfigurationParams params( |
| 1094 GetUpdatesCallerInfo::RECONFIGURATION, | 1090 GetUpdatesCallerInfo::RECONFIGURATION, |
| 1095 model_types, | 1091 model_types, |
| 1096 TypesToRoutingInfo(model_types), | 1092 TypesToRoutingInfo(model_types), |
| 1097 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, | 1093 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, |
| 1098 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 1094 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
| 1099 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 1095 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); |
| 1100 ASSERT_EQ(1, counter.times_called()); | 1096 ASSERT_EQ(1, counter.times_called()); |
| 1101 // Runs directly so no need to pump the loop. | 1097 // Runs directly so no need to pump the loop. |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1180 PumpLoop(); | 1176 PumpLoop(); |
| 1181 // Pump again to run job. | 1177 // Pump again to run job. |
| 1182 PumpLoop(); | 1178 PumpLoop(); |
| 1183 | 1179 |
| 1184 StopSyncScheduler(); | 1180 StopSyncScheduler(); |
| 1185 | 1181 |
| 1186 EXPECT_TRUE(expected == context()->previous_session_routing_info()); | 1182 EXPECT_TRUE(expected == context()->previous_session_routing_info()); |
| 1187 } | 1183 } |
| 1188 | 1184 |
| 1189 } // namespace syncer | 1185 } // namespace syncer |
| OLD | NEW |