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