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