| 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_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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |