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

Side by Side 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: 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // TODO(akalin): This file is basically just a unit test for 5 // TODO(akalin): This file is basically just a unit test for
6 // BookmarkChangeProcessor. Write unit tests for 6 // BookmarkChangeProcessor. Write unit tests for
7 // BookmarkModelAssociator separately. 7 // BookmarkModelAssociator separately.
8 8
9 #include <map> 9 #include <map>
10 #include <queue> 10 #include <queue>
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 EXPECT_EQ(BaseNode::INIT_OK, predecessor.InitByIdLookup(predecessor_id)); 92 EXPECT_EQ(BaseNode::INIT_OK, predecessor.InitByIdLookup(predecessor_id));
93 EXPECT_EQ(predecessor.GetParentId(), parent.GetId()); 93 EXPECT_EQ(predecessor.GetParentId(), parent.GetId());
94 EXPECT_TRUE(node.InitBookmarkByCreation(parent, &predecessor)); 94 EXPECT_TRUE(node.InitBookmarkByCreation(parent, &predecessor));
95 } 95 }
96 EXPECT_EQ(node.GetPredecessorId(), predecessor_id); 96 EXPECT_EQ(node.GetPredecessorId(), predecessor_id);
97 EXPECT_EQ(node.GetParentId(), parent_id); 97 EXPECT_EQ(node.GetParentId(), parent_id);
98 node.SetIsFolder(is_folder); 98 node.SetIsFolder(is_folder);
99 node.SetTitle(title); 99 node.SetTitle(title);
100 100
101 sync_pb::BookmarkSpecifics specifics(node.GetBookmarkSpecifics()); 101 sync_pb::BookmarkSpecifics specifics(node.GetBookmarkSpecifics());
102 const base::Time creation_time(base::Time::Now());
103 specifics.set_creation_time_us(creation_time.ToInternalValue());
102 if (!is_folder) 104 if (!is_folder)
103 specifics.set_url(url); 105 specifics.set_url(url);
104 if (meta_info_map) 106 if (meta_info_map)
105 SetNodeMetaInfo(*meta_info_map, &specifics); 107 SetNodeMetaInfo(*meta_info_map, &specifics);
106 node.SetBookmarkSpecifics(specifics); 108 node.SetBookmarkSpecifics(specifics);
107 109
108 syncer::ChangeRecord record; 110 syncer::ChangeRecord record;
109 record.action = syncer::ChangeRecord::ACTION_ADD; 111 record.action = syncer::ChangeRecord::ACTION_ADD;
110 record.id = node.GetId(); 112 record.id = node.GetId();
111 changes_.push_back(record); 113 changes_.push_back(record);
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 return; 252 return;
251 syncer::ChangeRecord record; 253 syncer::ChangeRecord record;
252 record.action = syncer::ChangeRecord::ACTION_UPDATE; 254 record.action = syncer::ChangeRecord::ACTION_UPDATE;
253 record.id = id; 255 record.id = id;
254 changes_.push_back(record); 256 changes_.push_back(record);
255 } 257 }
256 258
257 void SetNodeMetaInfo(const BookmarkNode::MetaInfoMap& meta_info_map, 259 void SetNodeMetaInfo(const BookmarkNode::MetaInfoMap& meta_info_map,
258 sync_pb::BookmarkSpecifics* specifics) { 260 sync_pb::BookmarkSpecifics* specifics) {
259 specifics->clear_meta_info(); 261 specifics->clear_meta_info();
260 for (BookmarkNode::MetaInfoMap::const_iterator it = 262 // Deliberatly set MetaInfoMap entries in opposite order (compared
261 meta_info_map.begin(); it != meta_info_map.end(); ++it) { 263 // to the implementation in BookmarkChangeProcessor) to ensure that
264 // (a) the implementation isn't sensitive to the order and
265 // (b) the original meta info isn't blindly overwritten by
266 // BookmarkChangeProcessor unless there is a real change.
267 BookmarkNode::MetaInfoMap::const_iterator it = meta_info_map.end();
Nicolas Zea 2015/02/04 22:46:21 nit: leave as for loop?
stanisc 2015/02/05 01:40:15 I have considered the for loop, but couldn't find
268 while (it != meta_info_map.begin()) {
269 --it;
262 sync_pb::MetaInfo* meta_info = specifics->add_meta_info(); 270 sync_pb::MetaInfo* meta_info = specifics->add_meta_info();
263 meta_info->set_key(it->first); 271 meta_info->set_key(it->first);
264 meta_info->set_value(it->second); 272 meta_info->set_value(it->second);
265 } 273 }
266 } 274 }
267 275
268
269 // The transaction on which everything happens. 276 // The transaction on which everything happens.
270 syncer::WriteTransaction *trans_; 277 syncer::WriteTransaction *trans_;
271 278
272 // The change list we construct. 279 // The change list we construct.
273 syncer::ChangeRecordList changes_; 280 syncer::ChangeRecordList changes_;
274 }; 281 };
275 282
276 class ExtensiveChangesBookmarkModelObserver 283 class ExtensiveChangesBookmarkModelObserver
277 : public bookmarks::BaseBookmarkModelObserver { 284 : public bookmarks::BaseBookmarkModelObserver {
278 public: 285 public:
(...skipping 1736 matching lines...) Expand 10 before | Expand all | Expand 10 after
2015 ExpectModelMatch(); 2022 ExpectModelMatch();
2016 2023
2017 // Change/delete existing meta info and verify. 2024 // Change/delete existing meta info and verify.
2018 model_->DeleteNodeMetaInfo(folder_node, "folder"); 2025 model_->DeleteNodeMetaInfo(folder_node, "folder");
2019 model_->SetNodeMetaInfo(node, "node", "changednodevalue"); 2026 model_->SetNodeMetaInfo(node, "node", "changednodevalue");
2020 model_->DeleteNodeMetaInfo(node, "other"); 2027 model_->DeleteNodeMetaInfo(node, "other");
2021 model_->SetNodeMetaInfo(node, "newkey", "newkeyvalue"); 2028 model_->SetNodeMetaInfo(node, "newkey", "newkeyvalue");
2022 ExpectModelMatch(); 2029 ExpectModelMatch();
2023 } 2030 }
2024 2031
2032 // Tests that
Nicolas Zea 2015/02/04 22:46:21 Finish comment?
stanisc 2015/02/05 01:40:15 Done.
2033 TEST_F(ProfileSyncServiceBookmarkTestWithData, MetaInfoPreservedOnNonChange) {
2034 LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
2035 WriteTestDataToBookmarkModel();
2036 StartSync();
2037
2038 std::string orig_specifics;
2039 int64 sync_id;
2040 const BookmarkNode* bookmark;
2041
2042 // Create bookmark folder node containing meta info.
2043 {
2044 syncer::WriteTransaction trans(FROM_HERE, test_user_share_.user_share());
2045 FakeServerChange adds(&trans);
2046
2047 int64 folder_id = adds.AddFolder("folder title", bookmark_bar_id(), 0);
2048
2049 BookmarkNode::MetaInfoMap node_meta_info;
2050 node_meta_info["one"] = "1";
2051 node_meta_info["two"] = "2";
2052 node_meta_info["three"] = "3";
2053
2054 sync_id = adds.AddURLWithMetaInfo("node title", "http://www.foo.com/",
2055 &node_meta_info, folder_id, 0);
2056
2057 // Verify that the node propagates to the bookmark model
2058 adds.ApplyPendingChanges(change_processor_.get());
2059
2060 bookmark = model_->bookmark_bar_node()->GetChild(0)->GetChild(0);
2061 EXPECT_EQ(node_meta_info, *bookmark->GetMetaInfoMap());
2062
2063 syncer::ReadNode sync_node(&trans);
2064 EXPECT_EQ(BaseNode::INIT_OK, sync_node.InitByIdLookup(sync_id));
2065 orig_specifics = sync_node.GetBookmarkSpecifics().SerializeAsString();
2066 }
2067
2068 // Force change processor to update the sync node.
2069 change_processor_->BookmarkMetaInfoChanged(model_, bookmark);
2070
2071 // Read bookmark specifics again and verify that there is no change.
2072 {
2073 syncer::ReadTransaction trans(FROM_HERE, test_user_share_.user_share());
2074 syncer::ReadNode sync_node(&trans);
2075 EXPECT_EQ(BaseNode::INIT_OK, sync_node.InitByIdLookup(sync_id));
2076 std::string new_specifics =
2077 sync_node.GetBookmarkSpecifics().SerializeAsString();
2078 ASSERT_EQ(orig_specifics, new_specifics);
2079 }
2080 }
2081
2025 void ProfileSyncServiceBookmarkTestWithData::GetTransactionVersions( 2082 void ProfileSyncServiceBookmarkTestWithData::GetTransactionVersions(
2026 const BookmarkNode* root, 2083 const BookmarkNode* root,
2027 BookmarkNodeVersionMap* node_versions) { 2084 BookmarkNodeVersionMap* node_versions) {
2028 node_versions->clear(); 2085 node_versions->clear();
2029 std::queue<const BookmarkNode*> nodes; 2086 std::queue<const BookmarkNode*> nodes;
2030 nodes.push(root); 2087 nodes.push(root);
2031 while (!nodes.empty()) { 2088 while (!nodes.empty()) {
2032 const BookmarkNode* n = nodes.front(); 2089 const BookmarkNode* n = nodes.front();
2033 nodes.pop(); 2090 nodes.pop();
2034 2091
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
2186 ExpectModelMatch(); 2243 ExpectModelMatch();
2187 2244
2188 // Then simulate the add call arriving late. 2245 // Then simulate the add call arriving late.
2189 change_processor_->BookmarkNodeAdded(model_, model_->bookmark_bar_node(), 0); 2246 change_processor_->BookmarkNodeAdded(model_, model_->bookmark_bar_node(), 0);
2190 ExpectModelMatch(); 2247 ExpectModelMatch();
2191 } 2248 }
2192 2249
2193 } // namespace 2250 } // namespace
2194 2251
2195 } // namespace browser_sync 2252 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698