1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/sync/glue/sync_backend_host.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <cstddef> 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/message_loop.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/scoped_ptr.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/sync/engine/model_safe_worker.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/sync/engine/syncapi.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/sync/glue/data_type_controller.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/sync/syncable/model_type.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/test/testing_profile.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/browser_thread.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "googleurl/src/gurl.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "testing/gmock/include/gmock/gmock.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TODO(akalin): Remove this once we fix the TODO below. 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prefs/pref_service.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/pref_names.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace browser_sync { 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass MockSyncFrontend : public SyncFrontend { 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~MockSyncFrontend() {} 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD0(OnBackendInitialized, void()); 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD0(OnSyncCycleCompleted, void()); 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD0(OnAuthError, void()); 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD0(OnStopSyncingPermanently, void()); 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD0(OnClearServerDataSucceeded, void()); 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD0(OnClearServerDataFailed, void()); 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD1(OnPassphraseRequired, void(bool)); 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD0(OnPassphraseAccepted, void()); 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD1(OnEncryptionComplete, void(const syncable::ModelTypeSet&)); 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD1(OnMigrationNeededForTypes, void(const syncable::ModelTypeSet&)); 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass SyncBackendHostTest : public testing::Test { 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncBackendHostTest() 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : ui_thread_(BrowserThread::UI, &ui_loop_) {} 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop ui_loop_; 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread ui_thread_; 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SyncBackendHostTest, InitShutdown) { 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TestingProfile profile; 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.CreateRequestContext(); 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncBackendHost backend(&profile); 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(akalin): Handle this in SyncBackendHost instead of in 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ProfileSyncService, or maybe figure out a way to share the 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // "register sync prefs" code. 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrefService* pref_service = profile.GetPrefs(); 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen pref_service->RegisterStringPref(prefs::kEncryptionBootstrapToken, ""); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockSyncFrontend mock_frontend; 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sync_api::SyncCredentials credentials; 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credentials.email = "user@example.com"; 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credentials.sync_token = "sync_token"; 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen backend.Initialize(&mock_frontend, 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL("http://www.example.com"), 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet(), 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.GetRequestContext(), 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credentials, 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen true); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen backend.Shutdown(false); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Scoping for io_thread to get destroyed before other locals. 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The request context gets deleted on the I/O thread. To prevent a leak 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // supply one here. 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(sanjeevr): Investigate whether we can do this within 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ResetRequestContext 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread io_thread(BrowserThread::IO, MessageLoop::current()); 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.ResetRequestContext(); 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop::current()->RunAllPending(); 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SyncBackendHostTest, MakePendingConfigModeState) { 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Empty. 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DataTypeController::TypeMap data_type_controllers; 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet types; 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ModelSafeRoutingInfo routing_info; 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<SyncBackendHost::PendingConfigureDataTypesState> 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen state(SyncBackendHost::MakePendingConfigModeState( 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers, types, NULL, &routing_info)); 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(routing_info.empty()); 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(state->ready_task.get()); 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(types, state->initial_types); 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(state->deleted_type); 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(state->added_types.none()); 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // No enabled types. 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DataTypeController::TypeMap data_type_controllers; 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers[syncable::BOOKMARKS] = NULL; 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet types; 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ModelSafeRoutingInfo routing_info; 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<SyncBackendHost::PendingConfigureDataTypesState> 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen state(SyncBackendHost::MakePendingConfigModeState( 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers, types, NULL, &routing_info)); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(routing_info.empty()); 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(state->ready_task.get()); 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(types, state->initial_types); 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(state->deleted_type); 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(state->added_types.none()); 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add type. 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DataTypeController::TypeMap data_type_controllers; 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers[syncable::BOOKMARKS] = NULL; 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet types; 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen types.insert(syncable::BOOKMARKS); 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ModelSafeRoutingInfo routing_info; 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<SyncBackendHost::PendingConfigureDataTypesState> 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen state(SyncBackendHost::MakePendingConfigModeState( 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers, types, NULL, &routing_info)); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ModelSafeRoutingInfo expected_routing_info; 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected_routing_info, routing_info); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(state->ready_task.get()); 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(types, state->initial_types); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(state->deleted_type); 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeBitSet expected_added_types; 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_added_types.set(syncable::BOOKMARKS); 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected_added_types, state->added_types); 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add existing type. 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DataTypeController::TypeMap data_type_controllers; 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers[syncable::BOOKMARKS] = NULL; 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet types; 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen types.insert(syncable::BOOKMARKS); 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ModelSafeRoutingInfo routing_info; 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ModelSafeRoutingInfo expected_routing_info = routing_info; 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<SyncBackendHost::PendingConfigureDataTypesState> 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen state(SyncBackendHost::MakePendingConfigModeState( 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers, types, NULL, &routing_info)); 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected_routing_info, routing_info); 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(state->ready_task.get()); 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(types, state->initial_types); 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(state->deleted_type); 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(state->added_types.none()); 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Delete type. 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DataTypeController::TypeMap data_type_controllers; 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers[syncable::BOOKMARKS] = NULL; 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet types; 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ModelSafeRoutingInfo routing_info; 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<SyncBackendHost::PendingConfigureDataTypesState> 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen state(SyncBackendHost::MakePendingConfigModeState( 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_type_controllers, types, NULL, &routing_info)); 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ModelSafeRoutingInfo expected_routing_info; 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected_routing_info, routing_info); 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(state->ready_task.get()); 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(types, state->initial_types); 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(state->deleted_type); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(state->added_types.none()); 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TODO(akalin): Write more SyncBackendHost unit tests. 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace browser_sync 195