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