Index: chrome/browser/sync/glue/data_type_manager_impl2_unittest.cc |
diff --git a/chrome/browser/sync/glue/data_type_manager_impl2_unittest.cc b/chrome/browser/sync/glue/data_type_manager_impl2_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7f05701efbf7bf575eb629cbd920a29b82074499 |
--- /dev/null |
+++ b/chrome/browser/sync/glue/data_type_manager_impl2_unittest.cc |
@@ -0,0 +1,469 @@ |
+// 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 "chrome/browser/sync/glue/data_type_manager_impl2.h" |
+ |
+#include <set> |
+ |
+#include "base/message_loop.h" |
+#include "base/scoped_ptr.h" |
+#include "base/stl_util-inl.h" |
+#include "base/task.h" |
+#include "chrome/browser/browser_thread.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/sync_backend_host_mock.h" |
+#include "chrome/browser/sync/profile_sync_test_util.h" |
+#include "chrome/browser/sync/syncable/model_type.h" |
+#include "chrome/common/notification_details.h" |
+#include "chrome/common/notification_observer_mock.h" |
+#include "chrome/common/notification_registrar.h" |
+#include "chrome/common/notification_service.h" |
+#include "chrome/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::DataTypeManagerImpl2; |
+using browser_sync::DataTypeController; |
+using browser_sync::DataTypeControllerMock; |
+using browser_sync::SyncBackendHostMock; |
+using testing::_; |
+using testing::DoAll; |
+using testing::DoDefault; |
+using testing::InSequence; |
+using testing::Property; |
+using testing::Pointee; |
+using testing::Return; |
+using testing::SaveArg; |
+ |
+ACTION_P(InvokeCallback, callback_result) { |
+ arg0->Run(callback_result); |
+ delete arg0; |
+} |
+ |
+class DataTypeManagerImpl2Test : public testing::Test { |
+ public: |
+ DataTypeManagerImpl2Test() |
+ : ui_thread_(BrowserThread::UI, &message_loop_) {} |
+ |
+ virtual ~DataTypeManagerImpl2Test() { |
+ } |
+ |
+ 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(); |
+ EXPECT_CALL(*dtc, enabled()).WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*dtc, type()).WillRepeatedly(Return(syncable::PASSWORDS)); |
+ EXPECT_CALL(*dtc, name()).WillRepeatedly(Return("passwords")); |
+ return dtc; |
+ } |
+ |
+ 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)))); |
+ } |
+ |
+ MessageLoopForUI message_loop_; |
+ BrowserThread ui_thread_; |
+ DataTypeController::TypeMap controllers_; |
+ SyncBackendHostMock backend_; |
+ NotificationObserverMock observer_; |
+ NotificationRegistrar registrar_; |
+ std::set<syncable::ModelType> types_; |
+}; |
+ |
+TEST_F(DataTypeManagerImpl2Test, NoControllers) { |
+ DataTypeManagerImpl2 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(DataTypeManagerImpl2Test, ConfigureOne) { |
+ DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
+ SetStartStopExpectations(bookmark_dtc); |
+ controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
+ DataTypeManagerImpl2 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(DataTypeManagerImpl2Test, ConfigureOneStopWhileStarting) { |
+ DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
+ SetBusyStartStopExpectations(bookmark_dtc, |
+ DataTypeController::MODEL_STARTING); |
+ controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
+ DataTypeManagerImpl2 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(DataTypeManagerImpl2Test, ConfigureOneStopWhileAssociating) { |
+ DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
+ SetBusyStartStopExpectations(bookmark_dtc, DataTypeController::ASSOCIATING); |
+ controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
+ DataTypeManagerImpl2 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(DataTypeManagerImpl2Test, OneWaitingForCrypto) { |
+ DataTypeControllerMock* password_dtc = MakePasswordDTC(); |
+ EXPECT_CALL(*password_dtc, state()). |
+ WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
+ EXPECT_CALL(*password_dtc, Start(_)). |
+ WillOnce(InvokeCallback((DataTypeController::NEEDS_CRYPTO))); |
+ EXPECT_CALL(*password_dtc, state()). |
+ WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
+ |
+ controllers_[syncable::PASSWORDS] = password_dtc; |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
+ |
+ DataTypeManagerImpl2 dtm(&backend_, controllers_); |
+ types_.insert(syncable::PASSWORDS); |
+ SetConfigureStartExpectation(); |
+ SetConfigureDoneExpectation(DataTypeManager::OK); |
+ dtm.Configure(types_); |
+ EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
+ dtm.Stop(); |
+ EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
+} |
+ |
+TEST_F(DataTypeManagerImpl2Test, 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; |
+ |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(2); |
+ DataTypeManagerImpl2 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(DataTypeManagerImpl2Test, 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; |
+ |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(2); |
+ DataTypeManagerImpl2 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(DataTypeManagerImpl2Test, 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; |
+ |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(2); |
+ DataTypeManagerImpl2 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); |
+ delete callback; |
+ |
+ EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
+ |
+ dtm.Stop(); |
+ EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
+} |
+ |
+TEST_F(DataTypeManagerImpl2Test, 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; |
+ |
+ DataTypeManagerImpl2 dtm(&backend_, controllers_); |
+ SetConfigureStartExpectation(); |
+ SetConfigureDoneExpectation(DataTypeManager::ASSOCIATION_FAILED); |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
+ |
+ types_.insert(syncable::BOOKMARKS); |
+ dtm.Configure(types_); |
+ EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
+} |
+ |
+TEST_F(DataTypeManagerImpl2Test, 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, Stop()).Times(1); |
+ EXPECT_CALL(*preference_dtc, state()). |
+ WillRepeatedly(Return(DataTypeController::NOT_RUNNING)); |
+ controllers_[syncable::PREFERENCES] = preference_dtc; |
+ |
+ DataTypeManagerImpl2 dtm(&backend_, controllers_); |
+ SetConfigureStartExpectation(); |
+ SetConfigureDoneExpectation(DataTypeManager::ABORTED); |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
+ |
+ 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. |
+ dtm.Stop(); |
+ callback->Run(DataTypeController::ABORTED); |
+ delete callback; |
+ EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
+} |
+ |
+TEST_F(DataTypeManagerImpl2Test, 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; |
+ |
+ DataTypeManagerImpl2 dtm(&backend_, controllers_); |
+ SetConfigureStartExpectation(); |
+ SetConfigureDoneExpectation(DataTypeManager::ASSOCIATION_FAILED); |
+ EXPECT_CALL(backend_, ConfigureDataTypes(_, _, _)).Times(1); |
+ |
+ types_.insert(syncable::BOOKMARKS); |
+ types_.insert(syncable::PREFERENCES); |
+ dtm.Configure(types_); |
+ EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
+} |
+ |
+TEST_F(DataTypeManagerImpl2Test, 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; |
+ |
+ DataTypeManagerImpl2 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()); |
+ |
+ 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_); |
+ |
+ // Should now be RESTARTING. |
+ EXPECT_EQ(DataTypeManager::RESTARTING, dtm.state()); |
+ |
+ // Running the task will queue a restart task to the message loop, and |
+ // eventually get us configured. |
+ task->Run(); |
+ delete task; |
+ EXPECT_EQ(DataTypeManager::RESTARTING, dtm.state()); |
+ MessageLoop::current()->RunAllPending(); |
+ EXPECT_EQ(DataTypeManager::CONFIGURED, dtm.state()); |
+ |
+ dtm.Stop(); |
+ EXPECT_EQ(DataTypeManager::STOPPED, dtm.state()); |
+} |
+ |
+TEST_F(DataTypeManagerImpl2Test, StopWhileDownloadPending) { |
+ DataTypeControllerMock* bookmark_dtc = MakeBookmarkDTC(); |
+ SetNotUsedExpectations(bookmark_dtc); |
+ controllers_[syncable::BOOKMARKS] = bookmark_dtc; |
+ |
+ DataTypeManagerImpl2 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)); |
+ |
+ 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; |
+} |