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

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

Issue 10837214: Refactor ModelTypePayloadMap and ObjectIdPayloadMap to StateMaps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unit test Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sync/engine/sync_scheduler_impl.cc ('k') | sync/engine/sync_scheduler_whitebox_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/callback.h" 6 #include "base/callback.h"
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/memory/weak_ptr.h" 8 #include "base/memory/weak_ptr.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/test/test_timeouts.h" 10 #include "base/test/test_timeouts.h"
11 #include "sync/engine/backoff_delay_provider.h" 11 #include "sync/engine/backoff_delay_provider.h"
12 #include "sync/engine/sync_scheduler_impl.h" 12 #include "sync/engine/sync_scheduler_impl.h"
13 #include "sync/engine/syncer.h" 13 #include "sync/engine/syncer.h"
14 #include "sync/engine/throttled_data_type_tracker.h" 14 #include "sync/engine/throttled_data_type_tracker.h"
15 #include "sync/internal_api/public/base/model_type_state_map_test_util.h"
15 #include "sync/sessions/test_util.h" 16 #include "sync/sessions/test_util.h"
16 #include "sync/test/callback_counter.h" 17 #include "sync/test/callback_counter.h"
17 #include "sync/test/engine/fake_model_worker.h" 18 #include "sync/test/engine/fake_model_worker.h"
18 #include "sync/test/engine/mock_connection_manager.h" 19 #include "sync/test/engine/mock_connection_manager.h"
19 #include "sync/test/engine/test_directory_setter_upper.h" 20 #include "sync/test/engine/test_directory_setter_upper.h"
20 #include "sync/test/fake_extensions_activity_monitor.h" 21 #include "sync/test/fake_extensions_activity_monitor.h"
21 #include "testing/gmock/include/gmock/gmock.h" 22 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
23 24
24 using base::TimeDelta; 25 using base::TimeDelta;
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 RunLoop(); 192 RunLoop();
192 193
193 return scheduler()->IsBackingOff(); 194 return scheduler()->IsBackingOff();
194 } 195 }
195 196
196 void UseMockDelayProvider() { 197 void UseMockDelayProvider() {
197 delay_ = new MockDelayProvider(); 198 delay_ = new MockDelayProvider();
198 scheduler_->delay_provider_.reset(delay_); 199 scheduler_->delay_provider_.reset(delay_);
199 } 200 }
200 201
201 // Compare a ModelTypeSet to a ModelTypePayloadMap, ignoring 202 // Compare a ModelTypeSet to a ModelTypeStateMap, ignoring
202 // payload values. 203 // state values.
203 bool CompareModelTypeSetToModelTypePayloadMap( 204 bool CompareModelTypeSetToModelTypeStateMap(
204 ModelTypeSet lhs, 205 ModelTypeSet lhs,
205 const ModelTypePayloadMap& rhs) { 206 const ModelTypeStateMap& rhs) {
206 size_t count = 0; 207 size_t count = 0;
207 for (ModelTypePayloadMap::const_iterator i = rhs.begin(); 208 for (ModelTypeStateMap::const_iterator i = rhs.begin();
208 i != rhs.end(); ++i, ++count) { 209 i != rhs.end(); ++i, ++count) {
209 if (!lhs.Has(i->first)) 210 if (!lhs.Has(i->first))
210 return false; 211 return false;
211 } 212 }
212 if (lhs.Size() != count) 213 if (lhs.Size() != count)
213 return false; 214 return false;
214 return true; 215 return true;
215 } 216 }
216 217
217 SyncSessionContext* context() { return context_.get(); } 218 SyncSessionContext* context() { return context_.get(); }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 WithArg<0>(RecordSyncShare(&records)))) 274 WithArg<0>(RecordSyncShare(&records))))
274 .RetiresOnSaturation(); 275 .RetiresOnSaturation();
275 276
276 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 277 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
277 278
278 scheduler()->ScheduleNudgeAsync( 279 scheduler()->ScheduleNudgeAsync(
279 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); 280 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE);
280 RunLoop(); 281 RunLoop();
281 282
282 ASSERT_EQ(1U, records.snapshots.size()); 283 ASSERT_EQ(1U, records.snapshots.size());
283 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, 284 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(model_types,
284 records.snapshots[0].source().types)); 285 records.snapshots[0].source().types));
285 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 286 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
286 records.snapshots[0].source().updates_source); 287 records.snapshots[0].source().updates_source);
287 288
288 Mock::VerifyAndClearExpectations(syncer()); 289 Mock::VerifyAndClearExpectations(syncer());
289 290
290 // Make sure a second, later, nudge is unaffected by first (no coalescing). 291 // Make sure a second, later, nudge is unaffected by first (no coalescing).
291 SyncShareRecords records2; 292 SyncShareRecords records2;
292 model_types.Remove(BOOKMARKS); 293 model_types.Remove(BOOKMARKS);
293 model_types.Put(AUTOFILL); 294 model_types.Put(AUTOFILL);
294 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 295 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
295 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 296 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
296 WithArg<0>(RecordSyncShare(&records2)))); 297 WithArg<0>(RecordSyncShare(&records2))));
297 scheduler()->ScheduleNudgeAsync( 298 scheduler()->ScheduleNudgeAsync(
298 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); 299 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE);
299 RunLoop(); 300 RunLoop();
300 301
301 ASSERT_EQ(1U, records2.snapshots.size()); 302 ASSERT_EQ(1U, records2.snapshots.size());
302 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, 303 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(model_types,
303 records2.snapshots[0].source().types)); 304 records2.snapshots[0].source().types));
304 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 305 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
305 records2.snapshots[0].source().updates_source); 306 records2.snapshots[0].source().updates_source);
306 } 307 }
307 308
308 // Make sure a regular config command is scheduled fine in the absence of any 309 // Make sure a regular config command is scheduled fine in the absence of any
309 // errors. 310 // errors.
310 TEST_F(SyncSchedulerTest, Config) { 311 TEST_F(SyncSchedulerTest, Config) {
311 SyncShareRecords records; 312 SyncShareRecords records;
312 const ModelTypeSet model_types(BOOKMARKS); 313 const ModelTypeSet model_types(BOOKMARKS);
313 314
314 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 315 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
315 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 316 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
316 WithArg<0>(RecordSyncShare(&records)))); 317 WithArg<0>(RecordSyncShare(&records))));
317 318
318 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 319 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
319 320
320 CallbackCounter counter; 321 CallbackCounter counter;
321 ConfigurationParams params( 322 ConfigurationParams params(
322 GetUpdatesCallerInfo::RECONFIGURATION, 323 GetUpdatesCallerInfo::RECONFIGURATION,
323 model_types, 324 model_types,
324 TypesToRoutingInfo(model_types), 325 TypesToRoutingInfo(model_types),
325 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 326 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
326 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); 327 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params));
327 ASSERT_EQ(1, counter.times_called()); 328 ASSERT_EQ(1, counter.times_called());
328 329
329 ASSERT_EQ(1U, records.snapshots.size()); 330 ASSERT_EQ(1U, records.snapshots.size());
330 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, 331 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(model_types,
331 records.snapshots[0].source().types)); 332 records.snapshots[0].source().types));
332 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, 333 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION,
333 records.snapshots[0].source().updates_source); 334 records.snapshots[0].source().updates_source);
334 } 335 }
335 336
336 // Simulate a failure and make sure the config request is retried. 337 // Simulate a failure and make sure the config request is retried.
337 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { 338 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) {
338 UseMockDelayProvider(); 339 UseMockDelayProvider();
339 EXPECT_CALL(*delay(), GetDelay(_)) 340 EXPECT_CALL(*delay(), GetDelay(_))
340 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); 341 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1)));
(...skipping 16 matching lines...) Expand all
357 TypesToRoutingInfo(model_types), 358 TypesToRoutingInfo(model_types),
358 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 359 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
359 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); 360 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params));
360 ASSERT_EQ(0, counter.times_called()); 361 ASSERT_EQ(0, counter.times_called());
361 362
362 ASSERT_EQ(1U, records.snapshots.size()); 363 ASSERT_EQ(1U, records.snapshots.size());
363 RunLoop(); 364 RunLoop();
364 365
365 ASSERT_EQ(2U, records.snapshots.size()); 366 ASSERT_EQ(2U, records.snapshots.size());
366 ASSERT_EQ(1, counter.times_called()); 367 ASSERT_EQ(1, counter.times_called());
367 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, 368 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(model_types,
368 records.snapshots[1].source().types)); 369 records.snapshots[1].source().types));
369 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, 370 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION,
370 records.snapshots[1].source().updates_source); 371 records.snapshots[1].source().updates_source);
371 } 372 }
372 373
373 // Issue a nudge when the config has failed. Make sure both the config and 374 // Issue a nudge when the config has failed. Make sure both the config and
374 // nudge are executed. 375 // nudge are executed.
375 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { 376 TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) {
376 const ModelTypeSet model_types(BOOKMARKS); 377 const ModelTypeSet model_types(BOOKMARKS);
377 UseMockDelayProvider(); 378 UseMockDelayProvider();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 411
411 RunLoop(); 412 RunLoop();
412 ASSERT_EQ(3U, records.snapshots.size()); 413 ASSERT_EQ(3U, records.snapshots.size());
413 ASSERT_EQ(1, counter.times_called()); 414 ASSERT_EQ(1, counter.times_called());
414 415
415 // Now change the mode so nudge can execute. 416 // Now change the mode so nudge can execute.
416 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 417 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
417 418
418 ASSERT_EQ(4U, records.snapshots.size()); 419 ASSERT_EQ(4U, records.snapshots.size());
419 420
420 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, 421 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(model_types,
421 records.snapshots[2].source().types)); 422 records.snapshots[2].source().types));
422 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION, 423 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION,
423 records.snapshots[2].source().updates_source); 424 records.snapshots[2].source().updates_source);
424 425
425 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, 426 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(model_types,
426 records.snapshots[3].source().types)); 427 records.snapshots[3].source().types));
427 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 428 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
428 records.snapshots[3].source().updates_source); 429 records.snapshots[3].source().updates_source);
429 430
430 } 431 }
431 432
432 // Test that nudges are coalesced. 433 // Test that nudges are coalesced.
433 TEST_F(SyncSchedulerTest, NudgeCoalescing) { 434 TEST_F(SyncSchedulerTest, NudgeCoalescing) {
434 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 435 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
435 436
436 SyncShareRecords r; 437 SyncShareRecords r;
437 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 438 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
438 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 439 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
439 WithArg<0>(RecordSyncShare(&r)))); 440 WithArg<0>(RecordSyncShare(&r))));
440 const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES); 441 const ModelTypeSet types1(BOOKMARKS), types2(AUTOFILL), types3(THEMES);
441 TimeDelta delay = zero(); 442 TimeDelta delay = zero();
442 TimeTicks optimal_time = TimeTicks::Now() + delay; 443 TimeTicks optimal_time = TimeTicks::Now() + delay;
443 scheduler()->ScheduleNudgeAsync( 444 scheduler()->ScheduleNudgeAsync(
444 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); 445 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE);
445 scheduler()->ScheduleNudgeAsync( 446 scheduler()->ScheduleNudgeAsync(
446 zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE); 447 zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE);
447 RunLoop(); 448 RunLoop();
448 449
449 ASSERT_EQ(1U, r.snapshots.size()); 450 ASSERT_EQ(1U, r.snapshots.size());
450 EXPECT_GE(r.times[0], optimal_time); 451 EXPECT_GE(r.times[0], optimal_time);
451 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap( 452 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(
452 Union(types1, types2), r.snapshots[0].source().types)); 453 Union(types1, types2), r.snapshots[0].source().types));
453 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 454 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
454 r.snapshots[0].source().updates_source); 455 r.snapshots[0].source().updates_source);
455 456
456 Mock::VerifyAndClearExpectations(syncer()); 457 Mock::VerifyAndClearExpectations(syncer());
457 458
458 SyncShareRecords r2; 459 SyncShareRecords r2;
459 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 460 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
460 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 461 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
461 WithArg<0>(RecordSyncShare(&r2)))); 462 WithArg<0>(RecordSyncShare(&r2))));
462 scheduler()->ScheduleNudgeAsync( 463 scheduler()->ScheduleNudgeAsync(
463 zero(), NUDGE_SOURCE_NOTIFICATION, types3, FROM_HERE); 464 zero(), NUDGE_SOURCE_NOTIFICATION, types3, FROM_HERE);
464 RunLoop(); 465 RunLoop();
465 466
466 ASSERT_EQ(1U, r2.snapshots.size()); 467 ASSERT_EQ(1U, r2.snapshots.size());
467 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(types3, 468 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(types3,
468 r2.snapshots[0].source().types)); 469 r2.snapshots[0].source().types));
469 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, 470 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION,
470 r2.snapshots[0].source().updates_source); 471 r2.snapshots[0].source().updates_source);
471 } 472 }
472 473
473 // Test that nudges are coalesced. 474 // Test that nudges are coalesced.
474 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { 475 TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) {
475 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 476 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
476 477
477 SyncShareRecords r; 478 SyncShareRecords r;
(...skipping 11 matching lines...) Expand all
489 scheduler()->ScheduleNudgeAsync( 490 scheduler()->ScheduleNudgeAsync(
490 zero(), NUDGE_SOURCE_UNKNOWN, types2, FROM_HERE); 491 zero(), NUDGE_SOURCE_UNKNOWN, types2, FROM_HERE);
491 492
492 TimeTicks min_time = TimeTicks::Now(); 493 TimeTicks min_time = TimeTicks::Now();
493 TimeTicks max_time = TimeTicks::Now() + delay; 494 TimeTicks max_time = TimeTicks::Now() + delay;
494 495
495 RunLoop(); 496 RunLoop();
496 497
497 // Make sure the sync has happened. 498 // Make sure the sync has happened.
498 ASSERT_EQ(1U, r.snapshots.size()); 499 ASSERT_EQ(1U, r.snapshots.size());
499 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap( 500 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(
500 Union(types1, types2), r.snapshots[0].source().types)); 501 Union(types1, types2), r.snapshots[0].source().types));
501 502
502 // Make sure the sync happened at the right time. 503 // Make sure the sync happened at the right time.
503 EXPECT_GE(r.times[0], min_time); 504 EXPECT_GE(r.times[0], min_time);
504 EXPECT_LE(r.times[0], max_time); 505 EXPECT_LE(r.times[0], max_time);
505 } 506 }
506 507
507 // Test nudge scheduling. 508 // Test nudge scheduling.
508 TEST_F(SyncSchedulerTest, NudgeWithPayloads) { 509 TEST_F(SyncSchedulerTest, NudgeWithStates) {
509 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 510 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
510 511
511 SyncShareRecords records; 512 SyncShareRecords records;
512 ModelTypePayloadMap model_types_with_payloads; 513 ModelTypeStateMap type_state_map;
513 model_types_with_payloads[BOOKMARKS] = "test"; 514 type_state_map[BOOKMARKS].payload = "test";
514 515
515 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 516 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
516 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 517 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
517 WithArg<0>(RecordSyncShare(&records)))) 518 WithArg<0>(RecordSyncShare(&records))))
518 .RetiresOnSaturation(); 519 .RetiresOnSaturation();
519 scheduler()->ScheduleNudgeWithPayloadsAsync( 520 scheduler()->ScheduleNudgeWithStatesAsync(
520 zero(), NUDGE_SOURCE_LOCAL, model_types_with_payloads, FROM_HERE); 521 zero(), NUDGE_SOURCE_LOCAL, type_state_map, FROM_HERE);
521 RunLoop(); 522 RunLoop();
522 523
523 ASSERT_EQ(1U, records.snapshots.size()); 524 ASSERT_EQ(1U, records.snapshots.size());
524 EXPECT_EQ(model_types_with_payloads, records.snapshots[0].source().types); 525 EXPECT_THAT(type_state_map, Eq(records.snapshots[0].source().types));
525 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 526 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
526 records.snapshots[0].source().updates_source); 527 records.snapshots[0].source().updates_source);
527 528
528 Mock::VerifyAndClearExpectations(syncer()); 529 Mock::VerifyAndClearExpectations(syncer());
529 530
530 // Make sure a second, later, nudge is unaffected by first (no coalescing). 531 // Make sure a second, later, nudge is unaffected by first (no coalescing).
531 SyncShareRecords records2; 532 SyncShareRecords records2;
532 model_types_with_payloads.erase(BOOKMARKS); 533 type_state_map.erase(BOOKMARKS);
533 model_types_with_payloads[AUTOFILL] = "test2"; 534 type_state_map[AUTOFILL].payload = "test2";
534 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 535 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
535 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 536 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
536 WithArg<0>(RecordSyncShare(&records2)))); 537 WithArg<0>(RecordSyncShare(&records2))));
537 scheduler()->ScheduleNudgeWithPayloadsAsync( 538 scheduler()->ScheduleNudgeWithStatesAsync(
538 zero(), NUDGE_SOURCE_LOCAL, model_types_with_payloads, FROM_HERE); 539 zero(), NUDGE_SOURCE_LOCAL, type_state_map, FROM_HERE);
539 RunLoop(); 540 RunLoop();
540 541
541 ASSERT_EQ(1U, records2.snapshots.size()); 542 ASSERT_EQ(1U, records2.snapshots.size());
542 EXPECT_EQ(model_types_with_payloads, records2.snapshots[0].source().types); 543 EXPECT_THAT(type_state_map, Eq(records2.snapshots[0].source().types));
543 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 544 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
544 records2.snapshots[0].source().updates_source); 545 records2.snapshots[0].source().updates_source);
545 } 546 }
546 547
547 // Test that nudges are coalesced. 548 // Test that nudges are coalesced.
548 TEST_F(SyncSchedulerTest, NudgeWithPayloadsCoalescing) { 549 TEST_F(SyncSchedulerTest, NudgeWithStatesCoalescing) {
549 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 550 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
550 551
551 SyncShareRecords r; 552 SyncShareRecords r;
552 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 553 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
553 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 554 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
554 WithArg<0>(RecordSyncShare(&r)))); 555 WithArg<0>(RecordSyncShare(&r))));
555 ModelTypePayloadMap types1, types2, types3; 556 ModelTypeStateMap types1, types2, types3;
556 types1[BOOKMARKS] = "test1"; 557 types1[BOOKMARKS].payload = "test1";
557 types2[AUTOFILL] = "test2"; 558 types2[AUTOFILL].payload = "test2";
558 types3[THEMES] = "test3"; 559 types3[THEMES].payload = "test3";
559 TimeDelta delay = zero(); 560 TimeDelta delay = zero();
560 TimeTicks optimal_time = TimeTicks::Now() + delay; 561 TimeTicks optimal_time = TimeTicks::Now() + delay;
561 scheduler()->ScheduleNudgeWithPayloadsAsync( 562 scheduler()->ScheduleNudgeWithStatesAsync(
562 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE); 563 delay, NUDGE_SOURCE_UNKNOWN, types1, FROM_HERE);
563 scheduler()->ScheduleNudgeWithPayloadsAsync( 564 scheduler()->ScheduleNudgeWithStatesAsync(
564 zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE); 565 zero(), NUDGE_SOURCE_LOCAL, types2, FROM_HERE);
565 RunLoop(); 566 RunLoop();
566 567
567 ASSERT_EQ(1U, r.snapshots.size()); 568 ASSERT_EQ(1U, r.snapshots.size());
568 EXPECT_GE(r.times[0], optimal_time); 569 EXPECT_GE(r.times[0], optimal_time);
569 ModelTypePayloadMap coalesced_types; 570 ModelTypeStateMap coalesced_types;
570 CoalescePayloads(&coalesced_types, types1); 571 CoalesceStates(&coalesced_types, types1);
571 CoalescePayloads(&coalesced_types, types2); 572 CoalesceStates(&coalesced_types, types2);
572 EXPECT_EQ(coalesced_types, r.snapshots[0].source().types); 573 EXPECT_THAT(coalesced_types, Eq(r.snapshots[0].source().types));
573 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 574 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
574 r.snapshots[0].source().updates_source); 575 r.snapshots[0].source().updates_source);
575 576
576 Mock::VerifyAndClearExpectations(syncer()); 577 Mock::VerifyAndClearExpectations(syncer());
577 578
578 SyncShareRecords r2; 579 SyncShareRecords r2;
579 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 580 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
580 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 581 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
581 WithArg<0>(RecordSyncShare(&r2)))); 582 WithArg<0>(RecordSyncShare(&r2))));
582 scheduler()->ScheduleNudgeWithPayloadsAsync( 583 scheduler()->ScheduleNudgeWithStatesAsync(
583 zero(), NUDGE_SOURCE_NOTIFICATION, types3, FROM_HERE); 584 zero(), NUDGE_SOURCE_NOTIFICATION, types3, FROM_HERE);
584 RunLoop(); 585 RunLoop();
585 586
586 ASSERT_EQ(1U, r2.snapshots.size()); 587 ASSERT_EQ(1U, r2.snapshots.size());
587 EXPECT_EQ(types3, r2.snapshots[0].source().types); 588 EXPECT_THAT(types3, Eq(r2.snapshots[0].source().types));
588 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION, 589 EXPECT_EQ(GetUpdatesCallerInfo::NOTIFICATION,
589 r2.snapshots[0].source().updates_source); 590 r2.snapshots[0].source().updates_source);
590 } 591 }
591 592
592 // Test that polling works as expected. 593 // Test that polling works as expected.
593 TEST_F(SyncSchedulerTest, Polling) { 594 TEST_F(SyncSchedulerTest, Polling) {
594 SyncShareRecords records; 595 SyncShareRecords records;
595 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); 596 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30));
596 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples)) 597 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(AtLeast(kMinNumSamples))
597 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), 598 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess),
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 CallbackCounter counter; 789 CallbackCounter counter;
789 ConfigurationParams params( 790 ConfigurationParams params(
790 GetUpdatesCallerInfo::RECONFIGURATION, 791 GetUpdatesCallerInfo::RECONFIGURATION,
791 config_types, 792 config_types,
792 TypesToRoutingInfo(config_types), 793 TypesToRoutingInfo(config_types),
793 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 794 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
794 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); 795 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params));
795 ASSERT_EQ(1, counter.times_called()); 796 ASSERT_EQ(1, counter.times_called());
796 797
797 ASSERT_EQ(1U, records.snapshots.size()); 798 ASSERT_EQ(1U, records.snapshots.size());
798 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(config_types, 799 EXPECT_TRUE(CompareModelTypeSetToModelTypeStateMap(config_types,
799 records.snapshots[0].source().types)); 800 records.snapshots[0].source().types));
800 } 801 }
801 802
802 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest { 803 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest {
803 void SetUp() { 804 void SetUp() {
804 SyncSchedulerTest::SetUp(); 805 SyncSchedulerTest::SetUp();
805 UseMockDelayProvider(); 806 UseMockDelayProvider();
806 EXPECT_CALL(*delay(), GetDelay(_)) 807 EXPECT_CALL(*delay(), GetDelay(_))
807 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); 808 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1)));
808 } 809 }
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), 938 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
938 RecordSyncShareMultiple(&r, kMinNumSamples))); 939 RecordSyncShareMultiple(&r, kMinNumSamples)));
939 940
940 const TimeDelta first = TimeDelta::FromSeconds(kInitialBackoffRetrySeconds); 941 const TimeDelta first = TimeDelta::FromSeconds(kInitialBackoffRetrySeconds);
941 const TimeDelta second = TimeDelta::FromMilliseconds(2); 942 const TimeDelta second = TimeDelta::FromMilliseconds(2);
942 const TimeDelta third = TimeDelta::FromMilliseconds(3); 943 const TimeDelta third = TimeDelta::FromMilliseconds(3);
943 const TimeDelta fourth = TimeDelta::FromMilliseconds(4); 944 const TimeDelta fourth = TimeDelta::FromMilliseconds(4);
944 const TimeDelta fifth = TimeDelta::FromMilliseconds(5); 945 const TimeDelta fifth = TimeDelta::FromMilliseconds(5);
945 const TimeDelta sixth = TimeDelta::FromDays(1); 946 const TimeDelta sixth = TimeDelta::FromDays(1);
946 947
947 EXPECT_CALL(*delay(), GetDelay(Eq(first))).WillOnce(Return(second)) 948 EXPECT_CALL(*delay(), GetDelay(first)).WillOnce(Return(second))
948 .RetiresOnSaturation(); 949 .RetiresOnSaturation();
949 EXPECT_CALL(*delay(), GetDelay(Eq(second))).WillOnce(Return(third)) 950 EXPECT_CALL(*delay(), GetDelay(second)).WillOnce(Return(third))
950 .RetiresOnSaturation(); 951 .RetiresOnSaturation();
951 EXPECT_CALL(*delay(), GetDelay(Eq(third))).WillOnce(Return(fourth)) 952 EXPECT_CALL(*delay(), GetDelay(third)).WillOnce(Return(fourth))
952 .RetiresOnSaturation(); 953 .RetiresOnSaturation();
953 EXPECT_CALL(*delay(), GetDelay(Eq(fourth))).WillOnce(Return(fifth)) 954 EXPECT_CALL(*delay(), GetDelay(fourth)).WillOnce(Return(fifth))
954 .RetiresOnSaturation(); 955 .RetiresOnSaturation();
955 EXPECT_CALL(*delay(), GetDelay(Eq(fifth))).WillOnce(Return(sixth)); 956 EXPECT_CALL(*delay(), GetDelay(fifth)).WillOnce(Return(sixth));
956 957
957 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 958 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
958 959
959 // Run again with a nudge. 960 // Run again with a nudge.
960 scheduler()->ScheduleNudgeAsync( 961 scheduler()->ScheduleNudgeAsync(
961 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); 962 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE);
962 RunLoop(); 963 RunLoop();
963 964
964 ASSERT_EQ(kMinNumSamples, r.snapshots.size()); 965 ASSERT_EQ(kMinNumSamples, r.snapshots.size());
965 EXPECT_GE(r.times[1] - r.times[0], second); 966 EXPECT_GE(r.times[1] - r.times[0], second);
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 // Should save the nudge for until after the server is reachable. 1117 // Should save the nudge for until after the server is reachable.
1117 MessageLoop::current()->RunAllPending(); 1118 MessageLoop::current()->RunAllPending();
1118 1119
1119 connection()->SetServerReachable(); 1120 connection()->SetServerReachable();
1120 connection()->UpdateConnectionStatus(); 1121 connection()->UpdateConnectionStatus();
1121 scheduler()->OnConnectionStatusChange(); 1122 scheduler()->OnConnectionStatusChange();
1122 MessageLoop::current()->RunAllPending(); 1123 MessageLoop::current()->RunAllPending();
1123 } 1124 }
1124 1125
1125 } // namespace syncer 1126 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/engine/sync_scheduler_impl.cc ('k') | sync/engine/sync_scheduler_whitebox_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698