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