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

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: Removing redundant hash value. 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
« no previous file with comments | « components/sync_driver/device_info_service.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 }
110 110
111 // Creates an EntityData/EntityDataPtr around a copy of the given specifics. 111 // Creates an EntityData/EntityDataPtr around a copy of the given specifics.
112 EntityDataPtr SpecificsToEntity(const DeviceInfoSpecifics& specifics) { 112 EntityDataPtr SpecificsToEntity(const DeviceInfoSpecifics& specifics) {
113 EntityData data; 113 EntityData data;
114 // These tests do not care about the tag hash, but EntityData and friends 114 // These tests do not care about the tag hash, but EntityData and friends
115 // cannot differentiate between the default EntityData object if the hash 115 // cannot differentiate between the default EntityData object if the hash
116 // is unset, which causes pass/copy operations to no-op and things start to 116 // is unset, which causes pass/copy operations to no-op and things start to
117 // break, so we throw in a junk value and forget about it. 117 // break, so we throw in a junk value and forget about it.
118 data.client_tag_hash = "junk"; 118 data.client_tag_hash = "junk";
119 *data.specifics.mutable_device_info() = specifics; 119 *data.specifics.mutable_device_info() = specifics;
120 return data.PassToPtr(); 120 return data.PassToPtr();
121 } 121 }
122 122
123 std::string CacheGuidToTag(const std::string& guid) { 123 std::string CacheGuidToTag(const std::string& guid) {
124 return "DeviceInfo_" + guid; 124 return "DeviceInfo_" + guid;
125 } 125 }
126 126
127 // Helper method to reduce duplicated code between tests. Wraps the given
128 // specifics object in an EntityData and EntityChange of type ACTION_ADD, and
129 // pushes them onto the given change list. The corresponding guid of the data
130 // is returned, which happens to be the storage key.
131 std::string PushBackEntityChangeAdd(const DeviceInfoSpecifics& specifics,
132 EntityChangeList* changes) {
133 EntityDataPtr ptr = SpecificsToEntity(specifics);
134 changes->push_back(EntityChange::CreateAdd(specifics.cache_guid(), ptr));
135 return specifics.cache_guid();
136 }
137
127 // Instead of actually processing anything, simply accumulates all instructions 138 // Instead of actually processing anything, simply accumulates all instructions
128 // in members that can then be accessed. TODO(skym): If this ends up being 139 // in members that can then be accessed. TODO(skym): If this ends up being
129 // useful for other model type unittests it should be moved out to a shared 140 // useful for other model type unittests it should be moved out to a shared
130 // location. 141 // location.
131 class RecordingModelTypeChangeProcessor 142 class RecordingModelTypeChangeProcessor
132 : public syncer_v2::FakeModelTypeChangeProcessor { 143 : public syncer_v2::FakeModelTypeChangeProcessor {
133 public: 144 public:
134 RecordingModelTypeChangeProcessor() {} 145 RecordingModelTypeChangeProcessor() {}
135 ~RecordingModelTypeChangeProcessor() override {} 146 ~RecordingModelTypeChangeProcessor() override {}
136 147
137 void Put(const std::string& client_tag, 148 void Put(const std::string& storage_key,
138 std::unique_ptr<EntityData> entity_data, 149 std::unique_ptr<EntityData> entity_data,
139 MetadataChangeList* metadata_changes) override { 150 MetadataChangeList* metadata_changes) override {
140 put_map_.insert(std::make_pair(client_tag, std::move(entity_data))); 151 put_map_.insert(std::make_pair(storage_key, std::move(entity_data)));
141 } 152 }
142 153
143 void Delete(const std::string& client_tag, 154 void Delete(const std::string& storage_key,
144 MetadataChangeList* metadata_changes) override { 155 MetadataChangeList* metadata_changes) override {
145 delete_set_.insert(client_tag); 156 delete_set_.insert(storage_key);
146 } 157 }
147 158
148 void OnMetadataLoaded(syncer::SyncError error, 159 void OnMetadataLoaded(syncer::SyncError error,
149 std::unique_ptr<MetadataBatch> batch) override { 160 std::unique_ptr<MetadataBatch> batch) override {
150 std::swap(metadata_, batch); 161 std::swap(metadata_, batch);
151 } 162 }
152 163
153 const std::map<std::string, std::unique_ptr<EntityData>>& put_map() const { 164 const std::map<std::string, std::unique_ptr<EntityData>>& put_map() const {
154 return put_map_; 165 return put_map_;
155 } 166 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 return DeviceInfoService::CopyToSpecifics(info); 257 return DeviceInfoService::CopyToSpecifics(info);
247 } 258 }
248 259
249 // Override to allow specific cache guids. 260 // Override to allow specific cache guids.
250 DeviceInfoSpecifics GenerateTestSpecifics(const std::string& guid) { 261 DeviceInfoSpecifics GenerateTestSpecifics(const std::string& guid) {
251 DeviceInfoSpecifics specifics(GenerateTestSpecifics()); 262 DeviceInfoSpecifics specifics(GenerateTestSpecifics());
252 specifics.set_cache_guid(guid); 263 specifics.set_cache_guid(guid);
253 return specifics; 264 return specifics;
254 } 265 }
255 266
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
258 // pushes them onto the given change list. The corresponding client tag the
259 // service determines is returned. Instance method because we need access to
260 // service to generate the tag.
261 std::string PushBackEntityChangeAdd(const DeviceInfoSpecifics& specifics,
262 EntityChangeList* changes) {
263 EntityDataPtr ptr = SpecificsToEntity(specifics);
264 const std::string tag = service()->GetClientTag(ptr.value());
265 changes->push_back(EntityChange::CreateAdd(tag, ptr));
266 return tag;
267 }
268
269 // Allows access to the store before that will ultimately be used to 267 // Allows access to the store before that will ultimately be used to
270 // initialize the service. 268 // initialize the service.
271 ModelTypeStore* store() { 269 ModelTypeStore* store() {
272 EXPECT_TRUE(store_); 270 EXPECT_TRUE(store_);
273 return store_.get(); 271 return store_.get();
274 } 272 }
275 273
276 // Get the number of times the service notifies observers of changes. 274 // Get the number of times the service notifies observers of changes.
277 int change_count() { return change_count_; } 275 int change_count() { return change_count_; }
278 276
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 store()->WriteData(batch.get(), specifics2.cache_guid(), 478 store()->WriteData(batch.get(), specifics2.cache_guid(),
481 specifics2.SerializeAsString()); 479 specifics2.SerializeAsString());
482 store()->WriteData(batch.get(), specifics3.cache_guid(), 480 store()->WriteData(batch.get(), specifics3.cache_guid(),
483 specifics3.SerializeAsString()); 481 specifics3.SerializeAsString());
484 store()->CommitWriteBatch(std::move(batch), 482 store()->CommitWriteBatch(std::move(batch),
485 base::Bind(&AssertResultIsSuccess)); 483 base::Bind(&AssertResultIsSuccess));
486 484
487 InitializeAndPump(); 485 InitializeAndPump();
488 486
489 std::map<std::string, DeviceInfoSpecifics> expected; 487 std::map<std::string, DeviceInfoSpecifics> expected;
490 expected[CacheGuidToTag(specifics1.cache_guid())] = specifics1; 488 expected[specifics1.cache_guid()] = specifics1;
491 expected[CacheGuidToTag(specifics3.cache_guid())] = specifics3; 489 expected[specifics3.cache_guid()] = specifics3;
492 ClientTagList client_tags; 490 StorageKeyList storage_keys;
493 client_tags.push_back(CacheGuidToTag(specifics1.cache_guid())); 491 storage_keys.push_back(specifics1.cache_guid());
494 client_tags.push_back(CacheGuidToTag(specifics3.cache_guid())); 492 storage_keys.push_back(specifics3.cache_guid());
495 service()->GetData(client_tags, 493 service()->GetData(storage_keys,
496 base::Bind(&AssertExpectedFromDataBatch, expected)); 494 base::Bind(&AssertExpectedFromDataBatch, expected));
497 } 495 }
498 496
499 TEST_F(DeviceInfoServiceTest, GetDataMissing) { 497 TEST_F(DeviceInfoServiceTest, GetDataMissing) {
500 InitializeAndPump(); 498 InitializeAndPump();
501 std::map<std::string, DeviceInfoSpecifics> expected; 499 std::map<std::string, DeviceInfoSpecifics> expected;
502 ClientTagList client_tags; 500 StorageKeyList storage_keys;
503 client_tags.push_back(CacheGuidToTag("tag1")); 501 storage_keys.push_back("does_not_exist");
504 service()->GetData(client_tags, 502 service()->GetData(storage_keys,
505 base::Bind(&AssertExpectedFromDataBatch, expected)); 503 base::Bind(&AssertExpectedFromDataBatch, expected));
506 } 504 }
507 505
508 TEST_F(DeviceInfoServiceTest, GetAllData) { 506 TEST_F(DeviceInfoServiceTest, GetAllData) {
509 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); 507 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch();
510 DeviceInfoSpecifics specifics1(GenerateTestSpecifics()); 508 DeviceInfoSpecifics specifics1(GenerateTestSpecifics());
511 DeviceInfoSpecifics specifics2(GenerateTestSpecifics()); 509 DeviceInfoSpecifics specifics2(GenerateTestSpecifics());
512 const std::string& tag1 = CacheGuidToTag(specifics1.cache_guid()); 510 const std::string& guid1 = specifics1.cache_guid();
513 const std::string& tag2 = CacheGuidToTag(specifics2.cache_guid()); 511 const std::string& guid2 = specifics2.cache_guid();
514 store()->WriteData(batch.get(), specifics1.cache_guid(), 512 store()->WriteData(batch.get(), specifics1.cache_guid(),
515 specifics1.SerializeAsString()); 513 specifics1.SerializeAsString());
516 store()->WriteData(batch.get(), specifics2.cache_guid(), 514 store()->WriteData(batch.get(), specifics2.cache_guid(),
517 specifics2.SerializeAsString()); 515 specifics2.SerializeAsString());
518 store()->CommitWriteBatch(std::move(batch), 516 store()->CommitWriteBatch(std::move(batch),
519 base::Bind(&AssertResultIsSuccess)); 517 base::Bind(&AssertResultIsSuccess));
520 518
521 InitializeAndPump(); 519 InitializeAndPump();
522 520
523 std::map<std::string, DeviceInfoSpecifics> expected; 521 std::map<std::string, DeviceInfoSpecifics> expected;
524 expected[tag1] = specifics1; 522 expected[guid1] = specifics1;
525 expected[tag2] = specifics2; 523 expected[guid2] = specifics2;
526 ClientTagList client_tags; 524 StorageKeyList storage_keys;
527 client_tags.push_back(tag1); 525 storage_keys.push_back(guid1);
528 client_tags.push_back(tag2); 526 storage_keys.push_back(guid2);
529 service()->GetData(client_tags, 527 service()->GetData(storage_keys,
530 base::Bind(&AssertExpectedFromDataBatch, expected)); 528 base::Bind(&AssertExpectedFromDataBatch, expected));
531 } 529 }
532 530
533 TEST_F(DeviceInfoServiceTest, ApplySyncChangesEmpty) { 531 TEST_F(DeviceInfoServiceTest, ApplySyncChangesEmpty) {
534 InitializeAndPump(); 532 InitializeAndPump();
535 const SyncError error = service()->ApplySyncChanges( 533 const SyncError error = service()->ApplySyncChanges(
536 service()->CreateMetadataChangeList(), EntityChangeList()); 534 service()->CreateMetadataChangeList(), EntityChangeList());
537 EXPECT_FALSE(error.IsSet()); 535 EXPECT_FALSE(error.IsSet());
538 EXPECT_EQ(0, change_count()); 536 EXPECT_EQ(0, change_count());
539 } 537 }
540 538
541 TEST_F(DeviceInfoServiceTest, ApplySyncChangesInMemory) { 539 TEST_F(DeviceInfoServiceTest, ApplySyncChangesInMemory) {
542 InitializeAndPump(); 540 InitializeAndPump();
543 541
544 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); 542 DeviceInfoSpecifics specifics = GenerateTestSpecifics();
545 EntityChangeList add_changes; 543 EntityChangeList add_changes;
546 const std::string tag = PushBackEntityChangeAdd(specifics, &add_changes); 544 PushBackEntityChangeAdd(specifics, &add_changes);
547 SyncError error = service()->ApplySyncChanges( 545 SyncError error = service()->ApplySyncChanges(
548 service()->CreateMetadataChangeList(), add_changes); 546 service()->CreateMetadataChangeList(), add_changes);
549 547
550 EXPECT_FALSE(error.IsSet()); 548 EXPECT_FALSE(error.IsSet());
551 std::unique_ptr<DeviceInfo> info = 549 std::unique_ptr<DeviceInfo> info =
552 service()->GetDeviceInfo(specifics.cache_guid()); 550 service()->GetDeviceInfo(specifics.cache_guid());
553 ASSERT_TRUE(info); 551 ASSERT_TRUE(info);
554 AssertEqual(specifics, *info.get()); 552 AssertEqual(specifics, *info.get());
555 EXPECT_EQ(1, change_count()); 553 EXPECT_EQ(1, change_count());
556 554
557 EntityChangeList delete_changes; 555 EntityChangeList delete_changes;
558 delete_changes.push_back(EntityChange::CreateDelete(tag)); 556 delete_changes.push_back(EntityChange::CreateDelete(specifics.cache_guid()));
559 error = service()->ApplySyncChanges(service()->CreateMetadataChangeList(), 557 error = service()->ApplySyncChanges(service()->CreateMetadataChangeList(),
560 delete_changes); 558 delete_changes);
561 559
562 EXPECT_FALSE(error.IsSet()); 560 EXPECT_FALSE(error.IsSet());
563 EXPECT_FALSE(service()->GetDeviceInfo(specifics.cache_guid())); 561 EXPECT_FALSE(service()->GetDeviceInfo(specifics.cache_guid()));
564 EXPECT_EQ(2, change_count()); 562 EXPECT_EQ(2, change_count());
565 } 563 }
566 564
567 TEST_F(DeviceInfoServiceTest, ApplySyncChangesStore) { 565 TEST_F(DeviceInfoServiceTest, ApplySyncChangesStore) {
568 InitializeAndPump(); 566 InitializeAndPump();
569 567
570 DeviceInfoSpecifics specifics = GenerateTestSpecifics(); 568 DeviceInfoSpecifics specifics = GenerateTestSpecifics();
571 EntityChangeList data_changes; 569 EntityChangeList data_changes;
572 const std::string tag = PushBackEntityChangeAdd(specifics, &data_changes); 570 PushBackEntityChangeAdd(specifics, &data_changes);
573 DataTypeState state; 571 DataTypeState state;
574 state.set_encryption_key_name("ekn"); 572 state.set_encryption_key_name("ekn");
575 std::unique_ptr<MetadataChangeList> metadata_changes( 573 std::unique_ptr<MetadataChangeList> metadata_changes(
576 service()->CreateMetadataChangeList()); 574 service()->CreateMetadataChangeList());
577 metadata_changes->UpdateDataTypeState(state); 575 metadata_changes->UpdateDataTypeState(state);
578 576
579 const SyncError error = 577 const SyncError error =
580 service()->ApplySyncChanges(std::move(metadata_changes), data_changes); 578 service()->ApplySyncChanges(std::move(metadata_changes), data_changes);
581 EXPECT_FALSE(error.IsSet()); 579 EXPECT_FALSE(error.IsSet());
582 EXPECT_EQ(1, change_count()); 580 EXPECT_EQ(1, change_count());
(...skipping 12 matching lines...) Expand all
595 593
596 TEST_F(DeviceInfoServiceTest, ApplySyncChangesWithLocalGuid) { 594 TEST_F(DeviceInfoServiceTest, ApplySyncChangesWithLocalGuid) {
597 InitializeAndPumpAndStart(); 595 InitializeAndPumpAndStart();
598 596
599 // The point of this test is to try to apply remote changes that have the same 597 // 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 598 // cache guid as the local device. The service should ignore these changes
601 // since only it should be performing writes on its data. 599 // since only it should be performing writes on its data.
602 DeviceInfoSpecifics specifics = 600 DeviceInfoSpecifics specifics =
603 GenerateTestSpecifics(local_device()->GetLocalDeviceInfo()->guid()); 601 GenerateTestSpecifics(local_device()->GetLocalDeviceInfo()->guid());
604 EntityChangeList change_list; 602 EntityChangeList change_list;
605 const std::string tag = PushBackEntityChangeAdd(specifics, &change_list); 603 PushBackEntityChangeAdd(specifics, &change_list);
606 604
607 // Should have a single change from reconciliation. 605 // Should have a single change from reconciliation.
608 EXPECT_TRUE( 606 EXPECT_TRUE(
609 service()->GetDeviceInfo(local_device()->GetLocalDeviceInfo()->guid())); 607 service()->GetDeviceInfo(local_device()->GetLocalDeviceInfo()->guid()));
610 EXPECT_EQ(1, change_count()); 608 EXPECT_EQ(1, change_count());
611 // Ensure |last_updated| is about now, plus or minus a little bit. 609 // Ensure |last_updated| is about now, plus or minus a little bit.
612 Time last_updated( 610 Time last_updated(
613 syncer::ProtoTimeToTime(processor() 611 syncer::ProtoTimeToTime(processor()
614 ->put_map() 612 ->put_map()
615 .begin() 613 .begin()
616 ->second->specifics.device_info() 614 ->second->specifics.device_info()
617 .last_updated_timestamp())); 615 .last_updated_timestamp()));
618 EXPECT_LT(Time::Now() - TimeDelta::FromMinutes(1), last_updated); 616 EXPECT_LT(Time::Now() - TimeDelta::FromMinutes(1), last_updated);
619 EXPECT_GT(Time::Now() + TimeDelta::FromMinutes(1), last_updated); 617 EXPECT_GT(Time::Now() + TimeDelta::FromMinutes(1), last_updated);
620 618
621 EXPECT_FALSE( 619 EXPECT_FALSE(
622 service() 620 service()
623 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list) 621 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list)
624 .IsSet()); 622 .IsSet());
625 EXPECT_EQ(1, change_count()); 623 EXPECT_EQ(1, change_count());
626 624
627 change_list.clear(); 625 change_list.clear();
628 change_list.push_back(EntityChange::CreateDelete(tag)); 626 change_list.push_back(EntityChange::CreateDelete(specifics.cache_guid()));
629 EXPECT_FALSE( 627 EXPECT_FALSE(
630 service() 628 service()
631 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list) 629 ->ApplySyncChanges(service()->CreateMetadataChangeList(), change_list)
632 .IsSet()); 630 .IsSet());
633 EXPECT_EQ(1, change_count()); 631 EXPECT_EQ(1, change_count());
634 } 632 }
635 633
636 TEST_F(DeviceInfoServiceTest, ApplyDeleteNonexistent) { 634 TEST_F(DeviceInfoServiceTest, ApplyDeleteNonexistent) {
637 InitializeAndPumpAndStart(); 635 InitializeAndPumpAndStart();
638 EXPECT_EQ(1, change_count()); 636 EXPECT_EQ(1, change_count());
639 EntityChangeList delete_changes; 637 EntityChangeList delete_changes;
640 delete_changes.push_back(EntityChange::CreateDelete(CacheGuidToTag("tag"))); 638 delete_changes.push_back(EntityChange::CreateDelete("guid"));
641 const SyncError error = service()->ApplySyncChanges( 639 const SyncError error = service()->ApplySyncChanges(
642 service()->CreateMetadataChangeList(), delete_changes); 640 service()->CreateMetadataChangeList(), delete_changes);
643 EXPECT_FALSE(error.IsSet()); 641 EXPECT_FALSE(error.IsSet());
644 EXPECT_EQ(1, change_count()); 642 EXPECT_EQ(1, change_count());
645 } 643 }
646 644
647 TEST_F(DeviceInfoServiceTest, MergeEmpty) { 645 TEST_F(DeviceInfoServiceTest, MergeEmpty) {
648 InitializeAndPumpAndStart(); 646 InitializeAndPumpAndStart();
649 EXPECT_EQ(1, change_count()); 647 EXPECT_EQ(1, change_count());
650 const SyncError error = service()->MergeSyncData( 648 const SyncError error = service()->MergeSyncData(
651 service()->CreateMetadataChangeList(), EntityDataMap()); 649 service()->CreateMetadataChangeList(), EntityDataMap());
652 EXPECT_FALSE(error.IsSet()); 650 EXPECT_FALSE(error.IsSet());
653 EXPECT_EQ(1, change_count()); 651 EXPECT_EQ(1, change_count());
654 EXPECT_EQ(1u, processor()->put_map().size()); 652 EXPECT_EQ(1u, processor()->put_map().size());
655 EXPECT_EQ(0u, processor()->delete_set().size()); 653 EXPECT_EQ(0u, processor()->delete_set().size());
656 } 654 }
657 655
658 TEST_F(DeviceInfoServiceTest, MergeWithData) { 656 TEST_F(DeviceInfoServiceTest, MergeWithData) {
659 const DeviceInfoSpecifics unique_local(GenerateTestSpecifics("unique_local")); 657 const std::string conflict_guid = "conflict_guid";
660 const DeviceInfoSpecifics conflict_local(GenerateTestSpecifics("conflict")); 658 const DeviceInfoSpecifics unique_local(
661 DeviceInfoSpecifics conflict_remote(GenerateTestSpecifics("conflict")); 659 GenerateTestSpecifics("unique_local_guid"));
662 DeviceInfoSpecifics unique_remote(GenerateTestSpecifics("unique_remote")); 660 const DeviceInfoSpecifics conflict_local(
661 GenerateTestSpecifics(conflict_guid));
662 const DeviceInfoSpecifics conflict_remote(
663 GenerateTestSpecifics(conflict_guid));
664 const DeviceInfoSpecifics unique_remote(
665 GenerateTestSpecifics("unique_remote_guid"));
663 666
664 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); 667 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch();
665 store()->WriteData(batch.get(), unique_local.cache_guid(), 668 store()->WriteData(batch.get(), unique_local.cache_guid(),
666 unique_local.SerializeAsString()); 669 unique_local.SerializeAsString());
667 store()->WriteData(batch.get(), conflict_local.cache_guid(), 670 store()->WriteData(batch.get(), conflict_local.cache_guid(),
668 conflict_local.SerializeAsString()); 671 conflict_local.SerializeAsString());
669 store()->CommitWriteBatch(std::move(batch), 672 store()->CommitWriteBatch(std::move(batch),
670 base::Bind(&AssertResultIsSuccess)); 673 base::Bind(&AssertResultIsSuccess));
671 674
672 InitializeAndPumpAndStart(); 675 InitializeAndPumpAndStart();
673 EXPECT_EQ(1, change_count()); 676 EXPECT_EQ(1, change_count());
674 677
675 EntityDataMap remote_input; 678 EntityDataMap remote_input;
676 remote_input[CacheGuidToTag(conflict_remote.cache_guid())] = 679 remote_input[conflict_remote.cache_guid()] =
677 SpecificsToEntity(conflict_remote); 680 SpecificsToEntity(conflict_remote);
678 remote_input[CacheGuidToTag(unique_remote.cache_guid())] = 681 remote_input[unique_remote.cache_guid()] = SpecificsToEntity(unique_remote);
679 SpecificsToEntity(unique_remote);
680 682
681 DataTypeState state; 683 DataTypeState state;
682 state.set_encryption_key_name("ekn"); 684 state.set_encryption_key_name("ekn");
683 std::unique_ptr<MetadataChangeList> metadata_changes( 685 std::unique_ptr<MetadataChangeList> metadata_changes(
684 service()->CreateMetadataChangeList()); 686 service()->CreateMetadataChangeList());
685 metadata_changes->UpdateDataTypeState(state); 687 metadata_changes->UpdateDataTypeState(state);
686 688
687 const SyncError error = 689 const SyncError error =
688 service()->MergeSyncData(std::move(metadata_changes), remote_input); 690 service()->MergeSyncData(std::move(metadata_changes), remote_input);
689 EXPECT_FALSE(error.IsSet()); 691 EXPECT_FALSE(error.IsSet());
690 EXPECT_EQ(2, change_count()); 692 EXPECT_EQ(2, change_count());
691 693
692 // The remote should beat the local in conflict. 694 // The remote should beat the local in conflict.
693 EXPECT_EQ(4u, service()->GetAllDeviceInfo().size()); 695 EXPECT_EQ(4u, service()->GetAllDeviceInfo().size());
694 AssertEqual(unique_local, *service()->GetDeviceInfo("unique_local").get()); 696 AssertEqual(unique_local,
695 AssertEqual(unique_remote, *service()->GetDeviceInfo("unique_remote").get()); 697 *service()->GetDeviceInfo(unique_local.cache_guid()).get());
696 AssertEqual(conflict_remote, *service()->GetDeviceInfo("conflict").get()); 698 AssertEqual(unique_remote,
699 *service()->GetDeviceInfo(unique_remote.cache_guid()).get());
700 AssertEqual(conflict_remote, *service()->GetDeviceInfo(conflict_guid).get());
697 701
698 // Service should have told the processor about the existance of unique_local. 702 // Service should have told the processor about the existance of unique_local.
699 EXPECT_TRUE(processor()->delete_set().empty()); 703 EXPECT_TRUE(processor()->delete_set().empty());
700 EXPECT_EQ(2u, processor()->put_map().size()); 704 EXPECT_EQ(2u, processor()->put_map().size());
701 const auto& it = processor()->put_map().find(CacheGuidToTag("unique_local")); 705 const auto& it = processor()->put_map().find(unique_local.cache_guid());
702 ASSERT_NE(processor()->put_map().end(), it); 706 ASSERT_NE(processor()->put_map().end(), it);
703 AssertEqual(unique_local, it->second->specifics.device_info()); 707 AssertEqual(unique_local, it->second->specifics.device_info());
704 708
705 RestartService(); 709 RestartService();
706 ASSERT_EQ(state.encryption_key_name(), 710 ASSERT_EQ(state.encryption_key_name(),
707 processor()->metadata()->GetDataTypeState().encryption_key_name()); 711 processor()->metadata()->GetDataTypeState().encryption_key_name());
708 } 712 }
709 713
710 TEST_F(DeviceInfoServiceTest, MergeLocalGuid) { 714 TEST_F(DeviceInfoServiceTest, MergeLocalGuid) {
711 const DeviceInfo* local_device_info = local_device()->GetLocalDeviceInfo(); 715 const DeviceInfo* local_device_info = local_device()->GetLocalDeviceInfo();
712 std::unique_ptr<DeviceInfoSpecifics> specifics( 716 std::unique_ptr<DeviceInfoSpecifics> specifics(
713 CopyToSpecifics(*local_device_info)); 717 CopyToSpecifics(*local_device_info));
714 specifics->set_last_updated_timestamp(syncer::TimeToProtoTime(Time::Now())); 718 specifics->set_last_updated_timestamp(syncer::TimeToProtoTime(Time::Now()));
715 const std::string guid = local_device_info->guid(); 719 const std::string guid = local_device_info->guid();
716 720
717 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch(); 721 std::unique_ptr<WriteBatch> batch = store()->CreateWriteBatch();
718 store()->WriteData(batch.get(), guid, specifics->SerializeAsString()); 722 store()->WriteData(batch.get(), guid, specifics->SerializeAsString());
719 store()->CommitWriteBatch(std::move(batch), 723 store()->CommitWriteBatch(std::move(batch),
720 base::Bind(&AssertResultIsSuccess)); 724 base::Bind(&AssertResultIsSuccess));
721 725
722 InitializeAndPumpAndStart(); 726 InitializeAndPumpAndStart();
723 727
724 EntityDataMap remote_input; 728 EntityDataMap remote_input;
725 remote_input[CacheGuidToTag(guid)] = SpecificsToEntity(*specifics); 729 remote_input[guid] = SpecificsToEntity(*specifics);
726 730
727 const SyncError error = service()->MergeSyncData( 731 const SyncError error = service()->MergeSyncData(
728 service()->CreateMetadataChangeList(), remote_input); 732 service()->CreateMetadataChangeList(), remote_input);
729 EXPECT_FALSE(error.IsSet()); 733 EXPECT_FALSE(error.IsSet());
730 EXPECT_EQ(0, change_count()); 734 EXPECT_EQ(0, change_count());
731 EXPECT_EQ(1u, service()->GetAllDeviceInfo().size()); 735 EXPECT_EQ(1u, service()->GetAllDeviceInfo().size());
732 EXPECT_TRUE(processor()->delete_set().empty()); 736 EXPECT_TRUE(processor()->delete_set().empty());
733 EXPECT_TRUE(processor()->put_map().empty()); 737 EXPECT_TRUE(processor()->put_map().empty());
734 } 738 }
735 739
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
767 specifics.set_cache_guid("non-local"); 771 specifics.set_cache_guid("non-local");
768 PushBackEntityChangeAdd(specifics, &change_list); 772 PushBackEntityChangeAdd(specifics, &change_list);
769 service()->ApplySyncChanges(service()->CreateMetadataChangeList(), 773 service()->ApplySyncChanges(service()->CreateMetadataChangeList(),
770 change_list); 774 change_list);
771 EXPECT_EQ(1, service()->CountActiveDevices()); 775 EXPECT_EQ(1, service()->CountActiveDevices());
772 } 776 }
773 777
774 } // namespace 778 } // namespace
775 779
776 } // namespace sync_driver_v2 780 } // namespace sync_driver_v2
OLDNEW
« no previous file with comments | « components/sync_driver/device_info_service.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698