Chromium Code Reviews| 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 } |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |