Commit 418b75e0 authored by akalin@chromium.org's avatar akalin@chromium.org

[Sync] Refactor data type configuration/activation/deactivation

Changed ConfigureDataTypes to take a set of types to add and a set of types to remove.

Changed Activate/DeactivateDataType to take ModelTypes instead of
the DataTypeControllers directly.

BUG=
TEST=


Review URL: http://codereview.chromium.org/7511004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96326 0039d316-1c4b-4281-b951-d872f2087c98
parent 39607f74
......@@ -14,6 +14,7 @@
#include "chrome/browser/sync/glue/extension_sync.h"
#include "chrome/browser/sync/glue/extension_util.h"
#include "chrome/browser/sync/protocol/extension_specifics.pb.h"
#include "chrome/browser/sync/unrecoverable_error_handler.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
#include "content/browser/browser_thread.h"
......
......@@ -127,12 +127,12 @@ class AutofillDataTypeControllerTest : public TestingBrowserProcessTest {
WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true)));
EXPECT_CALL(*model_associator_, AssociateModels(_)).
WillRepeatedly(Return(true));
EXPECT_CALL(service_, ActivateDataType(_, _));
EXPECT_CALL(service_, ActivateDataType(_, _, _));
EXPECT_CALL(*change_processor_, IsRunning()).WillRepeatedly(Return(true));
}
void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _));
EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_));
}
......@@ -182,7 +182,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhilePDMStarting) {
autofill_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run));
EXPECT_EQ(DataTypeController::MODEL_STARTING, autofill_dtc_->state());
EXPECT_CALL(service_, DeactivateDataType(_, _)).Times(0);
EXPECT_CALL(service_, DeactivateDataType(_)).Times(0);
EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _));
autofill_dtc_->Stop();
EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state());
......@@ -200,7 +200,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileWDSStarting) {
autofill_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run));
EXPECT_EQ(DataTypeController::MODEL_STARTING, autofill_dtc_->state());
EXPECT_CALL(service_, DeactivateDataType(_, _)).Times(0);
EXPECT_CALL(service_, DeactivateDataType(_)).Times(0);
EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _));
autofill_dtc_->Stop();
EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state());
......@@ -240,7 +240,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileAssociatingNotActivated) {
wait_for_db_thread_pause.Wait();
EXPECT_EQ(DataTypeController::ASSOCIATING, autofill_dtc_->state());
EXPECT_CALL(service_, DeactivateDataType(_, _)).Times(0);
EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _));
autofill_dtc_->Stop();
EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state());
......@@ -269,7 +269,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileAssociatingActivated) {
// ActivateDataType() before allowing it to continue.
WaitableEvent pause_db_thread(false, false);
WaitableEvent wait_for_db_thread_pause(false, false);
EXPECT_CALL(service_, ActivateDataType(_, _)).
EXPECT_CALL(service_, ActivateDataType(_, _, _)).
WillOnce(DoAll(
SignalEvent(&wait_for_db_thread_pause),
WaitOnEvent(&pause_db_thread)));
......
......@@ -77,11 +77,11 @@ class BookmarkDataTypeControllerTest : public TestingBrowserProcessTest {
WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true)));
EXPECT_CALL(*model_associator_, AssociateModels(_)).
WillRepeatedly(Return(true));
EXPECT_CALL(service_, ActivateDataType(_, _));
EXPECT_CALL(service_, ActivateDataType(_, _, _));
}
void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _));
EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_));
}
......
......@@ -209,9 +209,26 @@ void DataTypeManagerImpl::Restart(sync_api::ConfigureReason reason,
// Tell the backend about the new set of data types we wish to sync.
// The task will be invoked when updates are downloaded.
state_ = DOWNLOAD_PENDING;
// Hopefully http://crbug.com/79970 will make this less verbose.
syncable::ModelTypeSet all_types;
const syncable::ModelTypeSet& types_to_add = last_requested_types_;
syncable::ModelTypeSet types_to_remove;
for (DataTypeController::TypeMap::const_iterator it =
controllers_.begin(); it != controllers_.end(); ++it) {
all_types.insert(it->first);
}
// Check that types_to_add \subseteq all_types.
DCHECK(std::includes(all_types.begin(), all_types.end(),
types_to_add.begin(), types_to_add.end()));
// Set types_to_remove to all_types \setminus types_to_add.
ignore_result(
std::set_difference(
all_types.begin(), all_types.end(),
types_to_add.begin(), types_to_add.end(),
std::inserter(types_to_remove, types_to_remove.end())));
backend_->ConfigureDataTypes(
controllers_,
last_requested_types_,
types_to_add,
types_to_remove,
reason,
base::Bind(&DataTypeManagerImpl::DownloadReady,
weak_ptr_factory_.GetWeakPtr()),
......
......@@ -31,6 +31,7 @@ class DataTypeManagerImpl : public DataTypeManager {
virtual void Configure(const TypeSet& desired_types,
sync_api::ConfigureReason reason);
// Needed only for backend migration.
virtual void ConfigureWithoutNigori(const TypeSet& desired_types,
sync_api::ConfigureReason reason);
......
......@@ -315,8 +315,8 @@ TEST_F(DataTypeManagerImplTest, ConfigureOneThenSwitch) {
}
void DoConfigureDataTypes(
const DataTypeController::TypeMap& data_type_controllers,
const syncable::ModelTypeSet& types,
const syncable::ModelTypeSet& types_to_add,
const syncable::ModelTypeSet& types_to_remove,
sync_api::ConfigureReason reason,
base::Callback<void(bool)> ready_task,
bool enable_nigori) {
......
......@@ -14,6 +14,7 @@
#include "chrome/browser/sync/glue/extension_sync.h"
#include "chrome/browser/sync/glue/extension_util.h"
#include "chrome/browser/sync/protocol/extension_specifics.pb.h"
#include "chrome/browser/sync/unrecoverable_error_handler.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
#include "content/browser/browser_thread.h"
......
......@@ -65,11 +65,11 @@ class ExtensionDataTypeControllerTest : public TestingBrowserProcessTest {
}
void SetActivateExpectations() {
EXPECT_CALL(service_, ActivateDataType(_, _));
EXPECT_CALL(service_, ActivateDataType(_, _, _));
}
void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _));
EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_));
}
......
......@@ -101,7 +101,8 @@ bool FrontendDataTypeController::Associate() {
return false;
}
sync_service_->ActivateDataType(this, change_processor_.get());
sync_service_->ActivateDataType(type(), model_safe_group(),
change_processor_.get());
state_ = RUNNING;
FinishStart(!sync_has_nodes ? OK_FIRST_RUN : OK, FROM_HERE);
return true;
......@@ -151,8 +152,7 @@ void FrontendDataTypeController::Stop() {
CleanUpState();
if (change_processor_.get())
sync_service_->DeactivateDataType(this, change_processor_.get());
sync_service_->DeactivateDataType(type());
if (model_associator()) {
SyncError error;
......
......@@ -118,13 +118,13 @@ class FrontendDataTypeControllerTest : public TestingBrowserProcessTest {
}
void SetActivateExpectations(DataTypeController::StartResult result) {
EXPECT_CALL(service_, ActivateDataType(_, _));
EXPECT_CALL(service_, ActivateDataType(_, _, _));
EXPECT_CALL(start_callback_, Run(result,_));
}
void SetStopExpectations() {
EXPECT_CALL(*dtc_mock_, CleanUpState());
EXPECT_CALL(service_, DeactivateDataType(_, _));
EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_));
}
......
......@@ -11,6 +11,7 @@
#include "chrome/browser/sync/api/sync_error.h"
#include "chrome/browser/sync/engine/syncapi.h"
#include "chrome/browser/sync/syncable/nigori_util.h"
#include "chrome/browser/sync/unrecoverable_error_handler.h"
namespace browser_sync {
......
......@@ -113,7 +113,8 @@ void NonFrontendDataTypeController::StartAssociation() {
return;
}
profile_sync_service_->ActivateDataType(this, change_processor_.get());
profile_sync_service_->ActivateDataType(type(), model_safe_group(),
change_processor_.get());
StartDone(!sync_has_nodes ? OK_FIRST_RUN : OK, RUNNING, FROM_HERE);
}
......@@ -199,8 +200,7 @@ void NonFrontendDataTypeController::Stop() {
// Deactivate the change processor on the UI thread. We dont want to listen
// for any more changes or process them from server.
if (change_processor_.get())
profile_sync_service_->DeactivateDataType(this, change_processor_.get());
profile_sync_service_->DeactivateDataType(type());
if (StopAssociationAsync()) {
datatype_stopped_.Wait();
......
......@@ -159,14 +159,14 @@ class NonFrontendDataTypeControllerTest : public TestingBrowserProcessTest {
}
void SetActivateExpectations(DataTypeController::StartResult result) {
EXPECT_CALL(service_, ActivateDataType(_, _));
EXPECT_CALL(service_, ActivateDataType(_, _, _));
EXPECT_CALL(start_callback_, Run(result,_));
}
void SetStopExpectations() {
EXPECT_CALL(*dtc_mock_, StopAssociationAsync());
EXPECT_CALL(*dtc_mock_, StopModels());
EXPECT_CALL(service_, DeactivateDataType(_, _));
EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_));
}
......@@ -312,7 +312,7 @@ TEST_F(NonFrontendDataTypeControllerTest, AbortDuringAssociationInactive) {
SignalEvent(&pause_db_thread));
EXPECT_CALL(*model_associator_, AssociateModels(_)).WillOnce(Return(true));
EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_));
EXPECT_CALL(service_, ActivateDataType(_, _));
EXPECT_CALL(service_, ActivateDataType(_, _, _));
EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_));
EXPECT_CALL(*dtc_mock_, RecordStartFailure(DataTypeController::ABORTED));
SetStopExpectations();
......@@ -342,7 +342,7 @@ TEST_F(NonFrontendDataTypeControllerTest, AbortDuringAssociationActivated) {
EXPECT_CALL(*model_associator_, AssociateModels(_)).
WillOnce(Return(true));
EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_));
EXPECT_CALL(service_, ActivateDataType(_, _)).WillOnce(DoAll(
EXPECT_CALL(service_, ActivateDataType(_, _, _)).WillOnce(DoAll(
SignalEvent(&wait_for_db_thread_pause),
WaitOnEvent(&pause_db_thread)));
EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_));
......
......@@ -67,11 +67,11 @@ class PreferenceDataTypeControllerTest : public TestingBrowserProcessTest {
}
void SetActivateExpectations() {
EXPECT_CALL(service_, ActivateDataType(_, _));
EXPECT_CALL(service_, ActivateDataType(_, _, _));
}
void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _));
EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_));
}
......
......@@ -21,8 +21,6 @@
#include "base/timer.h"
#include "chrome/browser/sync/engine/configure_reason.h"
#include "chrome/browser/sync/engine/model_safe_worker.h"
#include "chrome/browser/sync/engine/syncapi.h"
#include "chrome/browser/sync/glue/data_type_controller.h"
#include "chrome/browser/sync/glue/ui_model_worker.h"
#include "chrome/browser/sync/js/js_backend.h"
#include "chrome/browser/sync/notifier/sync_notifier_factory.h"
......@@ -46,7 +44,6 @@ struct SyncSessionSnapshot;
}
class ChangeProcessor;
class DataTypeController;
class JsEventHandler;
// SyncFrontend is the interface used by SyncBackendHost to communicate with
......@@ -133,7 +130,7 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
void Initialize(SyncFrontend* frontend,
const WeakHandle<JsEventHandler>& event_handler,
const GURL& service_url,
const syncable::ModelTypeSet& types,
const syncable::ModelTypeSet& initial_types,
const sync_api::SyncCredentials& credentials,
bool delete_sync_data_folder);
......@@ -160,11 +157,11 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
// Changes the set of data types that are currently being synced.
// The ready_task will be run when all of the requested data types
// are up-to-date and ready for activation. The task will cancelled
// upon shutdown. The method takes ownership of the task pointer.
// are up-to-date and ready for activation. The task will be
// cancelled upon shutdown.
virtual void ConfigureDataTypes(
const DataTypeController::TypeMap& data_type_controllers,
const syncable::ModelTypeSet& types,
const syncable::ModelTypeSet& types_to_add,
const syncable::ModelTypeSet& types_to_remove,
sync_api::ConfigureReason reason,
base::Callback<void(bool)> ready_task,
bool enable_nigori);
......@@ -186,12 +183,12 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
// be called synchronously with the data type's model association so
// no changes are dropped between model association and change
// processor activation.
void ActivateDataType(DataTypeController* data_type_controller,
ChangeProcessor* change_processor);
void ActivateDataType(
syncable::ModelType type, ModelSafeGroup group,
ChangeProcessor* change_processor);
// Deactivates change processing for the given data type.
void DeactivateDataType(DataTypeController* data_type_controller,
ChangeProcessor* change_processor);
void DeactivateDataType(syncable::ModelType type);
// Asks the server to clear all data associated with ChromeSync.
virtual bool RequestClearServerData();
......@@ -357,7 +354,8 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
void DoShutdown(bool stopping_sync);
// Posts a config request on the sync thread.
virtual void DoRequestConfig(const syncable::ModelTypeBitSet& added_types,
virtual void DoRequestConfig(
const syncable::ModelTypeBitSet& types_to_config,
sync_api::ConfigureReason reason);
// Start the configuration mode.
......@@ -408,9 +406,6 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
virtual ~Core();
// Return change processor for a particular model (return NULL on failure).
ChangeProcessor* GetProcessor(syncable::ModelType modeltype);
// Invoked when initialization of syncapi is complete and we can start
// our timer.
// This must be called from the thread on which SaveChanges is intended to
......@@ -458,9 +453,6 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
void FinishConfigureDataTypesOnFrontendLoop();
// Return true if a model lives on the current thread.
bool IsCurrentThreadSafeForModel(syncable::ModelType model_type);
Profile* profile_;
// Our parent SyncBackendHost
......@@ -528,26 +520,34 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
// The set of types that we are waiting to be initially synced in a
// configuration cycle.
syncable::ModelTypeSet initial_types;
syncable::ModelTypeSet types_to_add;
// Additional details about which types were added.
syncable::ModelTypeBitSet added_types;
syncable::ModelTypeSet added_types;
sync_api::ConfigureReason reason;
};
UIModelWorker* ui_worker();
// Helper function for ConfigureDataTypes() that fills in |state|
// and |deleted_type|. Does not take ownership of routing_info|.
// Return change processor for a particular model (return NULL on failure).
ChangeProcessor* GetProcessor(syncable::ModelType modeltype);
// Like GetProcessor(), but |registrar_lock_| must already be
// held.
ChangeProcessor* GetProcessorUnsafe(syncable::ModelType modeltype);
// Return true if a model lives on the current thread.
bool IsCurrentThreadSafeForModel(syncable::ModelType model_type) const;
// Helper function for ConfigureDataTypes() that fills in |state|.
// Does not take ownership of |routing_info|.
static void GetPendingConfigModeState(
const DataTypeController::TypeMap& data_type_controllers,
const syncable::ModelTypeSet& types,
const syncable::ModelTypeSet& types_to_add,
const syncable::ModelTypeSet& types_to_remove,
base::Callback<void(bool)> ready_task,
ModelSafeRoutingInfo* routing_info,
sync_api::ConfigureReason reason,
bool nigori_enabled,
PendingConfigureDataTypesState* state,
bool* deleted_type);
PendingConfigureDataTypesState* state);
// For convenience, checks if initialization state is INITIALIZED.
bool initialized() const { return initialization_state_ == INITIALIZED; }
......
......@@ -6,14 +6,15 @@
namespace browser_sync {
using ::testing::_;
ACTION(InvokeTask) {
arg3.Run(true);
}
SyncBackendHostMock::SyncBackendHostMock() {
// By default, invoke the ready callback.
ON_CALL(*this, ConfigureDataTypes(testing::_, testing::_, testing::_,
testing::_, testing::_)).
ON_CALL(*this, ConfigureDataTypes(_, _, _, _, _)).
WillByDefault(InvokeTask());
}
......
......@@ -22,7 +22,7 @@ class SyncBackendHostMock : public SyncBackendHost {
virtual ~SyncBackendHostMock();
MOCK_METHOD5(ConfigureDataTypes,
void(const DataTypeController::TypeMap&,
void(const std::set<syncable::ModelType>&,
const std::set<syncable::ModelType>&,
sync_api::ConfigureReason,
base::Callback<void(bool)>,
......
......@@ -10,7 +10,6 @@
#include "base/message_loop.h"
#include "chrome/browser/sync/engine/model_safe_worker.h"
#include "chrome/browser/sync/engine/syncapi.h"
#include "chrome/browser/sync/glue/data_type_controller.h"
#include "chrome/browser/sync/syncable/model_type.h"
#include "chrome/test/base/test_url_request_context_getter.h"
#include "chrome/test/base/testing_profile.h"
......@@ -112,160 +111,93 @@ TEST_F(SyncBackendHostTest, InitShutdown) {
TEST_F(SyncBackendHostTest, GetPendingConfigModeState) {
SyncBackendHost::PendingConfigureDataTypesState state;
bool deleted_type = false;
// Empty.
{
DataTypeController::TypeMap data_type_controllers;
syncable::ModelTypeSet types;
syncable::ModelTypeSet types_to_add;
syncable::ModelTypeSet types_to_remove;
ModelSafeRoutingInfo routing_info;
SyncBackendHost::GetPendingConfigModeState(
data_type_controllers, types, base::Callback<void(bool)>(),
types_to_add, types_to_remove, base::Callback<void(bool)>(),
&routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
false, &state, &deleted_type);
&state);
EXPECT_TRUE(routing_info.empty());
EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types);
EXPECT_FALSE(deleted_type);
EXPECT_TRUE(state.added_types.none());
}
// No enabled types.
{
DataTypeController::TypeMap data_type_controllers;
data_type_controllers[syncable::BOOKMARKS] = NULL;
syncable::ModelTypeSet types;
ModelSafeRoutingInfo routing_info;
types.insert(syncable::NIGORI);
SyncBackendHost::GetPendingConfigModeState(
data_type_controllers, types, base::Callback<void(bool)>(),
&routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
true, &state, &deleted_type);
EXPECT_TRUE(routing_info.empty());
EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types);
EXPECT_TRUE(deleted_type);
EXPECT_TRUE(state.added_types.none());
EXPECT_TRUE(state.types_to_add.empty());
EXPECT_TRUE(state.added_types.empty());
}
// Add type.
{
DataTypeController::TypeMap data_type_controllers;
data_type_controllers[syncable::BOOKMARKS] = NULL;
syncable::ModelTypeSet types;
types.insert(syncable::BOOKMARKS);
types.insert(syncable::NIGORI);
syncable::ModelTypeSet types_to_add;
types_to_add.insert(syncable::BOOKMARKS);
syncable::ModelTypeSet types_to_remove;
ModelSafeRoutingInfo routing_info;
SyncBackendHost::GetPendingConfigModeState(
data_type_controllers, types, base::Callback<void(bool)>(),
types_to_add, types_to_remove, base::Callback<void(bool)>(),
&routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
true, &state, &deleted_type);
&state);
ModelSafeRoutingInfo expected_routing_info;
expected_routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE;
EXPECT_EQ(expected_routing_info, routing_info);
EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types);
EXPECT_FALSE(deleted_type);
syncable::ModelTypeBitSet expected_added_types;
expected_added_types.set(syncable::BOOKMARKS);
EXPECT_EQ(expected_added_types, state.added_types);
EXPECT_EQ(types_to_add, state.types_to_add);
EXPECT_EQ(types_to_add, state.added_types);
}
// Add existing type.
{
DataTypeController::TypeMap data_type_controllers;
data_type_controllers[syncable::BOOKMARKS] = NULL;
syncable::ModelTypeSet types;
types.insert(syncable::BOOKMARKS);
types.insert(syncable::NIGORI);
syncable::ModelTypeSet types_to_add;
types_to_add.insert(syncable::BOOKMARKS);
syncable::ModelTypeSet types_to_remove;
ModelSafeRoutingInfo routing_info;
routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE;
ModelSafeRoutingInfo expected_routing_info = routing_info;
SyncBackendHost::GetPendingConfigModeState(
data_type_controllers, types, base::Callback<void(bool)>(),
types_to_add, types_to_remove, base::Callback<void(bool)>(),
&routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
true, &state, &deleted_type);
&state);
EXPECT_EQ(expected_routing_info, routing_info);
EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types);
EXPECT_FALSE(deleted_type);
EXPECT_TRUE(state.added_types.none());
EXPECT_EQ(types_to_add, state.types_to_add);
EXPECT_TRUE(state.added_types.empty());
}
// Delete type.
{
DataTypeController::TypeMap data_type_controllers;
data_type_controllers[syncable::BOOKMARKS] = NULL;
syncable::ModelTypeSet types;
types.insert(syncable::NIGORI);
syncable::ModelTypeSet types_to_add;
syncable::ModelTypeSet types_to_remove;
types_to_remove.insert(syncable::BOOKMARKS);
ModelSafeRoutingInfo routing_info;
routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE;
SyncBackendHost::GetPendingConfigModeState(
data_type_controllers, types, base::Callback<void(bool)>(),
&routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
true, &state, &deleted_type);
ModelSafeRoutingInfo expected_routing_info;
EXPECT_EQ(expected_routing_info, routing_info);
EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types);
EXPECT_TRUE(deleted_type);
EXPECT_TRUE(state.added_types.none());
}
// Add Nigori.
{
DataTypeController::TypeMap data_type_controllers;
syncable::ModelTypeSet types;
types.insert(syncable::NIGORI);
ModelSafeRoutingInfo routing_info;
SyncBackendHost::GetPendingConfigModeState(
data_type_controllers, types, base::Callback<void(bool)>(),
types_to_add, types_to_remove, base::Callback<void(bool)>(),
&routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
false, &state, &deleted_type);
ModelSafeRoutingInfo expected_routing_info;
expected_routing_info[syncable::NIGORI] = GROUP_PASSIVE;
EXPECT_EQ(expected_routing_info, routing_info);
EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types);
EXPECT_FALSE(deleted_type);
&state);
syncable::ModelTypeBitSet expected_added_types;
expected_added_types.set(syncable::NIGORI);
EXPECT_EQ(expected_added_types, state.added_types);
EXPECT_TRUE(routing_info.empty());
}
// Delete Nigori.
// Delete nonexistent type.
{
DataTypeController::TypeMap data_type_controllers;
syncable::ModelTypeSet types;
syncable::ModelTypeSet types_to_add;
syncable::ModelTypeSet types_to_remove;
types_to_remove.insert(syncable::BOOKMARKS);
ModelSafeRoutingInfo routing_info;
routing_info[syncable::NIGORI] = GROUP_PASSIVE;
SyncBackendHost::GetPendingConfigModeState(
data_type_controllers, types, base::Callback<void(bool)>(),
types_to_add, types_to_remove, base::Callback<void(bool)>(),
&routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
true, &state, &deleted_type);
ModelSafeRoutingInfo expected_routing_info;
EXPECT_EQ(expected_routing_info, routing_info);
EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types);
EXPECT_TRUE(deleted_type);
&state);
EXPECT_TRUE(state.added_types.none());
EXPECT_TRUE(routing_info.empty());
}
}
......
......@@ -10,6 +10,7 @@
#include "chrome/browser/sync/engine/syncapi.h"
#include "chrome/browser/sync/glue/theme_util.h"
#include "chrome/browser/sync/protocol/theme_specifics.pb.h"
#include "chrome/browser/sync/unrecoverable_error_handler.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/common/chrome_notification_types.h"
......
......@@ -64,11 +64,11 @@ class ThemeDataTypeControllerTest : public TestingBrowserProcessTest {
}
void SetActivateExpectations() {
EXPECT_CALL(service_, ActivateDataType(_, _));
EXPECT_CALL(service_, ActivateDataType(_, _, _));
}
void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _));
EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_));
}
......
......@@ -367,12 +367,12 @@ void ProfileSyncService::InitializeBackend(bool delete_sync_data_folder) {
return;
}
syncable::ModelTypeSet types;
syncable::ModelTypeSet initial_types;
// If sync setup hasn't finished, we don't want to initialize routing info
// for any data types so that we don't download updates for types that the
// user chooses not to sync on the first DownloadUpdatesCommand.
if (HasSyncSetupCompleted()) {
GetPreferredDataTypes(&types);
GetPreferredDataTypes(&initial_types);
}
SyncCredentials credentials = GetCredentials();
......@@ -384,7 +384,7 @@ void ProfileSyncService::InitializeBackend(bool delete_sync_data_folder) {
this,
WeakHandle<JsEventHandler>(sync_js_controller_.AsWeakPtr()),
sync_service_url_,
types,
initial_types,
credentials,
delete_sync_data_folder);
}
......@@ -1198,22 +1198,20 @@ void ProfileSyncService::GetModelSafeRoutingInfo(
}
void ProfileSyncService::ActivateDataType(
DataTypeController* data_type_controller,
syncable::ModelType type, browser_sync::ModelSafeGroup group,
ChangeProcessor* change_processor) {
if (!backend_.get()) {
NOTREACHED();
return;
}
DCHECK(backend_initialized_);
backend_->ActivateDataType(data_type_controller, change_processor);
backend_->ActivateDataType(type, group, change_processor);
}
void ProfileSyncService::DeactivateDataType(
DataTypeController* data_type_controller,
ChangeProcessor* change_processor) {
void ProfileSyncService::DeactivateDataType(syncable::ModelType type) {
if (!backend_.get())
return;
backend_->DeactivateDataType(data_type_controller, change_processor);
backend_->DeactivateDataType(type);
}
void ProfileSyncService::SetPassphrase(const std::string& passphrase,
......
......@@ -389,13 +389,12 @@ class ProfileSyncService : public browser_sync::SyncFrontend,
// remove this function.
void GetModelSafeRoutingInfo(browser_sync::ModelSafeRoutingInfo* out);
// Overridden by tests.
// TODO(zea): Remove these and have the dtc's call directly into the SBH.
virtual void ActivateDataType(
browser_sync::DataTypeController* data_type_controller,
browser_sync::ChangeProcessor* change_processor);
virtual void DeactivateDataType(
browser_sync::DataTypeController* data_type_controller,
syncable::ModelType type, browser_sync::ModelSafeGroup group,
browser_sync::ChangeProcessor* change_processor);
virtual void DeactivateDataType(syncable::ModelType type);
// NotificationObserver implementation.
virtual void Observe(int type,
......
......@@ -37,12 +37,10 @@ class ProfileSyncServiceMock : public ProfileSyncService {
MOCK_METHOD2(OnUnrecoverableError,
void(const tracked_objects::Location& location,
const std::string& message));
MOCK_METHOD2(ActivateDataType,
void(browser_sync::DataTypeController* data_type_controller,
browser_sync::ChangeProcessor* change_processor));
MOCK_METHOD2(DeactivateDataType,
void(browser_sync::DataTypeController* data_type_controller,
browser_sync::ChangeProcessor* change_processor));
MOCK_METHOD3(ActivateDataType,
void(syncable::ModelType, browser_sync::ModelSafeGroup,
browser_sync::ChangeProcessor*));
MOCK_METHOD1(DeactivateDataType, void(syncable::ModelType));
MOCK_METHOD0(InitializeBackend, void());
MOCK_METHOD1(AddObserver, void(Observer*));
......
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