| OLD | NEW | 
|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ | 5 #ifndef CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ | 
| 6 #define CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ | 6 #define CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ | 
| 7 #pragma once | 7 #pragma once | 
| 8 | 8 | 
| 9 #include <string> | 9 #include <string> | 
| 10 | 10 | 
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" | 
| 12 #include "chrome/browser/profile.h" | 12 #include "chrome/browser/profile.h" | 
| 13 #include "chrome/browser/sync/engine/syncapi.h" | 13 #include "chrome/browser/sync/engine/syncapi.h" | 
| 14 #include "chrome/browser/sync/profile_sync_factory.h" | 14 #include "chrome/browser/sync/profile_sync_factory.h" | 
| 15 #include "chrome/browser/sync/profile_sync_service.h" | 15 #include "chrome/browser/sync/profile_sync_service.h" | 
| 16 #include "chrome/browser/sync/glue/data_type_controller.h" | 16 #include "chrome/browser/sync/glue/data_type_controller.h" | 
| 17 #include "chrome/browser/sync/glue/data_type_manager_impl.h" | 17 #include "chrome/browser/sync/glue/data_type_manager_impl.h" | 
| 18 #include "chrome/browser/sync/glue/sync_backend_host.h" | 18 #include "chrome/browser/sync/glue/sync_backend_host.h" | 
| 19 #include "chrome/browser/sync/sessions/session_state.h" | 19 #include "chrome/browser/sync/sessions/session_state.h" | 
| 20 #include "chrome/browser/sync/syncable/directory_manager.h" | 20 #include "chrome/browser/sync/syncable/directory_manager.h" | 
| 21 #include "chrome/browser/sync/syncable/syncable.h" | 21 #include "chrome/browser/sync/syncable/syncable.h" | 
| 22 #include "chrome/common/notification_service.h" | 22 #include "chrome/common/notification_service.h" | 
| 23 #include "chrome/test/profile_mock.h" | 23 #include "chrome/test/profile_mock.h" | 
| 24 #include "chrome/test/sync/test_http_bridge_factory.h" | 24 #include "chrome/test/sync/test_http_bridge_factory.h" | 
|  | 25 #include "chrome/test/sync/engine/test_id_factory.h" | 
| 25 #include "testing/gmock/include/gmock/gmock.h" | 26 #include "testing/gmock/include/gmock/gmock.h" | 
| 26 | 27 | 
| 27 using browser_sync::ModelSafeRoutingInfo; | 28 using browser_sync::ModelSafeRoutingInfo; | 
| 28 using browser_sync::sessions::ErrorCounters; | 29 using browser_sync::sessions::ErrorCounters; | 
| 29 using browser_sync::sessions::SyncerStatus; | 30 using browser_sync::sessions::SyncerStatus; | 
| 30 using browser_sync::sessions::SyncSessionSnapshot; | 31 using browser_sync::sessions::SyncSessionSnapshot; | 
| 31 using sync_api::UserShare; | 32 using sync_api::UserShare; | 
| 32 using syncable::DirectoryManager; | 33 using syncable::DirectoryManager; | 
| 33 using syncable::ModelType; | 34 using syncable::ModelType; | 
| 34 using syncable::ScopedDirLookup; | 35 using syncable::ScopedDirLookup; | 
| 35 | 36 | 
|  | 37 class TestProfileSyncService; | 
|  | 38 | 
| 36 ACTION_P(CallOnPaused, core) { | 39 ACTION_P(CallOnPaused, core) { | 
| 37   core->OnPaused(); | 40   core->OnPaused(); | 
| 38 }; | 41 }; | 
| 39 | 42 | 
| 40 ACTION_P(CallOnResumed, core) { | 43 ACTION_P(CallOnResumed, core) { | 
| 41   core->OnResumed(); | 44   core->OnResumed(); | 
| 42 } | 45 } | 
| 43 | 46 | 
| 44 ACTION(ReturnNewDataTypeManager) { | 47 ACTION(ReturnNewDataTypeManager) { | 
| 45   return new browser_sync::DataTypeManagerImpl(arg0, arg1); | 48   return new browser_sync::DataTypeManagerImpl(arg0, arg1); | 
| 46 } | 49 } | 
| 47 | 50 | 
| 48 namespace browser_sync { | 51 namespace browser_sync { | 
| 49 | 52 | 
| 50 // Mocks out the SyncerThread operations (Pause/Resume) since no thread is | 53 // Mocks out the SyncerThread operations (Pause/Resume) since no thread is | 
| 51 // running in these tests, and allows tests to provide a task on construction | 54 // running in these tests, and allows tests to provide a task on construction | 
| 52 // to set up initial nodes to mock out an actual server initial sync | 55 // to set up initial nodes to mock out an actual server initial sync | 
| 53 // download. | 56 // download. | 
| 54 class SyncBackendHostForProfileSyncTest : public SyncBackendHost { | 57 class SyncBackendHostForProfileSyncTest : public SyncBackendHost { | 
| 55  public: | 58  public: | 
| 56   // |initial_condition_setup_task| can be used to populate nodes before the | 59   // |initial_condition_setup_task| can be used to populate nodes before the | 
| 57   //     OnBackendInitialized callback fires. | 60   //     OnBackendInitialized callback fires. | 
| 58   // |set_initial_sync_ended_on_init| determines whether we pretend that a full | 61   // |set_initial_sync_ended_on_init| determines whether we pretend that a full | 
| 59   //     initial download has occurred and set bits for enabled data types.  If | 62   //     initial download has occurred and set bits for enabled data types.  If | 
| 60   //     this is false, configuring data types will require a syncer nudge. | 63   //     this is false, configuring data types will require a syncer nudge. | 
| 61   // |synchronous_init| causes initialization to block until the syncapi has | 64   // |synchronous_init| causes initialization to block until the syncapi has | 
| 62   //     completed setting itself up and called us back. | 65   //     completed setting itself up and called us back. | 
| 63   SyncBackendHostForProfileSyncTest(SyncFrontend* frontend, | 66   SyncBackendHostForProfileSyncTest(TestProfileSyncService* service, | 
| 64       Profile* profile, | 67       Profile* profile, | 
| 65       const FilePath& profile_path, | 68       const FilePath& profile_path, | 
| 66       const DataTypeController::TypeMap& data_type_controllers, | 69       const DataTypeController::TypeMap& data_type_controllers, | 
| 67       Task* initial_condition_setup_task, | 70       Task* initial_condition_setup_task, | 
| 68       int num_expected_resumes, | 71       int num_expected_resumes, | 
| 69       int num_expected_pauses, | 72       int num_expected_pauses, | 
| 70       bool set_initial_sync_ended_on_init, | 73       bool set_initial_sync_ended_on_init, | 
| 71       bool synchronous_init) | 74       bool synchronous_init); | 
| 72       : browser_sync::SyncBackendHost(frontend, profile, profile_path, |  | 
| 73                                       data_type_controllers), |  | 
| 74         initial_condition_setup_task_(initial_condition_setup_task), |  | 
| 75         set_initial_sync_ended_on_init_(set_initial_sync_ended_on_init), |  | 
| 76         synchronous_init_(synchronous_init) { |  | 
| 77     // By default, the RequestPause and RequestResume methods will |  | 
| 78     // send the confirmation notification and return true. |  | 
| 79     ON_CALL(*this, RequestPause()). |  | 
| 80         WillByDefault(testing::DoAll(CallOnPaused(core_), |  | 
| 81                                      testing::Return(true))); |  | 
| 82     ON_CALL(*this, RequestResume()). |  | 
| 83         WillByDefault(testing::DoAll(CallOnResumed(core_), |  | 
| 84                                      testing::Return(true))); |  | 
| 85     ON_CALL(*this, RequestNudge()).WillByDefault(testing::Invoke(this, |  | 
| 86          &SyncBackendHostForProfileSyncTest:: |  | 
| 87              SimulateSyncCycleCompletedInitialSyncEnded)); |  | 
| 88 |  | 
| 89     EXPECT_CALL(*this, RequestPause()).Times(num_expected_pauses); |  | 
| 90     EXPECT_CALL(*this, RequestResume()).Times(num_expected_resumes); |  | 
| 91     EXPECT_CALL(*this, RequestNudge()). |  | 
| 92         Times(set_initial_sync_ended_on_init ? 0 : 1); |  | 
| 93   } |  | 
| 94 | 75 | 
| 95   MOCK_METHOD0(RequestPause, bool()); | 76   MOCK_METHOD0(RequestPause, bool()); | 
| 96   MOCK_METHOD0(RequestResume, bool()); | 77   MOCK_METHOD0(RequestResume, bool()); | 
| 97   MOCK_METHOD0(RequestNudge, void()); | 78   MOCK_METHOD0(RequestNudge, void()); | 
| 98 | 79 | 
| 99   void SetInitialSyncEndedForEnabledTypes() { | 80   void SetInitialSyncEndedForEnabledTypes(); | 
| 100     UserShare* user_share = core_->syncapi()->GetUserShare(); |  | 
| 101     DirectoryManager* dir_manager = user_share->dir_manager.get(); |  | 
| 102 | 81 | 
| 103     ScopedDirLookup dir(dir_manager, user_share->name); | 82   virtual void HandleInitializationCompletedOnFrontendLoop(); | 
| 104     if (!dir.good()) |  | 
| 105       FAIL(); |  | 
| 106 |  | 
| 107     ModelSafeRoutingInfo enabled_types; |  | 
| 108     GetModelSafeRoutingInfo(&enabled_types); |  | 
| 109     for (ModelSafeRoutingInfo::const_iterator i = enabled_types.begin(); |  | 
| 110          i != enabled_types.end(); ++i) { |  | 
| 111       dir->set_initial_sync_ended_for_type(i->first, true); |  | 
| 112     } |  | 
| 113   } |  | 
| 114 |  | 
| 115   virtual void HandleInitializationCompletedOnFrontendLoop() { |  | 
| 116     set_syncapi_initialized();  // Need to do this asap so task below works. |  | 
| 117 |  | 
| 118     // Set up any nodes the test wants around before model association. |  | 
| 119     if (initial_condition_setup_task_) { |  | 
| 120       initial_condition_setup_task_->Run(); |  | 
| 121     } |  | 
| 122 |  | 
| 123     // Pretend we downloaded initial updates and set initial sync ended bits |  | 
| 124     // if we were asked to. |  | 
| 125     if (set_initial_sync_ended_on_init_) |  | 
| 126       SetInitialSyncEndedForEnabledTypes(); |  | 
| 127 |  | 
| 128     SyncBackendHost::HandleInitializationCompletedOnFrontendLoop(); |  | 
| 129   } |  | 
| 130 | 83 | 
| 131   // Called when a nudge comes in. | 84   // Called when a nudge comes in. | 
| 132   void SimulateSyncCycleCompletedInitialSyncEnded() { | 85   void SimulateSyncCycleCompletedInitialSyncEnded(); | 
| 133     syncable::ModelTypeBitSet sync_ended; |  | 
| 134     ModelSafeRoutingInfo enabled_types; |  | 
| 135     GetModelSafeRoutingInfo(&enabled_types); |  | 
| 136     for (ModelSafeRoutingInfo::const_iterator i = enabled_types.begin(); |  | 
| 137          i != enabled_types.end(); ++i) { |  | 
| 138       sync_ended.set(i->first); |  | 
| 139     } |  | 
| 140     core_->HandleSyncCycleCompletedOnFrontendLoop(new SyncSessionSnapshot( |  | 
| 141         SyncerStatus(), ErrorCounters(), 0, 0, false, |  | 
| 142         sync_ended, false, false, 0, 0, false)); |  | 
| 143   } |  | 
| 144 | 86 | 
| 145   virtual sync_api::HttpPostProviderFactory* MakeHttpBridgeFactory( | 87   virtual sync_api::HttpPostProviderFactory* MakeHttpBridgeFactory( | 
| 146       URLRequestContextGetter* getter) { | 88       URLRequestContextGetter* getter) { | 
| 147     return new browser_sync::TestHttpBridgeFactory; | 89     return new browser_sync::TestHttpBridgeFactory; | 
| 148   } | 90   } | 
| 149 | 91 | 
| 150   virtual void InitCore(const Core::DoInitializeOptions& options) { | 92   virtual void InitCore(const Core::DoInitializeOptions& options); | 
| 151     std::wstring user = L"testuser"; |  | 
| 152     core_loop()->PostTask(FROM_HERE, |  | 
| 153         NewRunnableMethod(core_.get(), |  | 
| 154         &SyncBackendHost::Core::DoInitializeForTest, |  | 
| 155         user, |  | 
| 156         options.http_bridge_factory, |  | 
| 157         options.delete_sync_data_folder)); |  | 
| 158 | 93 | 
| 159     // TODO(akalin): Figure out a better way to do this. | 94   static void SetDefaultExpectationsForWorkerCreation(ProfileMock* profile); | 
| 160     if (synchronous_init_) { |  | 
| 161       // The SyncBackend posts a task to the current loop when |  | 
| 162       // initialization completes. |  | 
| 163       MessageLoop::current()->Run(); |  | 
| 164     } |  | 
| 165   } |  | 
| 166 |  | 
| 167   static void SetDefaultExpectationsForWorkerCreation(ProfileMock* profile) { |  | 
| 168     EXPECT_CALL(*profile, GetPasswordStore(testing::_)). |  | 
| 169         WillOnce(testing::Return((PasswordStore*)NULL)); |  | 
| 170     EXPECT_CALL(*profile, GetHistoryService(testing::_)). |  | 
| 171         WillOnce(testing::Return((HistoryService*)NULL)); |  | 
| 172   } |  | 
| 173 | 95 | 
| 174  private: | 96  private: | 
| 175   Task* initial_condition_setup_task_; | 97   Task* initial_condition_setup_task_; | 
| 176   bool set_initial_sync_ended_on_init_; | 98   bool set_initial_sync_ended_on_init_; | 
| 177   bool synchronous_init_; | 99   bool synchronous_init_; | 
| 178 | 100   TestProfileSyncService* test_service_; | 
| 179 }; | 101 }; | 
| 180 | 102 | 
| 181 }  // namespace browser_sync | 103 }  // namespace browser_sync | 
| 182 | 104 | 
| 183 class TestProfileSyncService : public ProfileSyncService { | 105 class TestProfileSyncService : public ProfileSyncService { | 
| 184  public: | 106  public: | 
| 185   TestProfileSyncService(ProfileSyncFactory* factory, | 107   TestProfileSyncService(ProfileSyncFactory* factory, | 
| 186                          Profile* profile, | 108                          Profile* profile, | 
| 187                          const std::string& test_user, | 109                          const std::string& test_user, | 
| 188                          bool synchronous_backend_initialization, | 110                          bool synchronous_backend_initialization, | 
| 189                          Task* initial_condition_setup_task) | 111                          Task* initial_condition_setup_task); | 
| 190       : ProfileSyncService(factory, profile, |  | 
| 191                            !test_user.empty() ? |  | 
| 192                            test_user : ""), |  | 
| 193         synchronous_backend_initialization_( |  | 
| 194             synchronous_backend_initialization), |  | 
| 195         synchronous_sync_configuration_(false), |  | 
| 196         num_expected_resumes_(1), |  | 
| 197         num_expected_pauses_(1), |  | 
| 198         initial_condition_setup_task_(initial_condition_setup_task), |  | 
| 199         set_initial_sync_ended_on_init_(true) { |  | 
| 200     RegisterPreferences(); |  | 
| 201     SetSyncSetupCompleted(); |  | 
| 202   } |  | 
| 203   virtual ~TestProfileSyncService() { } | 112   virtual ~TestProfileSyncService() { } | 
| 204 | 113 | 
| 205   virtual void CreateBackend() { | 114   virtual void CreateBackend(); | 
| 206     backend_.reset(new browser_sync::SyncBackendHostForProfileSyncTest( |  | 
| 207         this, profile(), |  | 
| 208         profile()->GetPath(), data_type_controllers(), |  | 
| 209         initial_condition_setup_task_.release(), |  | 
| 210         num_expected_resumes_, num_expected_pauses_, |  | 
| 211         set_initial_sync_ended_on_init_, |  | 
| 212         synchronous_backend_initialization_)); |  | 
| 213   } |  | 
| 214 | 115 | 
| 215   virtual void OnBackendInitialized() { | 116   virtual void OnBackendInitialized(); | 
| 216     ProfileSyncService::OnBackendInitialized(); |  | 
| 217     // TODO(akalin): Figure out a better way to do this. |  | 
| 218     if (synchronous_backend_initialization_) { |  | 
| 219       MessageLoop::current()->Quit(); |  | 
| 220     } |  | 
| 221   } |  | 
| 222 | 117 | 
| 223   virtual void Observe(NotificationType type, | 118   virtual void Observe(NotificationType type, | 
| 224                       const NotificationSource& source, | 119                       const NotificationSource& source, | 
| 225                       const NotificationDetails& details) { | 120                       const NotificationDetails& details); | 
| 226     ProfileSyncService::Observe(type, source, details); |  | 
| 227     if (type == NotificationType::SYNC_CONFIGURE_DONE && |  | 
| 228         !synchronous_sync_configuration_) { |  | 
| 229       MessageLoop::current()->Quit(); |  | 
| 230     } |  | 
| 231   } |  | 
| 232 | 121 | 
| 233   void set_num_expected_resumes(int times) { | 122   void set_num_expected_resumes(int times) { | 
| 234     num_expected_resumes_ = times; | 123     num_expected_resumes_ = times; | 
| 235   } | 124   } | 
| 236   void set_num_expected_pauses(int num) { | 125   void set_num_expected_pauses(int num) { | 
| 237     num_expected_pauses_ = num; | 126     num_expected_pauses_ = num; | 
| 238   } | 127   } | 
| 239   void dont_set_initial_sync_ended_on_init() { | 128   void dont_set_initial_sync_ended_on_init() { | 
| 240     set_initial_sync_ended_on_init_ = false; | 129     set_initial_sync_ended_on_init_ = false; | 
| 241   } | 130   } | 
| 242   void set_synchronous_sync_configuration() { | 131   void set_synchronous_sync_configuration() { | 
| 243     synchronous_sync_configuration_ = true; | 132     synchronous_sync_configuration_ = true; | 
| 244   } | 133   } | 
| 245 | 134 | 
|  | 135   browser_sync::TestIdFactory* id_factory() { return &id_factory_; } | 
|  | 136 | 
| 246  private: | 137  private: | 
| 247   // When testing under ChromiumOS, this method must not return an empty | 138   // When testing under ChromiumOS, this method must not return an empty | 
| 248   // value value in order for the profile sync service to start. | 139   // value value in order for the profile sync service to start. | 
| 249   virtual std::string GetLsidForAuthBootstraping() { | 140   virtual std::string GetLsidForAuthBootstraping() { | 
| 250     return "foo"; | 141     return "foo"; | 
| 251   } | 142   } | 
| 252 | 143 | 
| 253   bool synchronous_backend_initialization_; | 144   bool synchronous_backend_initialization_; | 
| 254 | 145 | 
| 255   // Set to true when a mock data type manager is being used and the configure | 146   // Set to true when a mock data type manager is being used and the configure | 
| 256   // step is performed synchronously. | 147   // step is performed synchronously. | 
| 257   bool synchronous_sync_configuration_; | 148   bool synchronous_sync_configuration_; | 
| 258   bool set_expect_resume_expectations_; | 149   bool set_expect_resume_expectations_; | 
| 259   int num_expected_resumes_; | 150   int num_expected_resumes_; | 
| 260   int num_expected_pauses_; | 151   int num_expected_pauses_; | 
| 261 | 152 | 
| 262   scoped_ptr<Task> initial_condition_setup_task_; | 153   scoped_ptr<Task> initial_condition_setup_task_; | 
| 263   bool set_initial_sync_ended_on_init_; | 154   bool set_initial_sync_ended_on_init_; | 
|  | 155   browser_sync::TestIdFactory id_factory_; | 
|  | 156 | 
| 264 }; | 157 }; | 
| 265 | 158 | 
| 266 #endif  // CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ | 159 #endif  // CHROME_BROWSER_SYNC_TEST_PROFILE_SYNC_SERVICE_H_ | 
| OLD | NEW | 
|---|