Home | History | Annotate | Download | only in glue
      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