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

Unified Diff: chrome/browser/sync/profile_sync_service_bookmark_unittest.cc

Issue 896073002: Prevent Meta Info from being overwritten due to reordering of entries. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed CR feedback Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/sync/glue/bookmark_change_processor.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync/profile_sync_service_bookmark_unittest.cc
diff --git a/chrome/browser/sync/profile_sync_service_bookmark_unittest.cc b/chrome/browser/sync/profile_sync_service_bookmark_unittest.cc
index 3f8f10350df1878975ca62c642975acbc2a23098..a0c1673169ed5fabe4be9f770d46b4afe23b9c00 100644
--- a/chrome/browser/sync/profile_sync_service_bookmark_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_bookmark_unittest.cc
@@ -100,6 +100,8 @@ class FakeServerChange {
node.SetTitle(title);
sync_pb::BookmarkSpecifics specifics(node.GetBookmarkSpecifics());
+ const base::Time creation_time(base::Time::Now());
+ specifics.set_creation_time_us(creation_time.ToInternalValue());
if (!is_folder)
specifics.set_url(url);
if (meta_info_map)
@@ -258,15 +260,20 @@ class FakeServerChange {
void SetNodeMetaInfo(const BookmarkNode::MetaInfoMap& meta_info_map,
sync_pb::BookmarkSpecifics* specifics) {
specifics->clear_meta_info();
- for (BookmarkNode::MetaInfoMap::const_iterator it =
- meta_info_map.begin(); it != meta_info_map.end(); ++it) {
+ // Deliberatly set MetaInfoMap entries in opposite order (compared
+ // to the implementation in BookmarkChangeProcessor) to ensure that
+ // (a) the implementation isn't sensitive to the order and
+ // (b) the original meta info isn't blindly overwritten by
+ // BookmarkChangeProcessor unless there is a real change.
+ BookmarkNode::MetaInfoMap::const_iterator it = meta_info_map.end();
+ while (it != meta_info_map.begin()) {
+ --it;
sync_pb::MetaInfo* meta_info = specifics->add_meta_info();
meta_info->set_key(it->first);
meta_info->set_value(it->second);
}
}
-
// The transaction on which everything happens.
syncer::WriteTransaction *trans_;
@@ -2023,6 +2030,58 @@ TEST_F(ProfileSyncServiceBookmarkTestWithData, UpdateMetaInfoFromModel) {
ExpectModelMatch();
}
+// Tests that node's specifics doesn't get unnecessarily overwritten (causing
+// a subsequent commit) when BookmarkChangeProcessor handles a notification
+// (such as BookmarkMetaInfoChanged) without an actual data change.
+TEST_F(ProfileSyncServiceBookmarkTestWithData, MetaInfoPreservedOnNonChange) {
+ LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
+ WriteTestDataToBookmarkModel();
+ StartSync();
+
+ std::string orig_specifics;
+ int64 sync_id;
+ const BookmarkNode* bookmark;
+
+ // Create bookmark folder node containing meta info.
+ {
+ syncer::WriteTransaction trans(FROM_HERE, test_user_share_.user_share());
+ FakeServerChange adds(&trans);
+
+ int64 folder_id = adds.AddFolder("folder title", bookmark_bar_id(), 0);
+
+ BookmarkNode::MetaInfoMap node_meta_info;
+ node_meta_info["one"] = "1";
+ node_meta_info["two"] = "2";
+ node_meta_info["three"] = "3";
+
+ sync_id = adds.AddURLWithMetaInfo("node title", "http://www.foo.com/",
+ &node_meta_info, folder_id, 0);
+
+ // Verify that the node propagates to the bookmark model
+ adds.ApplyPendingChanges(change_processor_.get());
+
+ bookmark = model_->bookmark_bar_node()->GetChild(0)->GetChild(0);
+ EXPECT_EQ(node_meta_info, *bookmark->GetMetaInfoMap());
+
+ syncer::ReadNode sync_node(&trans);
+ EXPECT_EQ(BaseNode::INIT_OK, sync_node.InitByIdLookup(sync_id));
+ orig_specifics = sync_node.GetBookmarkSpecifics().SerializeAsString();
+ }
+
+ // Force change processor to update the sync node.
+ change_processor_->BookmarkMetaInfoChanged(model_, bookmark);
+
+ // Read bookmark specifics again and verify that there is no change.
+ {
+ syncer::ReadTransaction trans(FROM_HERE, test_user_share_.user_share());
+ syncer::ReadNode sync_node(&trans);
+ EXPECT_EQ(BaseNode::INIT_OK, sync_node.InitByIdLookup(sync_id));
+ std::string new_specifics =
+ sync_node.GetBookmarkSpecifics().SerializeAsString();
+ ASSERT_EQ(orig_specifics, new_specifics);
+ }
+}
+
void ProfileSyncServiceBookmarkTestWithData::GetTransactionVersions(
const BookmarkNode* root,
BookmarkNodeVersionMap* node_versions) {
« no previous file with comments | « chrome/browser/sync/glue/bookmark_change_processor.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698