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