OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/sync/device_info/device_info_sync_bridge.h" | 5 #include "components/sync/device_info/device_info_sync_bridge.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 // Some tests may never initialize the bridge. | 186 // Some tests may never initialize the bridge. |
187 if (bridge_) | 187 if (bridge_) |
188 bridge_->RemoveObserver(this); | 188 bridge_->RemoveObserver(this); |
189 | 189 |
190 // Force all remaining (store) tasks to execute so we don't leak memory. | 190 // Force all remaining (store) tasks to execute so we don't leak memory. |
191 base::RunLoop().RunUntilIdle(); | 191 base::RunLoop().RunUntilIdle(); |
192 } | 192 } |
193 | 193 |
194 void OnDeviceInfoChange() override { change_count_++; } | 194 void OnDeviceInfoChange() override { change_count_++; } |
195 | 195 |
196 std::unique_ptr<ModelTypeChangeProcessor> CreateModelTypeChangeProcessor( | |
197 ModelType type, | |
198 ModelTypeSyncBridge* bridge) { | |
199 auto processor = base::MakeUnique<RecordingModelTypeChangeProcessor>(); | |
200 processor_ = processor.get(); | |
201 return std::move(processor); | |
202 } | |
203 | |
204 // Initialized the bridge based on the current local device and store. Can | 196 // Initialized the bridge based on the current local device and store. Can |
205 // only be called once per run, as it passes |store_|. | 197 // only be called once per run, as it passes |store_|. |
206 void InitializeBridge() { | 198 void InitializeBridge() { |
207 ASSERT_TRUE(store_); | 199 ASSERT_TRUE(store_); |
208 bridge_ = base::MakeUnique<DeviceInfoSyncBridge>( | 200 bridge_ = base::MakeUnique<DeviceInfoSyncBridge>( |
209 provider_.get(), | 201 provider_.get(), |
210 base::Bind(&ModelTypeStoreTestUtil::MoveStoreToCallback, | 202 base::Bind(&ModelTypeStoreTestUtil::MoveStoreToCallback, |
211 base::Passed(&store_)), | 203 base::Passed(&store_)), |
212 base::Bind(&DeviceInfoSyncBridgeTest::CreateModelTypeChangeProcessor, | 204 RecordingModelTypeChangeProcessor::FactoryForBridgeTest(&processor_)); |
213 base::Unretained(this))); | |
214 bridge_->AddObserver(this); | 205 bridge_->AddObserver(this); |
215 } | 206 } |
216 | 207 |
217 // Creates the bridge and runs any outstanding tasks. This will typically | 208 // Creates the bridge and runs any outstanding tasks. This will typically |
218 // cause all initialization callbacks between the sevice and store to fire. | 209 // cause all initialization callbacks between the sevice and store to fire. |
219 void InitializeAndPump() { | 210 void InitializeAndPump() { |
220 InitializeBridge(); | 211 InitializeBridge(); |
221 base::RunLoop().RunUntilIdle(); | 212 base::RunLoop().RunUntilIdle(); |
222 } | 213 } |
223 | 214 |
(...skipping 13 matching lines...) Expand all Loading... |
237 std::swap(provider_, provider); | 228 std::swap(provider_, provider); |
238 } | 229 } |
239 LocalDeviceInfoProviderMock* local_device() { return provider_.get(); } | 230 LocalDeviceInfoProviderMock* local_device() { return provider_.get(); } |
240 | 231 |
241 // Allows access to the bridge after InitializeBridge() is called. | 232 // Allows access to the bridge after InitializeBridge() is called. |
242 DeviceInfoSyncBridge* bridge() { | 233 DeviceInfoSyncBridge* bridge() { |
243 EXPECT_TRUE(bridge_); | 234 EXPECT_TRUE(bridge_); |
244 return bridge_.get(); | 235 return bridge_.get(); |
245 } | 236 } |
246 | 237 |
247 RecordingModelTypeChangeProcessor* processor() { | 238 const RecordingModelTypeChangeProcessor& processor() { return *processor_; } |
248 EXPECT_TRUE(processor_); | |
249 return processor_; | |
250 } | |
251 | 239 |
252 const OneShotTimer& pulse_timer() { return bridge()->pulse_timer_; } | 240 const OneShotTimer& pulse_timer() { return bridge()->pulse_timer_; } |
253 | 241 |
254 // Should only be called after the bridge has been initialized. Will first | 242 // Should only be called after the bridge has been initialized. Will first |
255 // recover the bridge's store, so another can be initialized later, and then | 243 // recover the bridge's store, so another can be initialized later, and then |
256 // deletes the bridge. | 244 // deletes the bridge. |
257 void PumpAndShutdown() { | 245 void PumpAndShutdown() { |
258 ASSERT_TRUE(bridge_); | 246 ASSERT_TRUE(bridge_); |
259 base::RunLoop().RunUntilIdle(); | 247 base::RunLoop().RunUntilIdle(); |
260 std::swap(store_, bridge_->store_); | 248 std::swap(store_, bridge_->store_); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 | 330 |
343 const DeviceInfoList devices = bridge()->GetAllDeviceInfo(); | 331 const DeviceInfoList devices = bridge()->GetAllDeviceInfo(); |
344 ASSERT_EQ(1u, devices.size()); | 332 ASSERT_EQ(1u, devices.size()); |
345 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); | 333 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
346 } | 334 } |
347 | 335 |
348 // Metadata shouldn't be loaded before the provider is initialized. | 336 // Metadata shouldn't be loaded before the provider is initialized. |
349 TEST_F(DeviceInfoSyncBridgeTest, LocalProviderInitRace) { | 337 TEST_F(DeviceInfoSyncBridgeTest, LocalProviderInitRace) { |
350 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); | 338 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); |
351 InitializeAndPump(); | 339 InitializeAndPump(); |
352 EXPECT_FALSE(processor()->metadata()); | 340 EXPECT_FALSE(processor().metadata()); |
353 | 341 |
354 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); | 342 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); |
355 local_device()->Initialize(CreateModel(1)); | 343 local_device()->Initialize(CreateModel(1)); |
356 base::RunLoop().RunUntilIdle(); | 344 base::RunLoop().RunUntilIdle(); |
357 | 345 |
358 DeviceInfoList devices = bridge()->GetAllDeviceInfo(); | 346 DeviceInfoList devices = bridge()->GetAllDeviceInfo(); |
359 ASSERT_EQ(1u, devices.size()); | 347 ASSERT_EQ(1u, devices.size()); |
360 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); | 348 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
361 | 349 |
362 EXPECT_TRUE(processor()->metadata()); | 350 EXPECT_TRUE(processor().metadata()); |
363 } | 351 } |
364 | 352 |
365 // Simulate shutting down sync during the ModelTypeStore callbacks. The pulse | 353 // Simulate shutting down sync during the ModelTypeStore callbacks. The pulse |
366 // timer should still be initialized, even though reconcile never occurs. | 354 // timer should still be initialized, even though reconcile never occurs. |
367 TEST_F(DeviceInfoSyncBridgeTest, ClearProviderDuringInit) { | 355 TEST_F(DeviceInfoSyncBridgeTest, ClearProviderDuringInit) { |
368 InitializeBridge(); | 356 InitializeBridge(); |
369 local_device()->Clear(); | 357 local_device()->Clear(); |
370 base::RunLoop().RunUntilIdle(); | 358 base::RunLoop().RunUntilIdle(); |
371 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); | 359 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); |
372 EXPECT_TRUE(pulse_timer().IsRunning()); | 360 EXPECT_TRUE(pulse_timer().IsRunning()); |
(...skipping 28 matching lines...) Expand all Loading... |
401 *bridge()->GetDeviceInfo(specifics.cache_guid()).get()); | 389 *bridge()->GetDeviceInfo(specifics.cache_guid()).get()); |
402 } | 390 } |
403 | 391 |
404 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalMetadata) { | 392 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalMetadata) { |
405 WriteToStore(std::vector<DeviceInfoSpecifics>(), StateWithEncryption("ekn")); | 393 WriteToStore(std::vector<DeviceInfoSpecifics>(), StateWithEncryption("ekn")); |
406 InitializeAndPump(); | 394 InitializeAndPump(); |
407 | 395 |
408 const DeviceInfoList devices = bridge()->GetAllDeviceInfo(); | 396 const DeviceInfoList devices = bridge()->GetAllDeviceInfo(); |
409 ASSERT_EQ(1u, devices.size()); | 397 ASSERT_EQ(1u, devices.size()); |
410 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); | 398 EXPECT_TRUE(local_device()->GetLocalDeviceInfo()->Equals(*devices[0])); |
411 EXPECT_EQ(1u, processor()->put_multimap().size()); | 399 EXPECT_EQ(1u, processor().put_multimap().size()); |
412 } | 400 } |
413 | 401 |
414 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalDataAndMetadata) { | 402 TEST_F(DeviceInfoSyncBridgeTest, TestWithLocalDataAndMetadata) { |
415 const DeviceInfoSpecifics specifics = CreateSpecifics(1); | 403 const DeviceInfoSpecifics specifics = CreateSpecifics(1); |
416 ModelTypeState state = StateWithEncryption("ekn"); | 404 ModelTypeState state = StateWithEncryption("ekn"); |
417 WriteToStore({specifics}, state); | 405 WriteToStore({specifics}, state); |
418 InitializeAndPump(); | 406 InitializeAndPump(); |
419 | 407 |
420 ASSERT_EQ(2u, bridge()->GetAllDeviceInfo().size()); | 408 ASSERT_EQ(2u, bridge()->GetAllDeviceInfo().size()); |
421 VerifyEqual(specifics, | 409 VerifyEqual(specifics, |
422 *bridge()->GetDeviceInfo(specifics.cache_guid()).get()); | 410 *bridge()->GetDeviceInfo(specifics.cache_guid()).get()); |
423 EXPECT_TRUE(processor()->metadata()); | 411 EXPECT_TRUE(processor().metadata()); |
424 EXPECT_EQ(state.encryption_key_name(), | 412 EXPECT_EQ(state.encryption_key_name(), |
425 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 413 processor().metadata()->GetModelTypeState().encryption_key_name()); |
426 } | 414 } |
427 | 415 |
428 TEST_F(DeviceInfoSyncBridgeTest, GetData) { | 416 TEST_F(DeviceInfoSyncBridgeTest, GetData) { |
429 const DeviceInfoSpecifics specifics1 = CreateSpecifics(1); | 417 const DeviceInfoSpecifics specifics1 = CreateSpecifics(1); |
430 const DeviceInfoSpecifics specifics2 = CreateSpecifics(2); | 418 const DeviceInfoSpecifics specifics2 = CreateSpecifics(2); |
431 const DeviceInfoSpecifics specifics3 = CreateSpecifics(3); | 419 const DeviceInfoSpecifics specifics3 = CreateSpecifics(3); |
432 WriteToStore({specifics1, specifics2, specifics3}); | 420 WriteToStore({specifics1, specifics2, specifics3}); |
433 InitializeAndPump(); | 421 InitializeAndPump(); |
434 | 422 |
435 const std::map<std::string, DeviceInfoSpecifics> expected{ | 423 const std::map<std::string, DeviceInfoSpecifics> expected{ |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 EXPECT_FALSE(error); | 495 EXPECT_FALSE(error); |
508 EXPECT_EQ(2, change_count()); | 496 EXPECT_EQ(2, change_count()); |
509 | 497 |
510 RestartBridge(); | 498 RestartBridge(); |
511 | 499 |
512 std::unique_ptr<DeviceInfo> info = | 500 std::unique_ptr<DeviceInfo> info = |
513 bridge()->GetDeviceInfo(specifics.cache_guid()); | 501 bridge()->GetDeviceInfo(specifics.cache_guid()); |
514 ASSERT_TRUE(info); | 502 ASSERT_TRUE(info); |
515 VerifyEqual(specifics, *info.get()); | 503 VerifyEqual(specifics, *info.get()); |
516 | 504 |
517 EXPECT_TRUE(processor()->metadata()); | 505 EXPECT_TRUE(processor().metadata()); |
518 EXPECT_EQ(state.encryption_key_name(), | 506 EXPECT_EQ(state.encryption_key_name(), |
519 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 507 processor().metadata()->GetModelTypeState().encryption_key_name()); |
520 } | 508 } |
521 | 509 |
522 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesWithLocalGuid) { | 510 TEST_F(DeviceInfoSyncBridgeTest, ApplySyncChangesWithLocalGuid) { |
523 InitializeAndPump(); | 511 InitializeAndPump(); |
524 | 512 |
525 // The bridge should ignore these changes using this specifics because its | 513 // The bridge should ignore these changes using this specifics because its |
526 // guid will match the local device. | 514 // guid will match the local device. |
527 const DeviceInfoSpecifics specifics = CreateSpecifics(kDefaultLocalSuffix); | 515 const DeviceInfoSpecifics specifics = CreateSpecifics(kDefaultLocalSuffix); |
528 | 516 |
529 // Should have a single change from reconciliation. | 517 // Should have a single change from reconciliation. |
530 EXPECT_TRUE( | 518 EXPECT_TRUE( |
531 bridge()->GetDeviceInfo(local_device()->GetLocalDeviceInfo()->guid())); | 519 bridge()->GetDeviceInfo(local_device()->GetLocalDeviceInfo()->guid())); |
532 EXPECT_EQ(1, change_count()); | 520 EXPECT_EQ(1, change_count()); |
533 // Ensure |last_updated| is about now, plus or minus a little bit. | 521 // Ensure |last_updated| is about now, plus or minus a little bit. |
534 const Time last_updated(ProtoTimeToTime(processor() | 522 const Time last_updated(ProtoTimeToTime(processor() |
535 ->put_multimap() | 523 .put_multimap() |
536 .begin() | 524 .begin() |
537 ->second->specifics.device_info() | 525 ->second->specifics.device_info() |
538 .last_updated_timestamp())); | 526 .last_updated_timestamp())); |
539 EXPECT_LT(Time::Now() - TimeDelta::FromMinutes(1), last_updated); | 527 EXPECT_LT(Time::Now() - TimeDelta::FromMinutes(1), last_updated); |
540 EXPECT_GT(Time::Now() + TimeDelta::FromMinutes(1), last_updated); | 528 EXPECT_GT(Time::Now() + TimeDelta::FromMinutes(1), last_updated); |
541 | 529 |
542 auto error_on_add = bridge()->ApplySyncChanges( | 530 auto error_on_add = bridge()->ApplySyncChanges( |
543 bridge()->CreateMetadataChangeList(), EntityAddList({specifics})); | 531 bridge()->CreateMetadataChangeList(), EntityAddList({specifics})); |
544 EXPECT_FALSE(error_on_add); | 532 EXPECT_FALSE(error_on_add); |
545 EXPECT_EQ(1, change_count()); | 533 EXPECT_EQ(1, change_count()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 TEST_F(DeviceInfoSyncBridgeTest, MergeEmpty) { | 571 TEST_F(DeviceInfoSyncBridgeTest, MergeEmpty) { |
584 InitializeAndPump(); | 572 InitializeAndPump(); |
585 EXPECT_EQ(1, change_count()); | 573 EXPECT_EQ(1, change_count()); |
586 auto error = bridge()->MergeSyncData(bridge()->CreateMetadataChangeList(), | 574 auto error = bridge()->MergeSyncData(bridge()->CreateMetadataChangeList(), |
587 EntityDataMap()); | 575 EntityDataMap()); |
588 EXPECT_FALSE(error); | 576 EXPECT_FALSE(error); |
589 EXPECT_EQ(1, change_count()); | 577 EXPECT_EQ(1, change_count()); |
590 // TODO(skym): Stop sending local twice. The first of the two puts will | 578 // TODO(skym): Stop sending local twice. The first of the two puts will |
591 // probably happen before the processor is tracking metadata yet, and so there | 579 // probably happen before the processor is tracking metadata yet, and so there |
592 // should not be much overhead. | 580 // should not be much overhead. |
593 EXPECT_EQ(2u, processor()->put_multimap().size()); | 581 EXPECT_EQ(2u, processor().put_multimap().size()); |
594 EXPECT_EQ(2u, processor()->put_multimap().count( | 582 EXPECT_EQ(2u, processor().put_multimap().count( |
595 local_device()->GetLocalDeviceInfo()->guid())); | 583 local_device()->GetLocalDeviceInfo()->guid())); |
596 EXPECT_EQ(0u, processor()->delete_set().size()); | 584 EXPECT_EQ(0u, processor().delete_set().size()); |
597 } | 585 } |
598 | 586 |
599 TEST_F(DeviceInfoSyncBridgeTest, MergeWithData) { | 587 TEST_F(DeviceInfoSyncBridgeTest, MergeWithData) { |
600 const DeviceInfoSpecifics unique_local = CreateSpecifics(1); | 588 const DeviceInfoSpecifics unique_local = CreateSpecifics(1); |
601 DeviceInfoSpecifics conflict_local = CreateSpecifics(2); | 589 DeviceInfoSpecifics conflict_local = CreateSpecifics(2); |
602 DeviceInfoSpecifics conflict_remote = CreateSpecifics(3); | 590 DeviceInfoSpecifics conflict_remote = CreateSpecifics(3); |
603 const DeviceInfoSpecifics unique_remote = CreateSpecifics(4); | 591 const DeviceInfoSpecifics unique_remote = CreateSpecifics(4); |
604 | 592 |
605 const std::string conflict_guid = "conflict_guid"; | 593 const std::string conflict_guid = "conflict_guid"; |
606 conflict_local.set_cache_guid(conflict_guid); | 594 conflict_local.set_cache_guid(conflict_guid); |
(...skipping 16 matching lines...) Expand all Loading... |
623 | 611 |
624 // The remote should beat the local in conflict. | 612 // The remote should beat the local in conflict. |
625 EXPECT_EQ(4u, bridge()->GetAllDeviceInfo().size()); | 613 EXPECT_EQ(4u, bridge()->GetAllDeviceInfo().size()); |
626 VerifyEqual(unique_local, | 614 VerifyEqual(unique_local, |
627 *bridge()->GetDeviceInfo(unique_local.cache_guid()).get()); | 615 *bridge()->GetDeviceInfo(unique_local.cache_guid()).get()); |
628 VerifyEqual(unique_remote, | 616 VerifyEqual(unique_remote, |
629 *bridge()->GetDeviceInfo(unique_remote.cache_guid()).get()); | 617 *bridge()->GetDeviceInfo(unique_remote.cache_guid()).get()); |
630 VerifyEqual(conflict_remote, *bridge()->GetDeviceInfo(conflict_guid).get()); | 618 VerifyEqual(conflict_remote, *bridge()->GetDeviceInfo(conflict_guid).get()); |
631 | 619 |
632 // bridge should have told the processor about the existance of unique_local. | 620 // bridge should have told the processor about the existance of unique_local. |
633 EXPECT_TRUE(processor()->delete_set().empty()); | 621 EXPECT_TRUE(processor().delete_set().empty()); |
634 EXPECT_EQ(3u, processor()->put_multimap().size()); | 622 EXPECT_EQ(3u, processor().put_multimap().size()); |
635 EXPECT_EQ(1u, processor()->put_multimap().count(unique_local.cache_guid())); | 623 EXPECT_EQ(1u, processor().put_multimap().count(unique_local.cache_guid())); |
636 const auto& it = processor()->put_multimap().find(unique_local.cache_guid()); | 624 const auto& it = processor().put_multimap().find(unique_local.cache_guid()); |
637 ASSERT_NE(processor()->put_multimap().end(), it); | 625 ASSERT_NE(processor().put_multimap().end(), it); |
638 VerifyEqual(unique_local, it->second->specifics.device_info()); | 626 VerifyEqual(unique_local, it->second->specifics.device_info()); |
639 | 627 |
640 RestartBridge(); | 628 RestartBridge(); |
641 EXPECT_EQ(state.encryption_key_name(), | 629 EXPECT_EQ(state.encryption_key_name(), |
642 processor()->metadata()->GetModelTypeState().encryption_key_name()); | 630 processor().metadata()->GetModelTypeState().encryption_key_name()); |
643 } | 631 } |
644 | 632 |
645 TEST_F(DeviceInfoSyncBridgeTest, MergeLocalGuid) { | 633 TEST_F(DeviceInfoSyncBridgeTest, MergeLocalGuid) { |
646 // If not recent, then reconcile is going to try to send an updated version to | 634 // If not recent, then reconcile is going to try to send an updated version to |
647 // Sync, which makes interpreting change_count() more difficult. | 635 // Sync, which makes interpreting change_count() more difficult. |
648 const DeviceInfoSpecifics specifics = | 636 const DeviceInfoSpecifics specifics = |
649 CreateSpecifics(kDefaultLocalSuffix, Time::Now()); | 637 CreateSpecifics(kDefaultLocalSuffix, Time::Now()); |
650 WriteToStore({specifics}); | 638 WriteToStore({specifics}); |
651 InitializeAndPump(); | 639 InitializeAndPump(); |
652 | 640 |
653 auto error = bridge()->MergeSyncData(bridge()->CreateMetadataChangeList(), | 641 auto error = bridge()->MergeSyncData(bridge()->CreateMetadataChangeList(), |
654 InlineEntityDataMap({specifics})); | 642 InlineEntityDataMap({specifics})); |
655 EXPECT_FALSE(error); | 643 EXPECT_FALSE(error); |
656 EXPECT_EQ(0, change_count()); | 644 EXPECT_EQ(0, change_count()); |
657 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); | 645 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); |
658 EXPECT_TRUE(processor()->delete_set().empty()); | 646 EXPECT_TRUE(processor().delete_set().empty()); |
659 EXPECT_TRUE(processor()->put_multimap().empty()); | 647 EXPECT_TRUE(processor().put_multimap().empty()); |
660 } | 648 } |
661 | 649 |
662 TEST_F(DeviceInfoSyncBridgeTest, MergeLocalGuidBeforeReconcile) { | 650 TEST_F(DeviceInfoSyncBridgeTest, MergeLocalGuidBeforeReconcile) { |
663 InitializeBridge(); | 651 InitializeBridge(); |
664 | 652 |
665 // The message loop is never pumped, which means local data/metadata is never | 653 // The message loop is never pumped, which means local data/metadata is never |
666 // loaded, and thus reconcile is never called. The bridge should ignore this | 654 // loaded, and thus reconcile is never called. The bridge should ignore this |
667 // EntityData because its cache guid is the same the local device's. | 655 // EntityData because its cache guid is the same the local device's. |
668 auto error = bridge()->MergeSyncData( | 656 auto error = bridge()->MergeSyncData( |
669 bridge()->CreateMetadataChangeList(), | 657 bridge()->CreateMetadataChangeList(), |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 | 704 |
717 // Now set time to long ago in the past, it should not be active anymore. | 705 // Now set time to long ago in the past, it should not be active anymore. |
718 bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), | 706 bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), |
719 EntityAddList({CreateSpecifics(1)})); | 707 EntityAddList({CreateSpecifics(1)})); |
720 EXPECT_EQ(1, bridge()->CountActiveDevices()); | 708 EXPECT_EQ(1, bridge()->CountActiveDevices()); |
721 } | 709 } |
722 | 710 |
723 TEST_F(DeviceInfoSyncBridgeTest, MultipleOnProviderInitialized) { | 711 TEST_F(DeviceInfoSyncBridgeTest, MultipleOnProviderInitialized) { |
724 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); | 712 set_provider(base::MakeUnique<LocalDeviceInfoProviderMock>()); |
725 InitializeAndPump(); | 713 InitializeAndPump(); |
726 EXPECT_EQ(nullptr, processor()->metadata()); | 714 EXPECT_EQ(nullptr, processor().metadata()); |
727 | 715 |
728 // Verify the processor was given metadata. | 716 // Verify the processor was given metadata. |
729 local_device()->Initialize(CreateModel(0)); | 717 local_device()->Initialize(CreateModel(0)); |
730 base::RunLoop().RunUntilIdle(); | 718 base::RunLoop().RunUntilIdle(); |
731 const MetadataBatch* metadata = processor()->metadata(); | 719 const MetadataBatch* metadata = processor().metadata(); |
732 EXPECT_NE(nullptr, metadata); | 720 EXPECT_NE(nullptr, metadata); |
733 | 721 |
734 // Pointer address of metadata should remain constant because the processor | 722 // Pointer address of metadata should remain constant because the processor |
735 // should not have been given new metadata. | 723 // should not have been given new metadata. |
736 local_device()->Initialize(CreateModel(0)); | 724 local_device()->Initialize(CreateModel(0)); |
737 base::RunLoop().RunUntilIdle(); | 725 base::RunLoop().RunUntilIdle(); |
738 EXPECT_EQ(metadata, processor()->metadata()); | 726 EXPECT_EQ(metadata, processor().metadata()); |
739 } | 727 } |
740 | 728 |
741 TEST_F(DeviceInfoSyncBridgeTest, SendLocalData) { | 729 TEST_F(DeviceInfoSyncBridgeTest, SendLocalData) { |
742 InitializeAndPump(); | 730 InitializeAndPump(); |
743 EXPECT_EQ(1, change_count()); | 731 EXPECT_EQ(1, change_count()); |
744 EXPECT_EQ(1u, processor()->put_multimap().size()); | 732 EXPECT_EQ(1u, processor().put_multimap().size()); |
745 | 733 |
746 ForcePulse(); | 734 ForcePulse(); |
747 EXPECT_EQ(2, change_count()); | 735 EXPECT_EQ(2, change_count()); |
748 EXPECT_EQ(2u, processor()->put_multimap().size()); | 736 EXPECT_EQ(2u, processor().put_multimap().size()); |
749 | 737 |
750 // After clearing, pulsing should no-op and not result in a processor put or | 738 // After clearing, pulsing should no-op and not result in a processor put or |
751 // a notification to observers. | 739 // a notification to observers. |
752 local_device()->Clear(); | 740 local_device()->Clear(); |
753 ForcePulse(); | 741 ForcePulse(); |
754 EXPECT_EQ(2, change_count()); | 742 EXPECT_EQ(2, change_count()); |
755 EXPECT_EQ(2u, processor()->put_multimap().size()); | 743 EXPECT_EQ(2u, processor().put_multimap().size()); |
756 } | 744 } |
757 | 745 |
758 TEST_F(DeviceInfoSyncBridgeTest, DisableSync) { | 746 TEST_F(DeviceInfoSyncBridgeTest, DisableSync) { |
759 InitializeAndPump(); | 747 InitializeAndPump(); |
760 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); | 748 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); |
761 EXPECT_EQ(1, change_count()); | 749 EXPECT_EQ(1, change_count()); |
762 | 750 |
763 const DeviceInfoSpecifics specifics = CreateSpecifics(1); | 751 const DeviceInfoSpecifics specifics = CreateSpecifics(1); |
764 auto error = bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), | 752 auto error = bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), |
765 EntityAddList({specifics})); | 753 EntityAddList({specifics})); |
766 | 754 |
767 EXPECT_FALSE(error); | 755 EXPECT_FALSE(error); |
768 EXPECT_EQ(2u, bridge()->GetAllDeviceInfo().size()); | 756 EXPECT_EQ(2u, bridge()->GetAllDeviceInfo().size()); |
769 EXPECT_EQ(2, change_count()); | 757 EXPECT_EQ(2, change_count()); |
770 | 758 |
771 // Should clear out all local data and notify observers. | 759 // Should clear out all local data and notify observers. |
772 bridge()->DisableSync(); | 760 bridge()->DisableSync(); |
773 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); | 761 EXPECT_EQ(0u, bridge()->GetAllDeviceInfo().size()); |
774 EXPECT_EQ(3, change_count()); | 762 EXPECT_EQ(3, change_count()); |
775 | 763 |
776 // Reloading from storage shouldn't contain remote data. | 764 // Reloading from storage shouldn't contain remote data. |
777 RestartBridge(); | 765 RestartBridge(); |
778 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); | 766 EXPECT_EQ(1u, bridge()->GetAllDeviceInfo().size()); |
779 EXPECT_EQ(4, change_count()); | 767 EXPECT_EQ(4, change_count()); |
780 } | 768 } |
781 | 769 |
782 } // namespace | 770 } // namespace |
783 | 771 |
784 } // namespace syncer | 772 } // namespace syncer |
OLD | NEW |