| 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" |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 // SettingsStorageFactory implementation. | 155 // SettingsStorageFactory implementation. |
| 156 virtual SettingsStorage* Create( | 156 virtual SettingsStorage* Create( |
| 157 const FilePath& base_path, const std::string& extension_id) OVERRIDE { | 157 const FilePath& base_path, const std::string& extension_id) OVERRIDE { |
| 158 TestingSettingsStorage* new_storage = new TestingSettingsStorage(); | 158 TestingSettingsStorage* new_storage = new TestingSettingsStorage(); |
| 159 DCHECK(!created_.count(extension_id)); | 159 DCHECK(!created_.count(extension_id)); |
| 160 created_[extension_id] = new_storage; | 160 created_[extension_id] = new_storage; |
| 161 return new_storage; | 161 return new_storage; |
| 162 } | 162 } |
| 163 | 163 |
| 164 private: | 164 private: |
| 165 // SettingsStorageFactory is refcounted. |
| 166 virtual ~TestingSettingsStorageFactory() {} |
| 167 |
| 165 // None of these storage areas are owned by this factory, so care must be | 168 // None of these storage areas are owned by this factory, so care must be |
| 166 // taken when calling GetExisting. | 169 // taken when calling GetExisting. |
| 167 std::map<std::string, TestingSettingsStorage*> created_; | 170 std::map<std::string, TestingSettingsStorage*> created_; |
| 168 }; | 171 }; |
| 169 | 172 |
| 170 void AssignSettingsService(SyncableService** dst, SyncableService* src) { | 173 void AssignSettingsService(SyncableService** dst, SyncableService* src) { |
| 171 *dst = src; | 174 *dst = src; |
| 172 } | 175 } |
| 173 | 176 |
| 174 } // namespace | 177 } // namespace |
| 175 | 178 |
| 176 class ExtensionSettingsSyncTest : public testing::Test { | 179 class ExtensionSettingsSyncTest : public testing::Test { |
| 177 public: | 180 public: |
| 178 ExtensionSettingsSyncTest() | 181 ExtensionSettingsSyncTest() |
| 179 : ui_thread_(BrowserThread::UI, MessageLoop::current()), | 182 : ui_thread_(BrowserThread::UI, MessageLoop::current()), |
| 180 file_thread_(BrowserThread::FILE, MessageLoop::current()) {} | 183 file_thread_(BrowserThread::FILE, MessageLoop::current()), |
| 184 storage_factory_(new ScopedSettingsStorageFactory()) {} |
| 181 | 185 |
| 182 virtual void SetUp() OVERRIDE { | 186 virtual void SetUp() OVERRIDE { |
| 183 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 187 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 184 profile_.reset(new MockProfile(temp_dir_.path())); | 188 profile_.reset(new MockProfile(temp_dir_.path())); |
| 185 storage_factory_ = | 189 storage_factory_->Reset(new SettingsLeveldbStorage::Factory()); |
| 186 new ScopedSettingsStorageFactory(new SettingsLeveldbStorage::Factory()); | 190 frontend_.reset( |
| 187 frontend_.reset(SettingsFrontend::Create(storage_factory_, profile_.get())); | 191 SettingsFrontend::Create(storage_factory_.get(), profile_.get())); |
| 188 } | 192 } |
| 189 | 193 |
| 190 virtual void TearDown() OVERRIDE { | 194 virtual void TearDown() OVERRIDE { |
| 191 frontend_.reset(); | 195 frontend_.reset(); |
| 192 profile_.reset(); | 196 profile_.reset(); |
| 193 } | 197 } |
| 194 | 198 |
| 195 protected: | 199 protected: |
| 196 // Adds a record of an extension or app to the extension service, then returns | 200 // Adds a record of an extension or app to the extension service, then returns |
| 197 // its storage area. | 201 // its storage area. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 227 | 231 |
| 228 // Need these so that the DCHECKs for running on FILE or UI threads pass. | 232 // Need these so that the DCHECKs for running on FILE or UI threads pass. |
| 229 MessageLoop message_loop_; | 233 MessageLoop message_loop_; |
| 230 content::TestBrowserThread ui_thread_; | 234 content::TestBrowserThread ui_thread_; |
| 231 content::TestBrowserThread file_thread_; | 235 content::TestBrowserThread file_thread_; |
| 232 | 236 |
| 233 ScopedTempDir temp_dir_; | 237 ScopedTempDir temp_dir_; |
| 234 MockSyncChangeProcessor sync_; | 238 MockSyncChangeProcessor sync_; |
| 235 scoped_ptr<MockProfile> profile_; | 239 scoped_ptr<MockProfile> profile_; |
| 236 scoped_ptr<SettingsFrontend> frontend_; | 240 scoped_ptr<SettingsFrontend> frontend_; |
| 237 | 241 scoped_refptr<ScopedSettingsStorageFactory> storage_factory_; |
| 238 // Owned by |frontend_|. | |
| 239 ScopedSettingsStorageFactory* storage_factory_; | |
| 240 }; | 242 }; |
| 241 | 243 |
| 242 // Get a semblance of coverage for both EXTENSION_SETTINGS and APP_SETTINGS | 244 // Get a semblance of coverage for both EXTENSION_SETTINGS and APP_SETTINGS |
| 243 // sync by roughly alternative which one to test. | 245 // sync by roughly alternative which one to test. |
| 244 | 246 |
| 245 TEST_F(ExtensionSettingsSyncTest, NoDataDoesNotInvokeSync) { | 247 TEST_F(ExtensionSettingsSyncTest, NoDataDoesNotInvokeSync) { |
| 246 syncable::ModelType model_type = syncable::EXTENSION_SETTINGS; | 248 syncable::ModelType model_type = syncable::EXTENSION_SETTINGS; |
| 247 Extension::Type type = Extension::TYPE_EXTENSION; | 249 Extension::Type type = Extension::TYPE_EXTENSION; |
| 248 | 250 |
| 249 ASSERT_EQ(0u, GetAllSyncData(model_type).size()); | 251 EXPECT_EQ(0u, GetAllSyncData(model_type).size()); |
| 250 | 252 |
| 251 // Have one extension created before sync is set up, the other created after. | 253 // Have one extension created before sync is set up, the other created after. |
| 252 AddExtensionAndGetStorage("s1", type); | 254 AddExtensionAndGetStorage("s1", type); |
| 253 ASSERT_EQ(0u, GetAllSyncData(model_type).size()); | 255 EXPECT_EQ(0u, GetAllSyncData(model_type).size()); |
| 254 | 256 |
| 255 GetSyncableService(model_type)->MergeDataAndStartSyncing( | 257 GetSyncableService(model_type)->MergeDataAndStartSyncing( |
| 256 model_type, SyncDataList(), &sync_); | 258 model_type, SyncDataList(), &sync_); |
| 257 | 259 |
| 258 AddExtensionAndGetStorage("s2", type); | 260 AddExtensionAndGetStorage("s2", type); |
| 259 ASSERT_EQ(0u, GetAllSyncData(model_type).size()); | 261 EXPECT_EQ(0u, GetAllSyncData(model_type).size()); |
| 260 | 262 |
| 261 GetSyncableService(model_type)->StopSyncing(model_type); | 263 GetSyncableService(model_type)->StopSyncing(model_type); |
| 262 | 264 |
| 263 ASSERT_EQ(0u, sync_.changes().size()); | 265 EXPECT_EQ(0u, sync_.changes().size()); |
| 264 ASSERT_EQ(0u, GetAllSyncData(model_type).size()); | 266 EXPECT_EQ(0u, GetAllSyncData(model_type).size()); |
| 265 } | 267 } |
| 266 | 268 |
| 267 TEST_F(ExtensionSettingsSyncTest, InSyncDataDoesNotInvokeSync) { | 269 TEST_F(ExtensionSettingsSyncTest, InSyncDataDoesNotInvokeSync) { |
| 268 syncable::ModelType model_type = syncable::APP_SETTINGS; | 270 syncable::ModelType model_type = syncable::APP_SETTINGS; |
| 269 Extension::Type type = Extension::TYPE_PACKAGED_APP; | 271 Extension::Type type = Extension::TYPE_PACKAGED_APP; |
| 270 | 272 |
| 271 StringValue value1("fooValue"); | 273 StringValue value1("fooValue"); |
| 272 ListValue value2; | 274 ListValue value2; |
| 273 value2.Append(StringValue::CreateStringValue("barValue")); | 275 value2.Append(StringValue::CreateStringValue("barValue")); |
| 274 | 276 |
| 275 SettingsStorage* storage1 = AddExtensionAndGetStorage("s1", type); | 277 SettingsStorage* storage1 = AddExtensionAndGetStorage("s1", type); |
| 276 SettingsStorage* storage2 = AddExtensionAndGetStorage("s2", type); | 278 SettingsStorage* storage2 = AddExtensionAndGetStorage("s2", type); |
| 277 | 279 |
| 278 storage1->Set(DEFAULTS, "foo", value1); | 280 storage1->Set(DEFAULTS, "foo", value1); |
| 279 storage2->Set(DEFAULTS, "bar", value2); | 281 storage2->Set(DEFAULTS, "bar", value2); |
| 280 | 282 |
| 281 std::map<std::string, SettingSyncDataList> all_sync_data = | 283 std::map<std::string, SettingSyncDataList> all_sync_data = |
| 282 GetAllSyncData(model_type); | 284 GetAllSyncData(model_type); |
| 283 ASSERT_EQ(2u, all_sync_data.size()); | 285 EXPECT_EQ(2u, all_sync_data.size()); |
| 284 ASSERT_EQ(1u, all_sync_data["s1"].size()); | 286 EXPECT_EQ(1u, all_sync_data["s1"].size()); |
| 285 ASSERT_PRED_FORMAT2(ValuesEq, &value1, &all_sync_data["s1"][0].value()); | 287 EXPECT_PRED_FORMAT2(ValuesEq, &value1, &all_sync_data["s1"][0].value()); |
| 286 ASSERT_EQ(1u, all_sync_data["s2"].size()); | 288 EXPECT_EQ(1u, all_sync_data["s2"].size()); |
| 287 ASSERT_PRED_FORMAT2(ValuesEq, &value2, &all_sync_data["s2"][0].value()); | 289 EXPECT_PRED_FORMAT2(ValuesEq, &value2, &all_sync_data["s2"][0].value()); |
| 288 | 290 |
| 289 SyncDataList sync_data; | 291 SyncDataList sync_data; |
| 290 sync_data.push_back(settings_sync_util::CreateData( | 292 sync_data.push_back(settings_sync_util::CreateData( |
| 291 "s1", "foo", value1)); | 293 "s1", "foo", value1)); |
| 292 sync_data.push_back(settings_sync_util::CreateData( | 294 sync_data.push_back(settings_sync_util::CreateData( |
| 293 "s2", "bar", value2)); | 295 "s2", "bar", value2)); |
| 294 | 296 |
| 295 GetSyncableService(model_type)->MergeDataAndStartSyncing( | 297 GetSyncableService(model_type)->MergeDataAndStartSyncing( |
| 296 model_type, sync_data, &sync_); | 298 model_type, sync_data, &sync_); |
| 297 | 299 |
| 298 // Already in sync, so no changes. | 300 // Already in sync, so no changes. |
| 299 ASSERT_EQ(0u, sync_.changes().size()); | 301 EXPECT_EQ(0u, sync_.changes().size()); |
| 300 | 302 |
| 301 // Regression test: not-changing the synced value shouldn't result in a sync | 303 // Regression test: not-changing the synced value shouldn't result in a sync |
| 302 // change, and changing the synced value should result in an update. | 304 // change, and changing the synced value should result in an update. |
| 303 storage1->Set(DEFAULTS, "foo", value1); | 305 storage1->Set(DEFAULTS, "foo", value1); |
| 304 ASSERT_EQ(0u, sync_.changes().size()); | 306 EXPECT_EQ(0u, sync_.changes().size()); |
| 305 | 307 |
| 306 storage1->Set(DEFAULTS, "foo", value2); | 308 storage1->Set(DEFAULTS, "foo", value2); |
| 307 ASSERT_EQ(1u, sync_.changes().size()); | 309 EXPECT_EQ(1u, sync_.changes().size()); |
| 308 SettingSyncData change = sync_.GetOnlyChange("s1", "foo"); | 310 SettingSyncData change = sync_.GetOnlyChange("s1", "foo"); |
| 309 ASSERT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); | 311 EXPECT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); |
| 310 ASSERT_TRUE(value2.Equals(&change.value())); | 312 EXPECT_TRUE(value2.Equals(&change.value())); |
| 311 | 313 |
| 312 GetSyncableService(model_type)->StopSyncing(model_type); | 314 GetSyncableService(model_type)->StopSyncing(model_type); |
| 313 } | 315 } |
| 314 | 316 |
| 315 TEST_F(ExtensionSettingsSyncTest, LocalDataWithNoSyncDataIsPushedToSync) { | 317 TEST_F(ExtensionSettingsSyncTest, LocalDataWithNoSyncDataIsPushedToSync) { |
| 316 syncable::ModelType model_type = syncable::EXTENSION_SETTINGS; | 318 syncable::ModelType model_type = syncable::EXTENSION_SETTINGS; |
| 317 Extension::Type type = Extension::TYPE_EXTENSION; | 319 Extension::Type type = Extension::TYPE_EXTENSION; |
| 318 | 320 |
| 319 StringValue value1("fooValue"); | 321 StringValue value1("fooValue"); |
| 320 ListValue value2; | 322 ListValue value2; |
| 321 value2.Append(StringValue::CreateStringValue("barValue")); | 323 value2.Append(StringValue::CreateStringValue("barValue")); |
| 322 | 324 |
| 323 SettingsStorage* storage1 = AddExtensionAndGetStorage("s1", type); | 325 SettingsStorage* storage1 = AddExtensionAndGetStorage("s1", type); |
| 324 SettingsStorage* storage2 = AddExtensionAndGetStorage("s2", type); | 326 SettingsStorage* storage2 = AddExtensionAndGetStorage("s2", type); |
| 325 | 327 |
| 326 storage1->Set(DEFAULTS, "foo", value1); | 328 storage1->Set(DEFAULTS, "foo", value1); |
| 327 storage2->Set(DEFAULTS, "bar", value2); | 329 storage2->Set(DEFAULTS, "bar", value2); |
| 328 | 330 |
| 329 GetSyncableService(model_type)->MergeDataAndStartSyncing( | 331 GetSyncableService(model_type)->MergeDataAndStartSyncing( |
| 330 model_type, SyncDataList(), &sync_); | 332 model_type, SyncDataList(), &sync_); |
| 331 | 333 |
| 332 // All settings should have been pushed to sync. | 334 // All settings should have been pushed to sync. |
| 333 ASSERT_EQ(2u, sync_.changes().size()); | 335 EXPECT_EQ(2u, sync_.changes().size()); |
| 334 SettingSyncData change = sync_.GetOnlyChange("s1", "foo"); | 336 SettingSyncData change = sync_.GetOnlyChange("s1", "foo"); |
| 335 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 337 EXPECT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 336 ASSERT_TRUE(value1.Equals(&change.value())); | 338 EXPECT_TRUE(value1.Equals(&change.value())); |
| 337 change = sync_.GetOnlyChange("s2", "bar"); | 339 change = sync_.GetOnlyChange("s2", "bar"); |
| 338 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 340 EXPECT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 339 ASSERT_TRUE(value2.Equals(&change.value())); | 341 EXPECT_TRUE(value2.Equals(&change.value())); |
| 340 | 342 |
| 341 GetSyncableService(model_type)->StopSyncing(model_type); | 343 GetSyncableService(model_type)->StopSyncing(model_type); |
| 342 } | 344 } |
| 343 | 345 |
| 344 TEST_F(ExtensionSettingsSyncTest, AnySyncDataOverwritesLocalData) { | 346 TEST_F(ExtensionSettingsSyncTest, AnySyncDataOverwritesLocalData) { |
| 345 syncable::ModelType model_type = syncable::APP_SETTINGS; | 347 syncable::ModelType model_type = syncable::APP_SETTINGS; |
| 346 Extension::Type type = Extension::TYPE_PACKAGED_APP; | 348 Extension::Type type = Extension::TYPE_PACKAGED_APP; |
| 347 | 349 |
| 348 StringValue value1("fooValue"); | 350 StringValue value1("fooValue"); |
| 349 ListValue value2; | 351 ListValue value2; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 363 sync_data.push_back(settings_sync_util::CreateData( | 365 sync_data.push_back(settings_sync_util::CreateData( |
| 364 "s2", "bar", value2)); | 366 "s2", "bar", value2)); |
| 365 GetSyncableService(model_type)->MergeDataAndStartSyncing( | 367 GetSyncableService(model_type)->MergeDataAndStartSyncing( |
| 366 model_type, sync_data, &sync_); | 368 model_type, sync_data, &sync_); |
| 367 expected1.Set("foo", value1.DeepCopy()); | 369 expected1.Set("foo", value1.DeepCopy()); |
| 368 expected2.Set("bar", value2.DeepCopy()); | 370 expected2.Set("bar", value2.DeepCopy()); |
| 369 | 371 |
| 370 SettingsStorage* storage2 = AddExtensionAndGetStorage("s2", type); | 372 SettingsStorage* storage2 = AddExtensionAndGetStorage("s2", type); |
| 371 | 373 |
| 372 // All changes should be local, so no sync changes. | 374 // All changes should be local, so no sync changes. |
| 373 ASSERT_EQ(0u, sync_.changes().size()); | 375 EXPECT_EQ(0u, sync_.changes().size()); |
| 374 | 376 |
| 375 // Sync settings should have been pushed to local settings. | 377 // Sync settings should have been pushed to local settings. |
| 376 ASSERT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get()); | 378 EXPECT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get()); |
| 377 ASSERT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get()); | 379 EXPECT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get()); |
| 378 | 380 |
| 379 GetSyncableService(model_type)->StopSyncing(model_type); | 381 GetSyncableService(model_type)->StopSyncing(model_type); |
| 380 } | 382 } |
| 381 | 383 |
| 382 TEST_F(ExtensionSettingsSyncTest, ProcessSyncChanges) { | 384 TEST_F(ExtensionSettingsSyncTest, ProcessSyncChanges) { |
| 383 syncable::ModelType model_type = syncable::EXTENSION_SETTINGS; | 385 syncable::ModelType model_type = syncable::EXTENSION_SETTINGS; |
| 384 Extension::Type type = Extension::TYPE_EXTENSION; | 386 Extension::Type type = Extension::TYPE_EXTENSION; |
| 385 | 387 |
| 386 StringValue value1("fooValue"); | 388 StringValue value1("fooValue"); |
| 387 ListValue value2; | 389 ListValue value2; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 409 // Make sync add some settings. | 411 // Make sync add some settings. |
| 410 SyncChangeList change_list; | 412 SyncChangeList change_list; |
| 411 change_list.push_back(settings_sync_util::CreateAdd( | 413 change_list.push_back(settings_sync_util::CreateAdd( |
| 412 "s1", "bar", value2)); | 414 "s1", "bar", value2)); |
| 413 change_list.push_back(settings_sync_util::CreateAdd( | 415 change_list.push_back(settings_sync_util::CreateAdd( |
| 414 "s2", "foo", value1)); | 416 "s2", "foo", value1)); |
| 415 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list); | 417 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list); |
| 416 expected1.Set("bar", value2.DeepCopy()); | 418 expected1.Set("bar", value2.DeepCopy()); |
| 417 expected2.Set("foo", value1.DeepCopy()); | 419 expected2.Set("foo", value1.DeepCopy()); |
| 418 | 420 |
| 419 ASSERT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get()); | 421 EXPECT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get()); |
| 420 ASSERT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get()); | 422 EXPECT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get()); |
| 421 | 423 |
| 422 // Make sync update some settings, storage1 the new setting, storage2 the | 424 // Make sync update some settings, storage1 the new setting, storage2 the |
| 423 // initial setting. | 425 // initial setting. |
| 424 change_list.clear(); | 426 change_list.clear(); |
| 425 change_list.push_back(settings_sync_util::CreateUpdate( | 427 change_list.push_back(settings_sync_util::CreateUpdate( |
| 426 "s1", "bar", value2)); | 428 "s1", "bar", value2)); |
| 427 change_list.push_back(settings_sync_util::CreateUpdate( | 429 change_list.push_back(settings_sync_util::CreateUpdate( |
| 428 "s2", "bar", value1)); | 430 "s2", "bar", value1)); |
| 429 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list); | 431 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list); |
| 430 expected1.Set("bar", value2.DeepCopy()); | 432 expected1.Set("bar", value2.DeepCopy()); |
| 431 expected2.Set("bar", value1.DeepCopy()); | 433 expected2.Set("bar", value1.DeepCopy()); |
| 432 | 434 |
| 433 ASSERT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get()); | 435 EXPECT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get()); |
| 434 ASSERT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get()); | 436 EXPECT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get()); |
| 435 | 437 |
| 436 // Make sync remove some settings, storage1 the initial setting, storage2 the | 438 // Make sync remove some settings, storage1 the initial setting, storage2 the |
| 437 // new setting. | 439 // new setting. |
| 438 change_list.clear(); | 440 change_list.clear(); |
| 439 change_list.push_back(settings_sync_util::CreateDelete( | 441 change_list.push_back(settings_sync_util::CreateDelete( |
| 440 "s1", "foo")); | 442 "s1", "foo")); |
| 441 change_list.push_back(settings_sync_util::CreateDelete( | 443 change_list.push_back(settings_sync_util::CreateDelete( |
| 442 "s2", "foo")); | 444 "s2", "foo")); |
| 443 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list); | 445 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list); |
| 444 expected1.Remove("foo", NULL); | 446 expected1.Remove("foo", NULL); |
| 445 expected2.Remove("foo", NULL); | 447 expected2.Remove("foo", NULL); |
| 446 | 448 |
| 447 ASSERT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get()); | 449 EXPECT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get()); |
| 448 ASSERT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get()); | 450 EXPECT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get()); |
| 449 | 451 |
| 450 GetSyncableService(model_type)->StopSyncing(model_type); | 452 GetSyncableService(model_type)->StopSyncing(model_type); |
| 451 } | 453 } |
| 452 | 454 |
| 453 TEST_F(ExtensionSettingsSyncTest, PushToSync) { | 455 TEST_F(ExtensionSettingsSyncTest, PushToSync) { |
| 454 syncable::ModelType model_type = syncable::APP_SETTINGS; | 456 syncable::ModelType model_type = syncable::APP_SETTINGS; |
| 455 Extension::Type type = Extension::TYPE_PACKAGED_APP; | 457 Extension::Type type = Extension::TYPE_PACKAGED_APP; |
| 456 | 458 |
| 457 StringValue value1("fooValue"); | 459 StringValue value1("fooValue"); |
| 458 ListValue value2; | 460 ListValue value2; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 477 GetSyncableService(model_type)->MergeDataAndStartSyncing( | 479 GetSyncableService(model_type)->MergeDataAndStartSyncing( |
| 478 model_type, sync_data, &sync_); | 480 model_type, sync_data, &sync_); |
| 479 | 481 |
| 480 // Add something locally. | 482 // Add something locally. |
| 481 storage1->Set(DEFAULTS, "bar", value2); | 483 storage1->Set(DEFAULTS, "bar", value2); |
| 482 storage2->Set(DEFAULTS, "bar", value2); | 484 storage2->Set(DEFAULTS, "bar", value2); |
| 483 storage3->Set(DEFAULTS, "foo", value1); | 485 storage3->Set(DEFAULTS, "foo", value1); |
| 484 storage4->Set(DEFAULTS, "foo", value1); | 486 storage4->Set(DEFAULTS, "foo", value1); |
| 485 | 487 |
| 486 SettingSyncData change = sync_.GetOnlyChange("s1", "bar"); | 488 SettingSyncData change = sync_.GetOnlyChange("s1", "bar"); |
| 487 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 489 EXPECT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 488 ASSERT_TRUE(value2.Equals(&change.value())); | 490 EXPECT_TRUE(value2.Equals(&change.value())); |
| 489 sync_.GetOnlyChange("s2", "bar"); | 491 sync_.GetOnlyChange("s2", "bar"); |
| 490 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 492 EXPECT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 491 ASSERT_TRUE(value2.Equals(&change.value())); | 493 EXPECT_TRUE(value2.Equals(&change.value())); |
| 492 change = sync_.GetOnlyChange("s3", "foo"); | 494 change = sync_.GetOnlyChange("s3", "foo"); |
| 493 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 495 EXPECT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 494 ASSERT_TRUE(value1.Equals(&change.value())); | 496 EXPECT_TRUE(value1.Equals(&change.value())); |
| 495 change = sync_.GetOnlyChange("s4", "foo"); | 497 change = sync_.GetOnlyChange("s4", "foo"); |
| 496 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); | 498 EXPECT_EQ(SyncChange::ACTION_ADD, change.change_type()); |
| 497 ASSERT_TRUE(value1.Equals(&change.value())); | 499 EXPECT_TRUE(value1.Equals(&change.value())); |
| 498 | 500 |
| 499 // Change something locally, storage1/3 the new setting and storage2/4 the | 501 // Change something locally, storage1/3 the new setting and storage2/4 the |
| 500 // initial setting, for all combinations of local vs sync intialisation and | 502 // initial setting, for all combinations of local vs sync intialisation and |
| 501 // new vs initial. | 503 // new vs initial. |
| 502 sync_.ClearChanges(); | 504 sync_.ClearChanges(); |
| 503 storage1->Set(DEFAULTS, "bar", value1); | 505 storage1->Set(DEFAULTS, "bar", value1); |
| 504 storage2->Set(DEFAULTS, "foo", value2); | 506 storage2->Set(DEFAULTS, "foo", value2); |
| 505 storage3->Set(DEFAULTS, "bar", value1); | 507 storage3->Set(DEFAULTS, "bar", value1); |
| 506 storage4->Set(DEFAULTS, "foo", value2); | 508 storage4->Set(DEFAULTS, "foo", value2); |
| 507 | 509 |
| 508 change = sync_.GetOnlyChange("s1", "bar"); | 510 change = sync_.GetOnlyChange("s1", "bar"); |
| 509 ASSERT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); | 511 EXPECT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); |
| 510 ASSERT_TRUE(value1.Equals(&change.value())); | 512 EXPECT_TRUE(value1.Equals(&change.value())); |
| 511 change = sync_.GetOnlyChange("s2", "foo"); | 513 change = sync_.GetOnlyChange("s2", "foo"); |
| 512 ASSERT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); | 514 EXPECT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); |
| 513 ASSERT_TRUE(value2.Equals(&change.value())); | 515 EXPECT_TRUE(value2.Equals(&change.value())); |
| 514 change = sync_.GetOnlyChange("s3", "bar"); | 516 change = sync_.GetOnlyChange("s3", "bar"); |
| 515 ASSERT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); | 517 EXPECT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); |
| 516 ASSERT_TRUE(value1.Equals(&change.value())); | 518 EXPECT_TRUE(value1.Equals(&change.value())); |
| 517 change = sync_.GetOnlyChange("s4", "foo"); | 519 change = sync_.GetOnlyChange("s4", "foo"); |
| 518 ASSERT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); | 520 EXPECT_EQ(SyncChange::ACTION_UPDATE, change.change_type()); |
| 519 ASSERT_TRUE(value2.Equals(&change.value())); | 521 EXPECT_TRUE(value2.Equals(&change.value())); |
| 520 | 522 |
| 521 // Remove something locally, storage1/3 the new setting and storage2/4 the | 523 // Remove something locally, storage1/3 the new setting and storage2/4 the |
| 522 // initial setting, for all combinations of local vs sync intialisation and | 524 // initial setting, for all combinations of local vs sync intialisation and |
| 523 // new vs initial. | 525 // new vs initial. |
| 524 sync_.ClearChanges(); | 526 sync_.ClearChanges(); |
| 525 storage1->Remove("foo"); | 527 storage1->Remove("foo"); |
| 526 storage2->Remove("bar"); | 528 storage2->Remove("bar"); |
| 527 storage3->Remove("foo"); | 529 storage3->Remove("foo"); |
| 528 storage4->Remove("bar"); | 530 storage4->Remove("bar"); |
| 529 | 531 |
| 530 ASSERT_EQ( | 532 EXPECT_EQ( |
| 531 SyncChange::ACTION_DELETE, | 533 SyncChange::ACTION_DELETE, |
| 532 sync_.GetOnlyChange("s1", "foo").change_type()); | 534 sync_.GetOnlyChange("s1", "foo").change_type()); |
| 533 ASSERT_EQ( | 535 EXPECT_EQ( |
| 534 SyncChange::ACTION_DELETE, | 536 SyncChange::ACTION_DELETE, |
| 535 sync_.GetOnlyChange("s2", "bar").change_type()); | 537 sync_.GetOnlyChange("s2", "bar").change_type()); |
| 536 ASSERT_EQ( | 538 EXPECT_EQ( |
| 537 SyncChange::ACTION_DELETE, | 539 SyncChange::ACTION_DELETE, |
| 538 sync_.GetOnlyChange("s3", "foo").change_type()); | 540 sync_.GetOnlyChange("s3", "foo").change_type()); |
| 539 ASSERT_EQ( | 541 EXPECT_EQ( |
| 540 SyncChange::ACTION_DELETE, | 542 SyncChange::ACTION_DELETE, |
| 541 sync_.GetOnlyChange("s4", "bar").change_type()); | 543 sync_.GetOnlyChange("s4", "bar").change_type()); |
| 542 | 544 |
| 543 // Remove some nonexistent settings. | 545 // Remove some nonexistent settings. |
| 544 sync_.ClearChanges(); | 546 sync_.ClearChanges(); |
| 545 storage1->Remove("foo"); | 547 storage1->Remove("foo"); |
| 546 storage2->Remove("bar"); | 548 storage2->Remove("bar"); |
| 547 storage3->Remove("foo"); | 549 storage3->Remove("foo"); |
| 548 storage4->Remove("bar"); | 550 storage4->Remove("bar"); |
| 549 | 551 |
| 550 ASSERT_EQ(0u, sync_.changes().size()); | 552 EXPECT_EQ(0u, sync_.changes().size()); |
| 551 | 553 |
| 552 // Clear the rest of the settings. Add the removed ones back first so that | 554 // Clear the rest of the settings. Add the removed ones back first so that |
| 553 // more than one setting is cleared. | 555 // more than one setting is cleared. |
| 554 storage1->Set(DEFAULTS, "foo", value1); | 556 storage1->Set(DEFAULTS, "foo", value1); |
| 555 storage2->Set(DEFAULTS, "bar", value2); | 557 storage2->Set(DEFAULTS, "bar", value2); |
| 556 storage3->Set(DEFAULTS, "foo", value1); | 558 storage3->Set(DEFAULTS, "foo", value1); |
| 557 storage4->Set(DEFAULTS, "bar", value2); | 559 storage4->Set(DEFAULTS, "bar", value2); |
| 558 | 560 |
| 559 sync_.ClearChanges(); | 561 sync_.ClearChanges(); |
| 560 storage1->Clear(); | 562 storage1->Clear(); |
| 561 storage2->Clear(); | 563 storage2->Clear(); |
| 562 storage3->Clear(); | 564 storage3->Clear(); |
| 563 storage4->Clear(); | 565 storage4->Clear(); |
| 564 | 566 |
| 565 ASSERT_EQ( | 567 EXPECT_EQ( |
| 566 SyncChange::ACTION_DELETE, | 568 SyncChange::ACTION_DELETE, |
| 567 sync_.GetOnlyChange("s1", "foo").change_type()); | 569 sync_.GetOnlyChange("s1", "foo").change_type()); |
| 568 ASSERT_EQ( | 570 EXPECT_EQ( |
| 569 SyncChange::ACTION_DELETE, | 571 SyncChange::ACTION_DELETE, |
| 570 sync_.GetOnlyChange("s1", "bar").change_type()); | 572 sync_.GetOnlyChange("s1", "bar").change_type()); |
| 571 ASSERT_EQ( | 573 EXPECT_EQ( |
| 572 SyncChange::ACTION_DELETE, | 574 SyncChange::ACTION_DELETE, |
| 573 sync_.GetOnlyChange("s2", "foo").change_type()); | 575 sync_.GetOnlyChange("s2", "foo").change_type()); |
| 574 ASSERT_EQ( | 576 EXPECT_EQ( |
| 575 SyncChange::ACTION_DELETE, | 577 SyncChange::ACTION_DELETE, |
| 576 sync_.GetOnlyChange("s2", "bar").change_type()); | 578 sync_.GetOnlyChange("s2", "bar").change_type()); |
| 577 ASSERT_EQ( | 579 EXPECT_EQ( |
| 578 SyncChange::ACTION_DELETE, | 580 SyncChange::ACTION_DELETE, |
| 579 sync_.GetOnlyChange("s3", "foo").change_type()); | 581 sync_.GetOnlyChange("s3", "foo").change_type()); |
| 580 ASSERT_EQ( | 582 EXPECT_EQ( |
| 581 SyncChange::ACTION_DELETE, | 583 SyncChange::ACTION_DELETE, |
| 582 sync_.GetOnlyChange("s3", "bar").change_type()); | 584 sync_.GetOnlyChange("s3", "bar").change_type()); |
| 583 ASSERT_EQ( | 585 EXPECT_EQ( |
| 584 SyncChange::ACTION_DELETE, | 586 SyncChange::ACTION_DELETE, |
| 585 sync_.GetOnlyChange("s4", "foo").change_type()); | 587 sync_.GetOnlyChange("s4", "foo").change_type()); |
| 586 ASSERT_EQ( | 588 EXPECT_EQ( |
| 587 SyncChange::ACTION_DELETE, | 589 SyncChange::ACTION_DELETE, |
| 588 sync_.GetOnlyChange("s4", "bar").change_type()); | 590 sync_.GetOnlyChange("s4", "bar").change_type()); |
| 589 | 591 |
| 590 GetSyncableService(model_type)->StopSyncing(model_type); | 592 GetSyncableService(model_type)->StopSyncing(model_type); |
| 591 } | 593 } |
| 592 | 594 |
| 593 TEST_F(ExtensionSettingsSyncTest, ExtensionAndAppSettingsSyncSeparately) { | 595 TEST_F(ExtensionSettingsSyncTest, ExtensionAndAppSettingsSyncSeparately) { |
| 594 StringValue value1("fooValue"); | 596 StringValue value1("fooValue"); |
| 595 ListValue value2; | 597 ListValue value2; |
| 596 value2.Append(StringValue::CreateStringValue("barValue")); | 598 value2.Append(StringValue::CreateStringValue("barValue")); |
| 597 | 599 |
| 598 // storage1 is an extension, storage2 is an app. | 600 // storage1 is an extension, storage2 is an app. |
| 599 SettingsStorage* storage1 = AddExtensionAndGetStorage( | 601 SettingsStorage* storage1 = AddExtensionAndGetStorage( |
| 600 "s1", Extension::TYPE_EXTENSION); | 602 "s1", Extension::TYPE_EXTENSION); |
| 601 SettingsStorage* storage2 = AddExtensionAndGetStorage( | 603 SettingsStorage* storage2 = AddExtensionAndGetStorage( |
| 602 "s2", Extension::TYPE_PACKAGED_APP); | 604 "s2", Extension::TYPE_PACKAGED_APP); |
| 603 | 605 |
| 604 storage1->Set(DEFAULTS, "foo", value1); | 606 storage1->Set(DEFAULTS, "foo", value1); |
| 605 storage2->Set(DEFAULTS, "bar", value2); | 607 storage2->Set(DEFAULTS, "bar", value2); |
| 606 | 608 |
| 607 std::map<std::string, SettingSyncDataList> extension_sync_data = | 609 std::map<std::string, SettingSyncDataList> extension_sync_data = |
| 608 GetAllSyncData(syncable::EXTENSION_SETTINGS); | 610 GetAllSyncData(syncable::EXTENSION_SETTINGS); |
| 609 ASSERT_EQ(1u, extension_sync_data.size()); | 611 EXPECT_EQ(1u, extension_sync_data.size()); |
| 610 ASSERT_EQ(1u, extension_sync_data["s1"].size()); | 612 EXPECT_EQ(1u, extension_sync_data["s1"].size()); |
| 611 ASSERT_PRED_FORMAT2(ValuesEq, &value1, &extension_sync_data["s1"][0].value()); | 613 EXPECT_PRED_FORMAT2(ValuesEq, &value1, &extension_sync_data["s1"][0].value()); |
| 612 | 614 |
| 613 std::map<std::string, SettingSyncDataList> app_sync_data = | 615 std::map<std::string, SettingSyncDataList> app_sync_data = |
| 614 GetAllSyncData(syncable::APP_SETTINGS); | 616 GetAllSyncData(syncable::APP_SETTINGS); |
| 615 ASSERT_EQ(1u, app_sync_data.size()); | 617 EXPECT_EQ(1u, app_sync_data.size()); |
| 616 ASSERT_EQ(1u, app_sync_data["s2"].size()); | 618 EXPECT_EQ(1u, app_sync_data["s2"].size()); |
| 617 ASSERT_PRED_FORMAT2(ValuesEq, &value2, &app_sync_data["s2"][0].value()); | 619 EXPECT_PRED_FORMAT2(ValuesEq, &value2, &app_sync_data["s2"][0].value()); |
| 618 | 620 |
| 619 // Stop each separately, there should be no changes either time. | 621 // Stop each separately, there should be no changes either time. |
| 620 SyncDataList sync_data; | 622 SyncDataList sync_data; |
| 621 sync_data.push_back(settings_sync_util::CreateData( | 623 sync_data.push_back(settings_sync_util::CreateData( |
| 622 "s1", "foo", value1)); | 624 "s1", "foo", value1)); |
| 623 | 625 |
| 624 GetSyncableService(syncable::EXTENSION_SETTINGS)-> | 626 GetSyncableService(syncable::EXTENSION_SETTINGS)-> |
| 625 MergeDataAndStartSyncing(syncable::EXTENSION_SETTINGS, sync_data, &sync_); | 627 MergeDataAndStartSyncing(syncable::EXTENSION_SETTINGS, sync_data, &sync_); |
| 626 GetSyncableService(syncable::EXTENSION_SETTINGS)-> | 628 GetSyncableService(syncable::EXTENSION_SETTINGS)-> |
| 627 StopSyncing(syncable::EXTENSION_SETTINGS); | 629 StopSyncing(syncable::EXTENSION_SETTINGS); |
| 628 ASSERT_EQ(0u, sync_.changes().size()); | 630 EXPECT_EQ(0u, sync_.changes().size()); |
| 629 | 631 |
| 630 sync_data.clear(); | 632 sync_data.clear(); |
| 631 sync_data.push_back(settings_sync_util::CreateData( | 633 sync_data.push_back(settings_sync_util::CreateData( |
| 632 "s2", "bar", value2)); | 634 "s2", "bar", value2)); |
| 633 | 635 |
| 634 GetSyncableService(syncable::APP_SETTINGS)-> | 636 GetSyncableService(syncable::APP_SETTINGS)-> |
| 635 MergeDataAndStartSyncing(syncable::APP_SETTINGS, sync_data, &sync_); | 637 MergeDataAndStartSyncing(syncable::APP_SETTINGS, sync_data, &sync_); |
| 636 GetSyncableService(syncable::APP_SETTINGS)-> | 638 GetSyncableService(syncable::APP_SETTINGS)-> |
| 637 StopSyncing(syncable::APP_SETTINGS); | 639 StopSyncing(syncable::APP_SETTINGS); |
| 638 ASSERT_EQ(0u, sync_.changes().size()); | 640 EXPECT_EQ(0u, sync_.changes().size()); |
| 639 } | 641 } |
| 640 | 642 |
| 641 TEST_F(ExtensionSettingsSyncTest, FailingStartSyncingDisablesSync) { | 643 TEST_F(ExtensionSettingsSyncTest, FailingStartSyncingDisablesSync) { |
| 642 syncable::ModelType model_type = syncable::EXTENSION_SETTINGS; | 644 syncable::ModelType model_type = syncable::EXTENSION_SETTINGS; |
| 643 Extension::Type type = Extension::TYPE_EXTENSION; | 645 Extension::Type type = Extension::TYPE_EXTENSION; |
| 644 | 646 |
| 645 StringValue fooValue("fooValue"); | 647 StringValue fooValue("fooValue"); |
| 646 StringValue barValue("barValue"); | 648 StringValue barValue("barValue"); |
| 647 | 649 |
| 648 // There is a bit of a convoluted method to get storage areas that can fail; | 650 // There is a bit of a convoluted method to get storage areas that can fail; |
| (...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1283 DictionaryValue expected; | 1285 DictionaryValue expected; |
| 1284 expected.Set("large_value", large_value.DeepCopy()); | 1286 expected.Set("large_value", large_value.DeepCopy()); |
| 1285 EXPECT_PRED_FORMAT2(SettingsEq, expected, storage1->Get()); | 1287 EXPECT_PRED_FORMAT2(SettingsEq, expected, storage1->Get()); |
| 1286 EXPECT_PRED_FORMAT2(SettingsEq, expected, storage2->Get()); | 1288 EXPECT_PRED_FORMAT2(SettingsEq, expected, storage2->Get()); |
| 1287 } | 1289 } |
| 1288 | 1290 |
| 1289 GetSyncableService(model_type)->StopSyncing(model_type); | 1291 GetSyncableService(model_type)->StopSyncing(model_type); |
| 1290 } | 1292 } |
| 1291 | 1293 |
| 1292 } // namespace extensions | 1294 } // namespace extensions |
| OLD | NEW |