Commit e7250984 authored by Aleksei Loshkarev's avatar Aleksei Loshkarev Committed by Commit Bot

Propogates ShutdownReason to DataTypeManger::Stop

We need to know in DataTypeManager why we stopping.
It will helps us determine if we need to clear sync metadata on data type stop.

This is first CL in sequence.

Bug: 823721
Change-Id: I7c20febbfc8ed820018f583f6de16bf3e269333a
Reviewed-on: https://chromium-review.googlesource.com/1091752
Commit-Queue: Aleksei Loshkarev <lixan@yandex-team.ru>
Reviewed-by: default avatarMikel Astiz <mastiz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#565598}
parent d29b5922
......@@ -687,7 +687,7 @@ void ProfileSyncService::ShutdownImpl(syncer::ShutdownReason reason) {
// When aborting as part of shutdown, we should expect an aborted sync
// configure result, else we'll dcheck when we try to read the sync error.
expect_sync_configuration_aborted_ = true;
data_type_manager_->Stop();
data_type_manager_->Stop(reason);
}
data_type_manager_.reset();
}
......
......@@ -26,6 +26,7 @@ using testing::_;
using testing::ByMove;
using testing::DoAll;
using testing::Mock;
using testing::NiceMock;
using testing::Return;
namespace browser_sync {
......@@ -111,7 +112,7 @@ class ProfileSyncServiceStartupTest : public testing::Test {
}
DataTypeManagerMock* SetUpDataTypeManagerMock() {
auto data_type_manager = std::make_unique<DataTypeManagerMock>();
auto data_type_manager = std::make_unique<NiceMock<DataTypeManagerMock>>();
DataTypeManagerMock* data_type_manager_raw = data_type_manager.get();
ON_CALL(*component_factory(), CreateDataTypeManager(_, _, _, _, _, _))
.WillByDefault(Return(ByMove(std::move(data_type_manager))));
......@@ -216,7 +217,7 @@ TEST_F(ProfileSyncServiceStartupTest, StartFirstTime) {
EXPECT_TRUE(sync_service()->IsSyncActive());
EXPECT_FALSE(sync_service()->IsSyncConfirmationNeeded());
EXPECT_CALL(*data_type_manager, Stop());
EXPECT_CALL(*data_type_manager, Stop(syncer::BROWSER_SHUTDOWN));
}
#endif // OS_CHROMEOS
......@@ -288,13 +289,13 @@ TEST_F(ProfileSyncServiceStartupCrosTest, StartFirstTime) {
EXPECT_CALL(*data_type_manager, Configure(_, _));
EXPECT_CALL(*data_type_manager, state())
.WillRepeatedly(Return(DataTypeManager::CONFIGURED));
EXPECT_CALL(*data_type_manager, Stop());
// The primary account is already populated, all that's left to do is provide
// a refresh token.
UpdateCredentials();
sync_service()->Initialize();
EXPECT_TRUE(sync_service()->IsSyncActive());
EXPECT_CALL(*data_type_manager, Stop(syncer::BROWSER_SHUTDOWN));
}
TEST_F(ProfileSyncServiceStartupTest, StartNormal) {
......@@ -306,10 +307,42 @@ TEST_F(ProfileSyncServiceStartupTest, StartNormal) {
EXPECT_CALL(*data_type_manager, Configure(_, _));
EXPECT_CALL(*data_type_manager, state())
.WillRepeatedly(Return(DataTypeManager::CONFIGURED));
EXPECT_CALL(*data_type_manager, Stop());
ON_CALL(*data_type_manager, IsNigoriEnabled()).WillByDefault(Return(true));
sync_service()->Initialize();
EXPECT_CALL(*data_type_manager, Stop(syncer::BROWSER_SHUTDOWN));
}
TEST_F(ProfileSyncServiceStartupTest, StopSync) {
CreateSyncService(ProfileSyncService::MANUAL_START);
SimulateTestUserSignin();
sync_service()->SetFirstSetupComplete();
SetUpFakeSyncEngine();
DataTypeManagerMock* data_type_manager = SetUpDataTypeManagerMock();
ON_CALL(*data_type_manager, state())
.WillByDefault(Return(DataTypeManager::CONFIGURED));
ON_CALL(*data_type_manager, IsNigoriEnabled()).WillByDefault(Return(true));
sync_service()->Initialize();
EXPECT_CALL(*data_type_manager, Stop(syncer::STOP_SYNC));
sync_service()->RequestStop(syncer::SyncService::KEEP_DATA);
}
TEST_F(ProfileSyncServiceStartupTest, DisableSync) {
CreateSyncService(ProfileSyncService::MANUAL_START);
SimulateTestUserSignin();
sync_service()->SetFirstSetupComplete();
SetUpFakeSyncEngine();
DataTypeManagerMock* data_type_manager = SetUpDataTypeManagerMock();
ON_CALL(*data_type_manager, state())
.WillByDefault(Return(DataTypeManager::CONFIGURED));
ON_CALL(*data_type_manager, IsNigoriEnabled()).WillByDefault(Return(true));
sync_service()->Initialize();
EXPECT_CALL(*data_type_manager, Stop(syncer::DISABLE_SYNC));
sync_service()->RequestStop(syncer::SyncService::CLEAR_DATA);
}
// Test that we can recover from a case where a bug in the code resulted in
......@@ -333,7 +366,6 @@ TEST_F(ProfileSyncServiceStartupTest, StartRecoverDatatypePrefs) {
EXPECT_CALL(*data_type_manager, Configure(_, _));
EXPECT_CALL(*data_type_manager, state())
.WillRepeatedly(Return(DataTypeManager::CONFIGURED));
EXPECT_CALL(*data_type_manager, Stop());
ON_CALL(*data_type_manager, IsNigoriEnabled()).WillByDefault(Return(true));
sync_service()->Initialize();
......@@ -357,7 +389,6 @@ TEST_F(ProfileSyncServiceStartupTest, StartDontRecoverDatatypePrefs) {
EXPECT_CALL(*data_type_manager, Configure(_, _));
EXPECT_CALL(*data_type_manager, state())
.WillRepeatedly(Return(DataTypeManager::CONFIGURED));
EXPECT_CALL(*data_type_manager, Stop());
ON_CALL(*data_type_manager, IsNigoriEnabled()).WillByDefault(Return(true));
sync_service()->Initialize();
......@@ -397,7 +428,7 @@ TEST_F(ProfileSyncServiceStartupTest, SwitchManaged) {
Mock::VerifyAndClearExpectations(data_type_manager);
EXPECT_CALL(*data_type_manager, state())
.WillOnce(Return(DataTypeManager::CONFIGURED));
EXPECT_CALL(*data_type_manager, Stop());
EXPECT_CALL(*data_type_manager, Stop(syncer::DISABLE_SYNC));
pref_service()->SetBoolean(syncer::prefs::kSyncManaged, true);
EXPECT_FALSE(sync_service()->IsEngineInitialized());
// Note that PSS no longer references |data_type_manager| after stopping.
......
......@@ -60,7 +60,7 @@ class FakeDataTypeManager : public syncer::DataTypeManager {
void ResetDataTypeErrors() override {}
void PurgeForMigration(syncer::ModelTypeSet undesired_types,
syncer::ConfigureReason reason) override {}
void Stop() override {}
void Stop(syncer::ShutdownReason reason) override {}
syncer::ModelTypeSet GetActiveDataTypes() const override {
return syncer::ModelTypeSet();
}
......
......@@ -13,6 +13,7 @@
#include "components/sync/driver/data_type_controller.h"
#include "components/sync/driver/data_type_status_table.h"
#include "components/sync/engine/configure_reason.h"
#include "components/sync/engine/shutdown_reason.h"
#include "components/sync/model/sync_error.h"
namespace syncer {
......@@ -80,11 +81,12 @@ class DataTypeManager {
virtual void PurgeForMigration(ModelTypeSet undesired_types,
ConfigureReason reason) = 0;
// Synchronously stops all registered data types. If called after
// Synchronously stops all registered data types. If called after
// Configure() is called but before it finishes, it will abort the
// configure and any data types that have been started will be
// stopped.
virtual void Stop() = 0;
// If called with reason |DISABLE_SYNC|, purges sync data for all datatypes.
virtual void Stop(ShutdownReason reason) = 0;
// Get the set of current active data types (those chosen or configured by the
// user which have not also encountered a runtime error). Note that during
......
......@@ -757,12 +757,12 @@ void DataTypeManagerImpl::OnModelAssociationDone(
}
}
void DataTypeManagerImpl::Stop() {
void DataTypeManagerImpl::Stop(ShutdownReason reason) {
if (state_ == STOPPED)
return;
bool need_to_notify = state_ == CONFIGURING;
StopImpl();
StopImpl(reason);
if (need_to_notify) {
ConfigureResult result(ABORTED, last_requested_types_);
......@@ -773,14 +773,14 @@ void DataTypeManagerImpl::Stop() {
void DataTypeManagerImpl::Abort(ConfigureStatus status) {
DCHECK_EQ(CONFIGURING, state_);
StopImpl();
StopImpl(STOP_SYNC);
DCHECK_NE(OK, status);
ConfigureResult result(status, last_requested_types_);
NotifyDone(result);
}
void DataTypeManagerImpl::StopImpl() {
void DataTypeManagerImpl::StopImpl(ShutdownReason reason) {
state_ = STOPPING;
// Invalidate weak pointer to drop download callbacks.
......
......@@ -55,7 +55,7 @@ class DataTypeManagerImpl : public DataTypeManager,
void PurgeForMigration(ModelTypeSet undesired_types,
ConfigureReason reason) override;
void Stop() override;
void Stop(ShutdownReason reason) override;
ModelTypeSet GetActiveDataTypes() const override;
bool IsNigoriEnabled() const override;
State state() const override;
......@@ -174,7 +174,7 @@ class DataTypeManagerImpl : public DataTypeManager,
// is busy performing association.
void StartNextAssociation(AssociationGroup group);
void StopImpl();
void StopImpl(ShutdownReason reason);
// Returns the currently enabled types.
ModelTypeSet GetEnabledTypes() const;
......@@ -189,6 +189,8 @@ class DataTypeManagerImpl : public DataTypeManager,
// This list is determined at startup by various command line flags.
const DataTypeController::TypeMap* controllers_;
State state_;
// Types that requested in current configuration cycle.
ModelTypeSet last_requested_types_;
// A set of types that were enabled at the time initialization with the
......
......@@ -342,7 +342,7 @@ TEST_F(SyncDataTypeManagerImplTest, NoControllers) {
FinishDownload(ModelTypeSet(), ModelTypeSet());
EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
}
......@@ -366,7 +366,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureOne) {
EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
EXPECT_EQ(1U, configurer_.activated_types().Size());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
......@@ -388,7 +388,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileDownloadPending) {
EXPECT_EQ(ModelTypeSet(BOOKMARKS),
configurer_.registered_directory_types());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
}
......@@ -418,7 +418,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileStartingModel) {
FinishDownload(ModelTypeSet(BOOKMARKS), ModelTypeSet());
EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
dtm_.reset();
......@@ -451,7 +451,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureOneStopWhileAssociating) {
EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
dtm_.reset();
......@@ -498,7 +498,7 @@ TEST_F(SyncDataTypeManagerImplTest, OneWaitingForCrypto) {
EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
// Step 5.
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
}
......@@ -553,7 +553,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureOneThenBoth) {
EXPECT_EQ(2U, configurer_.activated_types().Size());
// Step 7.
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
......@@ -610,7 +610,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureOneThenSwitch) {
EXPECT_EQ(1U, configurer_.activated_types().Size());
// Step 7.
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
......@@ -663,7 +663,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileOneInFlight) {
configurer_.registered_directory_types());
// Step 7.
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
......@@ -788,7 +788,7 @@ TEST_F(SyncDataTypeManagerImplTest, OneControllerFailsAssociation) {
EXPECT_EQ(ModelTypeSet(BOOKMARKS), configurer_.registered_directory_types());
// Step 6.
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
......@@ -836,7 +836,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileDownloadPending) {
configurer_.registered_directory_types());
// Step 6.
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
}
......@@ -887,7 +887,7 @@ TEST_F(SyncDataTypeManagerImplTest, ConfigureWhileDownloadPendingWithFailure) {
configurer_.registered_directory_types());
// Step 6.
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.registered_directory_types().Empty());
}
......@@ -1088,7 +1088,7 @@ TEST_F(SyncDataTypeManagerImplTest, PrioritizedConfigurationStop) {
EXPECT_EQ(DataTypeController::MODEL_LOADED,
GetController(BOOKMARKS)->state());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_EQ(DataTypeController::NOT_RUNNING,
GetController(PREFERENCES)->state());
......@@ -1259,7 +1259,7 @@ TEST_F(SyncDataTypeManagerImplTest, FilterDesiredTypes) {
FinishDownload(ModelTypeSet(BOOKMARKS), ModelTypeSet());
GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
}
......@@ -1338,7 +1338,7 @@ TEST_F(SyncDataTypeManagerImplTest, UnreadyType) {
observer_.ResetExpectations();
dtm_->ReenableType(BOOKMARKS);
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
}
......@@ -1487,7 +1487,7 @@ TEST_F(SyncDataTypeManagerImplTest, AllLowPriorityTypesReady) {
EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
EXPECT_EQ(2U, configurer_.activated_types().Size());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
}
......@@ -1536,7 +1536,7 @@ TEST_F(SyncDataTypeManagerImplTest, AllHighPriorityTypesReady) {
EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
EXPECT_EQ(2U, configurer_.activated_types().Size());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
}
......@@ -1586,7 +1586,7 @@ TEST_F(SyncDataTypeManagerImplTest, AllTypesReady) {
EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
EXPECT_EQ(2U, configurer_.activated_types().Size());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
}
......@@ -1617,7 +1617,7 @@ TEST_F(SyncDataTypeManagerImplTest, CatchUpTypeAddedToConfigureClean) {
EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
EXPECT_EQ(2U, configurer_.activated_types().Size());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
EXPECT_TRUE(configurer_.activated_types().Empty());
}
......@@ -1656,7 +1656,7 @@ TEST_F(SyncDataTypeManagerImplTest, CatchUpMultipleConfigureCalls) {
GetController(PASSWORDS)->FinishStart(DataTypeController::OK);
EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
dtm_->Stop();
dtm_->Stop(STOP_SYNC);
EXPECT_EQ(DataTypeManager::STOPPED, dtm_->state());
}
......
......@@ -20,7 +20,7 @@ class DataTypeManagerMock : public DataTypeManager {
MOCK_METHOD1(ReenableType, void(ModelType));
MOCK_METHOD0(ResetDataTypeErrors, void());
MOCK_METHOD2(PurgeForMigration, void(ModelTypeSet, ConfigureReason));
MOCK_METHOD0(Stop, void());
MOCK_METHOD1(Stop, void(ShutdownReason));
MOCK_METHOD0(controllers, const DataTypeController::TypeMap&());
MOCK_CONST_METHOD0(GetActiveDataTypes, ModelTypeSet());
MOCK_CONST_METHOD0(IsNigoriEnabled, bool());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment