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