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) 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <string> 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <utility> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_backend.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_db_task.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_notifications.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/invalidation/fake_invalidation_service.h" 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/prefs/pref_service_syncable.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/abstract_profile_sync_service_test.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/typed_url_change_processor.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/typed_url_data_type_controller.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/typed_url_model_associator.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_test_util.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test_profile_sync_service.h" 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_browser_process.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_profile_manager.h" 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/browser/history_types.h" 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/invalidation/invalidation_service.h" 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/invalidation/profile_invalidation_provider.h" 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/refcounted_browser_context_keyed_service.h" 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_error_handler_mock.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_node.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_transaction.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_node.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_transaction.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/typed_url_specifics.pb.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Thread; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using base::Time; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::TypedUrlChangeProcessor; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::TypedUrlDataTypeController; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::TypedUrlModelAssociator; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::HistoryBackend; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::URLID; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::URLRow; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::WriteTransaction; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using testing::_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace content { 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class BrowserContext; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kTestProfileName[] = "test-profile"; 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Visits with this timestamp are treated as expired. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int EXPIRED_VISIT = -1; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryBackendMock : public HistoryBackend { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HistoryBackendMock() : HistoryBackend(base::FilePath(), NULL, NULL) {} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsExpiredVisitTime(const base::Time& time) OVERRIDE { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return time.ToInternalValue() == EXPIRED_VISIT; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(GetAllTypedURLs, bool(history::URLRows* entries)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(GetMostRecentVisitsForURL, bool(history::URLID id, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_visits, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector* visits)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(UpdateURL, bool(history::URLID id, const history::URLRow& url)); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(AddVisits, bool(const GURL& url, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<history::VisitInfo>& visits, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(RemoveVisits, bool(const history::VisitVector& visits)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(GetURL, bool(const GURL& url_id, history::URLRow* url_row)); 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MOCK_METHOD2(SetPageTitle, void(const GURL& url, 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(DeleteURL, void(const GURL& url)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HistoryBackendMock() {} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryServiceMock : public HistoryService { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) HistoryServiceMock(history::HistoryClient* client, Profile* profile) 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : HistoryService(client, profile), backend_(NULL) {} 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void ScheduleDBTask(scoped_ptr<history::HistoryDBTask> task, 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::CancelableTaskTracker* tracker) OVERRIDE { 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) history::HistoryDBTask* task_raw = task.get(); 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) task_runner_->PostTaskAndReply( 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FROM_HERE, 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&HistoryServiceMock::RunTaskOnDBThread, 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this), task_raw), 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&base::DeletePointer<history::HistoryDBTask>, 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) task.release())); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MOCK_METHOD0(Shutdown, void()); 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void ShutdownBaseService() { 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) HistoryService::Shutdown(); 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void set_task_runner( 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner) { 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(task_runner.get()); 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) task_runner_ = task_runner; 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void set_backend(scoped_refptr<history::HistoryBackend> backend) { 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) backend_ = backend; 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HistoryServiceMock() {} 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RunTaskOnDBThread(history::HistoryDBTask* task) { 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(task->RunOnDBThread(backend_.get(), NULL)); 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<history::HistoryBackend> backend_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)KeyedService* BuildFakeProfileInvalidationProvider( 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::BrowserContext* context) { 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return new invalidation::ProfileInvalidationProvider( 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<invalidation::InvalidationService>( 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new invalidation::FakeInvalidationService)); 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* BuildHistoryService(content::BrowserContext* profile) { 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return new HistoryServiceMock(NULL, static_cast<Profile*>(profile)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestTypedUrlModelAssociator : public TypedUrlModelAssociator { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestTypedUrlModelAssociator( 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncService* sync_service, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::HistoryBackend* history_backend, 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::DataTypeErrorHandler* error_handler) : 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlModelAssociator(sync_service, history_backend, error_handler) {} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't clear error stats - that way we can verify their values in our 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tests. 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ClearErrorStats() OVERRIDE {} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ACTION_P2(ShutdownHistoryService, thread, service) { 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) service->ShutdownBaseService(); 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) delete thread; 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P6(MakeTypedUrlSyncComponents, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtc, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_handler, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_associator) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *model_associator = 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TestTypedUrlModelAssociator(service, hb, error_handler); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlChangeProcessor* change_processor = 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TypedUrlChangeProcessor(profile, *model_associator, hb, dtc); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProfileSyncComponentsFactory::SyncComponents(*model_associator, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) change_processor); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceTypedUrlTest : public AbstractProfileSyncServiceTest { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddTypedUrlSyncNode(const history::URLRow& url, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::VisitVector& visits) { 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ReadNode typed_url_root(&trans); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(syncer::BaseNode::INIT_OK, 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typed_url_root.InitTypeRoot(syncer::TYPED_URLS)); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::WriteNode node(&trans); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string tag = url.url().spec(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::WriteNode::InitUniqueByCreationResult result = 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.InitUniqueByCreation(syncer::TYPED_URLS, typed_url_root, tag); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(syncer::WriteNode::INIT_SUCCESS, result); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlModelAssociator::WriteToSyncNode(url, visits, &node); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProfileSyncServiceTypedUrlTest() 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : profile_manager_(TestingBrowserProcess::GetGlobal()) { 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) history_thread_.reset(new Thread("history")); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AbstractProfileSyncServiceTest::SetUp(); 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(profile_manager_.SetUp()); 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestingProfile::TestingFactories testing_factories; 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch testing_factories.push_back(std::make_pair( 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProfileOAuth2TokenServiceFactory::GetInstance(), 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch BuildAutoIssuingFakeProfileOAuth2TokenService)); 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_ = profile_manager_.CreateTestingProfile( 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kTestProfileName, 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<PrefServiceSyncable>(), 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::UTF8ToUTF16(kTestProfileName), 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 0, 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string(), 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch testing_factories); 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) invalidation::ProfileInvalidationProviderFactory::GetInstance()-> 238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetTestingFactory(profile_, BuildFakeProfileInvalidationProvider); 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) history_thread_->Start(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_backend_ = new HistoryBackendMock(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service_ = static_cast<HistoryServiceMock*>( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryServiceFactory::GetInstance()->SetTestingFactoryAndUse( 243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_, BuildHistoryService)); 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) history_service_->set_task_runner(history_thread_->task_runner()); 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) history_service_->set_backend(history_backend_); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL((*history_service_), Shutdown()) 250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .WillOnce(ShutdownHistoryService(history_thread_.release(), 251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) history_service_)); 252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_ = NULL; 253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_manager_.DeleteTestingProfile(kTestProfileName); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AbstractProfileSyncServiceTest::TearDown(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlModelAssociator* StartSyncService(const base::Closure& callback) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlModelAssociator* model_associator = NULL; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!sync_service_) { 260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninManagerBase* signin = SigninManagerFactory::GetForProfile(profile_); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signin->SetAuthenticatedUsername("test"); 262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_ = TestProfileSyncService::BuildAutoStartAsyncInit(profile_, 263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch callback); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncComponentsFactoryMock* components = 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_service_->components_factory_mock(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlDataTypeController* data_type_controller = 267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new TypedUrlDataTypeController(components, profile_, sync_service_); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*components, CreateTypedUrlSyncComponents(_, _, _)). 270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch WillOnce(MakeTypedUrlSyncComponents(profile_, 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_service_, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_backend_.get(), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_type_controller, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_handler_, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &model_associator)); 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*components, CreateDataTypeManager(_, _, _, _, _)). 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(ReturnNewDataTypeManager()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileOAuth2TokenService* oauth2_token_service = 280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProfileOAuth2TokenServiceFactory::GetForProfile(profile_); 28168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) oauth2_token_service->UpdateCredentials("test", "oauth2_login_token"); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_service_->RegisterDataTypeController(data_type_controller); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_service_->Initialize(); 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return model_associator; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetTypedUrlsFromSyncDB(history::URLRows* urls) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls->clear(); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ReadNode typed_url_root(&trans); 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (typed_url_root.InitTypeRoot(syncer::TYPED_URLS) != 29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) syncer::BaseNode::INIT_OK) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 child_id = typed_url_root.GetFirstChildId(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child_id != syncer::kInvalidId) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ReadNode child_node(&trans); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_node.InitByIdLookup(child_id) != syncer::BaseNode::INIT_OK) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::TypedUrlSpecifics& typed_url( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_node.GetTypedUrlSpecifics()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow new_url(GURL(typed_url.url())); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_url.set_title(base::UTF8ToUTF16(typed_url.title())); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(typed_url.visits_size()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(typed_url.visits_size(), typed_url.visit_transitions_size()); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_url.set_last_visit(base::Time::FromInternalValue( 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typed_url.visits(typed_url.visits_size() - 1))); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_url.set_hidden(typed_url.hidden()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls->push_back(new_url); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_id = child_node.GetSuccessorId(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIdleChangeProcessorExpectations() { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), SetPageTitle(_, _)).Times(0); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), UpdateURL(_, _)).Times(0); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetURL(_, _)).Times(0); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), DeleteURL(_)).Times(0); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool URLsEqual(history::URLRow& lhs, history::URLRow& rhs) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only verify the fields we explicitly sync (i.e. don't verify typed_count 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or visit_count because we rely on the history DB to manage those values 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and they are left unchanged by HistoryBackendMock). 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (lhs.url().spec().compare(rhs.url().spec()) == 0) && 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (lhs.title().compare(rhs.title()) == 0) && 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (lhs.last_visit() == rhs.last_visit()) && 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (lhs.hidden() == rhs.hidden()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static history::URLRow MakeTypedUrlEntry(const char* url, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* title, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int typed_count, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 last_visit, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hidden, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector* visits) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give each URL a unique ID, to mimic the behavior of the real database. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int unique_url_id = 0; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gurl(url); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow history_url(gurl, ++unique_url_id); 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) history_url.set_title(base::UTF8ToUTF16(title)); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_url.set_typed_count(typed_count); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_url.set_last_visit( 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::FromInternalValue(last_visit)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_url.set_hidden(hidden); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits->push_back(history::VisitRow( 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_url.id(), history_url.last_visit(), 0, 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, 0)); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_url.set_visit_count(visits->size()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return history_url; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<Thread> history_thread_; 361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestingProfileManager profile_manager_; 362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestingProfile* profile_; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HistoryBackendMock> history_backend_; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryServiceMock* history_service_; 3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::DataTypeErrorHandlerMock error_handler_; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddTypedUrlEntries(ProfileSyncServiceTypedUrlTest* test, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::URLRows& entries) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test->CreateRoot(syncer::TYPED_URLS); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < entries.size(); ++i) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector visits; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits.push_back(history::VisitRow( 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries[i].id(), entries[i].last_visit(), 0, 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransitionFromInt(0), 0)); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test->AddTypedUrlSyncNode(entries[i], visits); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, EmptyNativeEmptySync) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(Return(true)); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIdleChangeProcessorExpectations(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlModelAssociator* associator = 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&sync_entries); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, sync_entries.size()); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, associator->GetErrorPercentage()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeEmptySync) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows entries; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector visits; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries.push_back(MakeTypedUrlEntry("http://foo.com", "bar", 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &visits)); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true))); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(visits), Return(true))); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIdleChangeProcessorExpectations(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlModelAssociator* associator = 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&sync_entries); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, sync_entries.size()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(entries[0], sync_entries[0])); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, associator->GetErrorPercentage()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeErrorReadingVisits) { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows entries; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector visits; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow native_entry1(MakeTypedUrlEntry("http://foo.com", "bar", 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &visits)); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow native_entry2(MakeTypedUrlEntry("http://foo2.com", "bar", 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 15, false, &visits)); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries.push_back(native_entry1); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries.push_back(native_entry2); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true))); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an error from GetMostRecentVisitsForURL() for the second URL. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMostRecentVisitsForURL(native_entry1.id(), _, _)). 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return(true)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMostRecentVisitsForURL(native_entry2.id(), _, _)). 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return(false)); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIdleChangeProcessorExpectations(); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&sync_entries); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, sync_entries.size()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(native_entry1, sync_entries[0])); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeWithBlankEmptySync) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<history::URLRow> entries; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector visits; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add an empty URL. 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries.push_back(MakeTypedUrlEntry("", "bar", 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &visits)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries.push_back(MakeTypedUrlEntry("http://foo.com", "bar", 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &visits)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true))); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(visits), Return(true))); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIdleChangeProcessorExpectations(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<history::URLRow> sync_entries; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&sync_entries); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The empty URL should be ignored. 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, sync_entries.size()); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(entries[1], sync_entries[0])); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeHasSyncNoMerge) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector native_visits; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector sync_visits; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow native_entry(MakeTypedUrlEntry("http://native.com", "entry", 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &native_visits)); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow sync_entry(MakeTypedUrlEntry("http://sync.com", "entry", 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 16, false, &sync_visits)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows native_entries; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_entries.push_back(native_entry); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true))); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(native_visits), Return(true))); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddVisits(_, _, history::SOURCE_SYNCED)).WillRepeatedly(Return(true)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_entries.push_back(sync_entry); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), UpdateURL(_, _)). 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return(true)); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(base::Bind(&AddTypedUrlEntries, this, sync_entries)); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, history::URLRow> expected; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected[native_entry.url().spec()] = native_entry; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected[sync_entry.url().spec()] = sync_entry; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(new_sync_entries.size() == expected.size()); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (history::URLRows::iterator entry = new_sync_entries.begin(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry != new_sync_entries.end(); ++entry) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(expected[entry->url().spec()], *entry)); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, EmptyNativeExpiredSync) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector sync_visits; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow sync_entry(MakeTypedUrlEntry("http://sync.com", "entry", 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, EXPIRED_VISIT, false, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &sync_visits)); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_entries.push_back(sync_entry); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since all our URLs are expired, no backend calls to add new URLs will be 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // made. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(Return(true)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIdleChangeProcessorExpectations(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(base::Bind(&AddTypedUrlEntries, this, sync_entries)); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeHasSyncMerge) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector native_visits; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow native_entry(MakeTypedUrlEntry("http://native.com", "entry", 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &native_visits)); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector sync_visits; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow sync_entry(MakeTypedUrlEntry("http://native.com", "name", 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 17, false, &sync_visits)); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector merged_visits; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) merged_visits.push_back(history::VisitRow( 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_entry.id(), base::Time::FromInternalValue(15), 0, 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransitionFromInt(0), 0)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow merged_entry(MakeTypedUrlEntry("http://native.com", "name", 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 17, false, &merged_visits)); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows native_entries; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_entries.push_back(native_entry); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true))); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(native_visits), Return(true))); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddVisits(_, _, history::SOURCE_SYNCED)). WillRepeatedly(Return(true)); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_entries.push_back(sync_entry); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), UpdateURL(_, _)). 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return(true)); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), SetPageTitle(_, _)). 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return()); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(base::Bind(&AddTypedUrlEntries, this, sync_entries)); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(merged_entry, new_sync_entries[0])); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeWithErrorHasSyncMerge) { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector native_visits; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow native_entry(MakeTypedUrlEntry("http://native.com", "native", 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &native_visits)); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector sync_visits; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow sync_entry(MakeTypedUrlEntry("http://native.com", "sync", 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 17, false, &sync_visits)); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows native_entries; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_entries.push_back(native_entry); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true))); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an error getting the visits for the native URL. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return(false)); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetURL(_, _)). 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<1>(native_entry), Return(true))); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddVisits(_, _, history::SOURCE_SYNCED)). WillRepeatedly(Return(true)); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_entries.push_back(sync_entry); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), UpdateURL(_, _)). 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return(true)); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), SetPageTitle(_, _)). 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(base::Bind(&AddTypedUrlEntries, this, sync_entries)); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(sync_entry, new_sync_entries[0])); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserChangeAdd) { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector added_visits; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow added_entry(MakeTypedUrlEntry("http://added.com", "entry", 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &added_visits)); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(Return(true)); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<2>(added_visits), Return(true))); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIdleChangeProcessorExpectations(); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLsModifiedDetails details; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(added_entry); 610a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 611a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, 613c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLsModifiedDetails>(&details)); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(added_entry, new_sync_entries[0])); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserChangeAddWithBlank) { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector added_visits; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow empty_entry(MakeTypedUrlEntry("", "entry", 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &added_visits)); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow added_entry(MakeTypedUrlEntry("http://added.com", "entry", 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &added_visits)); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(Return(true)); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(added_visits), Return(true))); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIdleChangeProcessorExpectations(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLsModifiedDetails details; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(empty_entry); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(added_entry); 641a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, 644c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLsModifiedDetails>(&details)); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<history::URLRow> new_sync_entries; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(added_entry, new_sync_entries[0])); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserChangeUpdate) { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry(MakeTypedUrlEntry("http://mine.com", "entry", 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows original_entries; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true))); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<2>(original_visits), 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector updated_visits; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow updated_entry(MakeTypedUrlEntry("http://mine.com", "entry", 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7, 17, false, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<2>(updated_visits), 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLsModifiedDetails details; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(updated_entry); 679a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 680a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, 682c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLsModifiedDetails>(&details)); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(updated_entry, new_sync_entries[0])); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserChangeAddFromVisit) { 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector added_visits; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow added_entry(MakeTypedUrlEntry("http://added.com", "entry", 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &added_visits)); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(Return(true)); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<2>(added_visits), Return(true))); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIdleChangeProcessorExpectations(); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLVisitedDetails details; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.row = added_entry; 7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci details.transition = ui::PAGE_TRANSITION_TYPED; 708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URL_VISITED, 711c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLVisitedDetails>(&details)); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(added_entry, new_sync_entries[0])); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserChangeUpdateFromVisit) { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry(MakeTypedUrlEntry("http://mine.com", "entry", 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows original_entries; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true))); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<2>(original_visits), 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector updated_visits; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow updated_entry(MakeTypedUrlEntry("http://mine.com", "entry", 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7, 17, false, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<2>(updated_visits), 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLVisitedDetails details; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.row = updated_entry; 7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci details.transition = ui::PAGE_TRANSITION_TYPED; 747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URL_VISITED, 750c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLVisitedDetails>(&details)); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(updated_entry, new_sync_entries[0])); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserIgnoreChangeUpdateFromVisit) { 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry(MakeTypedUrlEntry("http://mine.com", "entry", 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows original_entries; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true))); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(original_visits), 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(original_entry, new_sync_entries[0])); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector updated_visits; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow updated_entry(MakeTypedUrlEntry("http://mine.com", "entry", 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7, 15, false, 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLVisitedDetails details; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.row = updated_entry; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should ignore this change because it's not TYPED. 7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci details.transition = ui::PAGE_TRANSITION_RELOAD; 788a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 789a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URL_VISITED, 791c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLVisitedDetails>(&details)); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be no changes to the sync DB from this notification. 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(original_entry, new_sync_entries[0])); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, try updating it with a large number of visits not divisible by 10 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (should ignore this visit). 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow twelve_visits(MakeTypedUrlEntry("http://mine.com", "entry", 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12, 15, false, 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.row = twelve_visits; 8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci details.transition = ui::PAGE_TRANSITION_TYPED; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URL_VISITED, 808c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLVisitedDetails>(&details)); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be no changes to the sync DB from this notification. 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(original_entry, new_sync_entries[0])); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, try updating it with a large number of visits that is divisible by 10 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (should *not* be ignored). 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow twenty_visits(MakeTypedUrlEntry("http://mine.com", "entry", 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20, 15, false, 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.row = twenty_visits; 8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci details.transition = ui::PAGE_TRANSITION_TYPED; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URL_VISITED, 823c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLVisitedDetails>(&details)); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(twenty_visits, new_sync_entries[0])); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserChangeRemove) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits1; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry1(MakeTypedUrlEntry("http://mine.com", "entry", 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits1)); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits2; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry2(MakeTypedUrlEntry("http://mine2.com", 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "entry2", 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 15, false, 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits2)); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows original_entries; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry1); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry2); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true))); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(original_visits1), 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLsDeletedDetails changes; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes.all_history = false; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes.rows.push_back(history::URLRow(GURL("http://mine.com"))); 855a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 856a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_DELETED, 858c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLsDeletedDetails>(&changes)); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(original_entry2, new_sync_entries[0])); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserChangeRemoveExpired) { 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits1; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry1(MakeTypedUrlEntry("http://mine.com", "entry", 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits1)); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits2; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry2(MakeTypedUrlEntry("http://mine2.com", 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "entry2", 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 15, false, 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits2)); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows original_entries; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry1); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry2); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true))); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(original_visits1), 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLsDeletedDetails changes; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes.all_history = false; 89146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Setting expired=true should cause the sync code to ignore this deletion. 89246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) changes.expired = true; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes.rows.push_back(history::URLRow(GURL("http://mine.com"))); 894a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 895a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_DELETED, 897c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLsDeletedDetails>(&changes)); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both URLs should still be there. 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, new_sync_entries.size()); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, ProcessUserChangeRemoveAll) { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits1; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry1(MakeTypedUrlEntry("http://mine.com", "entry", 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits1)); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits2; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow original_entry2(MakeTypedUrlEntry("http://mine2.com", 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "entry2", 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 15, false, 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits2)); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows original_entries; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry1); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(original_entry2); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true))); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(original_visits1), 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, new_sync_entries.size()); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLsDeletedDetails changes; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changes.all_history = true; 934a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 935a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_DELETED, 937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLsDeletedDetails>(&changes)); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, new_sync_entries.size()); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, FailWriteToHistoryBackend) { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector native_visits; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector sync_visits; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow native_entry(MakeTypedUrlEntry("http://native.com", "entry", 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &native_visits)); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow sync_entry(MakeTypedUrlEntry("http://sync.com", "entry", 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 16, false, &sync_visits)); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows native_entries; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_entries.push_back(native_entry); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true))); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetURL(_, _)). 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<1>(native_entry), Return(true))); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(native_visits), Return(true))); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddVisits(_, _, history::SOURCE_SYNCED)).WillRepeatedly(Return(false)); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_entries.push_back(sync_entry); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), UpdateURL(_, _)). 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(Return(false)); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlModelAssociator* associator = 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(base::Bind(&AddTypedUrlEntries, this, sync_entries)); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Errors writing to the DB should be recorded, but should not cause an 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unrecoverable error. 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE( 9731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->data_type_status_table().GetFailedTypes().Has( 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::TYPED_URLS)); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some calls should have succeeded, so the error percentage should be 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // somewhere > 0 and < 100. 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, associator->GetErrorPercentage()); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(100, associator->GetErrorPercentage()); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, FailToGetTypedURLs) { 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector native_visits; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector sync_visits; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow native_entry(MakeTypedUrlEntry("http://native.com", "entry", 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 15, false, &native_visits)); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow sync_entry(MakeTypedUrlEntry("http://sync.com", "entry", 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 16, false, &sync_visits)); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows native_entries; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_entries.push_back(native_entry); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(false))); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows sync_entries; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_entries.push_back(sync_entry); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(error_handler_, CreateAndUploadError(_, _, _)). 998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WillOnce(Return(syncer::SyncError( 999eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 1000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch syncer::SyncError::DATATYPE_ERROR, 1001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "Unit test", 1002eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch syncer::TYPED_URLS))); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(base::Bind(&AddTypedUrlEntries, this, sync_entries)); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Errors getting typed URLs will cause an unrecoverable error (since we can 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // do *nothing* in that case). 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE( 10071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->data_type_status_table().GetFailedTypes().Has( 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::TYPED_URLS)); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ( 10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1u, sync_service_->data_type_status_table().GetFailedTypes().Size()); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can't check GetErrorPercentage(), because generating an unrecoverable 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error will free the model associator. 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1014a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, IgnoreLocalFileURL) { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits; 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create http and file url. 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow url_entry(MakeTypedUrlEntry("http://yey.com", 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "yey", 12, 15, false, 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow file_entry(MakeTypedUrlEntry("file:///kitty.jpg", 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "kitteh", 12, 15, false, 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows original_entries; 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(url_entry); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(file_entry); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<0>(original_entries), 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(original_visits), 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector updated_visits; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create updates for the previous urls + a new file one. 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow updated_url_entry(MakeTypedUrlEntry("http://yey.com", 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "yey", 20, 15, false, 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow updated_file_entry(MakeTypedUrlEntry("file:///cat.jpg", 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cat", 20, 15, false, 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow new_file_entry(MakeTypedUrlEntry("file:///dog.jpg", 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dog", 20, 15, false, 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLsModifiedDetails details; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(updated_url_entry); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(updated_file_entry); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(new_file_entry); 1053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 1054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, 1056c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLsModifiedDetails>(&details)); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should ignore the local file urls (existing and updated), 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and only be left with the updated http url. 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(updated_url_entry, new_sync_entries[0])); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, IgnoreLocalhostURL) { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector original_visits; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create http and localhost url. 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow url_entry(MakeTypedUrlEntry("http://yey.com", 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "yey", 12, 15, false, 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow localhost_entry(MakeTypedUrlEntry("http://localhost", 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "localhost", 12, 15, false, 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows original_entries; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(url_entry); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_entries.push_back(localhost_entry); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<0>(original_entries), 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WillRepeatedly(DoAll(SetArgumentPointee<2>(original_visits), 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(true))); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncService(create_root.callback()); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitVector updated_visits; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the previous entries and add a new localhost. 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow updated_url_entry(MakeTypedUrlEntry("http://yey.com", 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "yey", 20, 15, false, 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &updated_visits)); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow updated_localhost_entry(MakeTypedUrlEntry( 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://localhost:80", 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "localhost", 20, 15, false, 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow localhost_ip_entry(MakeTypedUrlEntry("http://127.0.0.1", 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "localhost", 12, 15, false, 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_visits)); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLsModifiedDetails details; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(updated_url_entry); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(updated_localhost_entry); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.changed_urls.push_back(localhost_ip_entry); 1107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 1108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new ThreadNotifier(history_thread_.get())); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, 1110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::Source<Profile>(profile_), 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<history::URLsModifiedDetails>(&details)); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows new_sync_entries; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should ignore the localhost urls and left only with http url. 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, new_sync_entries.size()); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLsEqual(updated_url_entry, new_sync_entries[0])); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 112046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 112146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ProfileSyncServiceTypedUrlTest, IgnoreModificationWithoutValidVisit) { 112246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). 112346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WillRepeatedly(Return(true)); 112446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). 112546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WillRepeatedly(Return(true)); 112646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 112746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateRootHelper create_root(this, syncer::TYPED_URLS); 112846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) StartSyncService(create_root.callback()); 112946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 113046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) history::VisitVector updated_visits; 113146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) history::URLRow updated_url_entry(MakeTypedUrlEntry("http://yey.com", 113246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "yey", 20, 0, false, 113346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &updated_visits)); 113446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) history::URLsModifiedDetails details; 113546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) details.changed_urls.push_back(updated_url_entry); 113646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<ThreadNotifier> notifier( 113746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new ThreadNotifier(history_thread_.get())); 113846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) notifier->Notify(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, 113946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::Source<Profile>(profile_), 114046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::Details<history::URLsModifiedDetails>(&details)); 114146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 114246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) history::URLRows new_sync_entries; 114346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetTypedUrlsFromSyncDB(&new_sync_entries); 114446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 114546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The change should be ignored. 114646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(0U, new_sync_entries.size()); 114746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 1148