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