| Index: components/sync/driver/non_ui_data_type_controller_unittest.cc
|
| diff --git a/components/sync/driver/non_ui_data_type_controller_unittest.cc b/components/sync/driver/non_ui_data_type_controller_unittest.cc
|
| deleted file mode 100644
|
| index f03f79affd7c891bfe7e6b50dbce4e3251985dcf..0000000000000000000000000000000000000000
|
| --- a/components/sync/driver/non_ui_data_type_controller_unittest.cc
|
| +++ /dev/null
|
| @@ -1,480 +0,0 @@
|
| -// Copyright 2014 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 "components/sync/driver/non_ui_data_type_controller.h"
|
| -
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/callback.h"
|
| -#include "base/location.h"
|
| -#include "base/macros.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "base/test/test_timeouts.h"
|
| -#include "base/threading/thread.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#include "base/tracked_objects.h"
|
| -#include "components/sync/driver/data_type_controller_mock.h"
|
| -#include "components/sync/driver/fake_sync_client.h"
|
| -#include "components/sync/driver/generic_change_processor_factory.h"
|
| -#include "components/sync/driver/non_ui_data_type_controller_mock.h"
|
| -#include "components/sync/engine/model_safe_worker.h"
|
| -#include "components/sync/model/fake_syncable_service.h"
|
| -#include "components/sync/model/sync_change.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace syncer {
|
| -
|
| -class SyncClient;
|
| -
|
| -namespace {
|
| -
|
| -using base::WaitableEvent;
|
| -using testing::_;
|
| -using testing::AtLeast;
|
| -using testing::DoAll;
|
| -using testing::InvokeWithoutArgs;
|
| -using testing::Mock;
|
| -using testing::Return;
|
| -using testing::SetArgumentPointee;
|
| -using testing::StrictMock;
|
| -
|
| -const ModelType kType = AUTOFILL_PROFILE;
|
| -
|
| -ACTION_P(WaitOnEvent, event) {
|
| - event->Wait();
|
| -}
|
| -
|
| -ACTION_P(SignalEvent, event) {
|
| - event->Signal();
|
| -}
|
| -
|
| -ACTION_P(SaveChangeProcessor, scoped_change_processor) {
|
| - scoped_change_processor->reset(arg2);
|
| -}
|
| -
|
| -class SharedChangeProcessorMock : public SharedChangeProcessor {
|
| - public:
|
| - explicit SharedChangeProcessorMock(ModelType type)
|
| - : SharedChangeProcessor(type) {}
|
| -
|
| - base::WeakPtr<SyncableService> Connect(
|
| - SyncClient*,
|
| - GenericChangeProcessorFactory*,
|
| - UserShare*,
|
| - std::unique_ptr<DataTypeErrorHandler>,
|
| - const base::WeakPtr<SyncMergeResult>&) {
|
| - return std::move(connect_return_);
|
| - }
|
| - MOCK_METHOD0(Disconnect, bool());
|
| - MOCK_METHOD2(ProcessSyncChanges,
|
| - SyncError(const tracked_objects::Location&,
|
| - const SyncChangeList&));
|
| - MOCK_CONST_METHOD2(GetAllSyncDataReturnError,
|
| - SyncError(ModelType, SyncDataList*));
|
| - MOCK_METHOD0(GetSyncCount, int());
|
| - MOCK_METHOD1(SyncModelHasUserCreatedNodes, bool(bool*));
|
| - MOCK_METHOD0(CryptoReadyIfNecessary, bool());
|
| - MOCK_CONST_METHOD1(GetDataTypeContext, bool(std::string*));
|
| - MOCK_METHOD1(RecordAssociationTime, void(base::TimeDelta time));
|
| -
|
| - void SetConnectReturn(base::WeakPtr<SyncableService> service) {
|
| - connect_return_ = service;
|
| - }
|
| -
|
| - protected:
|
| - virtual ~SharedChangeProcessorMock() { DCHECK(!connect_return_); }
|
| - MOCK_METHOD2(OnUnrecoverableError,
|
| - void(const tracked_objects::Location&, const std::string&));
|
| -
|
| - private:
|
| - base::WeakPtr<SyncableService> connect_return_;
|
| - DISALLOW_COPY_AND_ASSIGN(SharedChangeProcessorMock);
|
| -};
|
| -
|
| -class NonUIDataTypeControllerFake : public NonUIDataTypeController {
|
| - public:
|
| - NonUIDataTypeControllerFake(
|
| - SyncClient* sync_client,
|
| - NonUIDataTypeControllerMock* mock,
|
| - SharedChangeProcessor* change_processor,
|
| - scoped_refptr<base::SingleThreadTaskRunner> backend_task_runner)
|
| - : NonUIDataTypeController(kType,
|
| - base::Closure(),
|
| - sync_client,
|
| - GROUP_DB,
|
| - nullptr),
|
| - blocked_(false),
|
| - mock_(mock),
|
| - change_processor_(change_processor),
|
| - backend_task_runner_(backend_task_runner) {}
|
| - ~NonUIDataTypeControllerFake() override {}
|
| -
|
| - // Prevent tasks from being posted on the backend thread until
|
| - // UnblockBackendTasks() is called.
|
| - void BlockBackendTasks() { blocked_ = true; }
|
| -
|
| - // Post pending tasks on the backend thread and start allowing tasks
|
| - // to be posted on the backend thread again.
|
| - void UnblockBackendTasks() {
|
| - blocked_ = false;
|
| - for (std::vector<PendingTask>::const_iterator it = pending_tasks_.begin();
|
| - it != pending_tasks_.end(); ++it) {
|
| - PostTaskOnModelThread(it->from_here, it->task);
|
| - }
|
| - pending_tasks_.clear();
|
| - }
|
| -
|
| - SharedChangeProcessor* CreateSharedChangeProcessor() override {
|
| - return change_processor_.get();
|
| - }
|
| -
|
| - std::unique_ptr<DataTypeErrorHandler> CreateErrorHandler() override {
|
| - return NonUIDataTypeController::CreateErrorHandler();
|
| - }
|
| -
|
| - protected:
|
| - bool PostTaskOnModelThread(const tracked_objects::Location& from_here,
|
| - const base::Closure& task) override {
|
| - if (blocked_) {
|
| - pending_tasks_.push_back(PendingTask(from_here, task));
|
| - return true;
|
| - } else {
|
| - return backend_task_runner_->PostTask(from_here, task);
|
| - }
|
| - }
|
| -
|
| - // We mock the following methods because their default implementations do
|
| - // nothing, but we still want to make sure they're called appropriately.
|
| - bool StartModels() override { return mock_->StartModels(); }
|
| - void StopModels() override { mock_->StopModels(); }
|
| - void RecordStartFailure(DataTypeController::ConfigureResult result) override {
|
| - mock_->RecordStartFailure(result);
|
| - }
|
| -
|
| - private:
|
| - struct PendingTask {
|
| - PendingTask(const tracked_objects::Location& from_here,
|
| - const base::Closure& task)
|
| - : from_here(from_here), task(task) {}
|
| -
|
| - tracked_objects::Location from_here;
|
| - base::Closure task;
|
| - };
|
| -
|
| - bool blocked_;
|
| - std::vector<PendingTask> pending_tasks_;
|
| - NonUIDataTypeControllerMock* mock_;
|
| - scoped_refptr<SharedChangeProcessor> change_processor_;
|
| - scoped_refptr<base::SingleThreadTaskRunner> backend_task_runner_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(NonUIDataTypeControllerFake);
|
| -};
|
| -
|
| -class SyncNonUIDataTypeControllerTest : public testing::Test,
|
| - public FakeSyncClient {
|
| - public:
|
| - SyncNonUIDataTypeControllerTest() : backend_thread_("dbthread") {}
|
| -
|
| - void SetUp() override {
|
| - backend_thread_.Start();
|
| - change_processor_ = new SharedChangeProcessorMock(kType);
|
| - // All of these are refcounted, so don't need to be released.
|
| - dtc_mock_ = base::MakeUnique<StrictMock<NonUIDataTypeControllerMock>>();
|
| - non_ui_dtc_ = base::MakeUnique<NonUIDataTypeControllerFake>(
|
| - this, dtc_mock_.get(), change_processor_.get(),
|
| - backend_thread_.task_runner());
|
| - }
|
| -
|
| - void TearDown() override { backend_thread_.Stop(); }
|
| -
|
| - void WaitForDTC() {
|
| - WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL,
|
| - base::WaitableEvent::InitialState::NOT_SIGNALED);
|
| - backend_thread_.task_runner()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&SyncNonUIDataTypeControllerTest::SignalDone, &done));
|
| - done.TimedWait(TestTimeouts::action_timeout());
|
| - if (!done.IsSignaled()) {
|
| - ADD_FAILURE() << "Timed out waiting for DB thread to finish.";
|
| - }
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| -
|
| - SyncService* GetSyncService() override {
|
| - // Make sure this isn't called on backend_thread.
|
| - EXPECT_FALSE(backend_thread_.task_runner()->BelongsToCurrentThread());
|
| - return FakeSyncClient::GetSyncService();
|
| - }
|
| -
|
| - protected:
|
| - void SetStartExpectations() {
|
| - EXPECT_CALL(*dtc_mock_.get(), StartModels()).WillOnce(Return(true));
|
| - EXPECT_CALL(model_load_callback_, Run(_, _));
|
| - }
|
| -
|
| - void SetAssociateExpectations() {
|
| - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
|
| - EXPECT_CALL(*change_processor_.get(), CryptoReadyIfNecessary())
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(*change_processor_.get(), SyncModelHasUserCreatedNodes(_))
|
| - .WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true)));
|
| - EXPECT_CALL(*change_processor_.get(), GetAllSyncDataReturnError(_, _))
|
| - .WillOnce(Return(SyncError()));
|
| - EXPECT_CALL(*change_processor_.get(), GetSyncCount()).WillOnce(Return(0));
|
| - EXPECT_CALL(*change_processor_.get(), RecordAssociationTime(_));
|
| - }
|
| -
|
| - void SetActivateExpectations(DataTypeController::ConfigureResult result) {
|
| - EXPECT_CALL(start_callback_, Run(result, _, _));
|
| - }
|
| -
|
| - void SetStopExpectations() {
|
| - EXPECT_CALL(*dtc_mock_.get(), StopModels());
|
| - EXPECT_CALL(*change_processor_.get(), Disconnect()).WillOnce(Return(true));
|
| - }
|
| -
|
| - void SetStartFailExpectations(DataTypeController::ConfigureResult result) {
|
| - EXPECT_CALL(*dtc_mock_.get(), StopModels()).Times(AtLeast(1));
|
| - EXPECT_CALL(*dtc_mock_.get(), RecordStartFailure(result));
|
| - EXPECT_CALL(start_callback_, Run(result, _, _));
|
| - }
|
| -
|
| - void Start() {
|
| - non_ui_dtc_->LoadModels(base::Bind(
|
| - &ModelLoadCallbackMock::Run, base::Unretained(&model_load_callback_)));
|
| - non_ui_dtc_->StartAssociating(base::Bind(
|
| - &StartCallbackMock::Run, base::Unretained(&start_callback_)));
|
| - }
|
| -
|
| - static void SignalDone(WaitableEvent* done) { done->Signal(); }
|
| -
|
| - base::MessageLoopForUI message_loop_;
|
| - base::Thread backend_thread_;
|
| -
|
| - StartCallbackMock start_callback_;
|
| - ModelLoadCallbackMock model_load_callback_;
|
| - // Must be destroyed after non_ui_dtc_.
|
| - FakeSyncableService syncable_service_;
|
| - std::unique_ptr<NonUIDataTypeControllerFake> non_ui_dtc_;
|
| - std::unique_ptr<NonUIDataTypeControllerMock> dtc_mock_;
|
| - scoped_refptr<SharedChangeProcessorMock> change_processor_;
|
| - std::unique_ptr<SyncChangeProcessor> saved_change_processor_;
|
| -};
|
| -
|
| -TEST_F(SyncNonUIDataTypeControllerTest, StartOk) {
|
| - SetStartExpectations();
|
| - SetAssociateExpectations();
|
| - SetActivateExpectations(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -TEST_F(SyncNonUIDataTypeControllerTest, StartFirstRun) {
|
| - SetStartExpectations();
|
| - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
|
| - EXPECT_CALL(*change_processor_.get(), CryptoReadyIfNecessary())
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(*change_processor_.get(), SyncModelHasUserCreatedNodes(_))
|
| - .WillOnce(DoAll(SetArgumentPointee<0>(false), Return(true)));
|
| - EXPECT_CALL(*change_processor_.get(), GetAllSyncDataReturnError(_, _))
|
| - .WillOnce(Return(SyncError()));
|
| - EXPECT_CALL(*change_processor_.get(), RecordAssociationTime(_));
|
| - SetActivateExpectations(DataTypeController::OK_FIRST_RUN);
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -// Start the DTC and have StartModels() return false. Then, stop the
|
| -// DTC without finishing model startup. It should stop cleanly.
|
| -TEST_F(SyncNonUIDataTypeControllerTest, AbortDuringStartModels) {
|
| - EXPECT_CALL(*dtc_mock_.get(), StartModels()).WillOnce(Return(false));
|
| - EXPECT_CALL(*dtc_mock_.get(), StopModels());
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - non_ui_dtc_->LoadModels(base::Bind(&ModelLoadCallbackMock::Run,
|
| - base::Unretained(&model_load_callback_)));
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::MODEL_STARTING, non_ui_dtc_->state());
|
| - non_ui_dtc_->Stop();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -// Start the DTC and have MergeDataAndStartSyncing() return an error.
|
| -// The DTC should become disabled, and the DTC should still stop
|
| -// cleanly.
|
| -TEST_F(SyncNonUIDataTypeControllerTest, StartAssociationFailed) {
|
| - SetStartExpectations();
|
| - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
|
| - EXPECT_CALL(*change_processor_.get(), CryptoReadyIfNecessary())
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(*change_processor_.get(), SyncModelHasUserCreatedNodes(_))
|
| - .WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true)));
|
| - EXPECT_CALL(*change_processor_.get(), GetAllSyncDataReturnError(_, _))
|
| - .WillOnce(Return(SyncError()));
|
| - EXPECT_CALL(*change_processor_.get(), RecordAssociationTime(_));
|
| - SetStartFailExpectations(DataTypeController::ASSOCIATION_FAILED);
|
| - // Set up association to fail with an association failed error.
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - syncable_service_.set_merge_data_and_start_syncing_error(SyncError(
|
| - FROM_HERE, SyncError::DATATYPE_ERROR, "Sync Error", non_ui_dtc_->type()));
|
| - Start();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::DISABLED, non_ui_dtc_->state());
|
| - non_ui_dtc_->Stop();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -TEST_F(SyncNonUIDataTypeControllerTest,
|
| - StartAssociationTriggersUnrecoverableError) {
|
| - SetStartExpectations();
|
| - SetStartFailExpectations(DataTypeController::UNRECOVERABLE_ERROR);
|
| - // Set up association to fail with an unrecoverable error.
|
| - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
|
| - EXPECT_CALL(*change_processor_.get(), CryptoReadyIfNecessary())
|
| - .WillRepeatedly(Return(true));
|
| - EXPECT_CALL(*change_processor_.get(), SyncModelHasUserCreatedNodes(_))
|
| - .WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(false)));
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -TEST_F(SyncNonUIDataTypeControllerTest, StartAssociationCryptoNotReady) {
|
| - SetStartExpectations();
|
| - SetStartFailExpectations(DataTypeController::NEEDS_CRYPTO);
|
| - // Set up association to fail with a NEEDS_CRYPTO error.
|
| - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
|
| - EXPECT_CALL(*change_processor_.get(), CryptoReadyIfNecessary())
|
| - .WillRepeatedly(Return(false));
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -// Trigger a Stop() call when we check if the model associator has user created
|
| -// nodes.
|
| -TEST_F(SyncNonUIDataTypeControllerTest, AbortDuringAssociation) {
|
| - WaitableEvent wait_for_db_thread_pause(
|
| - base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
| - base::WaitableEvent::InitialState::NOT_SIGNALED);
|
| - WaitableEvent pause_db_thread(
|
| - base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
| - base::WaitableEvent::InitialState::NOT_SIGNALED);
|
| -
|
| - SetStartExpectations();
|
| - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
|
| - EXPECT_CALL(*change_processor_.get(), CryptoReadyIfNecessary())
|
| - .WillOnce(Return(true));
|
| - EXPECT_CALL(*change_processor_.get(), SyncModelHasUserCreatedNodes(_))
|
| - .WillOnce(DoAll(SignalEvent(&wait_for_db_thread_pause),
|
| - WaitOnEvent(&pause_db_thread),
|
| - SetArgumentPointee<0>(true), Return(true)));
|
| - EXPECT_CALL(*change_processor_.get(), GetAllSyncDataReturnError(_, _))
|
| - .WillOnce(Return(SyncError(FROM_HERE, SyncError::DATATYPE_ERROR,
|
| - "Disconnected.", kType)));
|
| - EXPECT_CALL(*dtc_mock_.get(), StopModels());
|
| - EXPECT_CALL(*change_processor_.get(), Disconnect())
|
| - .WillOnce(DoAll(SignalEvent(&pause_db_thread), Return(true)));
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - wait_for_db_thread_pause.Wait();
|
| - non_ui_dtc_->Stop();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -// Start the DTC while the backend tasks are blocked. Then stop the DTC before
|
| -// the backend tasks get a chance to run.
|
| -TEST_F(SyncNonUIDataTypeControllerTest, StartAfterSyncShutdown) {
|
| - non_ui_dtc_->BlockBackendTasks();
|
| -
|
| - SetStartExpectations();
|
| - // We don't expect StopSyncing to be called because local_service_ will never
|
| - // have been set.
|
| - SetStopExpectations();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - non_ui_dtc_->Stop();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Mock::VerifyAndClearExpectations(change_processor_.get());
|
| - Mock::VerifyAndClearExpectations(dtc_mock_.get());
|
| -
|
| - non_ui_dtc_->UnblockBackendTasks();
|
| - WaitForDTC();
|
| -}
|
| -
|
| -TEST_F(SyncNonUIDataTypeControllerTest, Stop) {
|
| - SetStartExpectations();
|
| - SetAssociateExpectations();
|
| - SetActivateExpectations(DataTypeController::OK);
|
| - SetStopExpectations();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
|
| - non_ui_dtc_->Stop();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -// Start the DTC then block its backend tasks. While its backend
|
| -// tasks are blocked, stop and start it again, then unblock its
|
| -// backend tasks. The (delayed) running of the backend tasks from the
|
| -// stop after the restart shouldn't cause any problems.
|
| -TEST_F(SyncNonUIDataTypeControllerTest, StopStart) {
|
| - SetStartExpectations();
|
| - SetAssociateExpectations();
|
| - SetActivateExpectations(DataTypeController::OK);
|
| - SetStopExpectations();
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
|
| -
|
| - non_ui_dtc_->BlockBackendTasks();
|
| - non_ui_dtc_->Stop();
|
| - SetStartExpectations();
|
| - SetAssociateExpectations();
|
| - SetActivateExpectations(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - non_ui_dtc_->UnblockBackendTasks();
|
| -
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
|
| -}
|
| -
|
| -TEST_F(SyncNonUIDataTypeControllerTest, OnUnrecoverableError) {
|
| - SetStartExpectations();
|
| - SetAssociateExpectations();
|
| - SetActivateExpectations(DataTypeController::OK);
|
| - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
|
| - Start();
|
| - WaitForDTC();
|
| - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
|
| -
|
| - testing::Mock::VerifyAndClearExpectations(&start_callback_);
|
| - EXPECT_CALL(model_load_callback_, Run(_, _));
|
| - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, "error",
|
| - non_ui_dtc_->type());
|
| - backend_thread_.task_runner()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&DataTypeErrorHandler::OnUnrecoverableError,
|
| - base::Passed(non_ui_dtc_->CreateErrorHandler()), error));
|
| - WaitForDTC();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -} // namespace syncer
|
|
|