two_client_bookmarks_sync_test.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Use of this source code is governed by a BSD-style license that can be
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// found in the LICENSE file.
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "base/rand_util.h"
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "base/run_loop.h"
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "base/values.h"
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "chrome/browser/policy/profile_policy_connector_factory.h"
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "chrome/browser/profiles/profile.h"
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "chrome/browser/sync/test/integration/bookmarks_helper.h"
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "chrome/browser/sync/test/integration/passwords_helper.h"
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "chrome/browser/sync/test/integration/sync_test.h"
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "components/policy/core/common/mock_configuration_policy_provider.h"
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "components/policy/core/common/policy_map.h"
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "policy/policy_constants.h"
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "sync/internal_api/public/sessions/sync_session_snapshot.h"
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "testing/gmock/include/gmock/gmock.h"
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen#include "ui/base/layout.h"
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::AddFolder;
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::AddURL;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::AllModelsMatch;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::AllModelsMatchVerifier;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::ContainsDuplicateBookmarks;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::CountBookmarksWithTitlesMatching;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::CreateFavicon;
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::GetBookmarkBarNode;
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::GetManagedNode;
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::GetOtherNode;
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::GetSyncedBookmarksNode;
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::GetUniqueNodeByURL;
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::HasNodeWithURL;
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::IndexedFolderName;
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::IndexedSubfolderName;
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::IndexedSubsubfolderName;
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::IndexedURL;
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::IndexedURLTitle;
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::Move;
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::Remove;
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::RemoveAll;
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::ReverseChildOrder;
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::SetFavicon;
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::SetTitle;
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::SetURL;
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing bookmarks_helper::SortChildren;
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing passwords_helper::SetDecryptionPassphrase;
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing passwords_helper::SetEncryptionPassphrase;
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing sync_integration_test_util::AwaitCommitActivityCompletion;
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing sync_integration_test_util::AwaitPassphraseAccepted;
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenusing sync_integration_test_util::AwaitPassphraseRequired;
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chennamespace {
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenconst char kGenericURL[] = "http://www.host.ext:1234/path/filename";
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenconst char kGenericURLTitle[] = "URL Title";
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenconst char kGenericFolderName[] = "Folder Name";
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenconst char kGenericSubfolderName[] = "Subfolder Name";
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenconst char kValidPassphrase[] = "passphrase!";
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}  // namespace
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclass TwoClientBookmarksSyncTest : public SyncTest {
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public:
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  TwoClientBookmarksSyncTest() : SyncTest(TWO_CLIENT) {}
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  virtual ~TwoClientBookmarksSyncTest() {}
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    SyncTest::TearDownInProcessBrowserTestFixture();
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    policy_provider_.Shutdown();
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen protected:
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  // Needs to be deleted after all Profiles are deleted.
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  policy::MockConfigurationPolicyProvider policy_provider_;
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private:
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  DISALLOW_COPY_AND_ASSIGN(TwoClientBookmarksSyncTest);
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen};
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclass LegacyTwoClientBookmarksSyncTest : public SyncTest {
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public:
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  LegacyTwoClientBookmarksSyncTest() : SyncTest(TWO_CLIENT_LEGACY) {}
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  virtual ~LegacyTwoClientBookmarksSyncTest() {}
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private:
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  DISALLOW_COPY_AND_ASSIGN(LegacyTwoClientBookmarksSyncTest);
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen};
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, Sanity) {
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL google_url("http://www.google.com");
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, "Google", google_url) != NULL);
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(1, "Yahoo", GURL("http://www.yahoo.com")) != NULL);
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(1)->AwaitMutualSyncCycleCompletion(GetClient(0)));
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* new_folder = AddFolder(0, 2, "New Folder");
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  Move(0, GetUniqueNodeByURL(0, google_url), new_folder, 0);
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, GetBookmarkBarNode(0)->GetChild(0), "Yahoo!!");
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, GetBookmarkBarNode(0), 1, "CNN",
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      GURL("http://www.cnn.com")) != NULL);
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(1, "Facebook", GURL("http://www.facebook.com")) != NULL);
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(1)->AwaitMutualSyncCycleCompletion(GetClient(0)));
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SortChildren(1, GetBookmarkBarNode(1));
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(1)->AwaitMutualSyncCycleCompletion(GetClient(0)));
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  DisableVerifier();
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, GetUniqueNodeByURL(0, google_url), "Google++");
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(1, GetUniqueNodeByURL(1, google_url), "Google--");
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AwaitQuiescence());
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatch());
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SimultaneousURLChanges) {
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL initial_url("http://www.google.com");
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL second_url("http://www.google.com/abc");
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL third_url("http://www.google.com/def");
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title = "Google";
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, title, initial_url) != NULL);
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  DisableVerifier();
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetURL(
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      0, GetUniqueNodeByURL(0, initial_url), second_url) != NULL);
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetURL(
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      1, GetUniqueNodeByURL(1, initial_url), third_url) != NULL);
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AwaitQuiescence());
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatch());
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, GetBookmarkBarNode(0)->GetChild(0), "Google1");
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatch());
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370558.
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_AddFirstFolder) {
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddFolder(0, kGenericFolderName) != NULL);
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370559.
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_AddFirstBMWithoutFavicon) {
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, kGenericURLTitle, GURL(kGenericURL)) != NULL);
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370489.
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_AddFirstBMWithFavicon) {
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const GURL page_url(kGenericURL);
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const GURL icon_url("http://www.google.com/favicon.ico");
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* bookmark = AddURL(0, kGenericURLTitle, page_url);
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(bookmark != NULL);
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetFavicon(0, bookmark, icon_url, CreateFavicon(SK_ColorWHITE),
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen             bookmarks_helper::FROM_UI);
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test that the history service logic for not losing the hidpi versions of
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// favicons as a result of sync does not result in dropping sync updates.
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// In particular, the synced 16x16 favicon bitmap should overwrite 16x16
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// favicon bitmaps on all clients. (Though non-16x16 favicon bitmaps
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// are unchanged).
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_SetFaviconHiDPI) {
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  // Set the supported scale factors to include 2x such that CreateFavicon()
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  // creates a favicon with hidpi representations and that methods in the
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  // FaviconService request hidpi favicons.
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::vector<ui::ScaleFactor> supported_scale_factors;
199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  supported_scale_factors.push_back(ui::SCALE_FACTOR_100P);
200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  supported_scale_factors.push_back(ui::SCALE_FACTOR_200P);
201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ui::SetSupportedScaleFactors(supported_scale_factors);
202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const GURL page_url(kGenericURL);
204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const GURL icon_url1("http://www.google.com/favicon1.ico");
205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const GURL icon_url2("http://www.google.com/favicon2.ico");
206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* bookmark0 = AddURL(0, kGenericURLTitle, page_url);
211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(bookmark0 != NULL);
212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetFavicon(0, bookmark0, icon_url1, CreateFavicon(SK_ColorWHITE),
214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen             bookmarks_helper::FROM_UI);
215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* bookmark1 = GetUniqueNodeByURL(1, page_url);
219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetFavicon(1, bookmark1, icon_url1, CreateFavicon(SK_ColorBLUE),
220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen             bookmarks_helper::FROM_UI);
221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(1)->AwaitMutualSyncCycleCompletion(GetClient(0)));
222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetFavicon(0, bookmark0, icon_url2, CreateFavicon(SK_ColorGREEN),
225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen             bookmarks_helper::FROM_UI);
226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370560.
231d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_AddNonHTTPBMs) {
232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(
236d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      0, "FTP UR", GURL("ftp://user:password@host:1234/path")) != NULL);
237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, "File UR", GURL("file://host/path")) != NULL);
238d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
239d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
240d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
241d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
242d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370561.
243d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
244d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_AddFirstBMUnderFolder) {
245d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
246d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
247d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
248d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
249d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(folder != NULL);
250d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(
251d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      0, folder, 0, kGenericURLTitle, GURL(kGenericURL)) != NULL);
252d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
253d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
254d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
255d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
256d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370562.
257d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
258d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_AddSeveralBMsUnderBMBarAndOtherBM) {
259d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
260d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
261d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
262d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 20; ++i) {
263d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    std::string title = IndexedURLTitle(i);
264d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    GURL url = GURL(IndexedURL(i));
265d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
266d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    ASSERT_TRUE(AddURL(
267d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        0, GetOtherNode(0), i, title, url) != NULL);
268d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
269d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
270d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
271d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
272d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
273d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370563.
274d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
275d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_AddSeveralBMsAndFolders) {
276d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
277d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
278d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
279d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 15; ++i) {
280d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    if (base::RandDouble() > 0.6) {
281d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      std::string title = IndexedURLTitle(i);
282d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      GURL url = GURL(IndexedURL(i));
283d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
284d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    } else {
285d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      std::string title = IndexedFolderName(i);
286d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      const BookmarkNode* folder = AddFolder(0, i, title);
287d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      ASSERT_TRUE(folder != NULL);
288d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      if (base::RandDouble() > 0.4) {
289d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        for (int i = 0; i < 20; ++i) {
290d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen          std::string title = IndexedURLTitle(i);
291d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen          GURL url = GURL(IndexedURL(i));
292d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen          ASSERT_TRUE(
293d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen              AddURL(0, folder, i, title, url) != NULL);
294d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
295d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      }
296d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
297d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
298d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 10; i++) {
299d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    std::string title = IndexedURLTitle(i);
300d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    GURL url = GURL(IndexedURL(i));
301d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    ASSERT_TRUE(AddURL(0, GetOtherNode(0), i, title, url) != NULL);
302d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
303d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
304d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
305d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
306d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
307d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370641.
308d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
309d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_DuplicateBMWithDifferentURLSameName) {
310d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
311d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
312d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
313d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL url0 = GURL(IndexedURL(0));
314d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL url1 = GURL(IndexedURL(1));
315d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, kGenericURLTitle, url0) != NULL);
316d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, kGenericURLTitle, url1) != NULL);
317d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
318d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
319d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
320d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
321d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 370639 - Add bookmarks with different name and same URL.
322d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
323d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_DuplicateBookmarksWithSameURL) {
324d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
325d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
326d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
327d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title0 = IndexedURLTitle(0);
328d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title1 = IndexedURLTitle(1);
329d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, title0, GURL(kGenericURL)) != NULL);
330d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(0, title1, GURL(kGenericURL)) != NULL);
331d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
332d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
333d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
334d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
335d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371817.
336d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_RenameBMName) {
337d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
338d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
339d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
340d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title = IndexedURLTitle(1);
341d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* bookmark = AddURL(0, title, GURL(kGenericURL));
342d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(bookmark != NULL);
343d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
344d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
345d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
346d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string new_title = IndexedURLTitle(2);
347d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, bookmark, new_title);
348d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
349d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
350d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
351d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
352d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371822.
353d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_RenameBMURL) {
354d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
355d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
356d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
357d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL url = GURL(IndexedURL(1));
358d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* bookmark = AddURL(0, kGenericURLTitle, url);
359d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(bookmark != NULL);
360d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
361d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
362d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
363d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL new_url = GURL(IndexedURL(2));
364d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetURL(0, bookmark, new_url) != NULL);
365d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
366d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
367d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
368d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
369d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
370d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371818 - Renaming the same bookmark name twice.
371d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
372d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_TwiceRenamingBookmarkName) {
373d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
374d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
375d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
376d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title = IndexedURLTitle(1);
377d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* bookmark = AddURL(0, title, GURL(kGenericURL));
378d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(bookmark != NULL);
379d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
380d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
381d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
382d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string new_title = IndexedURLTitle(2);
383d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, bookmark, new_title);
384d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
385d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
386d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
387d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, bookmark, title);
388d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
389d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
390d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
391d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
392d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371823 - Renaming the same bookmark URL twice.
393d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
394d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_TwiceRenamingBookmarkURL) {
395d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
396d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
397d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
398d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL url = GURL(IndexedURL(1));
399d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* bookmark = AddURL(0, kGenericURLTitle, url);
400d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(bookmark != NULL);
401d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
402d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
403d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
404d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL new_url = GURL(IndexedURL(2));
405d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetURL(0, bookmark, new_url) != NULL);
406d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
407d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
408d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
409d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetURL(0, bookmark, url) != NULL);
410d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
411d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
412d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
413d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
414d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371824.
415d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_RenameBMFolder) {
416d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
417d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
418d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
419d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title = IndexedFolderName(1);
420d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* folder = AddFolder(0, title);
421d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(
422d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      0, folder, 0, kGenericURLTitle, GURL(kGenericURL)) != NULL);
423d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
424d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
425d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
426d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string new_title = IndexedFolderName(2);
427d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, folder, new_title);
428d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
429d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
430d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
431d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
432d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371825.
433d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_RenameEmptyBMFolder) {
434d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
435d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
436d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
437d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title = IndexedFolderName(1);
438d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* folder = AddFolder(0, title);
439d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
440d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
441d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
442d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string new_title = IndexedFolderName(2);
443d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, folder, new_title);
444d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
445d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
446d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
447d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
448d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371826.
449d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
450d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_RenameBMFolderWithLongHierarchy) {
451d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
452d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
453d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
454d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title = IndexedFolderName(1);
455d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* folder = AddFolder(0, title);
456d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(folder != NULL);
457d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 120; ++i) {
458d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    if (base::RandDouble() > 0.15) {
459d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      std::string title = IndexedURLTitle(i);
460d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      GURL url = GURL(IndexedURL(i));
461d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
462d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    } else {
463d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      std::string title = IndexedSubfolderName(i);
464d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      ASSERT_TRUE(AddFolder(0, folder, i, title) != NULL);
465d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
466d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
467d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
468d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
469d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
470d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string new_title = IndexedFolderName(2);
471d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, folder, new_title);
472d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
473d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
474d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
475d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
476d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371827.
477d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
478d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_RenameBMFolderThatHasParentAndChildren) {
479d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
480d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
481d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
482d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
483d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(folder != NULL);
484d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 1; i < 15; ++i) {
485d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    std::string title = IndexedURLTitle(i);
486d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    GURL url = GURL(IndexedURL(i));
487d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
488d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
489d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title = IndexedSubfolderName(1);
490d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* subfolder = AddFolder(0, folder, 0, title);
491d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 120; ++i) {
492d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    if (base::RandDouble() > 0.15) {
493d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      std::string title = IndexedURLTitle(i);
494d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      GURL url = GURL(IndexedURL(i));
495d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      ASSERT_TRUE(AddURL(0, subfolder, i, title, url) != NULL);
496d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    } else {
497d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      std::string title = IndexedSubsubfolderName(i);
498d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      ASSERT_TRUE(AddFolder(0, subfolder, i, title) != NULL);
499d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
500d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
501d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
502d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
503d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
504d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string new_title = IndexedSubfolderName(2);
505d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, subfolder, new_title);
506d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
507d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
508d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
509d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
510d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371828.
511d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_RenameBMNameAndURL) {
512d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
513d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
514d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
515d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL url = GURL(IndexedURL(1));
516d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string title = IndexedURLTitle(1);
517d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* bookmark = AddURL(0, title, url);
518d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(bookmark != NULL);
519d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
520d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
521d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
522d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  GURL new_url = GURL(IndexedURL(2));
523d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  std::string new_title = IndexedURLTitle(2);
524d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  bookmark = SetURL(0, bookmark, new_url);
525d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(bookmark != NULL);
526d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  SetTitle(0, bookmark, new_title);
527d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
528d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
529d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
530d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
531d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371832.
532d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
533d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_DeleteBMEmptyAccountAfterwards) {
534d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
535d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
536d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
537d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AddURL(
538d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen      0, kGenericURLTitle, GURL(kGenericURL)) != NULL);
539d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
540d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
541d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
542d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  Remove(0, GetBookmarkBarNode(0), 0);
543d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
544d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
545d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
546d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
547d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371833.
548d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
549d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_DelBMNonEmptyAccountAfterwards) {
550d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
551d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
552d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
553d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 20; ++i) {
554d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    std::string title = IndexedURLTitle(i);
555d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    GURL url = GURL(IndexedURL(i));
556d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
557d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
558d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
559d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
560d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
561d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  Remove(0, GetBookmarkBarNode(0), 0);
562d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
563d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
564d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
565d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
566d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371835.
567d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
568d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_DelFirstBMUnderBMFoldNonEmptyFoldAfterwards) {
569d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
570d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
571d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
572d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
573d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(folder != NULL);
574d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 10; ++i) {
575d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    std::string title = IndexedURLTitle(i);
576d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    GURL url = GURL(IndexedURL(i));
577d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
578d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
579d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
580d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
581d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
582d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  Remove(0, folder, 0);
583d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
584d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
585d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
586d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
587d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371836.
588d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
589d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_DelLastBMUnderBMFoldNonEmptyFoldAfterwards) {
590d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
591d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
592d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
593d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
594d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(folder != NULL);
595d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 10; ++i) {
596d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    std::string title = IndexedURLTitle(i);
597d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    GURL url = GURL(IndexedURL(i));
598d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
599d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
600d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
601d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
602d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
603d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  Remove(0, folder, folder->child_count() - 1);
604d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
605d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
606d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
607d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
608d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Test Scribe ID - 371856.
609d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenIN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
610d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                       SC_DelMiddleBMUnderBMFoldNonEmptyFoldAfterwards) {
611d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
612d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
613d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
614d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
615d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(folder != NULL);
616d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  for (int i = 0; i < 10; ++i) {
617d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    std::string title = IndexedURLTitle(i);
618d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    GURL url = GURL(IndexedURL(i));
619d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
620d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  }
621d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
622d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
623d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
624d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  Remove(0, folder, 4);
625d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
626d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen  ASSERT_TRUE(AllModelsMatchVerifier());
627d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
628
629// Test Scribe ID - 371857.
630IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
631                       SC_DelBMsUnderBMFoldEmptyFolderAfterwards) {
632  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
633  ASSERT_TRUE(AllModelsMatchVerifier());
634
635  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
636  ASSERT_TRUE(folder != NULL);
637  for (int i = 0; i < 10; ++i) {
638    std::string title = IndexedURLTitle(i);
639    GURL url = GURL(IndexedURL(i));
640    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
641  }
642  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
643  ASSERT_TRUE(AllModelsMatchVerifier());
644
645  int child_count = folder->child_count();
646  for (int i = 0; i < child_count; ++i) {
647    Remove(0, folder, 0);
648  }
649  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
650  ASSERT_TRUE(AllModelsMatchVerifier());
651}
652
653// Test Scribe ID - 371858.
654IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
655                       SC_DelEmptyBMFoldEmptyAccountAfterwards) {
656  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
657  ASSERT_TRUE(AllModelsMatchVerifier());
658
659  ASSERT_TRUE(AddFolder(0, kGenericFolderName) != NULL);
660  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
661  ASSERT_TRUE(AllModelsMatchVerifier());
662
663  Remove(0, GetBookmarkBarNode(0), 0);
664  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
665  ASSERT_TRUE(AllModelsMatchVerifier());
666}
667
668// Test Scribe ID - 371869.
669IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
670                       SC_DelEmptyBMFoldNonEmptyAccountAfterwards) {
671  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
672  ASSERT_TRUE(AllModelsMatchVerifier());
673
674  ASSERT_TRUE(AddFolder(0, kGenericFolderName) != NULL);
675  for (int i = 1; i < 15; ++i) {
676    if (base::RandDouble() > 0.6) {
677      std::string title = IndexedURLTitle(i);
678      GURL url = GURL(IndexedURL(i));
679      ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
680    } else {
681      std::string title = IndexedFolderName(i);
682      ASSERT_TRUE(AddFolder(0, i, title) != NULL);
683    }
684  }
685  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
686  ASSERT_TRUE(AllModelsMatchVerifier());
687
688  Remove(0, GetBookmarkBarNode(0), 0);
689  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
690  ASSERT_TRUE(AllModelsMatchVerifier());
691}
692
693// Test Scribe ID - 371879.
694IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
695                       SC_DelBMFoldWithBMsNonEmptyAccountAfterwards) {
696  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
697  ASSERT_TRUE(AllModelsMatchVerifier());
698
699  ASSERT_TRUE(AddURL(0, kGenericURLTitle, GURL(kGenericURL)) != NULL);
700  const BookmarkNode* folder = AddFolder(0, 1, kGenericFolderName);
701  ASSERT_TRUE(folder != NULL);
702  for (int i = 2; i < 10; ++i) {
703    if (base::RandDouble() > 0.6) {
704      std::string title = IndexedURLTitle(i);
705      GURL url = GURL(IndexedURL(i));
706      ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
707    } else {
708      std::string title = IndexedFolderName(i);
709      ASSERT_TRUE(AddFolder(0, i, title) != NULL);
710    }
711  }
712  for (int i = 0; i < 15; ++i) {
713    std::string title = IndexedURLTitle(i);
714    GURL url = GURL(IndexedURL(i));
715    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
716  }
717  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
718  ASSERT_TRUE(AllModelsMatchVerifier());
719
720  Remove(0, GetBookmarkBarNode(0), 1);
721  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
722  ASSERT_TRUE(AllModelsMatchVerifier());
723}
724
725// Test Scribe ID - 371880.
726IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
727                       SC_DelBMFoldWithBMsAndBMFoldsNonEmptyACAfterwards) {
728  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
729  ASSERT_TRUE(AllModelsMatchVerifier());
730
731  ASSERT_TRUE(AddURL(0, kGenericURLTitle, GURL(kGenericURL)) != NULL);
732  const BookmarkNode* folder = AddFolder(0, 1, kGenericFolderName);
733  ASSERT_TRUE(folder != NULL);
734  for (int i = 2; i < 10; ++i) {
735    if (base::RandDouble() > 0.6) {
736      std::string title = IndexedURLTitle(i);
737      GURL url = GURL(IndexedURL(i));
738      ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
739    } else {
740      std::string title = IndexedFolderName(i);
741      ASSERT_TRUE(AddFolder(0, i, title) != NULL);
742    }
743  }
744  for (int i = 0; i < 10; ++i) {
745    if (base::RandDouble() > 0.6) {
746      std::string title = IndexedURLTitle(i);
747      GURL url = GURL(IndexedURL(i));
748      ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
749    } else {
750      std::string title = IndexedSubfolderName(i);
751      const BookmarkNode* subfolder =
752          AddFolder(0, folder, i, title);
753      ASSERT_TRUE(subfolder != NULL);
754      if (base::RandDouble() > 0.3) {
755        for (int j = 0; j < 10; ++j) {
756          if (base::RandDouble() > 0.6) {
757            std::string title = IndexedURLTitle(j);
758            GURL url = GURL(IndexedURL(j));
759            ASSERT_TRUE(AddURL(
760                0, subfolder, j, title, url) != NULL);
761          } else {
762            std::string title = IndexedSubsubfolderName(j);
763            ASSERT_TRUE(AddFolder(
764                0, subfolder, j, title) != NULL);
765          }
766        }
767      }
768    }
769  }
770  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
771  ASSERT_TRUE(AllModelsMatchVerifier());
772
773  Remove(0, GetBookmarkBarNode(0), 1);
774  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
775  ASSERT_TRUE(AllModelsMatchVerifier());
776}
777
778// Test Scribe ID - 371882.
779IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
780                       SC_DelBMFoldWithParentAndChildrenBMsAndBMFolds) {
781  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
782  ASSERT_TRUE(AllModelsMatchVerifier());
783
784  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
785  ASSERT_TRUE(folder != NULL);
786  for (int i = 1; i < 11; ++i) {
787    std::string title = IndexedURLTitle(i);
788    GURL url = GURL(IndexedURL(i));
789    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
790  }
791  const BookmarkNode* subfolder =
792      AddFolder(0, folder, 0, kGenericSubfolderName);
793  ASSERT_TRUE(subfolder != NULL);
794  for (int i = 0; i < 30; ++i) {
795    if (base::RandDouble() > 0.2) {
796      std::string title = IndexedURLTitle(i);
797      GURL url = GURL(IndexedURL(i));
798      ASSERT_TRUE(AddURL(0, subfolder, i, title, url) != NULL);
799    } else {
800      std::string title = IndexedSubsubfolderName(i);
801      ASSERT_TRUE(AddFolder(0, subfolder, i, title) != NULL);
802    }
803  }
804  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
805  ASSERT_TRUE(AllModelsMatchVerifier());
806
807  Remove(0, folder, 0);
808  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
809  ASSERT_TRUE(AllModelsMatchVerifier());
810}
811
812// Test Scribe ID - 371931.
813IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
814                       SC_ReverseTheOrderOfTwoBMs) {
815  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
816  ASSERT_TRUE(AllModelsMatchVerifier());
817
818  GURL url0 = GURL(IndexedURL(0));
819  GURL url1 = GURL(IndexedURL(1));
820  std::string title0 = IndexedURLTitle(0);
821  std::string title1 = IndexedURLTitle(1);
822  const BookmarkNode* bookmark0 = AddURL(0, 0, title0, url0);
823  const BookmarkNode* bookmark1 = AddURL(0, 1, title1, url1);
824  ASSERT_TRUE(bookmark0 != NULL);
825  ASSERT_TRUE(bookmark1 != NULL);
826  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
827  ASSERT_TRUE(AllModelsMatchVerifier());
828
829  Move(0, bookmark0, GetBookmarkBarNode(0), 2);
830  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
831  ASSERT_TRUE(AllModelsMatchVerifier());
832}
833
834// Test Scribe ID - 371933.
835IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_ReverseTheOrderOf10BMs) {
836  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
837  ASSERT_TRUE(AllModelsMatchVerifier());
838
839  for (int i = 0; i < 10; ++i) {
840    std::string title = IndexedURLTitle(i);
841    GURL url = GURL(IndexedURL(i));
842    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
843  }
844  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
845  ASSERT_TRUE(AllModelsMatchVerifier());
846
847  ReverseChildOrder(0, GetBookmarkBarNode(0));
848  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
849  ASSERT_TRUE(AllModelsMatchVerifier());
850}
851
852// Test Scribe ID - 371954.
853// flaky on Windows: http://crbug.com/412169
854#if defined(OS_WIN)
855#define MAYBE_SC_MovingBMsFromBMBarToBMFolder DISABLED_SC_MovingBMsFromBMBarToBMFolder
856#else
857#define MAYBE_SC_MovingBMsFromBMBarToBMFolder SC_MovingBMsFromBMBarToBMFolder
858#endif
859IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
860                       MAYBE_SC_MovingBMsFromBMBarToBMFolder) {
861  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
862  ASSERT_TRUE(AllModelsMatchVerifier());
863
864  ASSERT_TRUE(AddURL(0, kGenericURLTitle, GURL(kGenericURL)) != NULL);
865  const BookmarkNode* folder = AddFolder(0, 1, kGenericFolderName);
866  ASSERT_TRUE(folder != NULL);
867  for (int i = 2; i < 10; ++i) {
868    std::string title = IndexedURLTitle(i);
869    GURL url = GURL(IndexedURL(i));
870    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
871  }
872  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
873  ASSERT_TRUE(AllModelsMatchVerifier());
874
875  int num_bookmarks_to_move =
876      GetBookmarkBarNode(0)->child_count() - 2;
877  for (int i = 0; i < num_bookmarks_to_move; ++i) {
878    Move(
879        0, GetBookmarkBarNode(0)->GetChild(2), folder, i);
880    ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
881    ASSERT_TRUE(AllModelsMatchVerifier());
882  }
883}
884
885// Test Scribe ID - 371957.
886// flaky on Windows: http://crbug.com/412169
887#if defined(OS_WIN)
888#define MAYBE_SC_MovingBMsFromBMFoldToBMBar DISABLED_SC_MovingBMsFromBMFoldToBMBar
889#else
890#define MAYBE_SC_MovingBMsFromBMFoldToBMBar SC_MovingBMsFromBMFoldToBMBar
891#endif
892IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
893                       MAYBE_SC_MovingBMsFromBMFoldToBMBar) {
894  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
895  ASSERT_TRUE(AllModelsMatchVerifier());
896
897  ASSERT_TRUE(AddURL(0, kGenericURLTitle, GURL(kGenericURL)) != NULL);
898  const BookmarkNode* folder = AddFolder(0, 1, kGenericFolderName);
899  ASSERT_TRUE(folder != NULL);
900  for (int i = 0; i < 10; ++i) {
901    std::string title = IndexedURLTitle(i);
902    GURL url = GURL(IndexedURL(i));
903    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
904  }
905  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
906  ASSERT_TRUE(AllModelsMatchVerifier());
907
908  int num_bookmarks_to_move = folder->child_count() - 2;
909  for (int i = 0; i < num_bookmarks_to_move; ++i) {
910    Move(0, folder->GetChild(0), GetBookmarkBarNode(0), i);
911    ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
912    ASSERT_TRUE(AllModelsMatchVerifier());
913  }
914}
915
916// Test Scribe ID - 371961.
917IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
918                       SC_MovingBMsFromParentBMFoldToChildBMFold) {
919  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
920  ASSERT_TRUE(AllModelsMatchVerifier());
921
922  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
923  ASSERT_TRUE(folder != NULL);
924  for (int i = 0; i < 3; ++i) {
925    std::string title = IndexedURLTitle(i);
926    GURL url = GURL(IndexedURL(i));
927    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
928  }
929  const BookmarkNode* subfolder =
930      AddFolder(0, folder, 3, kGenericSubfolderName);
931  ASSERT_TRUE(subfolder != NULL);
932  for (int i = 0; i < 10; ++i) {
933    std::string title = IndexedURLTitle(i + 3);
934    GURL url = GURL(IndexedURL(i + 3));
935    ASSERT_TRUE(AddURL(0, subfolder, i, title, url) != NULL);
936  }
937  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
938  ASSERT_TRUE(AllModelsMatchVerifier());
939
940  for (int i = 0; i < 3; ++i) {
941    GURL url = GURL(IndexedURL(i));
942    Move(0, GetUniqueNodeByURL(0, url), subfolder, i + 10);
943  }
944  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
945  ASSERT_TRUE(AllModelsMatchVerifier());
946}
947
948// Test Scribe ID - 371964.
949IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
950                       SC_MovingBMsFromChildBMFoldToParentBMFold) {
951  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
952  ASSERT_TRUE(AllModelsMatchVerifier());
953
954  const BookmarkNode* folder = AddFolder(0, kGenericFolderName);
955  ASSERT_TRUE(folder != NULL);
956  for (int i = 0; i < 3; ++i) {
957    std::string title = IndexedURLTitle(i);
958    GURL url = GURL(IndexedURL(i));
959    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
960  }
961  const BookmarkNode* subfolder =
962      AddFolder(0, folder, 3, kGenericSubfolderName);
963  ASSERT_TRUE(subfolder != NULL);
964  for (int i = 0; i < 5; ++i) {
965    std::string title = IndexedURLTitle(i + 3);
966    GURL url = GURL(IndexedURL(i + 3));
967    ASSERT_TRUE(AddURL(0, subfolder, i, title, url) != NULL);
968  }
969  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
970  ASSERT_TRUE(AllModelsMatchVerifier());
971
972  for (int i = 0; i < 3; ++i) {
973    GURL url = GURL(IndexedURL(i + 3));
974    Move(0, GetUniqueNodeByURL(0, url), folder, i + 4);
975  }
976  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
977  ASSERT_TRUE(AllModelsMatchVerifier());
978}
979
980// Test Scribe ID - 371967.
981IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_HoistBMs10LevelUp) {
982  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
983  ASSERT_TRUE(AllModelsMatchVerifier());
984
985  const BookmarkNode* folder = GetBookmarkBarNode(0);
986  const BookmarkNode* folder_L0 = NULL;
987  const BookmarkNode* folder_L10 = NULL;
988  for (int level = 0; level < 15; ++level) {
989    int num_bookmarks = base::RandInt(0, 9);
990    for (int i = 0; i < num_bookmarks; ++i) {
991      std::string title = IndexedURLTitle(i);
992      GURL url = GURL(IndexedURL(i));
993      ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
994    }
995    std::string title = IndexedFolderName(level);
996    folder = AddFolder(0, folder, folder->child_count(), title);
997    ASSERT_TRUE(folder != NULL);
998    if (level == 0) folder_L0 = folder;
999    if (level == 10) folder_L10 = folder;
1000  }
1001  for (int i = 0; i < 3; ++i) {
1002    std::string title = IndexedURLTitle(i + 10);
1003    GURL url = GURL(IndexedURL(i + 10));
1004    ASSERT_TRUE(AddURL(0, folder_L10, i, title, url) != NULL);
1005  }
1006  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1007  ASSERT_TRUE(AllModelsMatchVerifier());
1008
1009  GURL url10 = GURL(IndexedURL(10));
1010  Move(0, GetUniqueNodeByURL(
1011      0, url10), folder_L0, folder_L0->child_count());
1012  GURL url11 = GURL(IndexedURL(11));
1013  Move(0, GetUniqueNodeByURL(0, url11), folder_L0, 0);
1014  GURL url12 = GURL(IndexedURL(12));
1015  Move(0, GetUniqueNodeByURL(0, url12), folder_L0, 1);
1016  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1017  ASSERT_TRUE(AllModelsMatchVerifier());
1018}
1019
1020// Test Scribe ID - 371968.
1021// Flaky. http://crbug.com/107744.
1022IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SC_SinkBMs10LevelDown) {
1023  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1024  ASSERT_TRUE(AllModelsMatchVerifier());
1025
1026  const BookmarkNode* folder = GetBookmarkBarNode(0);
1027  const BookmarkNode* folder_L0 = NULL;
1028  const BookmarkNode* folder_L10 = NULL;
1029  for (int level = 0; level < 15; ++level) {
1030    int num_bookmarks = base::RandInt(0, 9);
1031    for (int i = 0; i < num_bookmarks; ++i) {
1032      std::string title = IndexedURLTitle(i);
1033      GURL url = GURL(IndexedURL(i));
1034      ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
1035    }
1036    std::string title = IndexedFolderName(level);
1037    folder = AddFolder(0, folder, folder->child_count(), title);
1038    ASSERT_TRUE(folder != NULL);
1039    if (level == 0) folder_L0 = folder;
1040    if (level == 10) folder_L10 = folder;
1041  }
1042  for (int i = 0; i < 3; ++i) {
1043    std::string title = IndexedURLTitle(i + 10);
1044    GURL url = GURL(IndexedURL(i + 10));
1045    ASSERT_TRUE(AddURL(0, folder_L0, 0, title, url) != NULL);
1046  }
1047  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1048  ASSERT_TRUE(AllModelsMatchVerifier());
1049
1050  GURL url10 = GURL(IndexedURL(10));
1051  Move(0, GetUniqueNodeByURL(0, url10), folder_L10, folder_L10->child_count());
1052  GURL url11 = GURL(IndexedURL(11));
1053  Move(0, GetUniqueNodeByURL(0, url11), folder_L10, 0);
1054  GURL url12 = GURL(IndexedURL(12));
1055  Move(0, GetUniqueNodeByURL(0, url12), folder_L10, 1);
1056  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1057  ASSERT_TRUE(AllModelsMatchVerifier());
1058}
1059
1060// Test Scribe ID - 371980.
1061IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1062                       SC_SinkEmptyBMFold5LevelsDown) {
1063  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1064  ASSERT_TRUE(AllModelsMatchVerifier());
1065
1066  const BookmarkNode* folder = GetBookmarkBarNode(0);
1067  const BookmarkNode* folder_L5 = NULL;
1068  for (int level = 0; level < 15; ++level) {
1069    int num_bookmarks = base::RandInt(0, 9);
1070    for (int i = 0; i < num_bookmarks; ++i) {
1071      std::string title = IndexedURLTitle(i);
1072      GURL url = GURL(IndexedURL(i));
1073      ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
1074    }
1075    std::string title = IndexedFolderName(level);
1076    folder = AddFolder(
1077        0, folder, folder->child_count(), title);
1078    ASSERT_TRUE(folder != NULL);
1079    if (level == 5) folder_L5 = folder;
1080  }
1081  folder = AddFolder(
1082      0, GetBookmarkBarNode(0)->child_count(), kGenericFolderName);
1083  ASSERT_TRUE(folder != NULL);
1084  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1085  ASSERT_TRUE(AllModelsMatchVerifier());
1086
1087  Move(0, folder, folder_L5, folder_L5->child_count());
1088  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1089  ASSERT_TRUE(AllModelsMatchVerifier());
1090}
1091
1092// Test Scribe ID - 371997.
1093IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1094                       SC_SinkNonEmptyBMFold5LevelsDown) {
1095  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1096  ASSERT_TRUE(AllModelsMatchVerifier());
1097
1098  const BookmarkNode* folder = GetBookmarkBarNode(0);
1099  const BookmarkNode* folder_L5 = NULL;
1100  for (int level = 0; level < 6; ++level) {
1101    int num_bookmarks = base::RandInt(0, 9);
1102    for (int i = 0; i < num_bookmarks; ++i) {
1103      std::string title = IndexedURLTitle(i);
1104      GURL url = GURL(IndexedURL(i));
1105      ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
1106    }
1107    std::string title = IndexedFolderName(level);
1108    folder = AddFolder(0, folder, folder->child_count(), title);
1109    ASSERT_TRUE(folder != NULL);
1110    if (level == 5) folder_L5 = folder;
1111  }
1112  folder = AddFolder(
1113      0, GetBookmarkBarNode(0)->child_count(), kGenericFolderName);
1114  ASSERT_TRUE(folder != NULL);
1115  for (int i = 0; i < 10; ++i) {
1116    std::string title = IndexedURLTitle(i);
1117    GURL url = GURL(IndexedURL(i));
1118    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
1119  }
1120  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1121  ASSERT_TRUE(AllModelsMatchVerifier());
1122
1123  Move(0, folder, folder_L5, folder_L5->child_count());
1124  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1125  ASSERT_TRUE(AllModelsMatchVerifier());
1126}
1127
1128// Test Scribe ID - 372006.
1129IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1130                       SC_HoistFolder5LevelsUp) {
1131  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1132  ASSERT_TRUE(AllModelsMatchVerifier());
1133
1134  const BookmarkNode* folder = GetBookmarkBarNode(0);
1135  const BookmarkNode* folder_L5 = NULL;
1136  for (int level = 0; level < 6; ++level) {
1137    int num_bookmarks = base::RandInt(0, 9);
1138    for (int i = 0; i < num_bookmarks; ++i) {
1139      std::string title = IndexedURLTitle(i);
1140      GURL url = GURL(IndexedURL(i));
1141      ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
1142    }
1143    std::string title = IndexedFolderName(level);
1144    folder = AddFolder(
1145        0, folder, folder->child_count(), title);
1146    ASSERT_TRUE(folder != NULL);
1147    if (level == 5) folder_L5 = folder;
1148  }
1149  folder = AddFolder(
1150      0, folder_L5, folder_L5->child_count(), kGenericFolderName);
1151  ASSERT_TRUE(folder != NULL);
1152  for (int i = 0; i < 10; ++i) {
1153    std::string title = IndexedURLTitle(i);
1154    GURL url = GURL(IndexedURL(i));
1155    ASSERT_TRUE(AddURL(0, folder, i, title, url) != NULL);
1156  }
1157  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1158  ASSERT_TRUE(AllModelsMatchVerifier());
1159
1160  Move(0, folder, GetBookmarkBarNode(0), GetBookmarkBarNode(0)->child_count());
1161  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1162  ASSERT_TRUE(AllModelsMatchVerifier());
1163}
1164
1165// Test Scribe ID - 372026.
1166IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1167                       SC_ReverseTheOrderOfTwoBMFolders) {
1168  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1169  ASSERT_TRUE(AllModelsMatchVerifier());
1170
1171  for (int i = 0; i < 2; ++i) {
1172    std::string title = IndexedFolderName(i);
1173    const BookmarkNode* folder = AddFolder(0, i, title);
1174    ASSERT_TRUE(folder != NULL);
1175    for (int j = 0; j < 10; ++j) {
1176      std::string title = IndexedURLTitle(j);
1177      GURL url = GURL(IndexedURL(j));
1178      ASSERT_TRUE(AddURL(0, folder, j, title, url) != NULL);
1179    }
1180  }
1181  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1182  ASSERT_TRUE(AllModelsMatchVerifier());
1183
1184  ReverseChildOrder(0, GetBookmarkBarNode(0));
1185  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1186  ASSERT_TRUE(AllModelsMatchVerifier());
1187}
1188
1189// Test Scribe ID - 372028.
1190IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1191                       SC_ReverseTheOrderOfTenBMFolders) {
1192  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1193  ASSERT_TRUE(AllModelsMatchVerifier());
1194
1195  for (int i = 0; i < 10; ++i) {
1196    std::string title = IndexedFolderName(i);
1197    const BookmarkNode* folder = AddFolder(0, i, title);
1198    ASSERT_TRUE(folder != NULL);
1199    for (int j = 0; j < 10; ++j) {
1200      std::string title = IndexedURLTitle(1000 * i + j);
1201      GURL url = GURL(IndexedURL(j));
1202      ASSERT_TRUE(AddURL(0, folder, j, title, url) != NULL);
1203    }
1204  }
1205  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1206  ASSERT_TRUE(AllModelsMatchVerifier());
1207
1208  ReverseChildOrder(0, GetBookmarkBarNode(0));
1209  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1210  ASSERT_TRUE(AllModelsMatchVerifier());
1211}
1212
1213// Test Scribe ID - 373379.
1214IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1215                       MC_BiDirectionalPushAddingBM) {
1216  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1217  ASSERT_TRUE(AllModelsMatchVerifier());
1218
1219  DisableVerifier();
1220  for (int i = 0; i < 2; ++i) {
1221    std::string title0 = IndexedURLTitle(2*i);
1222    GURL url0 = GURL(IndexedURL(2*i));
1223    ASSERT_TRUE(AddURL(0, title0, url0) != NULL);
1224    std::string title1 = IndexedURLTitle(2*i+1);
1225    GURL url1 = GURL(IndexedURL(2*i+1));
1226    ASSERT_TRUE(AddURL(1, title1, url1) != NULL);
1227  }
1228  ASSERT_TRUE(AwaitQuiescence());
1229  ASSERT_TRUE(AllModelsMatch());
1230  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1231}
1232
1233// Test Scribe ID - 373503.
1234IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1235                       MC_BiDirectionalPush_AddingSameBMs) {
1236  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1237  ASSERT_TRUE(AllModelsMatchVerifier());
1238
1239  // Note: When a racy commit is done with identical bookmarks, it is possible
1240  // for duplicates to exist after sync completes. See http://crbug.com/19769.
1241  DisableVerifier();
1242  for (int i = 0; i < 2; ++i) {
1243    std::string title = IndexedURLTitle(i);
1244    GURL url = GURL(IndexedURL(i));
1245    ASSERT_TRUE(AddURL(0, title, url) != NULL);
1246    ASSERT_TRUE(AddURL(1, title, url) != NULL);
1247  }
1248  ASSERT_TRUE(AwaitQuiescence());
1249  ASSERT_TRUE(AllModelsMatch());
1250}
1251
1252// Test Scribe ID - 373506.
1253IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1254                       MC_BootStrapEmptyStateEverywhere) {
1255  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1256  ASSERT_TRUE(AwaitQuiescence());
1257  ASSERT_TRUE(AllModelsMatchVerifier());
1258}
1259
1260// Test Scribe ID - 373505.
1261IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1262                       MC_Merge_CaseInsensitivity_InNames) {
1263  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1264  DisableVerifier();
1265
1266  const BookmarkNode* folder0 = AddFolder(0, "Folder");
1267  ASSERT_TRUE(folder0 != NULL);
1268  ASSERT_TRUE(AddURL(0, folder0, 0, "Bookmark 0", GURL(kGenericURL)) != NULL);
1269  ASSERT_TRUE(AddURL(0, folder0, 1, "Bookmark 1", GURL(kGenericURL)) != NULL);
1270  ASSERT_TRUE(AddURL(0, folder0, 2, "Bookmark 2", GURL(kGenericURL)) != NULL);
1271
1272  const BookmarkNode* folder1 = AddFolder(1, "fOlDeR");
1273  ASSERT_TRUE(folder1 != NULL);
1274  ASSERT_TRUE(AddURL(1, folder1, 0, "bOoKmArK 0", GURL(kGenericURL)) != NULL);
1275  ASSERT_TRUE(AddURL(1, folder1, 1, "BooKMarK 1", GURL(kGenericURL)) != NULL);
1276  ASSERT_TRUE(AddURL(1, folder1, 2, "bOOKMARK 2", GURL(kGenericURL)) != NULL);
1277
1278  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1279  ASSERT_TRUE(AwaitQuiescence());
1280  ASSERT_TRUE(AllModelsMatch());
1281  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1282}
1283
1284// Test Scribe ID - 373508.
1285IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1286                       MC_SimpleMergeOfDifferentBMModels) {
1287  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1288  DisableVerifier();
1289
1290  for (int i = 0; i < 3; ++i) {
1291    std::string title = IndexedURLTitle(i);
1292    GURL url = GURL(IndexedURL(i));
1293    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
1294    ASSERT_TRUE(AddURL(1, i, title, url) != NULL);
1295  }
1296
1297  for (int i = 3; i < 10; ++i) {
1298    std::string title0 = IndexedURLTitle(i);
1299    GURL url0 = GURL(IndexedURL(i));
1300    ASSERT_TRUE(AddURL(0, i, title0, url0) != NULL);
1301    std::string title1 = IndexedURLTitle(i+7);
1302    GURL url1 = GURL(IndexedURL(i+7));
1303    ASSERT_TRUE(AddURL(1, i, title1, url1) != NULL);
1304  }
1305
1306  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1307  ASSERT_TRUE(AwaitQuiescence());
1308  ASSERT_TRUE(AllModelsMatch());
1309  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1310}
1311
1312// Test Scribe ID - 386586.
1313IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1314                       MC_MergeSimpleBMHierarchyUnderBMBar) {
1315  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1316  DisableVerifier();
1317
1318  for (int i = 0; i < 3; ++i) {
1319    std::string title = IndexedURLTitle(i);
1320    GURL url = GURL(IndexedURL(i));
1321    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
1322    ASSERT_TRUE(AddURL(1, i, title, url) != NULL);
1323  }
1324
1325  for (int i = 3; i < 10; ++i) {
1326    std::string title = IndexedURLTitle(i);
1327    GURL url = GURL(IndexedURL(i));
1328    ASSERT_TRUE(AddURL(1, i, title, url) != NULL);
1329  }
1330
1331  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1332  ASSERT_TRUE(AwaitQuiescence());
1333  ASSERT_TRUE(AllModelsMatch());
1334  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1335}
1336
1337// Test Scribe ID - 386589.
1338IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1339                       MC_MergeSimpleBMHierarchyEqualSetsUnderBMBar) {
1340  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1341  DisableVerifier();
1342
1343  for (int i = 0; i < 3; ++i) {
1344    std::string title = IndexedURLTitle(i);
1345    GURL url = GURL(IndexedURL(i));
1346    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
1347    ASSERT_TRUE(AddURL(1, i, title, url) != NULL);
1348  }
1349
1350  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1351  ASSERT_TRUE(AwaitQuiescence());
1352  ASSERT_TRUE(AllModelsMatch());
1353  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1354}
1355
1356// Test Scribe ID - 373504 - Merge bookmark folders with different bookmarks.
1357IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1358                       MC_MergeBMFoldersWithDifferentBMs) {
1359  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1360  DisableVerifier();
1361
1362  const BookmarkNode* folder0 = AddFolder(0, kGenericFolderName);
1363  ASSERT_TRUE(folder0 != NULL);
1364  const BookmarkNode* folder1 = AddFolder(1, kGenericFolderName);
1365  ASSERT_TRUE(folder1 != NULL);
1366  for (int i = 0; i < 2; ++i) {
1367    std::string title0 = IndexedURLTitle(2*i);
1368    GURL url0 = GURL(IndexedURL(2*i));
1369    ASSERT_TRUE(AddURL(0, folder0, i, title0, url0) != NULL);
1370    std::string title1 = IndexedURLTitle(2*i+1);
1371    GURL url1 = GURL(IndexedURL(2*i+1));
1372    ASSERT_TRUE(AddURL(1, folder1, i, title1, url1) != NULL);
1373  }
1374  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1375  ASSERT_TRUE(AwaitQuiescence());
1376  ASSERT_TRUE(AllModelsMatch());
1377  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1378}
1379
1380// Test Scribe ID - 373509 - Merge moderately complex bookmark models.
1381IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1382                       MC_MergeDifferentBMModelsModeratelyComplex) {
1383  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1384  DisableVerifier();
1385
1386  for (int i = 0; i < 25; ++i) {
1387    std::string title0 = IndexedURLTitle(i);
1388    GURL url0 = GURL(IndexedURL(i));
1389    ASSERT_TRUE(AddURL(0, i, title0, url0) != NULL);
1390    std::string title1 = IndexedURLTitle(i+50);
1391    GURL url1 = GURL(IndexedURL(i+50));
1392    ASSERT_TRUE(AddURL(1, i, title1, url1) != NULL);
1393  }
1394  for (int i = 25; i < 30; ++i) {
1395    std::string title0 = IndexedFolderName(i);
1396    const BookmarkNode* folder0 = AddFolder(0, i, title0);
1397    ASSERT_TRUE(folder0 != NULL);
1398    std::string title1 = IndexedFolderName(i+50);
1399    const BookmarkNode* folder1 = AddFolder(1, i, title1);
1400    ASSERT_TRUE(folder1 != NULL);
1401    for (int j = 0; j < 5; ++j) {
1402      std::string title0 = IndexedURLTitle(i+5*j);
1403      GURL url0 = GURL(IndexedURL(i+5*j));
1404      ASSERT_TRUE(AddURL(0, folder0, j, title0, url0) != NULL);
1405      std::string title1 = IndexedURLTitle(i+5*j+50);
1406      GURL url1 = GURL(IndexedURL(i+5*j+50));
1407      ASSERT_TRUE(AddURL(1, folder1, j, title1, url1) != NULL);
1408    }
1409  }
1410  for (int i = 100; i < 125; ++i) {
1411    std::string title = IndexedURLTitle(i);
1412    GURL url = GURL(IndexedURL(i));
1413    ASSERT_TRUE(AddURL(0, title, url) != NULL);
1414    ASSERT_TRUE(AddURL(1, title, url) != NULL);
1415  }
1416  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1417  ASSERT_TRUE(AwaitQuiescence());
1418  ASSERT_TRUE(AllModelsMatch());
1419  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1420}
1421
1422// TCM ID - 3675271 - Merge simple bookmark subset under bookmark folder.
1423IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1424                       MC_MergeSimpleBMHierarchySubsetUnderBMFolder) {
1425  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1426  DisableVerifier();
1427
1428  for (int i = 0; i < 2; ++i) {
1429    const BookmarkNode* folder = AddFolder(i, kGenericFolderName);
1430    ASSERT_TRUE(folder != NULL);
1431    for (int j = 0; j < 4; ++j) {
1432      if (base::RandDouble() < 0.5) {
1433        std::string title = IndexedURLTitle(j);
1434        GURL url = GURL(IndexedURL(j));
1435        ASSERT_TRUE(AddURL(i, folder, j, title, url) != NULL);
1436      } else {
1437        std::string title = IndexedFolderName(j);
1438        ASSERT_TRUE(AddFolder(i, folder, j, title) != NULL);
1439      }
1440    }
1441  }
1442  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1443  ASSERT_TRUE(AwaitQuiescence());
1444  ASSERT_TRUE(AllModelsMatch());
1445  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1446}
1447
1448// TCM ID - 3727284 - Merge subsets of bookmark under bookmark bar.
1449IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1450                       MC_MergeSimpleBMHierarchySubsetUnderBookmarkBar) {
1451  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1452  DisableVerifier();
1453
1454  for (int i = 0; i < 4; ++i) {
1455    std::string title = IndexedURLTitle(i);
1456    GURL url = GURL(IndexedURL(i));
1457    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
1458  }
1459
1460  for (int j = 0; j < 2; ++j) {
1461    std::string title = IndexedURLTitle(j);
1462    GURL url = GURL(IndexedURL(j));
1463    ASSERT_TRUE(AddURL(1, j, title, url) != NULL);
1464  }
1465
1466  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1467  ASSERT_TRUE(AwaitQuiescence());
1468  ASSERT_TRUE(AllModelsMatch());
1469  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1470  ASSERT_FALSE(ContainsDuplicateBookmarks(1));
1471}
1472
1473// TCM ID - 3659294 - Merge simple bookmark hierarchy under bookmark folder.
1474IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1475                       MC_Merge_SimpleBMHierarchy_Under_BMFolder) {
1476  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1477  DisableVerifier();
1478
1479  const BookmarkNode* folder0 = AddFolder(0, 0, kGenericFolderName);
1480  ASSERT_TRUE(folder0 != NULL);
1481  ASSERT_TRUE(AddURL(
1482      0, folder0, 0, IndexedURLTitle(1), GURL(IndexedURL(1))) != NULL);
1483  ASSERT_TRUE(AddFolder(0, folder0, 1, IndexedSubfolderName(2)) != NULL);
1484  ASSERT_TRUE(AddURL(
1485      0, folder0, 2, IndexedURLTitle(3), GURL(IndexedURL(3))) != NULL);
1486  ASSERT_TRUE(AddFolder(0, folder0, 3, IndexedSubfolderName(4)) != NULL);
1487
1488  const BookmarkNode* folder1 = AddFolder(1, 0, kGenericFolderName);
1489  ASSERT_TRUE(folder1 != NULL);
1490  ASSERT_TRUE(AddFolder(1, folder1, 0, IndexedSubfolderName(0)) != NULL);
1491  ASSERT_TRUE(AddFolder(1, folder1, 1, IndexedSubfolderName(2)) != NULL);
1492  ASSERT_TRUE(AddURL(
1493      1, folder1, 2, IndexedURLTitle(3), GURL(IndexedURL(3))) != NULL);
1494  ASSERT_TRUE(AddFolder(1, folder1, 3, IndexedSubfolderName(5)) != NULL);
1495  ASSERT_TRUE(AddURL(
1496      1, folder1, 4, IndexedURLTitle(1), GURL(IndexedURL(1))) != NULL);
1497
1498  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1499  ASSERT_TRUE(AwaitQuiescence());
1500  ASSERT_TRUE(AllModelsMatch());
1501  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1502}
1503
1504// TCM ID - 3711273 - Merge disjoint sets of bookmark hierarchy under bookmark
1505// folder.
1506IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1507                       MC_Merge_SimpleBMHierarchy_DisjointSets_Under_BMFolder) {
1508  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1509  DisableVerifier();
1510
1511  const BookmarkNode* folder0 =
1512      AddFolder(0, 0, kGenericFolderName);
1513  ASSERT_TRUE(folder0 != NULL);
1514  ASSERT_TRUE(AddURL(
1515      0, folder0, 0, IndexedURLTitle(1), GURL(IndexedURL(1))) != NULL);
1516  ASSERT_TRUE(AddFolder(0, folder0, 1, IndexedSubfolderName(2)) != NULL);
1517  ASSERT_TRUE(AddURL(
1518      0, folder0, 2, IndexedURLTitle(3), GURL(IndexedURL(3))) != NULL);
1519  ASSERT_TRUE(AddFolder(0, folder0, 3, IndexedSubfolderName(4)) != NULL);
1520
1521  const BookmarkNode* folder1 = AddFolder(1, 0, kGenericFolderName);
1522  ASSERT_TRUE(folder1 != NULL);
1523  ASSERT_TRUE(AddFolder(1, folder1, 0, IndexedSubfolderName(5)) != NULL);
1524  ASSERT_TRUE(AddFolder(1, folder1, 1, IndexedSubfolderName(6)) != NULL);
1525  ASSERT_TRUE(AddURL(
1526      1, folder1, 2, IndexedURLTitle(7), GURL(IndexedURL(7))) != NULL);
1527  ASSERT_TRUE(AddURL(
1528      1, folder1, 3, IndexedURLTitle(8), GURL(IndexedURL(8))) != NULL);
1529
1530  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1531  ASSERT_TRUE(AwaitQuiescence());
1532  ASSERT_TRUE(AllModelsMatch());
1533  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1534}
1535
1536// TCM ID - 3639296 - Merge disjoint sets of bookmark hierarchy under bookmark
1537// bar.
1538IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1539    MC_Merge_SimpleBMHierarchy_DisjointSets_Under_BookmarkBar) {
1540  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1541  DisableVerifier();
1542
1543  for (int i = 0; i < 3; ++i) {
1544    std::string title = IndexedURLTitle(i+1);
1545    GURL url = GURL(IndexedURL(i+1));
1546    ASSERT_TRUE(AddURL(0, i, title, url) != NULL);
1547  }
1548
1549  for (int j = 0; j < 3; ++j) {
1550    std::string title = IndexedURLTitle(j+4);
1551    GURL url = GURL(IndexedURL(j+4));
1552    ASSERT_TRUE(AddURL(0, j, title, url) != NULL);
1553  }
1554
1555  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1556  ASSERT_TRUE(AwaitQuiescence());
1557  ASSERT_TRUE(AllModelsMatch());
1558  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1559}
1560
1561// TCM ID - 3616282 - Merge sets of duplicate bookmarks under bookmark bar.
1562IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1563                       MC_Merge_SimpleBMHierarchy_DuplicateBMs_Under_BMBar) {
1564  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1565  DisableVerifier();
1566
1567  // Let's add duplicate set of bookmark {1,2,2,3,3,3,4,4,4,4} to client0.
1568  int node_index = 0;
1569  for (int i = 1; i < 5 ; ++i) {
1570    for (int j = 0; j < i; ++j) {
1571      std::string title = IndexedURLTitle(i);
1572      GURL url = GURL(IndexedURL(i));
1573      ASSERT_TRUE(AddURL(0, node_index, title, url) != NULL);
1574      ++node_index;
1575    }
1576  }
1577  // Let's add a set of bookmarks {1,2,3,4} to client1.
1578  for (int i = 0; i < 4; ++i) {
1579    std::string title = IndexedURLTitle(i+1);
1580    GURL url = GURL(IndexedURL(i+1));
1581    ASSERT_TRUE(AddURL(1, i, title, url) != NULL);
1582  }
1583
1584  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1585  ASSERT_TRUE(AwaitQuiescence());
1586  ASSERT_TRUE(AllModelsMatch());
1587
1588  for (int i = 1; i < 5 ; ++i) {
1589    ASSERT_TRUE(CountBookmarksWithTitlesMatching(1, IndexedURLTitle(i)) == i);
1590  }
1591}
1592
1593// TCM ID - 6593872.
1594IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, DisableBookmarks) {
1595  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1596  ASSERT_TRUE(AllModelsMatchVerifier());
1597
1598  ASSERT_TRUE(GetClient(1)->DisableSyncForDatatype(syncer::BOOKMARKS));
1599  ASSERT_TRUE(AddFolder(1, kGenericFolderName) != NULL);
1600  ASSERT_TRUE(AwaitQuiescence());
1601  ASSERT_FALSE(AllModelsMatch());
1602
1603  ASSERT_TRUE(GetClient(1)->EnableSyncForDatatype(syncer::BOOKMARKS));
1604  ASSERT_TRUE(AwaitQuiescence());
1605  ASSERT_TRUE(AllModelsMatch());
1606}
1607
1608// TCM ID - 7343544.
1609IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, DisableSync) {
1610  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1611  ASSERT_TRUE(AllModelsMatchVerifier());
1612
1613  ASSERT_TRUE(GetClient(1)->DisableSyncForAllDatatypes());
1614  ASSERT_TRUE(AddFolder(0, IndexedFolderName(0)) != NULL);
1615  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
1616  ASSERT_FALSE(AllModelsMatch());
1617
1618  ASSERT_TRUE(AddFolder(1, IndexedFolderName(1)) != NULL);
1619  ASSERT_FALSE(AllModelsMatch());
1620
1621  ASSERT_TRUE(GetClient(1)->EnableSyncForAllDatatypes());
1622  ASSERT_TRUE(AwaitQuiescence());
1623  ASSERT_TRUE(AllModelsMatch());
1624}
1625
1626// TCM ID - 3662298 - Test adding duplicate folder - Both with different BMs
1627// underneath.
1628IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, MC_DuplicateFolders) {
1629  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1630  DisableVerifier();
1631
1632  const BookmarkNode* folder0 = AddFolder(0, kGenericFolderName);
1633  ASSERT_TRUE(folder0 != NULL);
1634  const BookmarkNode* folder1 = AddFolder(1, kGenericFolderName);
1635  ASSERT_TRUE(folder1 != NULL);
1636  for (int i = 0; i < 5; ++i) {
1637    std::string title0 = IndexedURLTitle(i);
1638    GURL url0 = GURL(IndexedURL(i));
1639    ASSERT_TRUE(AddURL(0, folder0, i, title0, url0) != NULL);
1640    std::string title1 = IndexedURLTitle(i+5);
1641    GURL url1 = GURL(IndexedURL(i+5));
1642    ASSERT_TRUE(AddURL(1, folder1, i, title1, url1) != NULL);
1643  }
1644
1645  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1646  ASSERT_TRUE(AwaitQuiescence());
1647  ASSERT_TRUE(AllModelsMatch());
1648  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1649}
1650
1651// This test fails when run with FakeServer and FakeServerInvalidationService.
1652IN_PROC_BROWSER_TEST_F(LegacyTwoClientBookmarksSyncTest, MC_DeleteBookmark) {
1653  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1654  ASSERT_TRUE(GetClient(1)->DisableSyncForDatatype(syncer::BOOKMARKS));
1655
1656  const GURL bar_url("http://example.com/bar");
1657  const GURL other_url("http://example.com/other");
1658
1659  ASSERT_TRUE(AddURL(0, GetBookmarkBarNode(0), 0, "bar", bar_url) != NULL);
1660  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 0, "other", other_url) != NULL);
1661
1662  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
1663
1664  ASSERT_TRUE(HasNodeWithURL(0, bar_url));
1665  ASSERT_TRUE(HasNodeWithURL(0, other_url));
1666  ASSERT_FALSE(HasNodeWithURL(1, bar_url));
1667  ASSERT_FALSE(HasNodeWithURL(1, other_url));
1668
1669  Remove(0, GetBookmarkBarNode(0), 0);
1670  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
1671
1672  ASSERT_FALSE(HasNodeWithURL(0, bar_url));
1673  ASSERT_TRUE(HasNodeWithURL(0, other_url));
1674
1675  ASSERT_TRUE(GetClient(1)->EnableSyncForDatatype(syncer::BOOKMARKS));
1676  ASSERT_TRUE(AwaitQuiescence());
1677
1678  ASSERT_FALSE(HasNodeWithURL(0, bar_url));
1679  ASSERT_TRUE(HasNodeWithURL(0, other_url));
1680  ASSERT_FALSE(HasNodeWithURL(1, bar_url));
1681  ASSERT_TRUE(HasNodeWithURL(1, other_url));
1682}
1683
1684// TCM ID - 3719307 - Test a scenario of updating the name of the same bookmark
1685// from two clients at the same time.
1686IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1687                       MC_BookmarkNameChangeConflict) {
1688  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1689
1690  const BookmarkNode* folder0 = AddFolder(0, kGenericFolderName);
1691  ASSERT_TRUE(folder0 != NULL);
1692  for (int i = 0; i < 3; ++i) {
1693    std::string title = IndexedURLTitle(i);
1694    GURL url = GURL(IndexedURL(i));
1695    ASSERT_TRUE(AddURL(0, folder0, i, title, url) != NULL);
1696  }
1697  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1698  ASSERT_TRUE(AllModelsMatchVerifier());
1699  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1700
1701  DisableVerifier();
1702  GURL url(IndexedURL(0));
1703  SetTitle(0, GetUniqueNodeByURL(0, url), "Title++");
1704  SetTitle(1, GetUniqueNodeByURL(1, url), "Title--");
1705
1706  ASSERT_TRUE(AwaitQuiescence());
1707  ASSERT_TRUE(AllModelsMatch());
1708  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1709}
1710
1711// TCM ID - 3672299 - Test a scenario of updating the URL of the same bookmark
1712// from two clients at the same time.
1713IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1714                       MC_BookmarkURLChangeConflict) {
1715  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1716
1717  const BookmarkNode* folder0 = AddFolder(0, kGenericFolderName);
1718  ASSERT_TRUE(folder0 != NULL);
1719  for (int i = 0; i < 3; ++i) {
1720    std::string title = IndexedURLTitle(i);
1721    GURL url = GURL(IndexedURL(i));
1722    ASSERT_TRUE(AddURL(0, folder0, i, title, url) != NULL);
1723  }
1724  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1725  ASSERT_TRUE(AllModelsMatchVerifier());
1726  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1727
1728  DisableVerifier();
1729  GURL url(IndexedURL(0));
1730  ASSERT_TRUE(SetURL(
1731      0, GetUniqueNodeByURL(0, url), GURL("http://www.google.com/00")));
1732  ASSERT_TRUE(SetURL(
1733      1, GetUniqueNodeByURL(1, url), GURL("http://www.google.com/11")));
1734
1735  ASSERT_TRUE(AwaitQuiescence());
1736  ASSERT_TRUE(AllModelsMatch());
1737  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1738}
1739
1740// TCM ID - 3699290 - Test a scenario of updating the BM Folder name from two
1741// clients at the same time.
1742IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1743                       MC_FolderNameChangeConflict) {
1744  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
1745  DisableVerifier();
1746
1747  const BookmarkNode* folderA[2];
1748  const BookmarkNode* folderB[2];
1749  const BookmarkNode* folderC[2];
1750
1751  // Create empty folder A on both clients.
1752  folderA[0] = AddFolder(0, IndexedFolderName(0));
1753  ASSERT_TRUE(folderA[0] != NULL);
1754  folderA[1] = AddFolder(1, IndexedFolderName(0));
1755  ASSERT_TRUE(folderA[1] != NULL);
1756
1757  // Create folder B with bookmarks on both clients.
1758  folderB[0] = AddFolder(0, IndexedFolderName(1));
1759  ASSERT_TRUE(folderB[0] != NULL);
1760  folderB[1] = AddFolder(1, IndexedFolderName(1));
1761  ASSERT_TRUE(folderB[1] != NULL);
1762  for (int i = 0; i < 3; ++i) {
1763    std::string title = IndexedURLTitle(i);
1764    GURL url = GURL(IndexedURL(i));
1765    ASSERT_TRUE(AddURL(0, folderB[0], i, title, url) != NULL);
1766  }
1767
1768  // Create folder C with bookmarks and subfolders on both clients.
1769  folderC[0] = AddFolder(0, IndexedFolderName(2));
1770  ASSERT_TRUE(folderC[0] != NULL);
1771  folderC[1] = AddFolder(1, IndexedFolderName(2));
1772  ASSERT_TRUE(folderC[1] != NULL);
1773  for (int i = 0; i < 3; ++i) {
1774    std::string folder_name = IndexedSubfolderName(i);
1775    const BookmarkNode* subfolder = AddFolder(0, folderC[0], i, folder_name);
1776    ASSERT_TRUE(subfolder != NULL);
1777    for (int j = 0; j < 3; ++j) {
1778      std::string title = IndexedURLTitle(j);
1779      GURL url = GURL(IndexedURL(j));
1780      ASSERT_TRUE(AddURL(0, subfolder, j, title, url) != NULL);
1781    }
1782  }
1783
1784  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1785  ASSERT_TRUE(AwaitQuiescence());
1786  ASSERT_TRUE(AllModelsMatch());
1787  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1788
1789  // Simultaneously rename folder A on both clients.
1790  SetTitle(0, folderA[0], "Folder A++");
1791  SetTitle(1, folderA[1], "Folder A--");
1792  ASSERT_TRUE(AwaitQuiescence());
1793  ASSERT_TRUE(AllModelsMatch());
1794  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1795
1796  // Simultaneously rename folder B on both clients.
1797  SetTitle(0, folderB[0], "Folder B++");
1798  SetTitle(1, folderB[1], "Folder B--");
1799  ASSERT_TRUE(AwaitQuiescence());
1800  ASSERT_TRUE(AllModelsMatch());
1801  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1802
1803  // Simultaneously rename folder C on both clients.
1804  SetTitle(0, folderC[0], "Folder C++");
1805  SetTitle(1, folderC[1], "Folder C--");
1806  ASSERT_TRUE(AwaitQuiescence());
1807  ASSERT_TRUE(AllModelsMatch());
1808  ASSERT_FALSE(ContainsDuplicateBookmarks(0));
1809}
1810
1811IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1812                       SingleClientEnabledEncryption) {
1813  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1814  ASSERT_TRUE(AllModelsMatchVerifier());
1815
1816  ASSERT_TRUE(EnableEncryption(0));
1817  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1818  ASSERT_TRUE(IsEncryptionComplete(0));
1819  ASSERT_TRUE(IsEncryptionComplete(1));
1820  ASSERT_TRUE(AllModelsMatchVerifier());
1821}
1822
1823IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1824                       SingleClientEnabledEncryptionAndChanged) {
1825  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1826  ASSERT_TRUE(AllModelsMatchVerifier());
1827
1828  ASSERT_TRUE(EnableEncryption(0));
1829  ASSERT_TRUE(AddURL(0, IndexedURLTitle(0), GURL(IndexedURL(0))) != NULL);
1830  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1831  ASSERT_TRUE(IsEncryptionComplete(0));
1832  ASSERT_TRUE(IsEncryptionComplete(1));
1833  ASSERT_TRUE(AllModelsMatchVerifier());
1834}
1835
1836IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1837                       BothClientsEnabledEncryption) {
1838  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1839  ASSERT_TRUE(AllModelsMatchVerifier());
1840
1841  ASSERT_TRUE(EnableEncryption(0));
1842  ASSERT_TRUE(EnableEncryption(1));
1843  ASSERT_TRUE(AwaitQuiescence());
1844  ASSERT_TRUE(IsEncryptionComplete(0));
1845  ASSERT_TRUE(IsEncryptionComplete(1));
1846  ASSERT_TRUE(AllModelsMatchVerifier());
1847}
1848
1849IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1850                       SingleClientEnabledEncryptionBothChanged) {
1851  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1852  ASSERT_TRUE(AllModelsMatchVerifier());
1853
1854  ASSERT_TRUE(EnableEncryption(0));
1855  ASSERT_TRUE(AwaitQuiescence());
1856  ASSERT_TRUE(IsEncryptionComplete(0));
1857  ASSERT_TRUE(IsEncryptionComplete(1));
1858  ASSERT_TRUE(AddURL(0, IndexedURLTitle(0), GURL(IndexedURL(0))) != NULL);
1859  ASSERT_TRUE(AddURL(0, IndexedURLTitle(1), GURL(IndexedURL(1))) != NULL);
1860  ASSERT_TRUE(AwaitQuiescence());
1861  ASSERT_TRUE(AllModelsMatchVerifier());
1862  ASSERT_TRUE(IsEncryptionComplete(0));
1863  ASSERT_TRUE(IsEncryptionComplete(1));
1864}
1865
1866IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1867                       SingleClientEnabledEncryptionAndChangedMultipleTimes) {
1868  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1869  ASSERT_TRUE(AllModelsMatchVerifier());
1870
1871  ASSERT_TRUE(AddURL(0, IndexedURLTitle(0), GURL(IndexedURL(0))) != NULL);
1872  ASSERT_TRUE(EnableEncryption(0));
1873  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1874  ASSERT_TRUE(IsEncryptionComplete(0));
1875  ASSERT_TRUE(IsEncryptionComplete(1));
1876  ASSERT_TRUE(AllModelsMatchVerifier());
1877
1878  ASSERT_TRUE(AddURL(0, IndexedURLTitle(1), GURL(IndexedURL(1))) != NULL);
1879  ASSERT_TRUE(AddFolder(0, IndexedFolderName(0)) != NULL);
1880  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1881  ASSERT_TRUE(AllModelsMatchVerifier());
1882}
1883
1884IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
1885                       FirstClientEnablesEncryptionWithPassSecondChanges) {
1886  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1887  ASSERT_TRUE(AllModelsMatchVerifier());
1888
1889  // Add initial bookmarks.
1890  ASSERT_TRUE(AddURL(0, 0, IndexedURLTitle(0), GURL(IndexedURL(0))) != NULL);
1891  ASSERT_TRUE(AddURL(0, 1, IndexedURLTitle(1), GURL(IndexedURL(1))) != NULL);
1892  ASSERT_TRUE(AddURL(0, 2, IndexedURLTitle(2), GURL(IndexedURL(2))) != NULL);
1893  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1894  ASSERT_TRUE(AllModelsMatchVerifier());
1895
1896  // Set a passphrase and enable encryption on Client 0. Client 1 will not
1897  // understand the bookmark updates.
1898  SetEncryptionPassphrase(0, kValidPassphrase, ProfileSyncService::EXPLICIT);
1899  ASSERT_TRUE(AwaitPassphraseAccepted(GetSyncService((0))));
1900  ASSERT_TRUE(EnableEncryption(0));
1901  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1902  ASSERT_TRUE(IsEncryptionComplete(0));
1903  ASSERT_TRUE(IsEncryptionComplete(1));
1904  ASSERT_TRUE(GetSyncService((1))->IsPassphraseRequired());
1905
1906  // Client 1 adds bookmarks between the first two and between the second two.
1907  ASSERT_TRUE(AddURL(0, 1, IndexedURLTitle(3), GURL(IndexedURL(3))) != NULL);
1908  ASSERT_TRUE(AddURL(0, 3, IndexedURLTitle(4), GURL(IndexedURL(4))) != NULL);
1909  EXPECT_FALSE(AllModelsMatchVerifier());
1910  EXPECT_FALSE(AllModelsMatch());
1911
1912  // Set the passphrase. Everything should resolve.
1913  ASSERT_TRUE(AwaitPassphraseRequired(GetSyncService((1))));
1914  ASSERT_TRUE(SetDecryptionPassphrase(1, kValidPassphrase));
1915  ASSERT_TRUE(AwaitPassphraseAccepted(GetSyncService((1))));
1916  ASSERT_TRUE(AwaitQuiescence());
1917  EXPECT_TRUE(AllModelsMatch());
1918  ASSERT_EQ(0,
1919            GetClient(1)->GetLastSessionSnapshot().num_encryption_conflicts());
1920
1921  // Ensure everything is syncing normally by appending a final bookmark.
1922  ASSERT_TRUE(AddURL(1, 5, IndexedURLTitle(5), GURL(IndexedURL(5))) != NULL);
1923  ASSERT_TRUE(GetClient(1)->AwaitMutualSyncCycleCompletion(GetClient(0)));
1924  EXPECT_TRUE(AllModelsMatch());
1925  ASSERT_EQ(0,
1926            GetClient(1)->GetLastSessionSnapshot().num_encryption_conflicts());
1927}
1928
1929// Deliberately racy rearranging of bookmarks to test that our conflict resolver
1930// code results in a consistent view across machines (no matter what the final
1931// order is).
1932IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, RacyPositionChanges) {
1933  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1934  ASSERT_TRUE(AllModelsMatchVerifier());
1935
1936  // Add initial bookmarks.
1937  size_t num_bookmarks = 5;
1938  for (size_t i = 0; i < num_bookmarks; ++i) {
1939    ASSERT_TRUE(AddURL(0, i, IndexedURLTitle(i), GURL(IndexedURL(i))) != NULL);
1940  }
1941
1942  // Once we make diverging changes the verifer is helpless.
1943  ASSERT_TRUE(AwaitQuiescence());
1944  ASSERT_TRUE(AllModelsMatchVerifier());
1945  DisableVerifier();
1946
1947  // Make changes on client 0.
1948  for (size_t i = 0; i < num_bookmarks; ++i) {
1949    const BookmarkNode* node = GetUniqueNodeByURL(0, GURL(IndexedURL(i)));
1950    int rand_pos = base::RandInt(0, num_bookmarks-1);
1951    DVLOG(1) << "Moving client 0's bookmark " << i << " to position "
1952             << rand_pos;
1953    Move(0, node, node->parent(), rand_pos);
1954  }
1955
1956  // Make changes on client 1.
1957  for (size_t i = 0; i < num_bookmarks; ++i) {
1958    const BookmarkNode* node = GetUniqueNodeByURL(1, GURL(IndexedURL(i)));
1959    int rand_pos = base::RandInt(0, num_bookmarks-1);
1960    DVLOG(1) << "Moving client 1's bookmark " << i << " to position "
1961             << rand_pos;
1962    Move(1, node, node->parent(), rand_pos);
1963  }
1964
1965  ASSERT_TRUE(AwaitQuiescence());
1966  ASSERT_TRUE(AllModelsMatch());
1967
1968  // Now make changes to client 1 first.
1969  for (size_t i = 0; i < num_bookmarks; ++i) {
1970    const BookmarkNode* node = GetUniqueNodeByURL(1, GURL(IndexedURL(i)));
1971    int rand_pos = base::RandInt(0, num_bookmarks-1);
1972    DVLOG(1) << "Moving client 1's bookmark " << i << " to position "
1973             << rand_pos;
1974    Move(1, node, node->parent(), rand_pos);
1975  }
1976
1977  // Make changes on client 0.
1978  for (size_t i = 0; i < num_bookmarks; ++i) {
1979    const BookmarkNode* node = GetUniqueNodeByURL(0, GURL(IndexedURL(i)));
1980    int rand_pos = base::RandInt(0, num_bookmarks-1);
1981    DVLOG(1) << "Moving client 0's bookmark " << i << " to position "
1982             << rand_pos;
1983    Move(0, node, node->parent(), rand_pos);
1984  }
1985
1986  ASSERT_TRUE(AwaitQuiescence());
1987  ASSERT_TRUE(AllModelsMatch());
1988}
1989
1990// Trigger the server side creation of Synced Bookmarks. Ensure both clients
1991// remain syncing afterwards. Add bookmarks to the synced bookmarks folder
1992// and ensure both clients receive the boomkmark.
1993IN_PROC_BROWSER_TEST_F(LegacyTwoClientBookmarksSyncTest,
1994                       CreateSyncedBookmarks) {
1995  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1996  ASSERT_TRUE(AllModelsMatchVerifier());
1997
1998  TriggerCreateSyncedBookmarks();
1999
2000  // Add a bookmark on Client 0 and ensure it syncs over. This will also trigger
2001  // both clients downloading the new Synced Bookmarks folder.
2002  ASSERT_TRUE(AddURL(0, "Google", GURL("http://www.google.com")));
2003  ASSERT_TRUE(AwaitQuiescence());
2004  ASSERT_TRUE(AllModelsMatch());
2005
2006  // Now add a bookmark within the Synced Bookmarks folder and ensure it syncs
2007  // over.
2008  const BookmarkNode* synced_bookmarks = GetSyncedBookmarksNode(0);
2009  ASSERT_TRUE(synced_bookmarks);
2010  ASSERT_TRUE(AddURL(0, synced_bookmarks, 0, "Google2",
2011                     GURL("http://www.google2.com")));
2012  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2013  ASSERT_TRUE(AllModelsMatch());
2014}
2015
2016IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest,
2017                       BookmarkAllNodesRemovedEvent) {
2018
2019  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
2020  ASSERT_TRUE(AllModelsMatchVerifier());
2021
2022  // Starting state:
2023  // other_node
2024  //    -> folder0
2025  //      -> tier1_a
2026  //        -> http://mail.google.com
2027  //        -> http://www.google.com
2028  //      -> http://news.google.com
2029  //      -> http://yahoo.com
2030  //    -> http://www.cnn.com
2031  // bookmark_bar
2032  // -> empty_folder
2033  // -> folder1
2034  //    -> http://yahoo.com
2035  // -> http://gmail.com
2036
2037  const BookmarkNode* folder0 = AddFolder(0, GetOtherNode(0), 0, "folder0");
2038  const BookmarkNode* tier1_a = AddFolder(0, folder0, 0, "tier1_a");
2039  ASSERT_TRUE(AddURL(0, folder0, 1, "News", GURL("http://news.google.com")));
2040  ASSERT_TRUE(AddURL(0, folder0, 2, "Yahoo", GURL("http://www.yahoo.com")));
2041  ASSERT_TRUE(AddURL(0, tier1_a, 0, "Gmai", GURL("http://mail.google.com")));
2042  ASSERT_TRUE(AddURL(0, tier1_a, 1, "Google", GURL("http://www.google.com")));
2043  ASSERT_TRUE(
2044      AddURL(0, GetOtherNode(0), 1, "CNN", GURL("http://www.cnn.com")));
2045
2046  ASSERT_TRUE(AddFolder(0, GetBookmarkBarNode(0), 0, "empty_folder"));
2047  const BookmarkNode* folder1 =
2048      AddFolder(0, GetBookmarkBarNode(0), 1, "folder1");
2049  ASSERT_TRUE(AddURL(0, folder1, 0, "Yahoo", GURL("http://www.yahoo.com")));
2050  ASSERT_TRUE(
2051      AddURL(0, GetBookmarkBarNode(0), 2, "Gmai", GURL("http://gmail.com")));
2052
2053  ASSERT_TRUE(AwaitQuiescence());
2054  ASSERT_TRUE(AllModelsMatch());
2055
2056  // Remove all
2057  RemoveAll(0);
2058
2059  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2060  // Verify other node has no children now.
2061  EXPECT_EQ(0, GetOtherNode(0)->child_count());
2062  EXPECT_EQ(0, GetBookmarkBarNode(0)->child_count());
2063  ASSERT_TRUE(AllModelsMatch());
2064}
2065
2066// Verifies that managed bookmarks (installed by policy) don't get synced.
2067IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, ManagedBookmarks) {
2068  // Make sure the first Profile has an overridden policy provider.
2069  EXPECT_CALL(policy_provider_, IsInitializationComplete(testing::_))
2070      .WillRepeatedly(testing::Return(true));
2071  policy::ProfilePolicyConnectorFactory::GetInstance()->PushProviderForTesting(
2072      &policy_provider_);
2073
2074  // Set up sync.
2075  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
2076  ASSERT_TRUE(AllModelsMatchVerifier());
2077
2078  // Verify that there are no managed bookmarks at startup in either profile.
2079  // The Managed Bookmarks folder should not be visible at this stage.
2080  const BookmarkNode* managed_node0 = GetManagedNode(0);
2081  ASSERT_TRUE(managed_node0->empty());
2082  ASSERT_FALSE(managed_node0->IsVisible());
2083  const BookmarkNode* managed_node1 = GetManagedNode(1);
2084  ASSERT_TRUE(managed_node1->empty());
2085  ASSERT_FALSE(managed_node1->IsVisible());
2086
2087  // Verify that the bookmark bar node is empty on both profiles too.
2088  const BookmarkNode* bar_node0 = GetBookmarkBarNode(0);
2089  ASSERT_TRUE(bar_node0->empty());
2090  ASSERT_TRUE(bar_node0->IsVisible());
2091  const BookmarkNode* bar_node1 = GetBookmarkBarNode(1);
2092  ASSERT_TRUE(bar_node1->empty());
2093  ASSERT_TRUE(bar_node1->IsVisible());
2094
2095  // Verify that adding a bookmark is observed by the second Profile.
2096  GURL google_url("http://www.google.com");
2097  ASSERT_TRUE(AddURL(0, "Google", google_url) != NULL);
2098  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2099  ASSERT_TRUE(AllModelsMatchVerifier());
2100  ASSERT_EQ(1, bar_node0->child_count());
2101  ASSERT_EQ(1, bar_node1->child_count());
2102
2103  // Set the ManagedBookmarks policy for the first Profile,
2104  // which will add one new managed bookmark.
2105  base::DictionaryValue* bookmark = new base::DictionaryValue();
2106  bookmark->SetString("name", "Managed bookmark");
2107  bookmark->SetString("url", "youtube.com");
2108  base::ListValue* list = new base::ListValue();
2109  list->Append(bookmark);
2110  policy::PolicyMap policy;
2111  policy.Set(policy::key::kManagedBookmarks,
2112             policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
2113             list, NULL);
2114  policy_provider_.UpdateChromePolicy(policy);
2115  base::RunLoop().RunUntilIdle();
2116
2117  // Now add another user bookmark and wait for it to sync.
2118  ASSERT_TRUE(AddURL(0, "Google 2", google_url) != NULL);
2119  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2120  ASSERT_TRUE(AllModelsMatchVerifier());
2121
2122  EXPECT_FALSE(GetSyncService(0)->HasUnrecoverableError());
2123  EXPECT_FALSE(GetSyncService(1)->HasUnrecoverableError());
2124
2125  // Verify that the managed bookmark exists in the local model of the first
2126  // Profile, and has a child node.
2127  ASSERT_EQ(1, managed_node0->child_count());
2128  ASSERT_TRUE(managed_node0->IsVisible());
2129  EXPECT_EQ(GURL("http://youtube.com/"), managed_node0->GetChild(0)->url());
2130
2131  // Verify that the second Profile didn't get this node.
2132  ASSERT_EQ(0, managed_node1->child_count());
2133}
2134