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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/glue/bookmark_data_type_controller.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/prefs/pref_service.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/bookmarks/chrome_bookmark_client.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_mock.h"
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/pref_names.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/profile_mock.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h"
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/refcounted_browser_context_keyed_service.h"
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/sync_driver/change_processor_mock.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_controller_mock.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/model_associator_mock.h"
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/browser_thread.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::BookmarkDataTypeController;
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::ChangeProcessorMock;
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::DataTypeController;
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::ModelAssociatorMock;
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::ModelLoadCallbackMock;
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::StartCallbackMock;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeWithoutArgs;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryMock : public HistoryService {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit HistoryMock(history::HistoryClient* client, Profile* profile)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : HistoryService(client, profile) {}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(BackendLoaded, bool(void));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HistoryMock() {}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)KeyedService* BuildChromeBookmarkClient(content::BrowserContext* context) {
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return new ChromeBookmarkClient(static_cast<Profile*>(context));
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* BuildBookmarkModelWithoutLoading(
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    content::BrowserContext* context) {
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Profile* profile = static_cast<Profile*>(context);
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ChromeBookmarkClient* bookmark_client =
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ChromeBookmarkClientFactory::GetForProfile(profile);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BookmarkModel* bookmark_model = new BookmarkModel(bookmark_client);
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bookmark_client->Init(bookmark_model);
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return bookmark_model;
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)KeyedService* BuildBookmarkModel(content::BrowserContext* context) {
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  BookmarkModel* bookmark_model = static_cast<BookmarkModel*>(
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      BuildBookmarkModelWithoutLoading(context));
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Profile* profile = static_cast<Profile*>(context);
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bookmark_model->Load(profile->GetPrefs(),
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       profile->GetPrefs()->GetString(prefs::kAcceptLanguages),
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       profile->GetPath(),
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       profile->GetIOTaskRunner(),
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       content::BrowserThread::GetMessageLoopProxyForThread(
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           content::BrowserThread::UI));
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return bookmark_model;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* BuildHistoryService(content::BrowserContext* profile) {
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new HistoryMock(NULL, static_cast<Profile*>(profile));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncBookmarkDataTypeControllerTest : public testing::Test {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncBookmarkDataTypeControllerTest()
976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      : thread_bundle_(content::TestBrowserThreadBundle::DEFAULT),
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        service_(&profile_) {}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_associator_ = new ModelAssociatorMock();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    change_processor_ = new ChangeProcessorMock();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service_ = static_cast<HistoryMock*>(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        HistoryServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &profile_, BuildHistoryService));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_sync_factory_.reset(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ProfileSyncComponentsFactoryMock(model_associator_,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             change_processor_));
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bookmark_dtc_ = new BookmarkDataTypeController(profile_sync_factory_.get(),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   &profile_,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   &service_);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum BookmarkLoadPolicy {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DONT_LOAD_MODEL,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOAD_MODEL,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateBookmarkModel(BookmarkLoadPolicy bookmark_load_policy) {
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ChromeBookmarkClientFactory::GetInstance()->SetTestingFactory(
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        &profile_, BuildChromeBookmarkClient);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (bookmark_load_policy == LOAD_MODEL) {
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bookmark_model_ = static_cast<BookmarkModel*>(
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          BookmarkModelFactory::GetInstance()->SetTestingFactoryAndUse(
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              &profile_, BuildBookmarkModel));
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      test::WaitForBookmarkModelToLoad(bookmark_model_);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bookmark_model_ = static_cast<BookmarkModel*>(
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          BookmarkModelFactory::GetInstance()->SetTestingFactoryAndUse(
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              &profile_, BuildBookmarkModelWithoutLoading));
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetStartExpectations() {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*history_service_,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                BackendLoaded()).WillRepeatedly(Return(true));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(model_load_callback_, Run(_, _));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAssociateExpectations() {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()).
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillRepeatedly(Return(true));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*profile_sync_factory_, CreateBookmarkSyncComponents(_, _));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)).
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true)));
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*model_associator_, AssociateModels(_, _)).
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillRepeatedly(Return(syncer::SyncError()));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetStopExpectations() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(service_, DeactivateDataType(_));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*model_associator_, DisassociateModels()).
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                WillOnce(Return(syncer::SyncError()));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Start() {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_dtc_->LoadModels(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&ModelLoadCallbackMock::Run,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&model_load_callback_)));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_dtc_->StartAssociating(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&StartCallbackMock::Run,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(&start_callback_)));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<BookmarkDataTypeController> bookmark_dtc_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ProfileSyncComponentsFactoryMock> profile_sync_factory_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileMock profile_;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BookmarkModel* bookmark_model_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryMock* history_service_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileSyncServiceMock service_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModelAssociatorMock* model_associator_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChangeProcessorMock* change_processor_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartCallbackMock start_callback_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModelLoadCallbackMock model_load_callback_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, StartDependentsReady) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartExpectations();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetAssociateExpectations();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, bookmark_dtc_->state());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(start_callback_, Run(DataTypeController::OK, _, _));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Start();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::RUNNING, bookmark_dtc_->state());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, StartBookmarkModelNotReady) {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(DONT_LOAD_MODEL);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartExpectations();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetAssociateExpectations();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(start_callback_, Run(DataTypeController::OK, _, _));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bookmark_dtc_->LoadModels(
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ModelLoadCallbackMock::Run,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(&model_load_callback_)));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_STARTING, bookmark_dtc_->state());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bookmark_model_->Load(profile_.GetPrefs(),
2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        profile_.GetPrefs()->GetString(prefs::kAcceptLanguages),
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        profile_.GetPath(),
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        profile_.GetIOTaskRunner(),
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        content::BrowserThread::GetMessageLoopProxyForThread(
2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            content::BrowserThread::UI));
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  test::WaitForBookmarkModelToLoad(bookmark_model_);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_LOADED, bookmark_dtc_->state());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_dtc_->StartAssociating(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&StartCallbackMock::Run,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&start_callback_)));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::RUNNING, bookmark_dtc_->state());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, StartHistoryServiceNotReady) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartExpectations();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*history_service_,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              BackendLoaded()).WillRepeatedly(Return(false));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_dtc_->LoadModels(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ModelLoadCallbackMock::Run,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&model_load_callback_)));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_STARTING, bookmark_dtc_->state());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing::Mock::VerifyAndClearExpectations(history_service_);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*history_service_, BackendLoaded()).WillRepeatedly(Return(true));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the notification that the history service has finished loading the db.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_HISTORY_LOADED,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(&profile_),
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_LOADED, bookmark_dtc_->state());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, StartFirstRun) {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartExpectations();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetAssociateExpectations();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)).
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(true)));
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(start_callback_, Run(DataTypeController::OK_FIRST_RUN, _, _));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Start();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, StartBusy) {
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*history_service_, BackendLoaded()).WillRepeatedly(Return(false));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(model_load_callback_, Run(_, _));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_dtc_->LoadModels(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ModelLoadCallbackMock::Run,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&model_load_callback_)));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_dtc_->LoadModels(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ModelLoadCallbackMock::Run,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&model_load_callback_)));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, StartOk) {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartExpectations();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetAssociateExpectations();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)).
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true)));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(start_callback_, Run(DataTypeController::OK, _, _));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Start();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, StartAssociationFailed) {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartExpectations();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up association to fail.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*profile_sync_factory_, CreateBookmarkSyncComponents(_, _));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()).
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(true));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)).
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true)));
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*model_associator_, AssociateModels(_, _)).
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(syncer::SyncError(FROM_HERE,
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                              syncer::SyncError::DATATYPE_ERROR,
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                              "error",
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                              syncer::BOOKMARKS)));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(start_callback_,
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              Run(DataTypeController::ASSOCIATION_FAILED, _, _));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Start();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::DISABLED, bookmark_dtc_->state());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       StartAssociationTriggersUnrecoverableError) {
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartExpectations();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up association to fail with an unrecoverable error.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*profile_sync_factory_, CreateBookmarkSyncComponents(_, _));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()).
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(true));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)).
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(false)));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(start_callback_,
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              Run(DataTypeController::UNRECOVERABLE_ERROR, _, _));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Start();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, bookmark_dtc_->state());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, StartAborted) {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*history_service_, BackendLoaded()).WillRepeatedly(Return(false));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_dtc_->LoadModels(
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ModelLoadCallbackMock::Run,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(&model_load_callback_)));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_dtc_->Stop();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, bookmark_dtc_->state());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SyncBookmarkDataTypeControllerTest, Stop) {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBookmarkModel(LOAD_MODEL);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartExpectations();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetAssociateExpectations();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStopExpectations();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, bookmark_dtc_->state());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(start_callback_, Run(DataTypeController::OK, _, _));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Start();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::RUNNING, bookmark_dtc_->state());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_dtc_->Stop();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DataTypeController::NOT_RUNNING, bookmark_dtc_->state());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
337