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