theme_data_type_controller_unittest.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2010 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/message_loop.h" 9#include "base/scoped_ptr.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 19using browser_sync::ThemeDataTypeController; 20using browser_sync::ChangeProcessorMock; 21using browser_sync::DataTypeController; 22using browser_sync::ModelAssociatorMock; 23using testing::_; 24using testing::DoAll; 25using testing::InvokeWithoutArgs; 26using testing::Return; 27using testing::SetArgumentPointee; 28 29class StartCallback { 30 public: 31 MOCK_METHOD1(Run, void(DataTypeController::StartResult result)); 32}; 33 34class ThemeDataTypeControllerTest : public testing::Test { 35 public: 36 ThemeDataTypeControllerTest() 37 : ui_thread_(BrowserThread::UI, &message_loop_) {} 38 39 virtual void SetUp() { 40 profile_sync_factory_.reset(new ProfileSyncFactoryMock()); 41 theme_dtc_ = 42 new ThemeDataTypeController(profile_sync_factory_.get(), 43 &profile_, &service_); 44 } 45 46 protected: 47 void SetStartExpectations() { 48 model_associator_ = new ModelAssociatorMock(); 49 change_processor_ = new ChangeProcessorMock(); 50 EXPECT_CALL(*profile_sync_factory_, CreateThemeSyncComponents(_, _)). 51 WillOnce(Return(ProfileSyncFactory::SyncComponents(model_associator_, 52 change_processor_))); 53 } 54 55 void SetAssociateExpectations() { 56 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 57 WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 58 EXPECT_CALL(*model_associator_, AssociateModels()). 59 WillRepeatedly(Return(true)); 60 } 61 62 void SetActivateExpectations() { 63 EXPECT_CALL(service_, ActivateDataType(_, _)); 64 } 65 66 void SetStopExpectations() { 67 EXPECT_CALL(service_, DeactivateDataType(_, _)); 68 EXPECT_CALL(*model_associator_, DisassociateModels()); 69 } 70 71 MessageLoopForUI message_loop_; 72 BrowserThread ui_thread_; 73 scoped_refptr<ThemeDataTypeController> theme_dtc_; 74 scoped_ptr<ProfileSyncFactoryMock> profile_sync_factory_; 75 ProfileMock profile_; 76 ProfileSyncServiceMock service_; 77 ModelAssociatorMock* model_associator_; 78 ChangeProcessorMock* change_processor_; 79 StartCallback start_callback_; 80}; 81 82TEST_F(ThemeDataTypeControllerTest, Start) { 83 SetStartExpectations(); 84 SetAssociateExpectations(); 85 SetActivateExpectations(); 86 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 87 EXPECT_CALL(start_callback_, Run(DataTypeController::OK)); 88 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 89 EXPECT_EQ(DataTypeController::RUNNING, theme_dtc_->state()); 90} 91 92TEST_F(ThemeDataTypeControllerTest, StartFirstRun) { 93 SetStartExpectations(); 94 SetAssociateExpectations(); 95 SetActivateExpectations(); 96 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 97 WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(true))); 98 EXPECT_CALL(start_callback_, Run(DataTypeController::OK_FIRST_RUN)); 99 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 100} 101 102TEST_F(ThemeDataTypeControllerTest, StartOk) { 103 SetStartExpectations(); 104 SetAssociateExpectations(); 105 SetActivateExpectations(); 106 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 107 WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 108 109 EXPECT_CALL(start_callback_, Run(DataTypeController::OK)); 110 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 111} 112 113TEST_F(ThemeDataTypeControllerTest, StartAssociationFailed) { 114 SetStartExpectations(); 115 SetAssociateExpectations(); 116 EXPECT_CALL(*model_associator_, AssociateModels()). 117 WillRepeatedly(Return(false)); 118 119 EXPECT_CALL(start_callback_, Run(DataTypeController::ASSOCIATION_FAILED)); 120 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 121 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 122} 123 124TEST_F(ThemeDataTypeControllerTest, 125 StartAssociationTriggersUnrecoverableError) { 126 SetStartExpectations(); 127 // Set up association to fail with an unrecoverable error. 128 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 129 WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(false))); 130 EXPECT_CALL(start_callback_, Run(DataTypeController::UNRECOVERABLE_ERROR)); 131 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 132 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 133} 134 135TEST_F(ThemeDataTypeControllerTest, Stop) { 136 SetStartExpectations(); 137 SetAssociateExpectations(); 138 SetActivateExpectations(); 139 SetStopExpectations(); 140 141 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 142 143 EXPECT_CALL(start_callback_, Run(DataTypeController::OK)); 144 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 145 EXPECT_EQ(DataTypeController::RUNNING, theme_dtc_->state()); 146 theme_dtc_->Stop(); 147 EXPECT_EQ(DataTypeController::NOT_RUNNING, theme_dtc_->state()); 148} 149 150// TODO(akalin): Add this test to all the other DTCs. 151TEST_F(ThemeDataTypeControllerTest, OnUnrecoverableError) { 152 SetStartExpectations(); 153 SetAssociateExpectations(); 154 SetActivateExpectations(); 155 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). 156 WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 157 EXPECT_CALL(service_, OnUnrecoverableError(_,_)). 158 WillOnce(InvokeWithoutArgs(theme_dtc_.get(), 159 &ThemeDataTypeController::Stop)); 160 SetStopExpectations(); 161 162 EXPECT_CALL(start_callback_, Run(DataTypeController::OK)); 163 theme_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); 164 // This should cause theme_dtc_->Stop() to be called. 165 theme_dtc_->OnUnrecoverableError(FROM_HERE, "Test"); 166} 167