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