Index: chrome/browser/sync/glue/data_type_manager_impl_unittest.cc |
diff --git a/chrome/browser/sync/glue/data_type_manager_impl_unittest.cc b/chrome/browser/sync/glue/data_type_manager_impl_unittest.cc |
index d8d875b612569d5d1e7805191753c1741664f755..7a37f389f077027162703503423aa052c279e162 100644 |
--- a/chrome/browser/sync/glue/data_type_manager_impl_unittest.cc |
+++ b/chrome/browser/sync/glue/data_type_manager_impl_unittest.cc |
@@ -1,688 +1,3 @@ |
// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
- |
-#include <set> |
- |
-#include "base/memory/scoped_ptr.h" |
-#include "base/message_loop.h" |
-#include "base/stl_util-inl.h" |
-#include "base/task.h" |
-#include "chrome/browser/sync/glue/data_type_controller.h" |
-#include "chrome/browser/sync/glue/data_type_controller_mock.h" |
-#include "chrome/browser/sync/glue/data_type_manager_impl.h" |
-#include "chrome/browser/sync/glue/sync_backend_host_mock.h" |
-#include "chrome/browser/sync/profile_sync_test_util.h" |
-#include "chrome/browser/sync/syncable/model_type.h" |
-#include "content/browser/browser_thread.h" |
-#include "content/common/notification_details.h" |
-#include "content/common/notification_observer_mock.h" |
-#include "content/common/notification_registrar.h" |
-#include "content/common/notification_service.h" |
-#include "content/common/notification_type.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using browser_sync::DataTypeManager; |
-using browser_sync::DataTypeManagerImpl; |
-using browser_sync::DataTypeController; |
-using browser_sync::DataTypeControllerMock; |
-using browser_sync::SyncBackendHostMock; |
-using testing::_; |
-using testing::AtLeast; |
-using testing::DoAll; |
-using testing::DoDefault; |
-using testing::InSequence; |
-using testing::Mock; |
-using testing::Property; |
-using testing::Pointee; |
-using testing::Return; |
-using testing::SaveArg; |
- |
-ACTION_P(InvokeCallback, callback_result) { |
- arg0->Run(callback_result, FROM_HERE); |
- delete arg0; |
-} |
- |
-ACTION_P2(InvokeCallbackPointer, callback, argument) { |
- callback->Run(argument, FROM_HERE); |
- delete callback; |
-} |
- |
-class DataTypeManagerImplTest : public testing::Test { |
- public: |
- DataTypeManagerImplTest() |
- : ui_thread_(BrowserThread::UI, &message_loop_) {} |
- |
- virtual ~DataTypeManagerImplTest() { |
- } |
- |
- protected: |
- virtual void SetUp() { |
- registrar_.Add(&observer_, |
- NotificationType::SYNC_CONFIGURE_START, |
- NotificationService::AllSources()); |
- registrar_.Add(&observer_, |
- NotificationType::SYNC_CONFIGURE_DONE, |
- NotificationService::AllSources()); |
- } |
- |
- DataTypeControllerMock* MakeBookmarkDTC() { |
- DataTypeControllerMock* dtc = new DataTypeControllerMock(); |
- EXPECT_CALL(*dtc, enabled()).WillRepeatedly(Return(true)); |
- EXPECT_CALL(*dtc, type()).WillRepeatedly(Return(syncable::BOOKMARKS)); |
- EXPECT_CALL(*dtc, name()).WillRepeatedly(Return("bookmark")); |
- return dtc; |
- } |
- |
- DataTypeControllerMock* MakePreferenceDTC() { |
- DataTypeControllerMock* dtc = new DataTypeControllerMock(); |
- EXPECT_CALL(*dtc, enabled()).WillRepeatedly(Return(true)); |
- EXPECT_CALL(*dtc, type()).WillRepeatedly(Return(syncable::PREFERENCES)); |
- EXPECT_CALL(*dtc, name()).WillRepeatedly(Return("preference")); |
- return dtc; |
- } |
- |
- DataTypeControllerMock* MakePasswordDTC() { |
- DataTypeControllerMock* dtc = new DataTypeControllerMock(); |
- SetPasswordDTCExpectations(dtc); |
- return dtc; |
- } |
- |
- void SetPasswordDTCExpectations(DataTypeControllerMock* dtc) { |
- EXPECT_CALL(*dtc, enabled()).WillRepeatedly(Return(true)); |
- EXPECT_CALL(*dtc, type()).WillRepeatedly(Return(syncable::PASSWORDS)); |
- EXPECT_CALL(*dtc, name()).WillRepeatedly(Return("passwords")); |
- } |
- |
- void SetStartStopExpectations(DataTypeControllerMock* mock_dtc) { |
- InSequence seq; |
- EXPECT_CALL(*mock_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- EXPECT_CALL(*mock_dtc, Start(_)). |
- WillOnce(InvokeCallback((DataTypeController::OK))); |
- EXPECT_CALL(*mock_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::RUNNING)); |
- EXPECT_CALL(*mock_dtc, Stop()).Times(1); |
- EXPECT_CALL(*mock_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- } |
- |
- void SetBusyStartStopExpectations(DataTypeControllerMock* mock_dtc, |
- DataTypeController::State busy_state) { |
- InSequence seq; |
- EXPECT_CALL(*mock_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- EXPECT_CALL(*mock_dtc, Start(_)). |
- WillOnce(InvokeCallback((DataTypeController::OK))); |
- EXPECT_CALL(*mock_dtc, state()). |
- WillRepeatedly(Return(busy_state)); |
- EXPECT_CALL(*mock_dtc, Stop()).Times(1); |
- EXPECT_CALL(*mock_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- } |
- |
- void SetNotUsedExpectations(DataTypeControllerMock* mock_dtc) { |
- EXPECT_CALL(*mock_dtc, Start(_)).Times(0); |
- EXPECT_CALL(*mock_dtc, Stop()).Times(0); |
- EXPECT_CALL(*mock_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- } |
- |
- void SetConfigureStartExpectation() { |
- EXPECT_CALL( |
- observer_, |
- Observe(NotificationType(NotificationType::SYNC_CONFIGURE_START), |
- _, _)); |
- } |
- |
- void SetConfigureDoneExpectation(DataTypeManager::ConfigureResult result) { |
- EXPECT_CALL( |
- observer_, |
- Observe(NotificationType(NotificationType::SYNC_CONFIGURE_DONE), _, |
- Property(&Details<DataTypeManager::ConfigureResult>::ptr, |
- Pointee(result)))); |
- } |
- |
- void SetBackendExpectations(int times) { |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(times); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(times); |
- EXPECT_CALL(backend_, RequestPause()).Times(times); |
- EXPECT_CALL(backend_, RequestResume()).Times(times); |
- } |
- |
- MessageLoopForUI message_loop_; |
- BrowserThread ui_thread_; |
- DataTypeController::TypeMap controllers_; |
- SyncBackendHostMock backend_; |
- NotificationObserverMock observer_; |
- NotificationRegistrar registrar_; |
- std::set<syncable::ModelType> types_; |
-}; |
- |
-TEST_F(DataTypeManagerImplTest, NoControllers) { |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureOne) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- SetBackendExpectations(1); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::BOOKMARKS); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureOneStopWhileStarting) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetBusyStartStopExpectations(bookmark_dtc, |
- DataTypeController::MODEL_STARTING); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- SetBackendExpectations(1); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::BOOKMARKS); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureOneStopWhileAssociating) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetBusyStartStopExpectations(bookmark_dtc, DataTypeController::ASSOCIATING); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- SetBackendExpectations(1); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::BOOKMARKS); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, OneWaitingForCrypto) { |
- DataTypeControllerMock* password_dtc = MakePasswordDTC(); |
- EXPECT_CALL(*password_dtc, state()).Times(AtLeast(2)). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- EXPECT_CALL(*password_dtc, Start(_)). |
- WillOnce(InvokeCallback((DataTypeController::NEEDS_CRYPTO))); |
- |
- controllers_[syncable::PASSWORDS] = password_dtc; |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- EXPECT_CALL(backend_, RequestPause()).Times(1); |
- |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::PASSWORDS); |
- SetConfigureStartExpectation(); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::BLOCKED, dtm.state()); |
- |
- Mock::VerifyAndClearExpectations(&backend_); |
- Mock::VerifyAndClearExpectations(&observer_); |
- Mock::VerifyAndClearExpectations(password_dtc); |
- |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- SetPasswordDTCExpectations(password_dtc); |
- EXPECT_CALL(*password_dtc, state()). |
- WillOnce(Return(DataTypeController::NOT_RUNNING)). |
- WillRepeatedly(Return(DataTypeController::RUNNING)); |
- EXPECT_CALL(*password_dtc, Start(_)). |
- WillOnce(InvokeCallback((DataTypeController::OK))); |
- |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- EXPECT_CALL(backend_, RequestResume()).Times(1); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- EXPECT_CALL(*password_dtc, Stop()).Times(1); |
- dtm.Stop(); |
- |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureOneThenAnother) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- DataTypeControllerMock* preference_dtc = MakePreferenceDTC(); |
- SetStartStopExpectations(preference_dtc); |
- controllers_[syncable::PREFERENCES] = preference_dtc; |
- |
- SetBackendExpectations(2); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::BOOKMARKS); |
- |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- |
- types_.insert(syncable::PREFERENCES); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureOneThenSwitch) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- DataTypeControllerMock* preference_dtc = MakePreferenceDTC(); |
- SetStartStopExpectations(preference_dtc); |
- controllers_[syncable::PREFERENCES] = preference_dtc; |
- |
- SetBackendExpectations(2); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::BOOKMARKS); |
- |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- |
- types_.clear(); |
- types_.insert(syncable::PREFERENCES); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureWhileOneInFlight) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- // Save the callback here so we can interrupt startup. |
- DataTypeController::StartCallback* callback; |
- { |
- InSequence seq; |
- EXPECT_CALL(*bookmark_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- EXPECT_CALL(*bookmark_dtc, Start(_)). |
- WillOnce(SaveArg<0>(&callback)); |
- EXPECT_CALL(*bookmark_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::RUNNING)); |
- EXPECT_CALL(*bookmark_dtc, Stop()).Times(1); |
- EXPECT_CALL(*bookmark_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- } |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- DataTypeControllerMock* preference_dtc = MakePreferenceDTC(); |
- SetStartStopExpectations(preference_dtc); |
- controllers_[syncable::PREFERENCES] = preference_dtc; |
- |
- // Request/Resume only called once due to the configures being inlined. |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(2); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(2); |
- EXPECT_CALL(backend_, RequestPause()).Times(1); |
- EXPECT_CALL(backend_, RequestResume()).Times(1); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::BOOKMARKS); |
- |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- |
- // At this point, the bookmarks dtc should be in flight. Add |
- // preferences and continue starting bookmarks. |
- types_.insert(syncable::PREFERENCES); |
- dtm.Configure(types_); |
- callback->Run(DataTypeController::OK, FROM_HERE); |
- delete callback; |
- |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureWhilePausePending) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- DataTypeControllerMock* preference_dtc = MakePreferenceDTC(); |
- SetStartStopExpectations(preference_dtc); |
- controllers_[syncable::PREFERENCES] = preference_dtc; |
- |
- // Don't notify the first time pause is called. |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(2); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(2); |
- EXPECT_CALL(backend_, RequestPause()). |
- WillOnce(Return(true)); |
- EXPECT_CALL(backend_, RequestResume()).Times(1); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::BOOKMARKS); |
- |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::PAUSE_PENDING, dtm.state()); |
- |
- // Configure while pause pending. |
- types_.insert(syncable::PREFERENCES); |
- dtm.Configure(types_); |
- |
- // Send the SYNC_PAUSED notification. This will allow the DTM to |
- // wake up and restart itself with the new configuration. |
- NotificationService::current()->Notify(NotificationType::SYNC_PAUSED, |
- NotificationService::AllSources(), |
- NotificationService::NoDetails()); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, StopWhilePausePending) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetNotUsedExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- // Never notify when RequestPause is called. |
- EXPECT_CALL(backend_, RequestPause()).WillOnce(Return(true)); |
- EXPECT_CALL(backend_, RequestResume()).Times(0); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::ABORTED); |
- types_.insert(syncable::BOOKMARKS); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::PAUSE_PENDING, dtm.state()); |
- |
- // Stop while pause pending. |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
- |
- // We should be able to safely handle a SYNC_PAUSED notification. |
- NotificationService::current()->Notify(NotificationType::SYNC_PAUSED, |
- NotificationService::AllSources(), |
- NotificationService::NoDetails()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureWhileResumePending) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- DataTypeControllerMock* preference_dtc = MakePreferenceDTC(); |
- SetStartStopExpectations(preference_dtc); |
- controllers_[syncable::PREFERENCES] = preference_dtc; |
- |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(2); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(2); |
- EXPECT_CALL(backend_, RequestPause()).Times(2); |
- // Don't notify the first time resume is called. |
- EXPECT_CALL(backend_, RequestResume()). |
- WillOnce(Return(true)). |
- WillOnce(DoDefault()); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- types_.insert(syncable::BOOKMARKS); |
- |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::RESUME_PENDING, dtm.state()); |
- |
- // Configure while resume pending. |
- types_.insert(syncable::PREFERENCES); |
- dtm.Configure(types_); |
- |
- // Send the SYNC_PAUSED notification. This will allow the DTM to |
- // wake up and restart itself with the new configuration. |
- NotificationService::current()->Notify(NotificationType::SYNC_RESUMED, |
- NotificationService::AllSources(), |
- NotificationService::NoDetails()); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, StopWhileResumePending) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- EXPECT_CALL(backend_, RequestPause()).Times(1); |
- // Never notify pause resumed. |
- EXPECT_CALL(backend_, RequestResume()).WillOnce(Return(true)); |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::ABORTED); |
- types_.insert(syncable::BOOKMARKS); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::RESUME_PENDING, dtm.state()); |
- |
- // Stop while pause pending. |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
- |
- // We should be able to safely handle a SYNC_RESUMED notification. |
- NotificationService::current()->Notify(NotificationType::SYNC_RESUMED, |
- NotificationService::AllSources(), |
- NotificationService::NoDetails()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, OneFailingController) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- EXPECT_CALL(*bookmark_dtc, Start(_)). |
- WillOnce(InvokeCallback((DataTypeController::ASSOCIATION_FAILED))); |
- EXPECT_CALL(*bookmark_dtc, Stop()).Times(0); |
- EXPECT_CALL(*bookmark_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::ASSOCIATION_FAILED); |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- EXPECT_CALL(backend_, RequestPause()).Times(1); |
- EXPECT_CALL(backend_, RequestResume()).Times(0); |
- |
- types_.insert(syncable::BOOKMARKS); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, StopWhileInFlight) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- DataTypeControllerMock* preference_dtc = MakePreferenceDTC(); |
- // Save the callback here so we can interrupt startup. |
- DataTypeController::StartCallback* callback; |
- EXPECT_CALL(*preference_dtc, Start(_)). |
- WillOnce(SaveArg<0>(&callback)); |
- EXPECT_CALL(*preference_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- controllers_[syncable::PREFERENCES] = preference_dtc; |
- |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::ABORTED); |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- EXPECT_CALL(backend_, RequestPause()).Times(1); |
- EXPECT_CALL(backend_, RequestResume()).Times(0); |
- |
- types_.insert(syncable::BOOKMARKS); |
- types_.insert(syncable::PREFERENCES); |
- dtm.Configure(types_); |
- // Configure should stop in the CONFIGURING state because we are |
- // waiting for the preferences callback to be invoked. |
- EXPECT_EQ(DataTypeManager::CONFIGURING, dtm.state()); |
- |
- // Call stop before the preference callback is invoked. |
- EXPECT_CALL(*preference_dtc, Stop()). |
- WillOnce(InvokeCallbackPointer(callback, DataTypeController::ABORTED)); |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, SecondControllerFails) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- DataTypeControllerMock* preference_dtc = MakePreferenceDTC(); |
- EXPECT_CALL(*preference_dtc, Start(_)). |
- WillOnce(InvokeCallback((DataTypeController::ASSOCIATION_FAILED))); |
- EXPECT_CALL(*preference_dtc, Stop()).Times(0); |
- EXPECT_CALL(*preference_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- controllers_[syncable::PREFERENCES] = preference_dtc; |
- |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::ASSOCIATION_FAILED); |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- EXPECT_CALL(backend_, RequestPause()).Times(1); |
- EXPECT_CALL(backend_, RequestResume()).Times(0); |
- |
- types_.insert(syncable::BOOKMARKS); |
- types_.insert(syncable::PREFERENCES); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, PauseFailed) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- EXPECT_CALL(*bookmark_dtc, Start(_)).Times(0); |
- EXPECT_CALL(*bookmark_dtc, state()). |
- WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::UNRECOVERABLE_ERROR); |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- EXPECT_CALL(backend_, RequestPause()).WillOnce(Return(false)); |
- EXPECT_CALL(backend_, RequestResume()).Times(0); |
- |
- types_.insert(syncable::BOOKMARKS); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ResumeFailed) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::UNRECOVERABLE_ERROR); |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(1); |
- EXPECT_CALL(backend_, RequestPause()).Times(1); |
- EXPECT_CALL(backend_, RequestResume()).WillOnce(Return(false)); |
- |
- types_.insert(syncable::BOOKMARKS); |
- dtm.Configure(types_); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, ConfigureWhileDownloadPending) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetStartStopExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- DataTypeControllerMock* preference_dtc = MakePreferenceDTC(); |
- SetStartStopExpectations(preference_dtc); |
- controllers_[syncable::PREFERENCES] = preference_dtc; |
- |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::OK); |
- CancelableTask* task; |
- // Grab the task the first time this is called so we can configure |
- // before it is finished. |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)). |
- WillOnce(SaveArg<2>(&task)). |
- WillOnce(DoDefault()); |
- EXPECT_CALL(backend_, StartSyncingWithServer()).Times(2); |
- EXPECT_CALL(backend_, RequestPause()).Times(1); |
- EXPECT_CALL(backend_, RequestResume()).Times(1); |
- |
- types_.insert(syncable::BOOKMARKS); |
- dtm.Configure(types_); |
- // Configure should stop in the DOWNLOAD_PENDING state because we |
- // are waiting for the download ready task to be run. |
- EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm.state()); |
- |
- types_.insert(syncable::PREFERENCES); |
- dtm.Configure(types_); |
- |
- // Running the task will queue a restart task to the message loop, and |
- // eventually get us configured. |
- task->Run(); |
- delete task; |
- MessageLoop::current()->RunAllPending(); |
- EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
- |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
-} |
- |
-TEST_F(DataTypeManagerImplTest, StopWhileDownloadPending) { |
- DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
- SetNotUsedExpectations(bookmark_dtc); |
- controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
- |
- DataTypeManagerImpl dtm(&backend_, controllers_); |
- SetConfigureStartExpectation(); |
- SetConfigureDoneExpectation(DataTypeManager::ABORTED); |
- CancelableTask* task; |
- // Grab the task the first time this is called so we can stop |
- // before it is finished. |
- EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)). |
- WillOnce(SaveArg<2>(&task)); |
- EXPECT_CALL(backend_, StartSyncingWithServer()); |
- EXPECT_CALL(backend_, RequestPause()).Times(0); |
- EXPECT_CALL(backend_, RequestResume()).Times(0); |
- |
- types_.insert(syncable::BOOKMARKS); |
- dtm.Configure(types_); |
- // Configure should stop in the DOWNLOAD_PENDING state because we |
- // are waiting for the download ready task to be run. |
- EXPECT_EQ(DataTypeManager::DOWNLOAD_PENDING, dtm.state()); |
- |
- dtm.Stop(); |
- EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
- |
- // It should be perfectly safe to run this task even though the DTM |
- // has been stopped. |
- task->Run(); |
- delete task; |
-} |