1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "testing/gtest/include/gtest/gtest.h" 6 7 #include "base/callback.h" 8 #include "base/memory/scoped_ptr.h" 9 #include "base/message_loop.h" 10 #include "base/task.h" 11 #include "chrome/browser/sync/glue/theme_data_type_controller.h" 12 #include "chrome/browser/sync/glue/change_processor_mock.h" 13 #include "chrome/browser/sync/glue/model_associator_mock.h" 14 #include "chrome/browser/sync/profile_sync_factory_mock.h" 15 #include "chrome/browser/sync/profile_sync_service_mock.h" 16 #include "chrome/test/profile_mock.h" 17 #include "content/browser/browser_thread.h" 18 19 using browser_sync::ThemeDataTypeController; 20 using browser_sync::ChangeProcessorMock; 21 using browser_sync::DataTypeController; 22 using browser_sync::ModelAssociatorMock; 23 using testing::_; 24 using testing::DoAll; 25 using testing::InvokeWithoutArgs; 26 using testing::Return; 27 using testing::SetArgumentPointee; 28 29 class StartCallback { 30 public: 31 MOCK_METHOD2(Run, void(DataTypeController::StartResult result, 32 const tracked_objects::Location& location)); 33 }; 34 35 class ThemeDataTypeControllerTest : public testing::Test { 36 public: 37 ThemeDataTypeControllerTest() 38 : ui_thread_(BrowserThread::UI, &message_loop_) {} 39 40 virtual void SetUp() { 41 profile_sync_factory_.reset(new ProfileSyncFactoryMock()); 42 theme_dtc_ = 43 new ThemeDataTypeController(profile_sync_factory_.get(), 44 &profile_, &service_); 45 } 46 47 protected: 48 void SetStartExpectations() { 49 model_associator_ = new ModelAssociatorMock(); 50 change_processor_ = new ChangeProcessorMock(); 51 EXPECT_CALL(*profile_sync_factory_, CreateThemeSyncComponents(_, _)). 52 WillOnce(Return(ProfileSyncFactory::SyncComponents(model_associator_, 53 change_processor_))); 54 } 55 56 void SetAssociateExpectations() { 57 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). 58 WillRepeatedly(Return(true)); 59 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 60 WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 61 EXPECT_CALL(*model_associator_, AssociateModels()). 62 WillRepeatedly(Return(true)); 63 } 64 65 void SetActivateExpectations() { 66 EXPECT_CALL(service_, ActivateDataType(_, _)); 67 } 68 69 void SetStopExpectations() { 70 EXPECT_CALL(service_, DeactivateDataType(_, _)); 71 EXPECT_CALL(*model_associator_, DisassociateModels()); 72 } 73 74 MessageLoopForUI message_loop_; 75 BrowserThread ui_thread_; 76 scoped_refptr<ThemeDataTypeController> theme_dtc_; 77 scoped_ptr<ProfileSyncFactoryMock> profile_sync_factory_; 78 ProfileMock profile_; 79 ProfileSyncServiceMock service_; 80 ModelAssociatorMock* model_associator_; 81 ChangeProcessorMock* change_processor_; 82 StartCallback start_callback_; 83 }; 84 85 TEST_F(ThemeDataTypeControllerTest, Start) { 86 SetStartExpectations(); 87 SetAssociateExpectations(); 88 SetActivateExpectations(); 89 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 90 EXPECT_CALL(start_callback_, Run(DataTypeController::OK, _)); 91 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 92 EXPECT_EQ(DataTypeController::RUNNING, theme_dtc_->state()); 93 } 94 95 TEST_F(ThemeDataTypeControllerTest, StartFirstRun) { 96 SetStartExpectations(); 97 SetAssociateExpectations(); 98 SetActivateExpectations(); 99 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 100 WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(true))); 101 EXPECT_CALL(start_callback_, Run(DataTypeController::OK_FIRST_RUN, _)); 102 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 103 } 104 105 TEST_F(ThemeDataTypeControllerTest, StartOk) { 106 SetStartExpectations(); 107 SetAssociateExpectations(); 108 SetActivateExpectations(); 109 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 110 WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 111 112 EXPECT_CALL(start_callback_, Run(DataTypeController::OK, _)); 113 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 114 } 115 116 TEST_F(ThemeDataTypeControllerTest, StartAssociationFailed) { 117 SetStartExpectations(); 118 SetAssociateExpectations(); 119 EXPECT_CALL(*model_associator_, AssociateModels()). 120 WillRepeatedly(Return(false)); 121 122 EXPECT_CALL(start_callback_, Run(DataTypeController::ASSOCIATION_FAILED, _)); 123 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 124 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 125 } 126 127 TEST_F(ThemeDataTypeControllerTest, 128 StartAssociationTriggersUnrecoverableError) { 129 SetStartExpectations(); 130 // Set up association to fail with an unrecoverable error. 131 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). 132 WillRepeatedly(Return(true)); 133 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 134 WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(false))); 135 EXPECT_CALL(start_callback_, Run(DataTypeController::UNRECOVERABLE_ERROR, _)); 136 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 137 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 138 } 139 140 TEST_F(ThemeDataTypeControllerTest, Stop) { 141 SetStartExpectations(); 142 SetAssociateExpectations(); 143 SetActivateExpectations(); 144 SetStopExpectations(); 145 146 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 147 148 EXPECT_CALL(start_callback_, Run(DataTypeController::OK, _)); 149 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 150 EXPECT_EQ(DataTypeController::RUNNING, theme_dtc_->state()); 151 theme_dtc_->Stop(); 152 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 153 } 154 155 // TODO(akalin): Add this test to all the other DTCs. 156 TEST_F(ThemeDataTypeControllerTest, OnUnrecoverableError) { 157 SetStartExpectations(); 158 SetAssociateExpectations(); 159 SetActivateExpectations(); 160 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 161 WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 162 EXPECT_CALL(service_, OnUnrecoverableError(_,_)). 163 WillOnce(InvokeWithoutArgs(theme_dtc_.get(), 164 &ThemeDataTypeController::Stop)); 165 SetStopExpectations(); 166 167 EXPECT_CALL(start_callback_, Run(DataTypeController::OK, _)); 168 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 169 // This should cause theme_dtc_->Stop() to be called. 170 theme_dtc_->OnUnrecoverableError(FROM_HERE, "Test"); 171 } 172