Index: sync/internal_api/shared_model_type_processor_unittest.cc |
diff --git a/sync/internal_api/shared_model_type_processor_unittest.cc b/sync/internal_api/shared_model_type_processor_unittest.cc |
index 1e6a7f79ef8dd908d928a7a77c89ea93438f56be..d626e2b36f3caf0a8b3850b9f94b59a2e55c21f6 100644 |
--- a/sync/internal_api/shared_model_type_processor_unittest.cc |
+++ b/sync/internal_api/shared_model_type_processor_unittest.cc |
@@ -59,16 +59,25 @@ scoped_ptr<EntityData> CopyEntityData(const EntityData& old_data) { |
class SimpleStore { |
public: |
void PutData(const std::string& tag, const EntityData& data) { |
+ data_change_count_++; |
data_store_[tag] = CopyEntityData(data); |
} |
void PutMetadata(const std::string& tag, |
const sync_pb::EntityMetadata& metadata) { |
+ metadata_change_count_++; |
metadata_store_[tag] = metadata; |
} |
- void RemoveData(const std::string& tag) { data_store_.erase(tag); } |
- void RemoveMetadata(const std::string& tag) { metadata_store_.erase(tag); } |
+ void RemoveData(const std::string& tag) { |
+ data_change_count_++; |
+ data_store_.erase(tag); |
+ } |
+ |
+ void RemoveMetadata(const std::string& tag) { |
+ metadata_change_count_++; |
+ metadata_store_.erase(tag); |
+ } |
bool HasData(const std::string& tag) const { |
return data_store_.find(tag) != data_store_.end(); |
@@ -93,6 +102,9 @@ class SimpleStore { |
size_t DataCount() const { return data_store_.size(); } |
size_t MetadataCount() const { return metadata_store_.size(); } |
+ size_t DataChangeCount() const { return data_change_count_; } |
+ size_t MetadataChangeCount() const { return metadata_change_count_; } |
+ |
const sync_pb::DataTypeState& data_type_state() const { |
return data_type_state_; |
} |
@@ -111,12 +123,16 @@ class SimpleStore { |
} |
void Reset() { |
+ data_change_count_ = 0; |
+ metadata_change_count_ = 0; |
data_store_.clear(); |
metadata_store_.clear(); |
data_type_state_.Clear(); |
} |
private: |
+ size_t data_change_count_ = 0; |
+ size_t metadata_change_count_ = 0; |
std::map<std::string, scoped_ptr<EntityData>> data_store_; |
std::map<std::string, sync_pb::EntityMetadata> metadata_store_; |
sync_pb::DataTypeState data_type_state_; |
@@ -821,7 +837,7 @@ TEST_F(SharedModelTypeProcessorTest, LocalCreateItem) { |
// The purpose of this test case is to test setting |client_tag_hash| and |id| |
// on the EntityData object as we pass it into the Put method of the processor. |
-TEST_F(SharedModelTypeProcessorTest, LocalCreateAndModifyWithOverrides) { |
+TEST_F(SharedModelTypeProcessorTest, LocalUpdateItemWithOverrides) { |
const std::string kId1 = "cid1"; |
const std::string kId2 = "cid2"; |
const std::string kName1 = "name1"; |
@@ -883,7 +899,7 @@ TEST_F(SharedModelTypeProcessorTest, LocalCreateAndModifyWithOverrides) { |
// Creates a new local item then modifies it. |
// Thoroughly tests data generated by modification of server-unknown item. |
-TEST_F(SharedModelTypeProcessorTest, LocalCreateAndModifyItem) { |
+TEST_F(SharedModelTypeProcessorTest, LocalUpdateItem) { |
InitializeToReadyState(); |
WriteItem(kTag1, kValue1); |
@@ -934,6 +950,18 @@ TEST_F(SharedModelTypeProcessorTest, LocalCreateAndModifyItem) { |
EXPECT_NE(metadata_v1.specifics_hash(), metadata_v2.specifics_hash()); |
} |
+// Tests that a local update that doesn't change specifics doesn't generate a |
+// commit request. |
+TEST_F(SharedModelTypeProcessorTest, LocalUpdateItemRedundant) { |
+ InitializeToReadyState(); |
+ WriteItem(kTag1, kValue1); |
+ EXPECT_EQ(1U, db().MetadataCount()); |
+ ExpectCommitRequests({kTag1}); |
+ |
+ WriteItem(kTag1, kValue1); |
+ ExpectCommitRequests({kTag1}); |
+} |
+ |
// Thoroughly tests the data generated by a server item creation. |
TEST_F(SharedModelTypeProcessorTest, ServerCreateItem) { |
InitializeToReadyState(); |
@@ -964,6 +992,26 @@ TEST_F(SharedModelTypeProcessorTest, ServerCreateItem) { |
EXPECT_TRUE(metadata.has_specifics_hash()); |
} |
+// Thoroughly tests the data generated by a server item creation. |
+TEST_F(SharedModelTypeProcessorTest, ServerUpdateItem) { |
+ InitializeToReadyState(); |
+ |
+ // Local add writes data and metadata; ack writes metadata again. |
+ WriteItemAndAck(kTag1, kValue1); |
+ EXPECT_EQ(1U, db().DataChangeCount()); |
+ EXPECT_EQ(2U, db().MetadataChangeCount()); |
+ |
+ // Redundant update from server doesn't write data but updates metadata. |
+ UpdateFromServer(5, kTag1, kValue1); |
+ EXPECT_EQ(1U, db().DataChangeCount()); |
+ EXPECT_EQ(3U, db().MetadataChangeCount()); |
+ |
+ // A reflection (update already received) is ignored completely. |
+ UpdateFromServer(0 /* version_offset */, kTag1, kValue1); |
+ EXPECT_EQ(1U, db().DataChangeCount()); |
+ EXPECT_EQ(3U, db().MetadataChangeCount()); |
+} |
+ |
// Tests locally deleting an acknowledged item. |
TEST_F(SharedModelTypeProcessorTest, LocalDeleteItem) { |
InitializeToReadyState(); |