1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ 6 #define CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ 7 8 #include <string> 9 10 #include "base/callback.h" 11 #include "base/compiler_specific.h" 12 #include "base/memory/weak_ptr.h" 13 #include "chrome/browser/invalidation/invalidator_storage.h" 14 #include "chrome/browser/signin/oauth2_token_service.h" 15 #include "chrome/browser/signin/profile_oauth2_token_service.h" 16 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 17 #include "chrome/browser/sync/glue/data_type_manager_impl.h" 18 #include "chrome/browser/sync/profile_sync_components_factory_mock.h" 19 #include "chrome/browser/sync/profile_sync_service.h" 20 #include "chrome/browser/sync/sync_prefs.h" 21 #include "chrome/test/base/profile_mock.h" 22 #include "sync/internal_api/public/test/test_internal_components_factory.h" 23 #include "sync/test/engine/test_id_factory.h" 24 #include "testing/gmock/include/gmock/gmock.h" 25 26 class Profile; 27 class Task; 28 class TestProfileSyncService; 29 30 ACTION(ReturnNewDataTypeManager) { 31 return new browser_sync::DataTypeManagerImpl(arg0, 32 arg1, 33 arg2, 34 arg3, 35 arg4, 36 arg5); 37 } 38 39 namespace browser_sync { 40 41 class SyncBackendHostForProfileSyncTest : public SyncBackendHost { 42 public: 43 // |synchronous_init| causes initialization to block until the syncapi has 44 // completed setting itself up and called us back. 45 // TOOD(akalin): Remove |synchronous_init| (http://crbug.com/140354). 46 SyncBackendHostForProfileSyncTest( 47 Profile* profile, 48 const base::WeakPtr<SyncPrefs>& sync_prefs, 49 syncer::TestIdFactory& id_factory, 50 base::Closure& callback, 51 bool set_initial_sync_ended_on_init, 52 bool synchronous_init, 53 bool fail_initial_download, 54 syncer::StorageOption storage_option); 55 virtual ~SyncBackendHostForProfileSyncTest(); 56 57 MOCK_METHOD1(RequestNudge, void(const tracked_objects::Location&)); 58 59 virtual void UpdateCredentials( 60 const syncer::SyncCredentials& credentials) OVERRIDE; 61 62 virtual void RequestConfigureSyncer( 63 syncer::ConfigureReason reason, 64 syncer::ModelTypeSet to_download, 65 syncer::ModelTypeSet to_purge, 66 syncer::ModelTypeSet to_journal, 67 syncer::ModelTypeSet to_unapply, 68 syncer::ModelTypeSet to_ignore, 69 const syncer::ModelSafeRoutingInfo& routing_info, 70 const base::Callback<void(syncer::ModelTypeSet, 71 syncer::ModelTypeSet)>& ready_task, 72 const base::Closure& retry_callback) OVERRIDE; 73 74 virtual void HandleSyncManagerInitializationOnFrontendLoop( 75 const syncer::WeakHandle<syncer::JsBackend>& js_backend, 76 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& 77 debug_info_listener, 78 syncer::ModelTypeSet restored_types) OVERRIDE; 79 80 static void SetHistoryServiceExpectations(ProfileMock* profile); 81 82 protected: 83 virtual void InitCore(scoped_ptr<DoInitializeOptions> options) OVERRIDE; 84 85 private: 86 void ContinueInitialization( 87 const syncer::WeakHandle<syncer::JsBackend>& js_backend, 88 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& 89 debug_info_listener, 90 syncer::ModelTypeSet restored_types); 91 92 base::WeakPtrFactory<SyncBackendHostForProfileSyncTest> weak_ptr_factory_; 93 94 syncer::TestIdFactory& id_factory_; 95 96 // Invoked at the start of HandleSyncManagerInitializationOnFrontendLoop. 97 // Allows extra initialization work to be performed before the backend comes 98 // up. 99 base::Closure& callback_; 100 101 // Saved closure in case we failed the initial download but then received 102 // new credentials. Holds the results of 103 // HandleSyncManagerInitializationOnFrontendLoop, and if 104 // |fail_initial_download_| was true, finishes the initialization process 105 // once we receive new credentials. 106 base::Closure initial_download_closure_; 107 bool fail_initial_download_; 108 109 bool set_initial_sync_ended_on_init_; 110 bool synchronous_init_; 111 syncer::StorageOption storage_option_; 112 }; 113 114 } // namespace browser_sync 115 116 class TestProfileSyncService : public ProfileSyncService { 117 public: 118 // TODO(tim): Remove |synchronous_backend_initialization|, and add ability to 119 // inject TokenService alongside SigninManager. 120 TestProfileSyncService( 121 ProfileSyncComponentsFactory* factory, 122 Profile* profile, 123 SigninManagerBase* signin, 124 ProfileSyncService::StartBehavior behavior, 125 bool synchronous_backend_initialization); 126 127 virtual ~TestProfileSyncService(); 128 129 virtual void RequestAccessToken() OVERRIDE; 130 virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, 131 const GoogleServiceAuthError& error) OVERRIDE; 132 133 virtual void OnBackendInitialized( 134 const syncer::WeakHandle<syncer::JsBackend>& backend, 135 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& 136 debug_info_listener, 137 bool success) OVERRIDE; 138 139 virtual void OnConfigureDone( 140 const browser_sync::DataTypeManager::ConfigureResult& result) OVERRIDE; 141 142 // We implement our own version to avoid some DCHECKs. 143 virtual syncer::UserShare* GetUserShare() const OVERRIDE; 144 145 static BrowserContextKeyedService* BuildAutoStartAsyncInit( 146 content::BrowserContext* profile); 147 148 ProfileSyncComponentsFactoryMock* components_factory_mock(); 149 150 // If this is called, configuring data types will require a syncer 151 // nudge. 152 void dont_set_initial_sync_ended_on_init(); 153 void set_synchronous_sync_configuration(); 154 155 // Fails initial download until a new auth token is provided. 156 void fail_initial_download(); 157 158 void set_storage_option(syncer::StorageOption option); 159 160 // |callback| can be used to populate nodes before the OnBackendInitialized 161 // callback fires. 162 void set_backend_init_callback(const base::Closure& callback) { 163 callback_ = callback; 164 } 165 166 syncer::TestIdFactory* id_factory(); 167 168 // Override of ProfileSyncService::GetBackendForTest() with a more 169 // specific return type (since C++ supports covariant return types) 170 // that is made public. 171 virtual browser_sync::SyncBackendHostForProfileSyncTest* 172 GetBackendForTest() OVERRIDE; 173 174 protected: 175 virtual void CreateBackend() OVERRIDE; 176 177 // Return NULL handle to use in backend initialization to avoid receiving 178 // js messages on UI loop when it's being destroyed, which are not deleted 179 // and cause memory leak in test. 180 virtual syncer::WeakHandle<syncer::JsEventHandler> GetJsEventHandler() 181 OVERRIDE; 182 183 private: 184 syncer::TestIdFactory id_factory_; 185 186 bool synchronous_backend_initialization_; 187 188 // Set to true when a mock data type manager is being used and the configure 189 // step is performed synchronously. 190 bool synchronous_sync_configuration_; 191 192 base::Closure callback_; 193 bool set_initial_sync_ended_on_init_; 194 195 bool fail_initial_download_; 196 syncer::StorageOption storage_option_; 197 }; 198 199 200 class FakeOAuth2TokenService : public ProfileOAuth2TokenService { 201 public: 202 virtual scoped_ptr<OAuth2TokenService::Request> StartRequest( 203 const OAuth2TokenService::ScopeSet& scopes, 204 OAuth2TokenService::Consumer* consumer) OVERRIDE; 205 206 static BrowserContextKeyedService* BuildTokenService( 207 content::BrowserContext* context); 208 }; 209 210 #endif // CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ 211