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