15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/number_formatting.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_harness.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/bookmarks_helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_test.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/typed_urls_helper.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AddUrlToHistory;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AddUrlToHistoryWithTimestamp;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AddUrlToHistoryWithTransition;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AreVisitsEqual;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AreVisitsUnique;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AssertAllProfilesHaveSameURLsAsVerifier;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AssertURLRowVectorsAreEqual;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::DeleteUrlFromHistory;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::GetTypedUrlsFromClient;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::GetUrlFromClient;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::GetVisitsFromClient;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::RemoveVisitsFromClient;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TwoClientTypedUrlsSyncTest : public SyncTest {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TwoClientTypedUrlsSyncTest() : SyncTest(TWO_CLIENT) {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TwoClientTypedUrlsSyncTest() {}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckClientsEqual() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history::URLRows urls = GetTypedUrlsFromClient(0);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history::URLRows urls2 = GetTypedUrlsFromClient(1);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AssertURLRowVectorsAreEqual(urls, urls2);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now check the visits.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < urls.size() && i < urls2.size(); i++) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      history::VisitVector visit1 = GetVisitsFromClient(0, urls[i].id());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      history::VisitVector visit2 = GetVisitsFromClient(1, urls2[i].id());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!AreVisitsEqual(visit1, visit2))
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckNoDuplicateVisits() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < num_clients(); ++i) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      history::URLRows urls = GetTypedUrlsFromClient(i);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t j = 0; j < urls.size(); ++j) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        history::VisitVector visits = GetVisitsFromClient(i, urls[j].id());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!AreVisitsUnique(visits))
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetVisitCountForFirstURL(int index) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history::URLRows urls = GetTypedUrlsFromClient(index);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (urls.size() == 0)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return urls[0].visit_count();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TwoClientTypedUrlsSyncTest);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TCM: 3728323
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest, Add) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kHistoryUrl(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("http://www.add-one-history.google.com/"));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate one client with a URL, should sync to the other.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url(kHistoryUrl);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, new_url);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(new_url, urls[0].url());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have this URL.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest, AddExpired) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kHistoryUrl(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("http://www.add-one-history.google.com/"));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate one client with a URL, should sync to the other.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url(kHistoryUrl);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a URL with a timestamp 1 year before today.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time timestamp = base::Time::Now() - base::TimeDelta::FromDays(365);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTimestamp(0,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               new_url,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               content::PAGE_TRANSITION_TYPED,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               history::SOURCE_BROWSED,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               timestamp);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(new_url, urls[0].url());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second client should still have no URLs since this one is expired.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(1);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, urls.size());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flake on mac: http://crbug/115526
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AddExpiredThenUpdate DISABLED_AddExpiredThenUpdate
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AddExpiredThenUpdate AddExpiredThenUpdate
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest, MAYBE_AddExpiredThenUpdate) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kHistoryUrl(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("http://www.add-one-history.google.com/"));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate one client with a URL, should sync to the other.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url(kHistoryUrl);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a URL with a timestamp 1 year before today.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time timestamp = base::Time::Now() - base::TimeDelta::FromDays(365);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTimestamp(0,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               new_url,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               content::PAGE_TRANSITION_TYPED,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               history::SOURCE_BROWSED,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               timestamp);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<history::URLRow> urls = GetTypedUrlsFromClient(0);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(new_url, urls[0].url());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second client should still have no URLs since this one is expired.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(1);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, urls.size());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now drive an update on the first client.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, new_url);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish again.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second client should have the URL now.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(1);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TCM: 3705291
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// flaky, see crbug.com/108511
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest, DISABLED_AddThenDelete) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kHistoryUrl(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("http://www.add-one-history.google.com/"));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate one client with a URL, should sync to the other.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url(kHistoryUrl);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, new_url);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(new_url, urls[0].url());
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have this URL.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete from first client, should delete from second.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteUrlFromHistory(0, new_url);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Neither client should have this URL.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TCM: 3643277
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest, DisableEnableSync) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kUrl1(ASCIIToUTF16("http://history1.google.com/"));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kUrl2(ASCIIToUTF16("http://history2.google.com/"));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable typed url sync for one client, leave it active for the other.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClient(0)->DisableSyncForDatatype(syncer::TYPED_URLS);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add one URL to non-syncing client, add a different URL to the other,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // wait for sync cycle to complete. No data should be exchanged.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1(kUrl1);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2(kUrl2);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, url1);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(1, url2);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(1)->AwaitFullSyncCompletion("Added a typed url."));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that no data was exchanged.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows post_sync_urls = GetTypedUrlsFromClient(0);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, post_sync_urls.size());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(url1, post_sync_urls[0].url());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  post_sync_urls = GetTypedUrlsFromClient(1);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, post_sync_urls.size());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(url2, post_sync_urls[0].url());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable typed url sync, make both URLs are synced to each client.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClient(0)->EnableSyncForDatatype(syncer::TYPED_URLS);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(AwaitQuiescence());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// flaky, see crbug.com/108511
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest, DISABLED_AddOneDeleteOther) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kHistoryUrl(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("http://www.add-one-delete-history.google.com/"));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate one client with a URL, should sync to the other.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url(kHistoryUrl);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, new_url);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(new_url, urls[0].url());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have this URL.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, delete the URL from the second client.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteUrlFromHistory(1, new_url);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(0);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have this URL removed.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// flaky, see crbug.com/108511
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_AddOneDeleteOtherAddAgain) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kHistoryUrl(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("http://www.add-delete-add-history.google.com/"));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate one client with a URL, should sync to the other.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url(kHistoryUrl);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, new_url);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(new_url, urls[0].url());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have this URL.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, delete the URL from the second client.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteUrlFromHistory(1, new_url);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(0);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have this URL removed.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add it to the first client again, should succeed (tests that the deletion
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // properly disassociates that URL).
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, new_url);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have this URL added again.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MergeTypedWithNonTypedDuringAssociation) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupClients());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url("http://history.com");
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time timestamp = base::Time::Now();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put a non-typed URL in both clients with an identical timestamp.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then add a typed URL to the second client - this test makes sure that
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we properly merge both sets of visits together to end up with the same
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // set of visits on both ends.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTimestamp(0, new_url, content::PAGE_TRANSITION_LINK,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               history::SOURCE_BROWSED, timestamp);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTimestamp(1, new_url, content::PAGE_TRANSITION_LINK,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               history::SOURCE_BROWSED, timestamp);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTimestamp(1, new_url, content::PAGE_TRANSITION_TYPED,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               history::SOURCE_BROWSED,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               timestamp + base::TimeDelta::FromSeconds(1));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now start up sync - URLs should get merged. Fully sync client 1 first,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before syncing client 0, so we have both of client 1's URLs in the sync DB
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at the time that client 0 does model association.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(1)->SetupSync()) << "SetupSync() failed";
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClient(1)->AwaitFullSyncCompletion("Initial client sync");
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->SetupSync()) << "SetupSync() failed";
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CheckClientsEqual());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // At this point, we should have no duplicates (total visit count should be
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2). We only need to check client 0 since we already verified that both
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clients are identical above.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(new_url, urls[0].url());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CheckNoDuplicateVisits());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, GetVisitCountForFirstURL(0));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests transitioning a URL from non-typed to typed when both clients
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have already seen that URL (so a merge is required).
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MergeTypedWithNonTypedDuringChangeProcessing) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupClients());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url("http://history.com");
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time timestamp = base::Time::Now();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup both clients with the identical typed URL visit. This means we can't
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use the verifier in this test, because this will show up as two distinct
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // visits in the verifier.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTimestamp(0, new_url, content::PAGE_TRANSITION_LINK,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               history::SOURCE_BROWSED, timestamp);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTimestamp(1, new_url, content::PAGE_TRANSITION_LINK,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               history::SOURCE_BROWSED, timestamp);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now start up sync. Neither URL should get synced as they do not look like
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // typed URLs.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CheckClientsEqual());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, urls.size());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, add a typed visit to the first client.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTimestamp(0, new_url, content::PAGE_TRANSITION_TYPED,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               history::SOURCE_BROWSED,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               timestamp + base::TimeDelta::FromSeconds(1));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CheckClientsEqual());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CheckNoDuplicateVisits());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(0);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, GetVisitCountForFirstURL(0));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, GetVisitCountForFirstURL(1));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests transitioning a URL from non-typed to typed when one of the clients
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has never seen that URL before (so no merge is necessary).
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest, UpdateToNonTypedURL) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 kHistoryUrl(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("http://www.add-delete-add-history.google.com/"));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate one client with a non-typed URL, should not be synced.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_url(kHistoryUrl);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTransition(0, new_url, content::PAGE_TRANSITION_LINK,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                history::SOURCE_BROWSED);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, urls.size());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have 0 typed URLs.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(0);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, urls.size());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, add a typed visit to this URL.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, new_url);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let sync finish.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both clients should have this URL as typed and have two visits synced up.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CheckClientsEqual());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(0);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(new_url, urls[0].url());
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, GetVisitCountForFirstURL(0));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SkipImportedVisits) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL imported_url("http://imported_url.com");
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL browsed_url("http://browsed_url.com");
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL browsed_and_imported_url("http://browsed_and_imported_url.com");
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupClients());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create 3 items in our first client - 1 imported, one browsed, one with
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // both imported and browsed entries.
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTransition(0, imported_url,
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                content::PAGE_TRANSITION_TYPED,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                history::SOURCE_FIREFOX_IMPORTED);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTransition(0, browsed_url,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                content::PAGE_TRANSITION_TYPED,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                history::SOURCE_BROWSED);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTransition(0, browsed_and_imported_url,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                content::PAGE_TRANSITION_TYPED,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                history::SOURCE_FIREFOX_IMPORTED);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(1);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(browsed_url, urls[0].url());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now browse to 3rd URL - this should cause it to be synced, even though it
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was initially imported.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistoryWithTransition(0, browsed_and_imported_url,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                content::PAGE_TRANSITION_TYPED,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                history::SOURCE_BROWSED);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls = GetTypedUrlsFromClient(1);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, urls.size());
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the imported URL didn't make it over.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < urls.size(); ++i) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(imported_url, urls[i].url());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TwoClientTypedUrlsSyncTest, BookmarksWithTypedVisit) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL bookmark_url("http://www.bookmark.google.com/");
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL bookmark_icon_url("http://www.bookmark.google.com/favicon.ico");
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupClients());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a bookmark.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* node = bookmarks_helper::AddURL(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, bookmarks_helper::IndexedURLTitle(0), bookmark_url);
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bookmarks_helper::SetFavicon(0, node, bookmark_icon_url,
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bookmarks_helper::CreateFavicon(SK_ColorWHITE),
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bookmarks_helper::FROM_UI);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A row in the DB for client 1 should have been created as a result of the
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sync.
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRow row;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetUrlFromClient(1, bookmark_url, &row));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, add a typed visit for client 0 to the bookmark URL and sync it over
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - this should not cause a crash.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddUrlToHistory(0, bookmark_url);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertAllProfilesHaveSameURLsAsVerifier();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::URLRows urls = GetTypedUrlsFromClient(0);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, urls.size());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(bookmark_url, urls[0].url());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, GetVisitCountForFirstURL(0));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
473