| 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 2b72b22474b8299010bc1f70697b3780333448e0..25bd86d26e90c913305108418d86ffd4aaf48f3b 100644
|
| --- a/chrome/browser/sync/profile_sync_service_bookmark_unittest.cc
|
| +++ b/chrome/browser/sync/profile_sync_service_bookmark_unittest.cc
|
| @@ -126,6 +126,8 @@ class FakeServerChange {
|
| syncer::WriteNode node(trans_);
|
| EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(id));
|
| EXPECT_FALSE(node.GetFirstChildId());
|
| + node.GetMutableEntryForTest()->Put(syncer::syncable::SERVER_IS_DEL,
|
| + true);
|
| node.Remove();
|
| }
|
| {
|
| @@ -373,6 +375,8 @@ class ProfileSyncServiceBookmarkTest : public testing::Test {
|
| }
|
|
|
| void StartSync() {
|
| + test_user_share_.Reload();
|
| +
|
| ASSERT_TRUE(CreatePermanentBookmarkNodes());
|
|
|
| // Set up model associator.
|
| @@ -421,8 +425,10 @@ class ProfileSyncServiceBookmarkTest : public testing::Test {
|
|
|
| void StopSync() {
|
| change_processor_.reset();
|
| - syncer::SyncError error = model_associator_->DisassociateModels();
|
| - EXPECT_FALSE(error.IsSet());
|
| + if (model_associator_.get()) {
|
| + syncer::SyncError error = model_associator_->DisassociateModels();
|
| + EXPECT_FALSE(error.IsSet());
|
| + }
|
| model_associator_.reset();
|
|
|
| message_loop_.RunUntilIdle();
|
| @@ -1008,6 +1014,87 @@ TEST_F(ProfileSyncServiceBookmarkTest, MergeDuplicates) {
|
| ExpectModelMatch();
|
| }
|
|
|
| +TEST_F(ProfileSyncServiceBookmarkTest, ApplySyncDeletesFromJournal) {
|
| + // Initialize sync model and bookmark model as:
|
| + // URL 0
|
| + // Folder 1
|
| + // |-- URL 1
|
| + // +-- Folder 2
|
| + // +-- URL 2
|
| + LoadBookmarkModel(DELETE_EXISTING_STORAGE, SAVE_TO_STORAGE);
|
| + int64 u0 = 0;
|
| + int64 f1 = 0;
|
| + int64 u1 = 0;
|
| + int64 f2 = 0;
|
| + int64 u2 = 0;
|
| + StartSync();
|
| + int fixed_sync_bk_count = GetSyncBookmarkCount();
|
| + {
|
| + syncer::WriteTransaction trans(FROM_HERE, test_user_share_.user_share());
|
| + FakeServerChange adds(&trans);
|
| + u0 = adds.AddURL(L"URL 0", "http://plus.google.com/", bookmark_bar_id(), 0);
|
| + f1 = adds.AddFolder(L"Folder 1", bookmark_bar_id(), u0);
|
| + u1 = adds.AddURL(L"URL 1", "http://www.google.com/", f1, 0);
|
| + f2 = adds.AddFolder(L"Folder 2", f1, u1);
|
| + u2 = adds.AddURL(L"URL 2", "http://mail.google.com/", f2, 0);
|
| + adds.ApplyPendingChanges(change_processor_.get());
|
| + }
|
| + StopSync();
|
| +
|
| + // Reload bookmark model and disable model saving to make sync changes not
|
| + // persisted.
|
| + LoadBookmarkModel(LOAD_FROM_STORAGE, DONT_SAVE_TO_STORAGE);
|
| + EXPECT_EQ(6, model_->bookmark_bar_node()->GetTotalNodeCount());
|
| + EXPECT_EQ(fixed_sync_bk_count + 5, GetSyncBookmarkCount());
|
| + StartSync();
|
| + {
|
| + // Remove all folders/bookmarks except u3 added above.
|
| + syncer::WriteTransaction trans(FROM_HERE, test_user_share_.user_share());
|
| + FakeServerChange dels(&trans);
|
| + dels.Delete(u2);
|
| + dels.Delete(f2);
|
| + dels.Delete(u1);
|
| + dels.Delete(f1);
|
| + dels.ApplyPendingChanges(change_processor_.get());
|
| + }
|
| + StopSync();
|
| + // Bookmark bar itself and u0 remain.
|
| + EXPECT_EQ(2, model_->bookmark_bar_node()->GetTotalNodeCount());
|
| +
|
| + // Reload bookmarks including ones deleted in sync model from storage.
|
| + LoadBookmarkModel(LOAD_FROM_STORAGE, DONT_SAVE_TO_STORAGE);
|
| + EXPECT_EQ(6, model_->bookmark_bar_node()->GetTotalNodeCount());
|
| + // Add a bookmark under f1 when sync is off so that f1 will not be
|
| + // deleted even when f1 matches delete journal because it's not empty.
|
| + model_->AddURL(model_->bookmark_bar_node()->GetChild(1),
|
| + 0, UTF8ToUTF16("local"), GURL("http://www.youtube.com"));
|
| + // Sync model has fixed bookmarks nodes and u3.
|
| + EXPECT_EQ(fixed_sync_bk_count + 1, GetSyncBookmarkCount());
|
| + StartSync();
|
| + // Expect 4 bookmarks after model association because u2, f2, u1 are removed
|
| + // by delete journal, f1 is not removed by delete journal because it's
|
| + // not empty due to www.youtube.com added above.
|
| + EXPECT_EQ(4, model_->bookmark_bar_node()->GetTotalNodeCount());
|
| + EXPECT_EQ(UTF8ToUTF16("URL 0"),
|
| + model_->bookmark_bar_node()->GetChild(0)->GetTitle());
|
| + EXPECT_EQ(UTF8ToUTF16("Folder 1"),
|
| + model_->bookmark_bar_node()->GetChild(1)->GetTitle());
|
| + EXPECT_EQ(UTF8ToUTF16("local"),
|
| + model_->bookmark_bar_node()->GetChild(1)->GetChild(0)->GetTitle());
|
| + StopSync();
|
| +
|
| + // Verify purging of delete journals.
|
| + // Delete journals for u2, f2, u1 remains because they are used in last
|
| + // association.
|
| + EXPECT_EQ(3u, test_user_share_.GetDeleteJournalSize());
|
| + StartSync();
|
| + StopSync();
|
| + // Reload again and all delete journals should be gone because none is used
|
| + // in last association.
|
| + ASSERT_TRUE(test_user_share_.Reload());
|
| + EXPECT_EQ(0u, test_user_share_.GetDeleteJournalSize());
|
| +}
|
| +
|
| struct TestData {
|
| const wchar_t* title;
|
| const char* url;
|
|
|