| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "testing/gtest/include/gtest/gtest.h" | 5 #include "testing/gtest/include/gtest/gtest.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
| 9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| 12 #include "base/scoped_temp_dir.h" | 12 #include "base/scoped_temp_dir.h" |
| 13 #include "base/task.h" | 13 #include "base/task.h" |
| 14 #include "chrome/browser/extensions/extension_settings_backend.h" | |
| 15 #include "chrome/browser/extensions/extension_settings_frontend.h" | 14 #include "chrome/browser/extensions/extension_settings_frontend.h" |
| 16 #include "chrome/browser/extensions/extension_settings_storage_cache.h" | 15 #include "chrome/browser/extensions/extension_settings_storage_cache.h" |
| 17 #include "chrome/browser/extensions/extension_settings_sync_util.h" | 16 #include "chrome/browser/extensions/extension_settings_sync_util.h" |
| 18 #include "chrome/browser/extensions/syncable_extension_settings_storage.h" | 17 #include "chrome/browser/extensions/syncable_extension_settings_storage.h" |
| 18 #include "chrome/browser/extensions/extension_settings_test_util.h" |
| 19 #include "chrome/browser/sync/api/sync_change_processor.h" | 19 #include "chrome/browser/sync/api/sync_change_processor.h" |
| 20 #include "chrome/test/base/testing_profile.h" | |
| 21 #include "content/browser/browser_thread.h" | 20 #include "content/browser/browser_thread.h" |
| 22 | 21 |
| 23 // TODO(kalman): Integration tests for sync. | 22 // TODO(kalman): Integration tests for sync. |
| 24 | 23 |
| 24 using namespace extension_settings_test_util; |
| 25 |
| 25 namespace { | 26 namespace { |
| 26 | 27 |
| 27 // Gets the pretty-printed JSON for a value. | 28 // Gets the pretty-printed JSON for a value. |
| 28 static std::string GetJson(const Value& value) { | 29 static std::string GetJson(const Value& value) { |
| 29 std::string json; | 30 std::string json; |
| 30 base::JSONWriter::Write(&value, true, &json); | 31 base::JSONWriter::Write(&value, true, &json); |
| 31 return json; | 32 return json; |
| 32 } | 33 } |
| 33 | 34 |
| 34 // Returns whether two Values are equal. | 35 // Returns whether two Values are equal. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 ADD_FAILURE() << matching_changes.size() << " matching changes for " << | 113 ADD_FAILURE() << matching_changes.size() << " matching changes for " << |
| 113 extension_id << "/" << key << " (out of " << changes_.size() << ")"; | 114 extension_id << "/" << key << " (out of " << changes_.size() << ")"; |
| 114 } | 115 } |
| 115 return matching_changes[0]; | 116 return matching_changes[0]; |
| 116 } | 117 } |
| 117 | 118 |
| 118 private: | 119 private: |
| 119 ExtensionSettingSyncDataList changes_; | 120 ExtensionSettingSyncDataList changes_; |
| 120 }; | 121 }; |
| 121 | 122 |
| 122 // To be called as a callback from ExtensionSettingsFrontend::RunWithSettings. | 123 void AssignSettingsService(SyncableService** dst, SyncableService* src) { |
| 123 void AssignSettings( | |
| 124 ExtensionSettingsBackend** dst, ExtensionSettingsBackend* src) { | |
| 125 *dst = src; | 124 *dst = src; |
| 126 } | 125 } |
| 127 | 126 |
| 128 } // namespace | 127 } // namespace |
| 129 | 128 |
| 130 class ExtensionSettingsSyncTest : public testing::Test { | 129 class ExtensionSettingsSyncTest : public testing::Test { |
| 131 public: | 130 public: |
| 132 ExtensionSettingsSyncTest() | 131 ExtensionSettingsSyncTest() |
| 133 : ui_thread_(BrowserThread::UI, MessageLoop::current()), | 132 : ui_thread_(BrowserThread::UI, MessageLoop::current()), |
| 134 file_thread_(BrowserThread::FILE, MessageLoop::current()), | 133 file_thread_(BrowserThread::FILE, MessageLoop::current()) {} |
| 135 frontend_(&profile_), | 134 |
| 136 backend_(NULL) { | 135 virtual void SetUp() OVERRIDE { |
| 136 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 137 profile_.reset(new MockProfile(temp_dir_.path())); |
| 138 frontend_.reset(new ExtensionSettingsFrontend(profile_.get())); |
| 137 } | 139 } |
| 138 | 140 |
| 139 virtual void SetUp() OVERRIDE { | 141 virtual void TearDown() OVERRIDE { |
| 140 frontend_.RunWithBackend(base::Bind(&AssignSettings, &backend_)); | 142 frontend_.reset(); |
| 141 MessageLoop::current()->RunAllPending(); | 143 profile_.reset(); |
| 142 ASSERT_TRUE(backend_ != NULL); | |
| 143 } | 144 } |
| 144 | 145 |
| 145 protected: | 146 protected: |
| 146 // Creates a new extension storage object and adds a record of the extension | 147 // Adds a record of an extension or app to the extension service, then returns |
| 147 // to the extension service. | 148 // its storage area. |
| 148 SyncableExtensionSettingsStorage* GetStorage( | 149 ExtensionSettingsStorage* AddExtensionAndGetStorage( |
| 149 const std::string& extension_id) { | 150 const std::string& id, bool is_app) { |
| 150 return static_cast<SyncableExtensionSettingsStorage*>( | 151 profile_->GetMockExtensionService()->AddExtension(id, is_app); |
| 151 backend_->GetStorage(extension_id)); | 152 return GetStorage(id, frontend_.get()); |
| 152 } | 153 } |
| 153 | 154 |
| 154 // Gets all the sync data from |backend_| as a map from extension id to its | 155 // Gets the SyncableService for the given sync type. |
| 155 // sync data. | 156 SyncableService* GetSyncableService(syncable::ModelType model_type) { |
| 156 std::map<std::string, ExtensionSettingSyncDataList> GetAllSyncData() { | 157 SyncableService* settings_service = NULL; |
| 157 SyncDataList as_list = | 158 frontend_->RunWithSyncableService( |
| 158 backend_->GetAllSyncData(syncable::EXTENSION_SETTINGS); | 159 model_type, base::Bind(&AssignSettingsService, &settings_service)); |
| 160 MessageLoop::current()->RunAllPending(); |
| 161 return settings_service; |
| 162 } |
| 163 |
| 164 // Gets all the sync data from the SyncableService for a sync type as a map |
| 165 // from extension id to its sync data. |
| 166 std::map<std::string, ExtensionSettingSyncDataList> GetAllSyncData( |
| 167 syncable::ModelType type) { |
| 168 SyncDataList as_list = GetSyncableService(type)->GetAllSyncData(type); |
| 159 std::map<std::string, ExtensionSettingSyncDataList> as_map; | 169 std::map<std::string, ExtensionSettingSyncDataList> as_map; |
| 160 for (SyncDataList::iterator it = as_list.begin(); | 170 for (SyncDataList::iterator it = as_list.begin(); |
| 161 it != as_list.end(); ++it) { | 171 it != as_list.end(); ++it) { |
| 162 ExtensionSettingSyncData sync_data(*it); | 172 ExtensionSettingSyncData sync_data(*it); |
| 163 as_map[sync_data.extension_id()].push_back(sync_data); | 173 as_map[sync_data.extension_id()].push_back(sync_data); |
| 164 } | 174 } |
| 165 return as_map; | 175 return as_map; |
| 166 } | 176 } |
| 167 | 177 |
| 168 // Need these so that the DCHECKs for running on FILE or UI threads pass. | 178 // Need these so that the DCHECKs for running on FILE or UI threads pass. |
| 169 MessageLoop message_loop_; | 179 MessageLoop message_loop_; |
| 170 BrowserThread ui_thread_; | 180 BrowserThread ui_thread_; |
| 171 BrowserThread file_thread_; | 181 BrowserThread file_thread_; |
| 172 | 182 |
| 183 ScopedTempDir temp_dir_; |
| 173 MockSyncChangeProcessor sync_; | 184 MockSyncChangeProcessor sync_; |
| 174 TestingProfile profile_; | 185 scoped_ptr<MockProfile> profile_; |
| 175 ExtensionSettingsFrontend frontend_; | 186 scoped_ptr<ExtensionSettingsFrontend> frontend_; |
| 176 | |
| 177 // Get from frontend_->RunWithBackend, so weak reference. | |
| 178 ExtensionSettingsBackend* backend_; | |
| 179 }; | 187 }; |
| 180 | 188 |
| 189 // Get a semblance of coverage for both EXTENSION_SETTINGS and APP_SETTINGS |
| 190 // sync by roughly alternative which one to test. |
| 191 |
| 181 TEST_F(ExtensionSettingsSyncTest, NoDataDoesNotInvokeSync) { | 192 TEST_F(ExtensionSettingsSyncTest, NoDataDoesNotInvokeSync) { |
| 182 ASSERT_EQ(0u, GetAllSyncData().size()); | 193 syncable::ModelType type = syncable::EXTENSION_SETTINGS; |
| 194 bool is_app = false; |
| 195 |
| 196 ASSERT_EQ(0u, GetAllSyncData(type).size()); |
| 183 | 197 |
| 184 // Have one extension created before sync is set up, the other created after. | 198 // Have one extension created before sync is set up, the other created after. |
| 185 GetStorage("s1"); | 199 AddExtensionAndGetStorage("s1", is_app); |
| 186 ASSERT_EQ(0u, GetAllSyncData().size()); | 200 ASSERT_EQ(0u, GetAllSyncData(type).size()); |
| 187 | 201 |
| 188 backend_->MergeDataAndStartSyncing( | 202 GetSyncableService(type)->MergeDataAndStartSyncing( |
| 189 syncable::EXTENSION_SETTINGS, | 203 type, SyncDataList(), &sync_); |
| 190 SyncDataList(), | |
| 191 &sync_); | |
| 192 | 204 |
| 193 GetStorage("s2"); | 205 AddExtensionAndGetStorage("s2", is_app); |
| 194 ASSERT_EQ(0u, GetAllSyncData().size()); | 206 ASSERT_EQ(0u, GetAllSyncData(type).size()); |
| 195 | 207 |
| 196 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); | 208 GetSyncableService(type)->StopSyncing(type); |
| 197 | 209 |
| 198 ASSERT_EQ(0u, sync_.changes().size()); | 210 ASSERT_EQ(0u, sync_.changes().size()); |
| 199 ASSERT_EQ(0u, GetAllSyncData().size()); | 211 ASSERT_EQ(0u, GetAllSyncData(type).size()); |
| 200 } | 212 } |
| 201 | 213 |
| 202 TEST_F(ExtensionSettingsSyncTest, InSyncDataDoesNotInvokeSync) { | 214 TEST_F(ExtensionSettingsSyncTest, InSyncDataDoesNotInvokeSync) { |
| 215 syncable::ModelType type = syncable::APP_SETTINGS; |
| 216 bool is_app = true; |
| 217 |
| 203 StringValue value1("fooValue"); | 218 StringValue value1("fooValue"); |
| 204 ListValue value2; | 219 ListValue value2; |
| 205 value2.Append(StringValue::CreateStringValue("barValue")); | 220 value2.Append(StringValue::CreateStringValue("barValue")); |
| 206 | 221 |
| 207 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); | 222 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app); |
| 208 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); | 223 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app); |
| 209 | 224 |
| 210 storage1->Set("foo", value1); | 225 storage1->Set("foo", value1); |
| 211 storage2->Set("bar", value2); | 226 storage2->Set("bar", value2); |
| 212 | 227 |
| 213 std::map<std::string, ExtensionSettingSyncDataList> all_sync_data = | 228 std::map<std::string, ExtensionSettingSyncDataList> all_sync_data = |
| 214 GetAllSyncData(); | 229 GetAllSyncData(type); |
| 215 ASSERT_EQ(2u, all_sync_data.size()); | 230 ASSERT_EQ(2u, all_sync_data.size()); |
| 216 ASSERT_EQ(1u, all_sync_data["s1"].size()); | 231 ASSERT_EQ(1u, all_sync_data["s1"].size()); |
| 217 ASSERT_PRED_FORMAT2(ValuesEq, &value1, &all_sync_data["s1"][0].value()); | 232 ASSERT_PRED_FORMAT2(ValuesEq, &value1, &all_sync_data["s1"][0].value()); |
| 218 ASSERT_EQ(1u, all_sync_data["s2"].size()); | 233 ASSERT_EQ(1u, all_sync_data["s2"].size()); |
| 219 ASSERT_PRED_FORMAT2(ValuesEq, &value2, &all_sync_data["s2"][0].value()); | 234 ASSERT_PRED_FORMAT2(ValuesEq, &value2, &all_sync_data["s2"][0].value()); |
| 220 | 235 |
| 221 SyncDataList sync_data; | 236 SyncDataList sync_data; |
| 222 sync_data.push_back(extension_settings_sync_util::CreateData( | 237 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 223 "s1", "foo", value1)); | 238 "s1", "foo", value1)); |
| 224 sync_data.push_back(extension_settings_sync_util::CreateData( | 239 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 225 "s2", "bar", value2)); | 240 "s2", "bar", value2)); |
| 226 | 241 |
| 227 backend_->MergeDataAndStartSyncing( | 242 GetSyncableService(type)->MergeDataAndStartSyncing(type, sync_data, &sync_); |
| 228 syncable::EXTENSION_SETTINGS, sync_data, &sync_); | 243 GetSyncableService(type)->StopSyncing(type); |
| 229 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); | |
| 230 | 244 |
| 231 // Already in sync, so no changes. | 245 // Already in sync, so no changes. |
| 232 ASSERT_EQ(0u, sync_.changes().size()); | 246 ASSERT_EQ(0u, sync_.changes().size()); |
| 233 } | 247 } |
| 234 | 248 |
| 235 TEST_F(ExtensionSettingsSyncTest, LocalDataWithNoSyncDataIsPushedToSync) { | 249 TEST_F(ExtensionSettingsSyncTest, LocalDataWithNoSyncDataIsPushedToSync) { |
| 250 syncable::ModelType type = syncable::EXTENSION_SETTINGS; |
| 251 bool is_app = false; |
| 252 |
| 236 StringValue value1("fooValue"); | 253 StringValue value1("fooValue"); |
| 237 ListValue value2; | 254 ListValue value2; |
| 238 value2.Append(StringValue::CreateStringValue("barValue")); | 255 value2.Append(StringValue::CreateStringValue("barValue")); |
| 239 | 256 |
| 240 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); | 257 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app); |
| 241 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); | 258 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app); |
| 242 | 259 |
| 243 storage1->Set("foo", value1); | 260 storage1->Set("foo", value1); |
| 244 storage2->Set("bar", value2); | 261 storage2->Set("bar", value2); |
| 245 | 262 |
| 246 backend_->MergeDataAndStartSyncing( | 263 GetSyncableService(type)->MergeDataAndStartSyncing( |
| 247 syncable::EXTENSION_SETTINGS, SyncDataList(), &sync_); | 264 type, SyncDataList(), &sync_); |
| 248 | 265 |
| 249 // All settings should have been pushed to sync. | 266 // All settings should have been pushed to sync. |
| 250 ASSERT_EQ(2u, sync_.changes().size()); | 267 ASSERT_EQ(2u, sync_.changes().size()); |
| 251 ExtensionSettingSyncData change = sync_.GetOnlyChange("s1", "foo"); | 268 ExtensionSettingSyncData change = sync_.GetOnlyChange("s1", "foo"); |
| 252 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 269 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 253 ASSERT_TRUE(value1.Equals(&change.value())); | 270 ASSERT_TRUE(value1.Equals(&change.value())); |
| 254 change = sync_.GetOnlyChange("s2", "bar"); | 271 change = sync_.GetOnlyChange("s2", "bar"); |
| 255 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 272 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 256 ASSERT_TRUE(value2.Equals(&change.value())); | 273 ASSERT_TRUE(value2.Equals(&change.value())); |
| 257 | 274 |
| 258 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); | 275 GetSyncableService(type)->StopSyncing(type); |
| 259 } | 276 } |
| 260 | 277 |
| 261 TEST_F(ExtensionSettingsSyncTest, AnySyncDataOverwritesLocalData) { | 278 TEST_F(ExtensionSettingsSyncTest, AnySyncDataOverwritesLocalData) { |
| 279 syncable::ModelType type = syncable::APP_SETTINGS; |
| 280 bool is_app = true; |
| 281 |
| 262 StringValue value1("fooValue"); | 282 StringValue value1("fooValue"); |
| 263 ListValue value2; | 283 ListValue value2; |
| 264 value2.Append(StringValue::CreateStringValue("barValue")); | 284 value2.Append(StringValue::CreateStringValue("barValue")); |
| 265 | 285 |
| 266 // Maintain dictionaries mirrored to the expected values of the settings in | 286 // Maintain dictionaries mirrored to the expected values of the settings in |
| 267 // each storage area. | 287 // each storage area. |
| 268 DictionaryValue expected1, expected2; | 288 DictionaryValue expected1, expected2; |
| 269 | 289 |
| 270 // Pre-populate one of the storage areas. | 290 // Pre-populate one of the storage areas. |
| 271 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); | 291 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app); |
| 272 storage1->Set("overwriteMe", value1); | 292 storage1->Set("overwriteMe", value1); |
| 273 | 293 |
| 274 SyncDataList sync_data; | 294 SyncDataList sync_data; |
| 275 sync_data.push_back(extension_settings_sync_util::CreateData( | 295 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 276 "s1", "foo", value1)); | 296 "s1", "foo", value1)); |
| 277 sync_data.push_back(extension_settings_sync_util::CreateData( | 297 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 278 "s2", "bar", value2)); | 298 "s2", "bar", value2)); |
| 279 backend_->MergeDataAndStartSyncing( | 299 GetSyncableService(type)->MergeDataAndStartSyncing(type, sync_data, &sync_); |
| 280 syncable::EXTENSION_SETTINGS, sync_data, &sync_); | |
| 281 expected1.Set("foo", value1.DeepCopy()); | 300 expected1.Set("foo", value1.DeepCopy()); |
| 282 expected2.Set("bar", value2.DeepCopy()); | 301 expected2.Set("bar", value2.DeepCopy()); |
| 283 | 302 |
| 284 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); | 303 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app); |
| 285 | 304 |
| 286 // All changes should be local, so no sync changes. | 305 // All changes should be local, so no sync changes. |
| 287 ASSERT_EQ(0u, sync_.changes().size()); | 306 ASSERT_EQ(0u, sync_.changes().size()); |
| 288 | 307 |
| 289 // Sync settings should have been pushed to local settings. | 308 // Sync settings should have been pushed to local settings. |
| 290 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); | 309 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); |
| 291 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); | 310 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); |
| 292 | 311 |
| 293 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); | 312 GetSyncableService(type)->StopSyncing(type); |
| 294 } | 313 } |
| 295 | 314 |
| 296 TEST_F(ExtensionSettingsSyncTest, ProcessSyncChanges) { | 315 TEST_F(ExtensionSettingsSyncTest, ProcessSyncChanges) { |
| 316 syncable::ModelType type = syncable::EXTENSION_SETTINGS; |
| 317 bool is_app = false; |
| 318 |
| 297 StringValue value1("fooValue"); | 319 StringValue value1("fooValue"); |
| 298 ListValue value2; | 320 ListValue value2; |
| 299 value2.Append(StringValue::CreateStringValue("barValue")); | 321 value2.Append(StringValue::CreateStringValue("barValue")); |
| 300 | 322 |
| 301 // Maintain dictionaries mirrored to the expected values of the settings in | 323 // Maintain dictionaries mirrored to the expected values of the settings in |
| 302 // each storage area. | 324 // each storage area. |
| 303 DictionaryValue expected1, expected2; | 325 DictionaryValue expected1, expected2; |
| 304 | 326 |
| 305 // Make storage1 initialised from local data, storage2 initialised from sync. | 327 // Make storage1 initialised from local data, storage2 initialised from sync. |
| 306 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); | 328 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app); |
| 307 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); | 329 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app); |
| 308 | 330 |
| 309 storage1->Set("foo", value1); | 331 storage1->Set("foo", value1); |
| 310 expected1.Set("foo", value1.DeepCopy()); | 332 expected1.Set("foo", value1.DeepCopy()); |
| 311 | 333 |
| 312 SyncDataList sync_data; | 334 SyncDataList sync_data; |
| 313 sync_data.push_back(extension_settings_sync_util::CreateData( | 335 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 314 "s2", "bar", value2)); | 336 "s2", "bar", value2)); |
| 315 | 337 |
| 316 backend_->MergeDataAndStartSyncing( | 338 GetSyncableService(type)->MergeDataAndStartSyncing(type, sync_data, &sync_); |
| 317 syncable::EXTENSION_SETTINGS, sync_data, &sync_); | |
| 318 expected2.Set("bar", value2.DeepCopy()); | 339 expected2.Set("bar", value2.DeepCopy()); |
| 319 | 340 |
| 320 // Make sync add some settings. | 341 // Make sync add some settings. |
| 321 SyncChangeList change_list; | 342 SyncChangeList change_list; |
| 322 change_list.push_back(extension_settings_sync_util::CreateAdd( | 343 change_list.push_back(extension_settings_sync_util::CreateAdd( |
| 323 "s1", "bar", value2)); | 344 "s1", "bar", value2)); |
| 324 change_list.push_back(extension_settings_sync_util::CreateAdd( | 345 change_list.push_back(extension_settings_sync_util::CreateAdd( |
| 325 "s2", "foo", value1)); | 346 "s2", "foo", value1)); |
| 326 backend_->ProcessSyncChanges(FROM_HERE, change_list); | 347 GetSyncableService(type)->ProcessSyncChanges(FROM_HERE, change_list); |
| 327 expected1.Set("bar", value2.DeepCopy()); | 348 expected1.Set("bar", value2.DeepCopy()); |
| 328 expected2.Set("foo", value1.DeepCopy()); | 349 expected2.Set("foo", value1.DeepCopy()); |
| 329 | 350 |
| 330 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); | 351 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); |
| 331 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); | 352 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); |
| 332 | 353 |
| 333 // Make sync update some settings, storage1 the new setting, storage2 the | 354 // Make sync update some settings, storage1 the new setting, storage2 the |
| 334 // initial setting. | 355 // initial setting. |
| 335 change_list.clear(); | 356 change_list.clear(); |
| 336 change_list.push_back(extension_settings_sync_util::CreateUpdate( | 357 change_list.push_back(extension_settings_sync_util::CreateUpdate( |
| 337 "s1", "bar", value2)); | 358 "s1", "bar", value2)); |
| 338 change_list.push_back(extension_settings_sync_util::CreateUpdate( | 359 change_list.push_back(extension_settings_sync_util::CreateUpdate( |
| 339 "s2", "bar", value1)); | 360 "s2", "bar", value1)); |
| 340 backend_->ProcessSyncChanges(FROM_HERE, change_list); | 361 GetSyncableService(type)->ProcessSyncChanges(FROM_HERE, change_list); |
| 341 expected1.Set("bar", value2.DeepCopy()); | 362 expected1.Set("bar", value2.DeepCopy()); |
| 342 expected2.Set("bar", value1.DeepCopy()); | 363 expected2.Set("bar", value1.DeepCopy()); |
| 343 | 364 |
| 344 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); | 365 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); |
| 345 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); | 366 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); |
| 346 | 367 |
| 347 // Make sync remove some settings, storage1 the initial setting, storage2 the | 368 // Make sync remove some settings, storage1 the initial setting, storage2 the |
| 348 // new setting. | 369 // new setting. |
| 349 change_list.clear(); | 370 change_list.clear(); |
| 350 change_list.push_back(extension_settings_sync_util::CreateDelete( | 371 change_list.push_back(extension_settings_sync_util::CreateDelete( |
| 351 "s1", "foo")); | 372 "s1", "foo")); |
| 352 change_list.push_back(extension_settings_sync_util::CreateDelete( | 373 change_list.push_back(extension_settings_sync_util::CreateDelete( |
| 353 "s2", "foo")); | 374 "s2", "foo")); |
| 354 backend_->ProcessSyncChanges(FROM_HERE, change_list); | 375 GetSyncableService(type)->ProcessSyncChanges(FROM_HERE, change_list); |
| 355 expected1.Remove("foo", NULL); | 376 expected1.Remove("foo", NULL); |
| 356 expected2.Remove("foo", NULL); | 377 expected2.Remove("foo", NULL); |
| 357 | 378 |
| 358 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); | 379 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); |
| 359 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); | 380 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); |
| 360 | 381 |
| 361 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); | 382 GetSyncableService(type)->StopSyncing(type); |
| 362 } | 383 } |
| 363 | 384 |
| 364 TEST_F(ExtensionSettingsSyncTest, PushToSync) { | 385 TEST_F(ExtensionSettingsSyncTest, PushToSync) { |
| 386 syncable::ModelType type = syncable::APP_SETTINGS; |
| 387 bool is_app = true; |
| 388 |
| 365 StringValue value1("fooValue"); | 389 StringValue value1("fooValue"); |
| 366 ListValue value2; | 390 ListValue value2; |
| 367 value2.Append(StringValue::CreateStringValue("barValue")); | 391 value2.Append(StringValue::CreateStringValue("barValue")); |
| 368 | 392 |
| 369 // Make storage1/2 initialised from local data, storage3/4 initialised from | 393 // Make storage1/2 initialised from local data, storage3/4 initialised from |
| 370 // sync. | 394 // sync. |
| 371 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); | 395 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app); |
| 372 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); | 396 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app); |
| 373 SyncableExtensionSettingsStorage* storage3 = GetStorage("s3"); | 397 ExtensionSettingsStorage* storage3 = AddExtensionAndGetStorage("s3", is_app); |
| 374 SyncableExtensionSettingsStorage* storage4 = GetStorage("s4"); | 398 ExtensionSettingsStorage* storage4 = AddExtensionAndGetStorage("s4", is_app); |
| 375 | 399 |
| 376 storage1->Set("foo", value1); | 400 storage1->Set("foo", value1); |
| 377 storage2->Set("foo", value1); | 401 storage2->Set("foo", value1); |
| 378 | 402 |
| 379 SyncDataList sync_data; | 403 SyncDataList sync_data; |
| 380 sync_data.push_back(extension_settings_sync_util::CreateData( | 404 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 381 "s3", "bar", value2)); | 405 "s3", "bar", value2)); |
| 382 sync_data.push_back(extension_settings_sync_util::CreateData( | 406 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 383 "s4", "bar", value2)); | 407 "s4", "bar", value2)); |
| 384 | 408 |
| 385 backend_->MergeDataAndStartSyncing( | 409 GetSyncableService(type)->MergeDataAndStartSyncing(type, sync_data, &sync_); |
| 386 syncable::EXTENSION_SETTINGS, sync_data, &sync_); | |
| 387 | 410 |
| 388 // Add something locally. | 411 // Add something locally. |
| 389 storage1->Set("bar", value2); | 412 storage1->Set("bar", value2); |
| 390 storage2->Set("bar", value2); | 413 storage2->Set("bar", value2); |
| 391 storage3->Set("foo", value1); | 414 storage3->Set("foo", value1); |
| 392 storage4->Set("foo", value1); | 415 storage4->Set("foo", value1); |
| 393 | 416 |
| 394 ExtensionSettingSyncData change = sync_.GetOnlyChange("s1", "bar"); | 417 ExtensionSettingSyncData change = sync_.GetOnlyChange("s1", "bar"); |
| 395 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 418 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 396 ASSERT_TRUE(value2.Equals(&change.value())); | 419 ASSERT_TRUE(value2.Equals(&change.value())); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 ASSERT_EQ( | 511 ASSERT_EQ( |
| 489 SyncChange::ACTION_DELETE, | 512 SyncChange::ACTION_DELETE, |
| 490 sync_.GetOnlyChange("s3", "bar").change_type()); | 513 sync_.GetOnlyChange("s3", "bar").change_type()); |
| 491 ASSERT_EQ( | 514 ASSERT_EQ( |
| 492 SyncChange::ACTION_DELETE, | 515 SyncChange::ACTION_DELETE, |
| 493 sync_.GetOnlyChange("s4", "foo").change_type()); | 516 sync_.GetOnlyChange("s4", "foo").change_type()); |
| 494 ASSERT_EQ( | 517 ASSERT_EQ( |
| 495 SyncChange::ACTION_DELETE, | 518 SyncChange::ACTION_DELETE, |
| 496 sync_.GetOnlyChange("s4", "bar").change_type()); | 519 sync_.GetOnlyChange("s4", "bar").change_type()); |
| 497 | 520 |
| 498 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); | 521 GetSyncableService(type)->StopSyncing(type); |
| 499 } | 522 } |
| 523 |
| 524 TEST_F(ExtensionSettingsSyncTest, ExtensionAndAppSettingsSyncSeparately) { |
| 525 StringValue value1("fooValue"); |
| 526 ListValue value2; |
| 527 value2.Append(StringValue::CreateStringValue("barValue")); |
| 528 |
| 529 // storage1 is an extension, storage2 is an app. |
| 530 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", false); |
| 531 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", true); |
| 532 |
| 533 storage1->Set("foo", value1); |
| 534 storage2->Set("bar", value2); |
| 535 |
| 536 std::map<std::string, ExtensionSettingSyncDataList> extension_sync_data = |
| 537 GetAllSyncData(syncable::EXTENSION_SETTINGS); |
| 538 ASSERT_EQ(1u, extension_sync_data.size()); |
| 539 ASSERT_EQ(1u, extension_sync_data["s1"].size()); |
| 540 ASSERT_PRED_FORMAT2(ValuesEq, &value1, &extension_sync_data["s1"][0].value()); |
| 541 |
| 542 std::map<std::string, ExtensionSettingSyncDataList> app_sync_data = |
| 543 GetAllSyncData(syncable::APP_SETTINGS); |
| 544 ASSERT_EQ(1u, app_sync_data.size()); |
| 545 ASSERT_EQ(1u, app_sync_data["s2"].size()); |
| 546 ASSERT_PRED_FORMAT2(ValuesEq, &value2, &app_sync_data["s2"][0].value()); |
| 547 |
| 548 // Stop each separately, there should be no changes either time. |
| 549 SyncDataList sync_data; |
| 550 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 551 "s1", "foo", value1)); |
| 552 |
| 553 GetSyncableService(syncable::EXTENSION_SETTINGS)-> |
| 554 MergeDataAndStartSyncing(syncable::EXTENSION_SETTINGS, sync_data, &sync_); |
| 555 GetSyncableService(syncable::EXTENSION_SETTINGS)-> |
| 556 StopSyncing(syncable::EXTENSION_SETTINGS); |
| 557 ASSERT_EQ(0u, sync_.changes().size()); |
| 558 |
| 559 sync_data.clear(); |
| 560 sync_data.push_back(extension_settings_sync_util::CreateData( |
| 561 "s2", "bar", value2)); |
| 562 |
| 563 GetSyncableService(syncable::APP_SETTINGS)-> |
| 564 MergeDataAndStartSyncing(syncable::APP_SETTINGS, sync_data, &sync_); |
| 565 GetSyncableService(syncable::APP_SETTINGS)-> |
| 566 StopSyncing(syncable::APP_SETTINGS); |
| 567 ASSERT_EQ(0u, sync_.changes().size()); |
| 568 } |
| OLD | NEW |