summaryrefslogtreecommitdiffstats
path: root/sync/internal_api/sync_manager_impl_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sync/internal_api/sync_manager_impl_unittest.cc')
-rw-r--r--sync/internal_api/sync_manager_impl_unittest.cc64
1 files changed, 64 insertions, 0 deletions
diff --git a/sync/internal_api/sync_manager_impl_unittest.cc b/sync/internal_api/sync_manager_impl_unittest.cc
index d2b1dec..eeba3bd 100644
--- a/sync/internal_api/sync_manager_impl_unittest.cc
+++ b/sync/internal_api/sync_manager_impl_unittest.cc
@@ -24,6 +24,7 @@
#include "base/values.h"
#include "google_apis/gaia/gaia_constants.h"
#include "sync/engine/sync_scheduler.h"
+#include "sync/internal_api/public/base/attachment_id_proto.h"
#include "sync/internal_api/public/base/cancelation_signal.h"
#include "sync/internal_api/public/base/model_type_test_util.h"
#include "sync/internal_api/public/change_record.h"
@@ -866,6 +867,7 @@ class SyncManagerTest : public testing::Test,
(*out)[PASSWORDS] = GROUP_PASSIVE;
(*out)[PREFERENCES] = GROUP_PASSIVE;
(*out)[PRIORITY_PREFERENCES] = GROUP_PASSIVE;
+ (*out)[ARTICLES] = GROUP_PASSIVE;
}
ModelTypeSet GetEnabledTypes() {
@@ -2872,6 +2874,8 @@ class SyncManagerChangeProcessingTest : public SyncManagerTest {
return last_changes_.Get().size();
}
+ void ClearChangeList() { last_changes_ = ImmutableChangeRecordList(); }
+
protected:
ImmutableChangeRecordList last_changes_;
TestIdFactory id_factory_;
@@ -3107,6 +3111,66 @@ TEST_F(SyncManagerChangeProcessingTest, DeletionsAndChanges) {
EXPECT_LT(folder_b_pos, folder_a_pos);
}
+// See that attachment metadata changes are not filtered out by
+// SyncManagerImpl::VisiblePropertiesDiffer.
+TEST_F(SyncManagerChangeProcessingTest, AttachmentMetadataOnlyChanges) {
+ // Create an article with no attachments. See that a change is generated.
+ int64 article_id = kInvalidId;
+ {
+ syncable::WriteTransaction trans(
+ FROM_HERE, syncable::SYNCER, share()->directory.get());
+ int64 type_root = GetIdForDataType(ARTICLES);
+ syncable::Entry root(&trans, syncable::GET_BY_HANDLE, type_root);
+ ASSERT_TRUE(root.good());
+ syncable::MutableEntry article(
+ &trans, syncable::CREATE, ARTICLES, root.GetId(), "article");
+ ASSERT_TRUE(article.good());
+ SetNodeProperties(&article);
+ article_id = article.GetMetahandle();
+ }
+ ASSERT_EQ(1UL, GetChangeListSize());
+ FindChangeInList(article_id, ChangeRecord::ACTION_ADD);
+ ClearChangeList();
+
+ // Modify the article by adding one attachment. Don't touch anything else.
+ // See that a change is generated.
+ {
+ syncable::WriteTransaction trans(
+ FROM_HERE, syncable::SYNCER, share()->directory.get());
+ syncable::MutableEntry article(&trans, syncable::GET_BY_HANDLE, article_id);
+ sync_pb::AttachmentMetadata metadata;
+ *metadata.add_record()->mutable_id() = CreateAttachmentIdProto();
+ article.PutAttachmentMetadata(metadata);
+ }
+ ASSERT_EQ(1UL, GetChangeListSize());
+ FindChangeInList(article_id, ChangeRecord::ACTION_UPDATE);
+ ClearChangeList();
+
+ // Modify the article by replacing its attachment with a different one. See
+ // that a change is generated.
+ {
+ syncable::WriteTransaction trans(
+ FROM_HERE, syncable::SYNCER, share()->directory.get());
+ syncable::MutableEntry article(&trans, syncable::GET_BY_HANDLE, article_id);
+ sync_pb::AttachmentMetadata metadata = article.GetAttachmentMetadata();
+ *metadata.add_record()->mutable_id() = CreateAttachmentIdProto();
+ article.PutAttachmentMetadata(metadata);
+ }
+ ASSERT_EQ(1UL, GetChangeListSize());
+ FindChangeInList(article_id, ChangeRecord::ACTION_UPDATE);
+ ClearChangeList();
+
+ // Modify the article by replacing its attachment metadata with the same
+ // attachment metadata. No change should be generated.
+ {
+ syncable::WriteTransaction trans(
+ FROM_HERE, syncable::SYNCER, share()->directory.get());
+ syncable::MutableEntry article(&trans, syncable::GET_BY_HANDLE, article_id);
+ article.PutAttachmentMetadata(article.GetAttachmentMetadata());
+ }
+ ASSERT_EQ(0UL, GetChangeListSize());
+}
+
// During initialization SyncManagerImpl loads sqlite database. If it fails to
// do so it should fail initialization. This test verifies this behavior.
// Test reuses SyncManagerImpl initialization from SyncManagerTest but overrides