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