OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "testing/gtest/include/gtest/gtest.h" | 5 #include "testing/gtest/include/gtest/gtest.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 &service_, | 127 &service_, |
128 dtc_mock_.get()); | 128 dtc_mock_.get()); |
129 } | 129 } |
130 | 130 |
131 virtual void TearDown() { | 131 virtual void TearDown() { |
132 db_thread_.Stop(); | 132 db_thread_.Stop(); |
133 } | 133 } |
134 | 134 |
135 protected: | 135 protected: |
136 void SetStartExpectations() { | 136 void SetStartExpectations() { |
137 EXPECT_CALL(*dtc_mock_, StartModels()).WillOnce(Return(true)); | 137 EXPECT_CALL(*dtc_mock_.get(), StartModels()).WillOnce(Return(true)); |
138 EXPECT_CALL(model_load_callback_, Run(_, _)); | 138 EXPECT_CALL(model_load_callback_, Run(_, _)); |
139 model_associator_ = new ModelAssociatorMock(); | 139 model_associator_ = new ModelAssociatorMock(); |
140 change_processor_ = new ChangeProcessorMock(); | 140 change_processor_ = new ChangeProcessorMock(); |
141 EXPECT_CALL(*profile_sync_factory_, CreateBookmarkSyncComponents(_, _)). | 141 EXPECT_CALL(*profile_sync_factory_, CreateBookmarkSyncComponents(_, _)). |
142 WillOnce(Return(ProfileSyncComponentsFactory::SyncComponents( | 142 WillOnce(Return(ProfileSyncComponentsFactory::SyncComponents( |
143 model_associator_, change_processor_))); | 143 model_associator_, change_processor_))); |
144 } | 144 } |
145 | 145 |
146 void SetAssociateExpectations() { | 146 void SetAssociateExpectations() { |
147 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). | 147 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). |
148 WillOnce(Return(true)); | 148 WillOnce(Return(true)); |
149 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). | 149 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). |
150 WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true))); | 150 WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true))); |
151 EXPECT_CALL(*model_associator_, AssociateModels()). | 151 EXPECT_CALL(*model_associator_, AssociateModels()). |
152 WillOnce(Return(syncer::SyncError())); | 152 WillOnce(Return(syncer::SyncError())); |
153 EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); | 153 EXPECT_CALL(*dtc_mock_.get(), RecordAssociationTime(_)); |
154 } | 154 } |
155 | 155 |
156 void SetActivateExpectations(DataTypeController::StartResult result) { | 156 void SetActivateExpectations(DataTypeController::StartResult result) { |
157 EXPECT_CALL(service_, ActivateDataType(_, _, _)); | 157 EXPECT_CALL(service_, ActivateDataType(_, _, _)); |
158 EXPECT_CALL(start_callback_, Run(result,_)); | 158 EXPECT_CALL(start_callback_, Run(result,_)); |
159 } | 159 } |
160 | 160 |
161 void SetStopExpectations() { | 161 void SetStopExpectations() { |
162 EXPECT_CALL(*dtc_mock_, StopModels()); | 162 EXPECT_CALL(*dtc_mock_.get(), StopModels()); |
163 EXPECT_CALL(service_, DeactivateDataType(_)); | 163 EXPECT_CALL(service_, DeactivateDataType(_)); |
164 EXPECT_CALL(*model_associator_, DisassociateModels()). | 164 EXPECT_CALL(*model_associator_, DisassociateModels()). |
165 WillOnce(Return(syncer::SyncError())); | 165 WillOnce(Return(syncer::SyncError())); |
166 } | 166 } |
167 | 167 |
168 void SetStartFailExpectations(DataTypeController::StartResult result) { | 168 void SetStartFailExpectations(DataTypeController::StartResult result) { |
169 EXPECT_CALL(*dtc_mock_, StopModels()); | 169 EXPECT_CALL(*dtc_mock_.get(), StopModels()); |
170 if (DataTypeController::IsUnrecoverableResult(result)) | 170 if (DataTypeController::IsUnrecoverableResult(result)) |
171 EXPECT_CALL(*dtc_mock_, RecordUnrecoverableError(_, _)); | 171 EXPECT_CALL(*dtc_mock_.get(), RecordUnrecoverableError(_, _)); |
172 if (model_associator_) { | 172 if (model_associator_) { |
173 EXPECT_CALL(*model_associator_, DisassociateModels()). | 173 EXPECT_CALL(*model_associator_, DisassociateModels()). |
174 WillOnce(Return(syncer::SyncError())); | 174 WillOnce(Return(syncer::SyncError())); |
175 } | 175 } |
176 EXPECT_CALL(*dtc_mock_, RecordStartFailure(result)); | 176 EXPECT_CALL(*dtc_mock_.get(), RecordStartFailure(result)); |
177 EXPECT_CALL(start_callback_, Run(result,_)); | 177 EXPECT_CALL(start_callback_, Run(result,_)); |
178 } | 178 } |
179 | 179 |
180 static void SignalDone(WaitableEvent* done) { | 180 static void SignalDone(WaitableEvent* done) { |
181 done->Signal(); | 181 done->Signal(); |
182 } | 182 } |
183 | 183 |
184 void WaitForDTC() { | 184 void WaitForDTC() { |
185 WaitableEvent done(true, false); | 185 WaitableEvent done(true, false); |
186 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 186 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 } | 226 } |
227 | 227 |
228 TEST_F(SyncNonFrontendDataTypeControllerTest, StartFirstRun) { | 228 TEST_F(SyncNonFrontendDataTypeControllerTest, StartFirstRun) { |
229 SetStartExpectations(); | 229 SetStartExpectations(); |
230 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). | 230 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). |
231 WillOnce(Return(true)); | 231 WillOnce(Return(true)); |
232 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). | 232 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). |
233 WillOnce(DoAll(SetArgumentPointee<0>(false), Return(true))); | 233 WillOnce(DoAll(SetArgumentPointee<0>(false), Return(true))); |
234 EXPECT_CALL(*model_associator_, AssociateModels()). | 234 EXPECT_CALL(*model_associator_, AssociateModels()). |
235 WillOnce(Return(syncer::SyncError())); | 235 WillOnce(Return(syncer::SyncError())); |
236 EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); | 236 EXPECT_CALL(*dtc_mock_.get(), RecordAssociationTime(_)); |
237 SetActivateExpectations(DataTypeController::OK_FIRST_RUN); | 237 SetActivateExpectations(DataTypeController::OK_FIRST_RUN); |
238 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 238 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
239 Start(); | 239 Start(); |
240 WaitForDTC(); | 240 WaitForDTC(); |
241 EXPECT_EQ(DataTypeController::RUNNING, non_frontend_dtc_->state()); | 241 EXPECT_EQ(DataTypeController::RUNNING, non_frontend_dtc_->state()); |
242 } | 242 } |
243 | 243 |
244 TEST_F(SyncNonFrontendDataTypeControllerTest, StartAssociationFailed) { | 244 TEST_F(SyncNonFrontendDataTypeControllerTest, StartAssociationFailed) { |
245 SetStartExpectations(); | 245 SetStartExpectations(); |
246 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). | 246 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). |
247 WillOnce(Return(true)); | 247 WillOnce(Return(true)); |
248 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). | 248 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). |
249 WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true))); | 249 WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true))); |
250 EXPECT_CALL(*model_associator_, AssociateModels()). | 250 EXPECT_CALL(*model_associator_, AssociateModels()). |
251 WillOnce( | 251 WillOnce( |
252 Return(syncer::SyncError(FROM_HERE, "Error", syncer::AUTOFILL))); | 252 Return(syncer::SyncError(FROM_HERE, "Error", syncer::AUTOFILL))); |
253 EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); | 253 EXPECT_CALL(*dtc_mock_.get(), RecordAssociationTime(_)); |
254 SetStartFailExpectations(DataTypeController::ASSOCIATION_FAILED); | 254 SetStartFailExpectations(DataTypeController::ASSOCIATION_FAILED); |
255 // Set up association to fail with an association failed error. | 255 // Set up association to fail with an association failed error. |
256 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 256 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
257 Start(); | 257 Start(); |
258 WaitForDTC(); | 258 WaitForDTC(); |
259 EXPECT_EQ(DataTypeController::DISABLED, non_frontend_dtc_->state()); | 259 EXPECT_EQ(DataTypeController::DISABLED, non_frontend_dtc_->state()); |
260 } | 260 } |
261 | 261 |
262 TEST_F(SyncNonFrontendDataTypeControllerTest, | 262 TEST_F(SyncNonFrontendDataTypeControllerTest, |
263 StartAssociationTriggersUnrecoverableError) { | 263 StartAssociationTriggersUnrecoverableError) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). | 298 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). |
299 WillOnce(DoAll( | 299 WillOnce(DoAll( |
300 SignalEvent(&wait_for_db_thread_pause), | 300 SignalEvent(&wait_for_db_thread_pause), |
301 WaitOnEvent(&pause_db_thread), | 301 WaitOnEvent(&pause_db_thread), |
302 SetArgumentPointee<0>(true), | 302 SetArgumentPointee<0>(true), |
303 Return(true))); | 303 Return(true))); |
304 EXPECT_CALL(*model_associator_, AbortAssociation()).WillOnce( | 304 EXPECT_CALL(*model_associator_, AbortAssociation()).WillOnce( |
305 SignalEvent(&pause_db_thread)); | 305 SignalEvent(&pause_db_thread)); |
306 EXPECT_CALL(*model_associator_, AssociateModels()). | 306 EXPECT_CALL(*model_associator_, AssociateModels()). |
307 WillOnce(Return(syncer::SyncError())); | 307 WillOnce(Return(syncer::SyncError())); |
308 EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); | 308 EXPECT_CALL(*dtc_mock_.get(), RecordAssociationTime(_)); |
309 EXPECT_CALL(service_, ActivateDataType(_, _, _)); | 309 EXPECT_CALL(service_, ActivateDataType(_, _, _)); |
310 EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_)); | 310 EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_)); |
311 EXPECT_CALL(*dtc_mock_, RecordStartFailure(DataTypeController::ABORTED)); | 311 EXPECT_CALL( |
| 312 *dtc_mock_.get(), RecordStartFailure(DataTypeController::ABORTED)); |
312 SetStopExpectations(); | 313 SetStopExpectations(); |
313 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 314 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
314 Start(); | 315 Start(); |
315 wait_for_db_thread_pause.Wait(); | 316 wait_for_db_thread_pause.Wait(); |
316 non_frontend_dtc_->Stop(); | 317 non_frontend_dtc_->Stop(); |
317 WaitForDTC(); | 318 WaitForDTC(); |
318 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 319 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
319 } | 320 } |
320 | 321 |
321 // Same as above but abort during the Activate call. | 322 // Same as above but abort during the Activate call. |
322 TEST_F(SyncNonFrontendDataTypeControllerTest, AbortDuringAssociationActivated) { | 323 TEST_F(SyncNonFrontendDataTypeControllerTest, AbortDuringAssociationActivated) { |
323 WaitableEvent wait_for_db_thread_pause(false, false); | 324 WaitableEvent wait_for_db_thread_pause(false, false); |
324 WaitableEvent pause_db_thread(false, false); | 325 WaitableEvent pause_db_thread(false, false); |
325 | 326 |
326 SetStartExpectations(); | 327 SetStartExpectations(); |
327 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). | 328 EXPECT_CALL(*model_associator_, CryptoReadyIfNecessary()). |
328 WillOnce(Return(true)); | 329 WillOnce(Return(true)); |
329 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). | 330 EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes(_)). |
330 WillOnce(DoAll( | 331 WillOnce(DoAll( |
331 SetArgumentPointee<0>(true), | 332 SetArgumentPointee<0>(true), |
332 Return(true))); | 333 Return(true))); |
333 EXPECT_CALL(*model_associator_, AbortAssociation()).WillOnce( | 334 EXPECT_CALL(*model_associator_, AbortAssociation()).WillOnce( |
334 SignalEvent(&pause_db_thread)); | 335 SignalEvent(&pause_db_thread)); |
335 EXPECT_CALL(*model_associator_, AssociateModels()). | 336 EXPECT_CALL(*model_associator_, AssociateModels()). |
336 WillOnce(Return(syncer::SyncError())); | 337 WillOnce(Return(syncer::SyncError())); |
337 EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); | 338 EXPECT_CALL(*dtc_mock_.get(), RecordAssociationTime(_)); |
338 EXPECT_CALL(service_, ActivateDataType(_, _, _)).WillOnce(DoAll( | 339 EXPECT_CALL(service_, ActivateDataType(_, _, _)).WillOnce(DoAll( |
339 SignalEvent(&wait_for_db_thread_pause), | 340 SignalEvent(&wait_for_db_thread_pause), |
340 WaitOnEvent(&pause_db_thread))); | 341 WaitOnEvent(&pause_db_thread))); |
341 EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_)); | 342 EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_)); |
342 EXPECT_CALL(*dtc_mock_, RecordStartFailure(DataTypeController::ABORTED)); | 343 EXPECT_CALL( |
| 344 *dtc_mock_.get(), RecordStartFailure(DataTypeController::ABORTED)); |
343 SetStopExpectations(); | 345 SetStopExpectations(); |
344 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 346 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
345 Start(); | 347 Start(); |
346 wait_for_db_thread_pause.Wait(); | 348 wait_for_db_thread_pause.Wait(); |
347 non_frontend_dtc_->Stop(); | 349 non_frontend_dtc_->Stop(); |
348 WaitForDTC(); | 350 WaitForDTC(); |
349 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 351 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
350 } | 352 } |
351 | 353 |
352 TEST_F(SyncNonFrontendDataTypeControllerTest, Stop) { | 354 TEST_F(SyncNonFrontendDataTypeControllerTest, Stop) { |
353 SetStartExpectations(); | 355 SetStartExpectations(); |
354 SetAssociateExpectations(); | 356 SetAssociateExpectations(); |
355 SetActivateExpectations(DataTypeController::OK); | 357 SetActivateExpectations(DataTypeController::OK); |
356 SetStopExpectations(); | 358 SetStopExpectations(); |
357 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 359 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
358 Start(); | 360 Start(); |
359 WaitForDTC(); | 361 WaitForDTC(); |
360 EXPECT_EQ(DataTypeController::RUNNING, non_frontend_dtc_->state()); | 362 EXPECT_EQ(DataTypeController::RUNNING, non_frontend_dtc_->state()); |
361 non_frontend_dtc_->Stop(); | 363 non_frontend_dtc_->Stop(); |
362 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 364 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
363 } | 365 } |
364 | 366 |
365 TEST_F(SyncNonFrontendDataTypeControllerTest, | 367 TEST_F(SyncNonFrontendDataTypeControllerTest, |
366 OnSingleDatatypeUnrecoverableError) { | 368 OnSingleDatatypeUnrecoverableError) { |
367 SetStartExpectations(); | 369 SetStartExpectations(); |
368 SetAssociateExpectations(); | 370 SetAssociateExpectations(); |
369 SetActivateExpectations(DataTypeController::OK); | 371 SetActivateExpectations(DataTypeController::OK); |
370 EXPECT_CALL(*dtc_mock_, RecordUnrecoverableError(_, "Test")); | 372 EXPECT_CALL(*dtc_mock_.get(), RecordUnrecoverableError(_, "Test")); |
371 EXPECT_CALL(service_, DisableBrokenDatatype(_,_,_)).WillOnce( | 373 EXPECT_CALL(service_, DisableBrokenDatatype(_,_,_)).WillOnce( |
372 InvokeWithoutArgs(non_frontend_dtc_.get(), | 374 InvokeWithoutArgs(non_frontend_dtc_.get(), |
373 &NonFrontendDataTypeController::Stop)); | 375 &NonFrontendDataTypeController::Stop)); |
374 SetStopExpectations(); | 376 SetStopExpectations(); |
375 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 377 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
376 Start(); | 378 Start(); |
377 WaitForDTC(); | 379 WaitForDTC(); |
378 EXPECT_EQ(DataTypeController::RUNNING, non_frontend_dtc_->state()); | 380 EXPECT_EQ(DataTypeController::RUNNING, non_frontend_dtc_->state()); |
379 // This should cause non_frontend_dtc_->Stop() to be called. | 381 // This should cause non_frontend_dtc_->Stop() to be called. |
380 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, base::Bind( | 382 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, base::Bind( |
381 &NonFrontendDataTypeControllerFake::OnSingleDatatypeUnrecoverableError, | 383 &NonFrontendDataTypeControllerFake::OnSingleDatatypeUnrecoverableError, |
382 non_frontend_dtc_.get(), | 384 non_frontend_dtc_.get(), |
383 FROM_HERE, | 385 FROM_HERE, |
384 std::string("Test"))); | 386 std::string("Test"))); |
385 WaitForDTC(); | 387 WaitForDTC(); |
386 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); | 388 EXPECT_EQ(DataTypeController::NOT_RUNNING, non_frontend_dtc_->state()); |
387 } | 389 } |
OLD | NEW |