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