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

Side by Side Diff: components/sync_driver/device_info_service_unittest.cc

Issue 2222373003: [Sync] Adding storage key concept for ModelTypeServices. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments and method name fixes. Created 4 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
OLDNEW
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_driver/device_info_service.h" 5 #include "components/sync_driver/device_info_service.h"
6 6
7 #include <map> 7 #include <map>
8 #include <memory> 8 #include <memory>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 26 matching lines...) Expand all
37 using syncer_v2::EntityChangeList; 37 using syncer_v2::EntityChangeList;
38 using syncer_v2::EntityData; 38 using syncer_v2::EntityData;
39 using syncer_v2::EntityDataMap; 39 using syncer_v2::EntityDataMap;
40 using syncer_v2::EntityDataPtr; 40 using syncer_v2::EntityDataPtr;
41 using syncer_v2::MetadataBatch; 41 using syncer_v2::MetadataBatch;
42 using syncer_v2::MetadataChangeList; 42 using syncer_v2::MetadataChangeList;
43 using syncer_v2::ModelTypeChangeProcessor; 43 using syncer_v2::ModelTypeChangeProcessor;
44 using syncer_v2::ModelTypeService; 44 using syncer_v2::ModelTypeService;
45 using syncer_v2::ModelTypeStore; 45 using syncer_v2::ModelTypeStore;
46 using syncer_v2::ModelTypeStoreTestUtil; 46 using syncer_v2::ModelTypeStoreTestUtil;
47 using syncer_v2::TagAndData; 47 using syncer_v2::KeyAndData;
48 using sync_driver::DeviceInfo; 48 using sync_driver::DeviceInfo;
49 using sync_driver::DeviceInfoTracker; 49 using sync_driver::DeviceInfoTracker;
50 using sync_driver::LocalDeviceInfoProviderMock; 50 using sync_driver::LocalDeviceInfoProviderMock;
51 using sync_pb::DataTypeState; 51 using sync_pb::DataTypeState;
52 using sync_pb::DeviceInfoSpecifics; 52 using sync_pb::DeviceInfoSpecifics;
53 using sync_pb::EntitySpecifics; 53 using sync_pb::EntitySpecifics;
54 54
55 using ClientTagList = ModelTypeService::ClientTagList; 55 using StorageKeyList = ModelTypeService::StorageKeyList;
56 using RecordList = ModelTypeStore::RecordList; 56 using RecordList = ModelTypeStore::RecordList;
57 using Result = ModelTypeStore::Result; 57 using Result = ModelTypeStore::Result;
58 using StartCallback = ModelTypeChangeProcessor::StartCallback; 58 using StartCallback = ModelTypeChangeProcessor::StartCallback;
59 using WriteBatch = ModelTypeStore::WriteBatch; 59 using WriteBatch = ModelTypeStore::WriteBatch;
60 60
61 namespace { 61 namespace {
62 62
63 std::unique_ptr<DeviceInfo> CreateDeviceInfo() { 63 std::unique_ptr<DeviceInfo> CreateDeviceInfo() {
64 return base::MakeUnique<DeviceInfo>( 64 return base::MakeUnique<DeviceInfo>(
65 "guid_1", "client_1", "Chromium 10k", "Chrome 10k", 65 "guid_1", "client_1", "Chromium 10k", "Chrome 10k",
(...skipping 23 matching lines...) Expand all
89 ASSERT_EQ(specifics.signin_scoped_device_id(), 89 ASSERT_EQ(specifics.signin_scoped_device_id(),
90 model.signin_scoped_device_id()); 90 model.signin_scoped_device_id());
91 } 91 }
92 92
93 void AssertExpectedFromDataBatch( 93 void AssertExpectedFromDataBatch(
94 std::map<std::string, DeviceInfoSpecifics> expected, 94 std::map<std::string, DeviceInfoSpecifics> expected,
95 SyncError error, 95 SyncError error,
96 std::unique_ptr<DataBatch> batch) { 96 std::unique_ptr<DataBatch> batch) {
97 ASSERT_FALSE(error.IsSet()); 97 ASSERT_FALSE(error.IsSet());
98 while (batch->HasNext()) { 98 while (batch->HasNext()) {
99 const TagAndData& pair = batch->Next(); 99 const KeyAndData& pair = batch->Next();
100 std::map<std::string, DeviceInfoSpecifics>::iterator iter = 100 std::map<std::string, DeviceInfoSpecifics>::iterator iter =
101 expected.find(pair.first); 101 expected.find(pair.first);
102 ASSERT_NE(iter, expected.end()); 102 ASSERT_NE(iter, expected.end());
103 AssertEqual(iter->second, pair.second->specifics.device_info()); 103 AssertEqual(iter->second, pair.second->specifics.device_info());
104 // Removing allows us to verify we don't see the same item multiple times, 104 // Removing allows us to verify we don't see the same item multiple times,
105 // and that we saw everything we expected. 105 // and that we saw everything we expected.
106 expected.erase(iter); 106 expected.erase(iter);
107 } 107 }
108 ASSERT_TRUE(expected.empty()); 108 ASSERT_TRUE(expected.empty());
109 } 109 }
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 248
249 // Override to allow specific cache guids. 249 // Override to allow specific cache guids.
250 DeviceInfoSpecifics GenerateTestSpecifics(const std::string& guid) { 250 DeviceInfoSpecifics GenerateTestSpecifics(const std::string& guid) {
251 DeviceInfoSpecifics specifics(GenerateTestSpecifics()); 251 DeviceInfoSpecifics specifics(GenerateTestSpecifics());
252 specifics.set_cache_guid(guid); 252 specifics.set_cache_guid(guid);
253 return specifics; 253 return specifics;
254 } 254 }
255 255
256 // Helper method to reduce duplicated code between tests. Wraps the given 256 // Helper method to reduce duplicated code between tests. Wraps the given
257 // specifics object in an EntityData and EntityChange of type ACTION_ADD, and 257 // specifics object in an EntityData and EntityChange of type ACTION_ADD, and
258 // pushes them onto the given change list. The corresponding client tag the 258 // pushes them onto the given change list. The corresponding client tag the
skym 2016/08/10 19:23:23 Some "tag" naming that didn't get updated here.
skym 2016/08/11 16:28:48 Done.
259 // service determines is returned. Instance method because we need access to 259 // service determines is returned. Instance method because we need access to
260 // service to generate the tag. 260 // service to generate the tag.
skym 2016/08/10 19:23:23 And here.
skym 2016/08/11 16:28:47 Done.
261 std::string PushBackEntityChangeAdd(const DeviceInfoSpecifics& specifics, 261 std::string PushBackEntityChangeAdd(const DeviceInfoSpecifics& specifics,
262 EntityChangeList* changes) { 262 EntityChangeList* changes) {
263 EntityDataPtr ptr = SpecificsToEntity(specifics); 263 EntityDataPtr ptr = SpecificsToEntity(specifics);
264 const std::string tag = service()->GetClientTag(ptr.value()); 264 changes->push_back(EntityChange::CreateAdd(specifics.cache_guid(), ptr));
265 changes->push_back(EntityChange::CreateAdd(tag, ptr)); 265 return specifics.cache_guid();
266 return tag;
267 } 266 }
268 267
269 // Allows access to the store before that will ultimately be used to 268 // Allows access to the store before that will ultimately be used to
270 // initialize the service. 269 // initialize the service.
271 ModelTypeStore* store() { 270 ModelTypeStore* store() {
272 EXPECT_TRUE(store_); 271 EXPECT_TRUE(store_);
273 return store_.get(); 272 return store_.get();
274 } 273 }
275 274
276 // Get the number of times the service notifies observers of changes. 275 // Get the number of times the service notifies observers of changes.
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 store()->WriteData(batch.get(), specifics2.cache_guid(), 479 store()->WriteData(batch.get(), specifics2.cache_guid(),
481 specifics2.SerializeAsString()); 480 specifics2.SerializeAsString());
482 store()->WriteData(batch.get(), specifics3.cache_guid(), 481 store()->WriteData(batch.get(), specifics3.cache_guid(),
483 specifics3.SerializeAsString()); 482 specifics3.SerializeAsString());
484 store()->CommitWriteBatch(std::move(batch), 483 store()->CommitWriteBatch(std::move(batch),
485 base::Bind(&AssertResultIsSuccess)); 484 base::Bind(&AssertResultIsSuccess));
486 485
487 InitializeAndPump(); 486 InitializeAndPump();
488 487
489 std::map<std::string, DeviceInfoSpecifics> expected; 488 std::map<std::string, DeviceInfoSpecifics> expected;
490 expected[CacheGuidToTag(specifics1.cache_guid())] = specifics1; 489 expected[specifics1.cache_guid()] = specifics1;
491 expected[CacheGuidToTag(specifics3.cache_guid())] = specifics3; 490 expected[specifics3.cache_guid()] = specifics3;
492 ClientTagList client_tags; 491 StorageKeyList storage_keys;
493 client_tags.push_back(CacheGuidToTag(specifics1.cache_guid())); 492 storage_keys.push_back(specifics1.cache_guid());
494 client_tags.push_back(CacheGuidToTag(specifics3.cache_guid())); 493 storage_keys.push_back(specifics3.cache_guid());
495 service()->GetData(client_tags, 494 service()->GetData(storage_keys,
496 base::Bind(&AssertExpectedFromDataBatch, expected)); 495 base::Bind(&AssertExpectedFromDataBatch, expected));
497 } 496 }
498 497
499 TEST_F(DeviceInfoServiceTest, GetDataMissing) { 498 TEST_F(DeviceInfoServiceTest, GetDataMissing) {
500 InitializeAndPump(); 499 InitializeAndPump();
501 std::map<std::string, DeviceInfoSpecifics> expected; 500 std::map<std::string, DeviceInfoSpecifics> expected;
502 ClientTagList client_tags; 501 StorageKeyList storage_keys;
503 client_tags.push_back(CacheGuidToTag("tag1")); 502 storage_keys.push_back("tag1");
skym 2016/08/10 19:23:23 And here.
skym 2016/08/11 16:28:48 Done.
504 service()->GetData(client_tags, 503 service()->GetData(storage_keys,
505 base::Bind(&AssertExpectedFromDataBatch, expected)); 504 base::Bind(&AssertExpectedFromDataBatch, expected));
506 } 505 }
507 506
508 TEST_F(DeviceInfoServiceTest, GetAllData) { 507 TEST_F(DeviceInfoServiceTest, GetAllData) {
509 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); 508 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch();
510 DeviceInfoSpecifics specifics1(GenerateTestSpecifics()); 509 DeviceInfoSpecifics specifics1(GenerateTestSpecifics());
511 DeviceInfoSpecifics specifics2(GenerateTestSpecifics()); 510 DeviceInfoSpecifics specifics2(GenerateTestSpecifics());
512 const std::string& tag1 = CacheGuidToTag(specifics1.cache_guid()); 511 const std::string& guid1 = specifics1.cache_guid();
513 const std::string& tag2 = CacheGuidToTag(specifics2.cache_guid()); 512 const std::string& guid2 = specifics2.cache_guid();
514 store()->WriteData(batch.get(), specifics1.cache_guid(), 513 store()->WriteData(batch.get(), specifics1.cache_guid(),
515 specifics1.SerializeAsString()); 514 specifics1.SerializeAsString());
516 store()->WriteData(batch.get(), specifics2.cache_guid(), 515 store()->WriteData(batch.get(), specifics2.cache_guid(),
517 specifics2.SerializeAsString()); 516 specifics2.SerializeAsString());
518 store()->CommitWriteBatch(std::move(batch), 517 store()->CommitWriteBatch(std::move(batch),
519 base::Bind(&AssertResultIsSuccess)); 518 base::Bind(&AssertResultIsSuccess));
520 519
521 InitializeAndPump(); 520 InitializeAndPump();
522 521
523 std::map<std::string, DeviceInfoSpecifics> expected; 522 std::map<std::string, DeviceInfoSpecifics> expected;
524 expected[tag1] = specifics1; 523 expected[guid1] = specifics1;
525 expected[tag2] = specifics2; 524 expected[guid2] = specifics2;
526 ClientTagList client_tags; 525 StorageKeyList storage_keys;
527 client_tags.push_back(tag1); 526 storage_keys.push_back(guid1);
528 client_tags.push_back(tag2); 527 storage_keys.push_back(guid2);
529 service()->GetData(client_tags, 528 service()->GetData(storage_keys,
530 base::Bind(&AssertExpectedFromDataBatch, expected)); 529 base::Bind(&AssertExpectedFromDataBatch, expected));
531 } 530 }
532 531
533 TEST_F(DeviceInfoServiceTest, ApplySyncChangesEmpty) { 532 TEST_F(DeviceInfoServiceTest, ApplySyncChangesEmpty) {
534 InitializeAndPump(); 533 InitializeAndPump();
535 const SyncError error = service()->ApplySyncChanges( 534 const SyncError error = service()->ApplySyncChanges(
536 service()->CreateMetadataChangeList(), EntityChangeList()); 535 service()->CreateMetadataChangeList(), EntityChangeList());
537 EXPECT_FALSE(error.IsSet()); 536 EXPECT_FALSE(error.IsSet());
538 EXPECT_EQ(0, change_count()); 537 EXPECT_EQ(0, change_count());
539 } 538 }
540 539
541 TEST_F(DeviceInfoServiceTest, ApplySyncChangesInMemory) { 540 TEST_F(DeviceInfoServiceTest, ApplySyncChangesInMemory) {
542 InitializeAndPump(); 541 InitializeAndPump();
543 542
544 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); 543 DeviceInfoSpecifics specifics = GenerateTestSpecifics();
545 EntityChangeList add_changes; 544 EntityChangeList add_changes;
546 const std::string tag = PushBackEntityChangeAdd(specifics, &add_changes); 545 PushBackEntityChangeAdd(specifics, &add_changes);
547 SyncError error = service()->ApplySyncChanges( 546 SyncError error = service()->ApplySyncChanges(
548 service()->CreateMetadataChangeList(), add_changes); 547 service()->CreateMetadataChangeList(), add_changes);
549 548
550 EXPECT_FALSE(error.IsSet()); 549 EXPECT_FALSE(error.IsSet());
551 std::unique_ptr<DeviceInfo> info = 550 std::unique_ptr<DeviceInfo> info =
552 service()->GetDeviceInfo(specifics.cache_guid()); 551 service()->GetDeviceInfo(specifics.cache_guid());
553 ASSERT_TRUE(info); 552 ASSERT_TRUE(info);
554 AssertEqual(specifics, *info.get()); 553 AssertEqual(specifics, *info.get());
555 EXPECT_EQ(1, change_count()); 554 EXPECT_EQ(1, change_count());
556 555
557 EntityChangeList delete_changes; 556 EntityChangeList delete_changes;
558 delete_changes.push_back(EntityChange::CreateDelete(tag)); 557 delete_changes.push_back(EntityChange::CreateDelete(specifics.cache_guid()));
559 error = service()->ApplySyncChanges(service()->CreateMetadataChangeList(), 558 error = service()->ApplySyncChanges(service()->CreateMetadataChangeList(),
560 delete_changes); 559 delete_changes);
561 560
562 EXPECT_FALSE(error.IsSet()); 561 EXPECT_FALSE(error.IsSet());
563 EXPECT_FALSE(service()->GetDeviceInfo(specifics.cache_guid())); 562 EXPECT_FALSE(service()->GetDeviceInfo(specifics.cache_guid()));
564 EXPECT_EQ(2, change_count()); 563 EXPECT_EQ(2, change_count());
565 } 564 }
566 565
567 TEST_F(DeviceInfoServiceTest, ApplySyncChangesStore) { 566 TEST_F(DeviceInfoServiceTest, ApplySyncChangesStore) {
568 InitializeAndPump(); 567 InitializeAndPump();
569 568
570 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); 569 DeviceInfoSpecifics specifics = GenerateTestSpecifics();
571 EntityChangeList data_changes; 570 EntityChangeList data_changes;
572 const std::string tag = PushBackEntityChangeAdd(specifics, &data_changes); 571 PushBackEntityChangeAdd(specifics, &data_changes);
573 DataTypeState state; 572 DataTypeState state;
574 state.set_encryption_key_name("ekn"); 573 state.set_encryption_key_name("ekn");
575 std::unique_ptr<MetadataChangeList> metadata_changes( 574 std::unique_ptr<MetadataChangeList> metadata_changes(
576 service()->CreateMetadataChangeList()); 575 service()->CreateMetadataChangeList());
577 metadata_changes->UpdateDataTypeState(state); 576 metadata_changes->UpdateDataTypeState(state);
578 577
579 const SyncError error = 578 const SyncError error =
580 service()->ApplySyncChanges(std::move(metadata_changes), data_changes); 579 service()->ApplySyncChanges(std::move(metadata_changes), data_changes);
581 EXPECT_FALSE(error.IsSet()); 580 EXPECT_FALSE(error.IsSet());
582 EXPECT_EQ(1, change_count()); 581 EXPECT_EQ(1, change_count());
(...skipping 12 matching lines...) Expand all
595 594
596 TEST_F(DeviceInfoServiceTest, ApplySyncChangesWithLocalGuid) { 595 TEST_F(DeviceInfoServiceTest, ApplySyncChangesWithLocalGuid) {
597 InitializeAndPumpAndStart(); 596 InitializeAndPumpAndStart();
598 597
599 // The point of this test is to try to apply remote changes that have the same 598 // The point of this test is to try to apply remote changes that have the same
600 // cache guid as the local device. The service should ignore these changes 599 // cache guid as the local device. The service should ignore these changes
601 // since only it should be performing writes on its data. 600 // since only it should be performing writes on its data.
602 DeviceInfoSpecifics specifics = 601 DeviceInfoSpecifics specifics =
603 GenerateTestSpecifics(local_device()->GetLocalDeviceInfo()->guid()); 602 GenerateTestSpecifics(local_device()->GetLocalDeviceInfo()->guid());
604 EntityChangeList change_list; 603 EntityChangeList change_list;
605 const std::string tag = PushBackEntityChangeAdd(specifics, &change_list); 604 PushBackEntityChangeAdd(specifics, &change_list);
606 605
607 // Should have a single change from reconciliation. 606 // Should have a single change from reconciliation.
608 EXPECT_TRUE( 607 EXPECT_TRUE(
609 service()->GetDeviceInfo(local_device()->GetLocalDeviceInfo()->guid())); 608 service()->GetDeviceInfo(local_device()->GetLocalDeviceInfo()->guid()));
610 EXPECT_EQ(1, change_count()); 609 EXPECT_EQ(1, change_count());
611 // Ensure |last_updated| is about now, plus or minus a little bit. 610 // Ensure |last_updated| is about now, plus or minus a little bit.
612 Time last_updated( 611 Time last_updated(
613 syncer::ProtoTimeToTime(processor() 612 syncer::ProtoTimeToTime(processor()
614 ->put_map() 613 ->put_map()
615 .begin() 614 .begin()
616 ->second->specifics.device_info() 615 ->second->specifics.device_info()
617 .last_updated_timestamp())); 616 .last_updated_timestamp()));
618 EXPECT_LT(Time::Now() - TimeDelta::FromMinutes(1), last_updated); 617 EXPECT_LT(Time::Now() - TimeDelta::FromMinutes(1), last_updated);
619 EXPECT_GT(Time::Now() + TimeDelta::FromMinutes(1), last_updated); 618 EXPECT_GT(Time::Now() + TimeDelta::FromMinutes(1), last_updated);
620 619
621 EXPECT_FALSE( 620 EXPECT_FALSE(
622 service() 621 service()
623 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list) 622 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list)
624 .IsSet()); 623 .IsSet());
625 EXPECT_EQ(1, change_count()); 624 EXPECT_EQ(1, change_count());
626 625
627 change_list.clear(); 626 change_list.clear();
628 change_list.push_back(EntityChange::CreateDelete(tag)); 627 change_list.push_back(EntityChange::CreateDelete(specifics.cache_guid()));
629 EXPECT_FALSE( 628 EXPECT_FALSE(
630 service() 629 service()
631 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list) 630 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list)
632 .IsSet()); 631 .IsSet());
633 EXPECT_EQ(1, change_count()); 632 EXPECT_EQ(1, change_count());
634 } 633 }
635 634
636 TEST_F(DeviceInfoServiceTest, ApplyDeleteNonexistent) { 635 TEST_F(DeviceInfoServiceTest, ApplyDeleteNonexistent) {
637 InitializeAndPumpAndStart(); 636 InitializeAndPumpAndStart();
638 EXPECT_EQ(1, change_count()); 637 EXPECT_EQ(1, change_count());
639 EntityChangeList delete_changes; 638 EntityChangeList delete_changes;
640 delete_changes.push_back(EntityChange::CreateDelete(CacheGuidToTag("tag"))); 639 delete_changes.push_back(EntityChange::CreateDelete("guid"));
641 const SyncError error = service()->ApplySyncChanges( 640 const SyncError error = service()->ApplySyncChanges(
642 service()->CreateMetadataChangeList(), delete_changes); 641 service()->CreateMetadataChangeList(), delete_changes);
643 EXPECT_FALSE(error.IsSet()); 642 EXPECT_FALSE(error.IsSet());
644 EXPECT_EQ(1, change_count()); 643 EXPECT_EQ(1, change_count());
645 } 644 }
646 645
647 TEST_F(DeviceInfoServiceTest, MergeEmpty) { 646 TEST_F(DeviceInfoServiceTest, MergeEmpty) {
648 InitializeAndPumpAndStart(); 647 InitializeAndPumpAndStart();
649 EXPECT_EQ(1, change_count()); 648 EXPECT_EQ(1, change_count());
650 const SyncError error = service()->MergeSyncData( 649 const SyncError error = service()->MergeSyncData(
651 service()->CreateMetadataChangeList(), EntityDataMap()); 650 service()->CreateMetadataChangeList(), EntityDataMap());
652 EXPECT_FALSE(error.IsSet()); 651 EXPECT_FALSE(error.IsSet());
653 EXPECT_EQ(1, change_count()); 652 EXPECT_EQ(1, change_count());
654 EXPECT_EQ(1u, processor()->put_map().size()); 653 EXPECT_EQ(1u, processor()->put_map().size());
655 EXPECT_EQ(0u, processor()->delete_set().size()); 654 EXPECT_EQ(0u, processor()->delete_set().size());
656 } 655 }
657 656
658 TEST_F(DeviceInfoServiceTest, MergeWithData) { 657 TEST_F(DeviceInfoServiceTest, MergeWithData) {
659 const DeviceInfoSpecifics unique_local(GenerateTestSpecifics("unique_local")); 658 const DeviceInfoSpecifics unique_local(GenerateTestSpecifics("unique_local"));
maxbogue 2016/08/10 23:56:03 Could you create const strings here for the three
skym 2016/08/11 16:28:48 Kinda done, removed all the duplicated string usag
660 const DeviceInfoSpecifics conflict_local(GenerateTestSpecifics("conflict")); 659 const DeviceInfoSpecifics conflict_local(GenerateTestSpecifics("conflict"));
661 DeviceInfoSpecifics conflict_remote(GenerateTestSpecifics("conflict")); 660 DeviceInfoSpecifics conflict_remote(GenerateTestSpecifics("conflict"));
662 DeviceInfoSpecifics unique_remote(GenerateTestSpecifics("unique_remote")); 661 DeviceInfoSpecifics unique_remote(GenerateTestSpecifics("unique_remote"));
663 662
664 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); 663 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch();
665 store()->WriteData(batch.get(), unique_local.cache_guid(), 664 store()->WriteData(batch.get(), unique_local.cache_guid(),
666 unique_local.SerializeAsString()); 665 unique_local.SerializeAsString());
667 store()->WriteData(batch.get(), conflict_local.cache_guid(), 666 store()->WriteData(batch.get(), conflict_local.cache_guid(),
668 conflict_local.SerializeAsString()); 667 conflict_local.SerializeAsString());
669 store()->CommitWriteBatch(std::move(batch), 668 store()->CommitWriteBatch(std::move(batch),
670 base::Bind(&AssertResultIsSuccess)); 669 base::Bind(&AssertResultIsSuccess));
671 670
672 InitializeAndPumpAndStart(); 671 InitializeAndPumpAndStart();
673 EXPECT_EQ(1, change_count()); 672 EXPECT_EQ(1, change_count());
674 673
675 EntityDataMap remote_input; 674 EntityDataMap remote_input;
676 remote_input[CacheGuidToTag(conflict_remote.cache_guid())] = 675 remote_input[conflict_remote.cache_guid()] =
677 SpecificsToEntity(conflict_remote); 676 SpecificsToEntity(conflict_remote);
678 remote_input[CacheGuidToTag(unique_remote.cache_guid())] = 677 remote_input[unique_remote.cache_guid()] = SpecificsToEntity(unique_remote);
679 SpecificsToEntity(unique_remote);
680 678
681 DataTypeState state; 679 DataTypeState state;
682 state.set_encryption_key_name("ekn"); 680 state.set_encryption_key_name("ekn");
683 std::unique_ptr<MetadataChangeList> metadata_changes( 681 std::unique_ptr<MetadataChangeList> metadata_changes(
684 service()->CreateMetadataChangeList()); 682 service()->CreateMetadataChangeList());
685 metadata_changes->UpdateDataTypeState(state); 683 metadata_changes->UpdateDataTypeState(state);
686 684
687 const SyncError error = 685 const SyncError error =
688 service()->MergeSyncData(std::move(metadata_changes), remote_input); 686 service()->MergeSyncData(std::move(metadata_changes), remote_input);
689 EXPECT_FALSE(error.IsSet()); 687 EXPECT_FALSE(error.IsSet());
690 EXPECT_EQ(2, change_count()); 688 EXPECT_EQ(2, change_count());
691 689
692 // The remote should beat the local in conflict. 690 // The remote should beat the local in conflict.
693 EXPECT_EQ(4u, service()->GetAllDeviceInfo().size()); 691 EXPECT_EQ(4u, service()->GetAllDeviceInfo().size());
694 AssertEqual(unique_local, *service()->GetDeviceInfo("unique_local").get()); 692 AssertEqual(unique_local, *service()->GetDeviceInfo("unique_local").get());
695 AssertEqual(unique_remote, *service()->GetDeviceInfo("unique_remote").get()); 693 AssertEqual(unique_remote, *service()->GetDeviceInfo("unique_remote").get());
696 AssertEqual(conflict_remote, *service()->GetDeviceInfo("conflict").get()); 694 AssertEqual(conflict_remote, *service()->GetDeviceInfo("conflict").get());
697 695
698 // Service should have told the processor about the existance of unique_local. 696 // Service should have told the processor about the existance of unique_local.
699 EXPECT_TRUE(processor()->delete_set().empty()); 697 EXPECT_TRUE(processor()->delete_set().empty());
700 EXPECT_EQ(2u, processor()->put_map().size()); 698 EXPECT_EQ(2u, processor()->put_map().size());
701 const auto& it = processor()->put_map().find(CacheGuidToTag("unique_local")); 699 const auto& it = processor()->put_map().find("unique_local");
702 ASSERT_NE(processor()->put_map().end(), it); 700 ASSERT_NE(processor()->put_map().end(), it);
703 AssertEqual(unique_local, it->second->specifics.device_info()); 701 AssertEqual(unique_local, it->second->specifics.device_info());
704 702
705 RestartService(); 703 RestartService();
706 ASSERT_EQ(state.encryption_key_name(), 704 ASSERT_EQ(state.encryption_key_name(),
707 processor()->metadata()->GetDataTypeState().encryption_key_name()); 705 processor()->metadata()->GetDataTypeState().encryption_key_name());
708 } 706 }
709 707
710 TEST_F(DeviceInfoServiceTest, MergeLocalGuid) { 708 TEST_F(DeviceInfoServiceTest, MergeLocalGuid) {
711 const DeviceInfo* local_device_info = local_device()->GetLocalDeviceInfo(); 709 const DeviceInfo* local_device_info = local_device()->GetLocalDeviceInfo();
712 std::unique_ptr<DeviceInfoSpecifics> specifics( 710 std::unique_ptr<DeviceInfoSpecifics> specifics(
713 CopyToSpecifics(*local_device_info)); 711 CopyToSpecifics(*local_device_info));
714 specifics->set_last_updated_timestamp(syncer::TimeToProtoTime(Time::Now())); 712 specifics->set_last_updated_timestamp(syncer::TimeToProtoTime(Time::Now()));
715 const std::string guid = local_device_info->guid(); 713 const std::string guid = local_device_info->guid();
716 714
717 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); 715 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch();
718 store()->WriteData(batch.get(), guid, specifics->SerializeAsString()); 716 store()->WriteData(batch.get(), guid, specifics->SerializeAsString());
719 store()->CommitWriteBatch(std::move(batch), 717 store()->CommitWriteBatch(std::move(batch),
720 base::Bind(&AssertResultIsSuccess)); 718 base::Bind(&AssertResultIsSuccess));
721 719
722 InitializeAndPumpAndStart(); 720 InitializeAndPumpAndStart();
723 721
724 EntityDataMap remote_input; 722 EntityDataMap remote_input;
725 remote_input[CacheGuidToTag(guid)] = SpecificsToEntity(*specifics); 723 remote_input[guid] = SpecificsToEntity(*specifics);
726 724
727 const SyncError error = service()->MergeSyncData( 725 const SyncError error = service()->MergeSyncData(
728 service()->CreateMetadataChangeList(), remote_input); 726 service()->CreateMetadataChangeList(), remote_input);
729 EXPECT_FALSE(error.IsSet()); 727 EXPECT_FALSE(error.IsSet());
730 EXPECT_EQ(0, change_count()); 728 EXPECT_EQ(0, change_count());
731 EXPECT_EQ(1u, service()->GetAllDeviceInfo().size()); 729 EXPECT_EQ(1u, service()->GetAllDeviceInfo().size());
732 EXPECT_TRUE(processor()->delete_set().empty()); 730 EXPECT_TRUE(processor()->delete_set().empty());
733 EXPECT_TRUE(processor()->put_map().empty()); 731 EXPECT_TRUE(processor()->put_map().empty());
734 } 732 }
735 733
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
767 specifics.set_cache_guid("non-local"); 765 specifics.set_cache_guid("non-local");
768 PushBackEntityChangeAdd(specifics, &change_list); 766 PushBackEntityChangeAdd(specifics, &change_list);
769 service()->ApplySyncChanges(service()->CreateMetadataChangeList(), 767 service()->ApplySyncChanges(service()->CreateMetadataChangeList(),
770 change_list); 768 change_list);
771 EXPECT_EQ(1, service()->CountActiveDevices()); 769 EXPECT_EQ(1, service()->CountActiveDevices());
772 } 770 }
773 771
774 } // namespace 772 } // namespace
775 773
776 } // namespace sync_driver_v2 774 } // namespace sync_driver_v2
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698