Enable Enterprise enrollment on desktop builds.
[chromium-blink-merge.git] / chrome / browser / extensions / api / storage / settings_sync_unittest.cc
blobfa80fb8c475100b65916be5c3a59ac72040c9b9c
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.
5 #include "base/bind.h"
6 #include "base/files/scoped_temp_dir.h"
7 #include "base/json/json_reader.h"
8 #include "base/json/json_writer.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "chrome/browser/extensions/api/storage/settings_sync_util.h"
12 #include "chrome/browser/extensions/api/storage/sync_value_store_cache.h"
13 #include "chrome/browser/extensions/api/storage/syncable_settings_storage.h"
14 #include "content/public/test/test_browser_thread.h"
15 #include "extensions/browser/api/storage/leveldb_settings_storage_factory.h"
16 #include "extensions/browser/api/storage/settings_storage_factory.h"
17 #include "extensions/browser/api/storage/settings_test_util.h"
18 #include "extensions/browser/api/storage/storage_frontend.h"
19 #include "extensions/browser/extension_system.h"
20 #include "extensions/browser/value_store/testing_value_store.h"
21 #include "extensions/common/manifest.h"
22 #include "sync/api/sync_change_processor.h"
23 #include "sync/api/sync_change_processor_wrapper_for_test.h"
24 #include "sync/api/sync_error_factory.h"
25 #include "sync/api/sync_error_factory_mock.h"
26 #include "testing/gtest/include/gtest/gtest.h"
28 using base::DictionaryValue;
29 using base::ListValue;
30 using base::Value;
31 using content::BrowserThread;
33 namespace extensions {
35 namespace util = settings_test_util;
37 namespace {
39 // To save typing ValueStore::DEFAULTS everywhere.
40 const ValueStore::WriteOptions DEFAULTS = ValueStore::DEFAULTS;
42 // Gets the pretty-printed JSON for a value.
43 static std::string GetJson(const base::Value& value) {
44 std::string json;
45 base::JSONWriter::WriteWithOptions(&value,
46 base::JSONWriter::OPTIONS_PRETTY_PRINT,
47 &json);
48 return json;
51 // Returns whether two Values are equal.
52 testing::AssertionResult ValuesEq(
53 const char* _1, const char* _2,
54 const base::Value* expected,
55 const base::Value* actual) {
56 if (expected == actual) {
57 return testing::AssertionSuccess();
59 if (!expected && actual) {
60 return testing::AssertionFailure() <<
61 "Expected NULL, actual: " << GetJson(*actual);
63 if (expected && !actual) {
64 return testing::AssertionFailure() <<
65 "Expected: " << GetJson(*expected) << ", actual NULL";
67 if (!expected->Equals(actual)) {
68 return testing::AssertionFailure() <<
69 "Expected: " << GetJson(*expected) << ", actual: " << GetJson(*actual);
71 return testing::AssertionSuccess();
74 // Returns whether the result of a storage operation is an expected value.
75 // Logs when different.
76 testing::AssertionResult SettingsEq(
77 const char* _1, const char* _2,
78 const base::DictionaryValue& expected,
79 ValueStore::ReadResult actual) {
80 if (actual->HasError()) {
81 return testing::AssertionFailure() <<
82 "Expected: " << expected <<
83 ", actual has error: " << actual->error().message;
85 return ValuesEq(_1, _2, &expected, &actual->settings());
88 // SyncChangeProcessor which just records the changes made, accessed after
89 // being converted to the more useful SettingSyncData via changes().
90 class MockSyncChangeProcessor : public syncer::SyncChangeProcessor {
91 public:
92 MockSyncChangeProcessor() : fail_all_requests_(false) {}
94 // syncer::SyncChangeProcessor implementation.
95 virtual syncer::SyncError ProcessSyncChanges(
96 const tracked_objects::Location& from_here,
97 const syncer::SyncChangeList& change_list) OVERRIDE {
98 if (fail_all_requests_) {
99 return syncer::SyncError(
100 FROM_HERE,
101 syncer::SyncError::DATATYPE_ERROR,
102 "MockSyncChangeProcessor: configured to fail",
103 change_list[0].sync_data().GetDataType());
105 for (syncer::SyncChangeList::const_iterator it = change_list.begin();
106 it != change_list.end(); ++it) {
107 changes_.push_back(SettingSyncData(*it));
109 return syncer::SyncError();
112 virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
113 OVERRIDE {
114 return syncer::SyncDataList();
117 // Mock methods.
119 const SettingSyncDataList& changes() { return changes_; }
121 void ClearChanges() {
122 changes_.clear();
125 void set_fail_all_requests(bool fail_all_requests) {
126 fail_all_requests_ = fail_all_requests;
129 // Returns the only change for a given extension setting. If there is not
130 // exactly 1 change for that key, a test assertion will fail.
131 SettingSyncData GetOnlyChange(
132 const std::string& extension_id, const std::string& key) {
133 SettingSyncDataList matching_changes;
134 for (SettingSyncDataList::iterator it = changes_.begin();
135 it != changes_.end(); ++it) {
136 if (it->extension_id() == extension_id && it->key() == key) {
137 matching_changes.push_back(*it);
140 if (matching_changes.empty()) {
141 ADD_FAILURE() << "No matching changes for " << extension_id << "/" <<
142 key << " (out of " << changes_.size() << ")";
143 return SettingSyncData(syncer::SyncChange::ACTION_INVALID,
144 std::string(),
145 std::string(),
146 scoped_ptr<base::Value>(
147 new base::DictionaryValue()));
149 if (matching_changes.size() != 1u) {
150 ADD_FAILURE() << matching_changes.size() << " matching changes for " <<
151 extension_id << "/" << key << " (out of " << changes_.size() << ")";
153 return matching_changes[0];
156 private:
157 SettingSyncDataList changes_;
158 bool fail_all_requests_;
161 // SettingsStorageFactory which always returns TestingValueStore objects,
162 // and allows individually created objects to be returned.
163 class TestingValueStoreFactory : public SettingsStorageFactory {
164 public:
165 TestingValueStore* GetExisting(const std::string& extension_id) {
166 DCHECK(created_.count(extension_id));
167 return created_[extension_id];
170 // SettingsStorageFactory implementation.
171 virtual ValueStore* Create(const base::FilePath& base_path,
172 const std::string& extension_id) OVERRIDE {
173 TestingValueStore* new_storage = new TestingValueStore();
174 DCHECK(!created_.count(extension_id));
175 created_[extension_id] = new_storage;
176 return new_storage;
179 // Testing value stores don't actually create a real database. Don't delete
180 // any files.
181 virtual void DeleteDatabaseIfExists(
182 const base::FilePath& base_path,
183 const std::string& extension_id) OVERRIDE {}
185 private:
186 // SettingsStorageFactory is refcounted.
187 virtual ~TestingValueStoreFactory() {}
189 // None of these storage areas are owned by this factory, so care must be
190 // taken when calling GetExisting.
191 std::map<std::string, TestingValueStore*> created_;
194 } // namespace
196 class ExtensionSettingsSyncTest : public testing::Test {
197 public:
198 ExtensionSettingsSyncTest()
199 : ui_thread_(BrowserThread::UI, base::MessageLoop::current()),
200 file_thread_(BrowserThread::FILE, base::MessageLoop::current()),
201 storage_factory_(new util::ScopedSettingsStorageFactory()),
202 sync_processor_(new MockSyncChangeProcessor),
203 sync_processor_wrapper_(new syncer::SyncChangeProcessorWrapperForTest(
204 sync_processor_.get())) {}
206 virtual void SetUp() OVERRIDE {
207 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
208 profile_.reset(new util::MockProfile(temp_dir_.path()));
209 storage_factory_->Reset(new LeveldbSettingsStorageFactory());
210 frontend_.reset(
211 StorageFrontend::CreateForTesting(storage_factory_, profile_.get()));
214 virtual void TearDown() OVERRIDE {
215 frontend_.reset();
216 profile_.reset();
217 // Execute any pending deletion tasks.
218 message_loop_.RunUntilIdle();
221 protected:
222 // Adds a record of an extension or app to the extension service, then returns
223 // its storage area.
224 ValueStore* AddExtensionAndGetStorage(
225 const std::string& id, Manifest::Type type) {
226 scoped_refptr<const Extension> extension =
227 util::AddExtensionWithId(profile_.get(), id, type);
228 return util::GetStorage(extension, frontend_.get());
231 // Gets the syncer::SyncableService for the given sync type.
232 syncer::SyncableService* GetSyncableService(syncer::ModelType model_type) {
233 base::MessageLoop::current()->RunUntilIdle();
234 SyncValueStoreCache* sync_cache = static_cast<SyncValueStoreCache*>(
235 frontend_->GetValueStoreCache(settings_namespace::SYNC));
236 return sync_cache->GetSyncableService(model_type);
239 // Gets all the sync data from the SyncableService for a sync type as a map
240 // from extension id to its sync data.
241 std::map<std::string, SettingSyncDataList> GetAllSyncData(
242 syncer::ModelType model_type) {
243 syncer::SyncDataList as_list =
244 GetSyncableService(model_type)->GetAllSyncData(model_type);
245 std::map<std::string, SettingSyncDataList> as_map;
246 for (syncer::SyncDataList::iterator it = as_list.begin();
247 it != as_list.end(); ++it) {
248 SettingSyncData sync_data(*it);
249 as_map[sync_data.extension_id()].push_back(sync_data);
251 return as_map;
254 // Need these so that the DCHECKs for running on FILE or UI threads pass.
255 base::MessageLoop message_loop_;
256 content::TestBrowserThread ui_thread_;
257 content::TestBrowserThread file_thread_;
259 base::ScopedTempDir temp_dir_;
260 scoped_ptr<util::MockProfile> profile_;
261 scoped_ptr<StorageFrontend> frontend_;
262 scoped_refptr<util::ScopedSettingsStorageFactory> storage_factory_;
263 scoped_ptr<MockSyncChangeProcessor> sync_processor_;
264 scoped_ptr<syncer::SyncChangeProcessorWrapperForTest> sync_processor_wrapper_;
267 // Get a semblance of coverage for both EXTENSION_SETTINGS and APP_SETTINGS
268 // sync by roughly alternative which one to test.
270 TEST_F(ExtensionSettingsSyncTest, NoDataDoesNotInvokeSync) {
271 syncer::ModelType model_type = syncer::EXTENSION_SETTINGS;
272 Manifest::Type type = Manifest::TYPE_EXTENSION;
274 EXPECT_EQ(0u, GetAllSyncData(model_type).size());
276 // Have one extension created before sync is set up, the other created after.
277 AddExtensionAndGetStorage("s1", type);
278 EXPECT_EQ(0u, GetAllSyncData(model_type).size());
280 GetSyncableService(model_type)->MergeDataAndStartSyncing(
281 model_type,
282 syncer::SyncDataList(),
283 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
284 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
286 AddExtensionAndGetStorage("s2", type);
287 EXPECT_EQ(0u, GetAllSyncData(model_type).size());
289 GetSyncableService(model_type)->StopSyncing(model_type);
291 EXPECT_EQ(0u, sync_processor_->changes().size());
292 EXPECT_EQ(0u, GetAllSyncData(model_type).size());
295 TEST_F(ExtensionSettingsSyncTest, InSyncDataDoesNotInvokeSync) {
296 syncer::ModelType model_type = syncer::APP_SETTINGS;
297 Manifest::Type type = Manifest::TYPE_LEGACY_PACKAGED_APP;
299 base::StringValue value1("fooValue");
300 base::ListValue value2;
301 value2.Append(new base::StringValue("barValue"));
303 ValueStore* storage1 = AddExtensionAndGetStorage("s1", type);
304 ValueStore* storage2 = AddExtensionAndGetStorage("s2", type);
306 storage1->Set(DEFAULTS, "foo", value1);
307 storage2->Set(DEFAULTS, "bar", value2);
309 std::map<std::string, SettingSyncDataList> all_sync_data =
310 GetAllSyncData(model_type);
311 EXPECT_EQ(2u, all_sync_data.size());
312 EXPECT_EQ(1u, all_sync_data["s1"].size());
313 EXPECT_PRED_FORMAT2(ValuesEq, &value1, &all_sync_data["s1"][0].value());
314 EXPECT_EQ(1u, all_sync_data["s2"].size());
315 EXPECT_PRED_FORMAT2(ValuesEq, &value2, &all_sync_data["s2"][0].value());
317 syncer::SyncDataList sync_data;
318 sync_data.push_back(settings_sync_util::CreateData(
319 "s1", "foo", value1, model_type));
320 sync_data.push_back(settings_sync_util::CreateData(
321 "s2", "bar", value2, model_type));
323 GetSyncableService(model_type)->MergeDataAndStartSyncing(
324 model_type,
325 sync_data,
326 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
327 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
329 // Already in sync, so no changes.
330 EXPECT_EQ(0u, sync_processor_->changes().size());
332 // Regression test: not-changing the synced value shouldn't result in a sync
333 // change, and changing the synced value should result in an update.
334 storage1->Set(DEFAULTS, "foo", value1);
335 EXPECT_EQ(0u, sync_processor_->changes().size());
337 storage1->Set(DEFAULTS, "foo", value2);
338 EXPECT_EQ(1u, sync_processor_->changes().size());
339 SettingSyncData change = sync_processor_->GetOnlyChange("s1", "foo");
340 EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type());
341 EXPECT_TRUE(value2.Equals(&change.value()));
343 GetSyncableService(model_type)->StopSyncing(model_type);
346 TEST_F(ExtensionSettingsSyncTest, LocalDataWithNoSyncDataIsPushedToSync) {
347 syncer::ModelType model_type = syncer::EXTENSION_SETTINGS;
348 Manifest::Type type = Manifest::TYPE_EXTENSION;
350 base::StringValue value1("fooValue");
351 base::ListValue value2;
352 value2.Append(new base::StringValue("barValue"));
354 ValueStore* storage1 = AddExtensionAndGetStorage("s1", type);
355 ValueStore* storage2 = AddExtensionAndGetStorage("s2", type);
357 storage1->Set(DEFAULTS, "foo", value1);
358 storage2->Set(DEFAULTS, "bar", value2);
360 GetSyncableService(model_type)->MergeDataAndStartSyncing(
361 model_type,
362 syncer::SyncDataList(),
363 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
364 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
366 // All settings should have been pushed to sync.
367 EXPECT_EQ(2u, sync_processor_->changes().size());
368 SettingSyncData change = sync_processor_->GetOnlyChange("s1", "foo");
369 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type());
370 EXPECT_TRUE(value1.Equals(&change.value()));
371 change = sync_processor_->GetOnlyChange("s2", "bar");
372 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type());
373 EXPECT_TRUE(value2.Equals(&change.value()));
375 GetSyncableService(model_type)->StopSyncing(model_type);
378 TEST_F(ExtensionSettingsSyncTest, AnySyncDataOverwritesLocalData) {
379 syncer::ModelType model_type = syncer::APP_SETTINGS;
380 Manifest::Type type = Manifest::TYPE_LEGACY_PACKAGED_APP;
382 base::StringValue value1("fooValue");
383 base::ListValue value2;
384 value2.Append(new base::StringValue("barValue"));
386 // Maintain dictionaries mirrored to the expected values of the settings in
387 // each storage area.
388 base::DictionaryValue expected1, expected2;
390 // Pre-populate one of the storage areas.
391 ValueStore* storage1 = AddExtensionAndGetStorage("s1", type);
392 storage1->Set(DEFAULTS, "overwriteMe", value1);
394 syncer::SyncDataList sync_data;
395 sync_data.push_back(settings_sync_util::CreateData(
396 "s1", "foo", value1, model_type));
397 sync_data.push_back(settings_sync_util::CreateData(
398 "s2", "bar", value2, model_type));
399 GetSyncableService(model_type)->MergeDataAndStartSyncing(
400 model_type,
401 sync_data,
402 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
403 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
404 expected1.Set("foo", value1.DeepCopy());
405 expected2.Set("bar", value2.DeepCopy());
407 ValueStore* storage2 = AddExtensionAndGetStorage("s2", type);
409 // All changes should be local, so no sync changes.
410 EXPECT_EQ(0u, sync_processor_->changes().size());
412 // Sync settings should have been pushed to local settings.
413 EXPECT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get());
414 EXPECT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get());
416 GetSyncableService(model_type)->StopSyncing(model_type);
419 TEST_F(ExtensionSettingsSyncTest, ProcessSyncChanges) {
420 syncer::ModelType model_type = syncer::EXTENSION_SETTINGS;
421 Manifest::Type type = Manifest::TYPE_EXTENSION;
423 base::StringValue value1("fooValue");
424 base::ListValue value2;
425 value2.Append(new base::StringValue("barValue"));
427 // Maintain dictionaries mirrored to the expected values of the settings in
428 // each storage area.
429 base::DictionaryValue expected1, expected2;
431 // Make storage1 initialised from local data, storage2 initialised from sync.
432 ValueStore* storage1 = AddExtensionAndGetStorage("s1", type);
433 ValueStore* storage2 = AddExtensionAndGetStorage("s2", type);
435 storage1->Set(DEFAULTS, "foo", value1);
436 expected1.Set("foo", value1.DeepCopy());
438 syncer::SyncDataList sync_data;
439 sync_data.push_back(settings_sync_util::CreateData(
440 "s2", "bar", value2, model_type));
442 GetSyncableService(model_type)->MergeDataAndStartSyncing(
443 model_type,
444 sync_data,
445 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
446 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
447 expected2.Set("bar", value2.DeepCopy());
449 // Make sync add some settings.
450 syncer::SyncChangeList change_list;
451 change_list.push_back(settings_sync_util::CreateAdd(
452 "s1", "bar", value2, model_type));
453 change_list.push_back(settings_sync_util::CreateAdd(
454 "s2", "foo", value1, model_type));
455 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
456 expected1.Set("bar", value2.DeepCopy());
457 expected2.Set("foo", value1.DeepCopy());
459 EXPECT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get());
460 EXPECT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get());
462 // Make sync update some settings, storage1 the new setting, storage2 the
463 // initial setting.
464 change_list.clear();
465 change_list.push_back(settings_sync_util::CreateUpdate(
466 "s1", "bar", value2, model_type));
467 change_list.push_back(settings_sync_util::CreateUpdate(
468 "s2", "bar", value1, model_type));
469 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
470 expected1.Set("bar", value2.DeepCopy());
471 expected2.Set("bar", value1.DeepCopy());
473 EXPECT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get());
474 EXPECT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get());
476 // Make sync remove some settings, storage1 the initial setting, storage2 the
477 // new setting.
478 change_list.clear();
479 change_list.push_back(settings_sync_util::CreateDelete(
480 "s1", "foo", model_type));
481 change_list.push_back(settings_sync_util::CreateDelete(
482 "s2", "foo", model_type));
483 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
484 expected1.Remove("foo", NULL);
485 expected2.Remove("foo", NULL);
487 EXPECT_PRED_FORMAT2(SettingsEq, expected1, storage1->Get());
488 EXPECT_PRED_FORMAT2(SettingsEq, expected2, storage2->Get());
490 GetSyncableService(model_type)->StopSyncing(model_type);
493 TEST_F(ExtensionSettingsSyncTest, PushToSync) {
494 syncer::ModelType model_type = syncer::APP_SETTINGS;
495 Manifest::Type type = Manifest::TYPE_LEGACY_PACKAGED_APP;
497 base::StringValue value1("fooValue");
498 base::ListValue value2;
499 value2.Append(new base::StringValue("barValue"));
501 // Make storage1/2 initialised from local data, storage3/4 initialised from
502 // sync.
503 ValueStore* storage1 = AddExtensionAndGetStorage("s1", type);
504 ValueStore* storage2 = AddExtensionAndGetStorage("s2", type);
505 ValueStore* storage3 = AddExtensionAndGetStorage("s3", type);
506 ValueStore* storage4 = AddExtensionAndGetStorage("s4", type);
508 storage1->Set(DEFAULTS, "foo", value1);
509 storage2->Set(DEFAULTS, "foo", value1);
511 syncer::SyncDataList sync_data;
512 sync_data.push_back(settings_sync_util::CreateData(
513 "s3", "bar", value2, model_type));
514 sync_data.push_back(settings_sync_util::CreateData(
515 "s4", "bar", value2, model_type));
517 GetSyncableService(model_type)->MergeDataAndStartSyncing(
518 model_type,
519 sync_data,
520 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
521 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
523 // Add something locally.
524 storage1->Set(DEFAULTS, "bar", value2);
525 storage2->Set(DEFAULTS, "bar", value2);
526 storage3->Set(DEFAULTS, "foo", value1);
527 storage4->Set(DEFAULTS, "foo", value1);
529 SettingSyncData change = sync_processor_->GetOnlyChange("s1", "bar");
530 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type());
531 EXPECT_TRUE(value2.Equals(&change.value()));
532 sync_processor_->GetOnlyChange("s2", "bar");
533 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type());
534 EXPECT_TRUE(value2.Equals(&change.value()));
535 change = sync_processor_->GetOnlyChange("s3", "foo");
536 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type());
537 EXPECT_TRUE(value1.Equals(&change.value()));
538 change = sync_processor_->GetOnlyChange("s4", "foo");
539 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type());
540 EXPECT_TRUE(value1.Equals(&change.value()));
542 // Change something locally, storage1/3 the new setting and storage2/4 the
543 // initial setting, for all combinations of local vs sync intialisation and
544 // new vs initial.
545 sync_processor_->ClearChanges();
546 storage1->Set(DEFAULTS, "bar", value1);
547 storage2->Set(DEFAULTS, "foo", value2);
548 storage3->Set(DEFAULTS, "bar", value1);
549 storage4->Set(DEFAULTS, "foo", value2);
551 change = sync_processor_->GetOnlyChange("s1", "bar");
552 EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type());
553 EXPECT_TRUE(value1.Equals(&change.value()));
554 change = sync_processor_->GetOnlyChange("s2", "foo");
555 EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type());
556 EXPECT_TRUE(value2.Equals(&change.value()));
557 change = sync_processor_->GetOnlyChange("s3", "bar");
558 EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type());
559 EXPECT_TRUE(value1.Equals(&change.value()));
560 change = sync_processor_->GetOnlyChange("s4", "foo");
561 EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type());
562 EXPECT_TRUE(value2.Equals(&change.value()));
564 // Remove something locally, storage1/3 the new setting and storage2/4 the
565 // initial setting, for all combinations of local vs sync intialisation and
566 // new vs initial.
567 sync_processor_->ClearChanges();
568 storage1->Remove("foo");
569 storage2->Remove("bar");
570 storage3->Remove("foo");
571 storage4->Remove("bar");
573 EXPECT_EQ(
574 syncer::SyncChange::ACTION_DELETE,
575 sync_processor_->GetOnlyChange("s1", "foo").change_type());
576 EXPECT_EQ(
577 syncer::SyncChange::ACTION_DELETE,
578 sync_processor_->GetOnlyChange("s2", "bar").change_type());
579 EXPECT_EQ(
580 syncer::SyncChange::ACTION_DELETE,
581 sync_processor_->GetOnlyChange("s3", "foo").change_type());
582 EXPECT_EQ(
583 syncer::SyncChange::ACTION_DELETE,
584 sync_processor_->GetOnlyChange("s4", "bar").change_type());
586 // Remove some nonexistent settings.
587 sync_processor_->ClearChanges();
588 storage1->Remove("foo");
589 storage2->Remove("bar");
590 storage3->Remove("foo");
591 storage4->Remove("bar");
593 EXPECT_EQ(0u, sync_processor_->changes().size());
595 // Clear the rest of the settings. Add the removed ones back first so that
596 // more than one setting is cleared.
597 storage1->Set(DEFAULTS, "foo", value1);
598 storage2->Set(DEFAULTS, "bar", value2);
599 storage3->Set(DEFAULTS, "foo", value1);
600 storage4->Set(DEFAULTS, "bar", value2);
602 sync_processor_->ClearChanges();
603 storage1->Clear();
604 storage2->Clear();
605 storage3->Clear();
606 storage4->Clear();
608 EXPECT_EQ(
609 syncer::SyncChange::ACTION_DELETE,
610 sync_processor_->GetOnlyChange("s1", "foo").change_type());
611 EXPECT_EQ(
612 syncer::SyncChange::ACTION_DELETE,
613 sync_processor_->GetOnlyChange("s1", "bar").change_type());
614 EXPECT_EQ(
615 syncer::SyncChange::ACTION_DELETE,
616 sync_processor_->GetOnlyChange("s2", "foo").change_type());
617 EXPECT_EQ(
618 syncer::SyncChange::ACTION_DELETE,
619 sync_processor_->GetOnlyChange("s2", "bar").change_type());
620 EXPECT_EQ(
621 syncer::SyncChange::ACTION_DELETE,
622 sync_processor_->GetOnlyChange("s3", "foo").change_type());
623 EXPECT_EQ(
624 syncer::SyncChange::ACTION_DELETE,
625 sync_processor_->GetOnlyChange("s3", "bar").change_type());
626 EXPECT_EQ(
627 syncer::SyncChange::ACTION_DELETE,
628 sync_processor_->GetOnlyChange("s4", "foo").change_type());
629 EXPECT_EQ(
630 syncer::SyncChange::ACTION_DELETE,
631 sync_processor_->GetOnlyChange("s4", "bar").change_type());
633 GetSyncableService(model_type)->StopSyncing(model_type);
636 TEST_F(ExtensionSettingsSyncTest, ExtensionAndAppSettingsSyncSeparately) {
637 base::StringValue value1("fooValue");
638 base::ListValue value2;
639 value2.Append(new base::StringValue("barValue"));
641 // storage1 is an extension, storage2 is an app.
642 ValueStore* storage1 = AddExtensionAndGetStorage(
643 "s1", Manifest::TYPE_EXTENSION);
644 ValueStore* storage2 = AddExtensionAndGetStorage(
645 "s2", Manifest::TYPE_LEGACY_PACKAGED_APP);
647 storage1->Set(DEFAULTS, "foo", value1);
648 storage2->Set(DEFAULTS, "bar", value2);
650 std::map<std::string, SettingSyncDataList> extension_sync_data =
651 GetAllSyncData(syncer::EXTENSION_SETTINGS);
652 EXPECT_EQ(1u, extension_sync_data.size());
653 EXPECT_EQ(1u, extension_sync_data["s1"].size());
654 EXPECT_PRED_FORMAT2(ValuesEq, &value1, &extension_sync_data["s1"][0].value());
656 std::map<std::string, SettingSyncDataList> app_sync_data =
657 GetAllSyncData(syncer::APP_SETTINGS);
658 EXPECT_EQ(1u, app_sync_data.size());
659 EXPECT_EQ(1u, app_sync_data["s2"].size());
660 EXPECT_PRED_FORMAT2(ValuesEq, &value2, &app_sync_data["s2"][0].value());
662 // Stop each separately, there should be no changes either time.
663 syncer::SyncDataList sync_data;
664 sync_data.push_back(settings_sync_util::CreateData(
665 "s1", "foo", value1, syncer::EXTENSION_SETTINGS));
667 GetSyncableService(syncer::EXTENSION_SETTINGS)->MergeDataAndStartSyncing(
668 syncer::EXTENSION_SETTINGS,
669 sync_data,
670 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
671 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
672 GetSyncableService(syncer::EXTENSION_SETTINGS)->
673 StopSyncing(syncer::EXTENSION_SETTINGS);
674 EXPECT_EQ(0u, sync_processor_->changes().size());
676 sync_data.clear();
677 sync_data.push_back(settings_sync_util::CreateData(
678 "s2", "bar", value2, syncer::APP_SETTINGS));
680 scoped_ptr<syncer::SyncChangeProcessorWrapperForTest> app_settings_delegate_(
681 new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
682 GetSyncableService(syncer::APP_SETTINGS)->MergeDataAndStartSyncing(
683 syncer::APP_SETTINGS,
684 sync_data,
685 app_settings_delegate_.PassAs<syncer::SyncChangeProcessor>(),
686 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
687 GetSyncableService(syncer::APP_SETTINGS)->
688 StopSyncing(syncer::APP_SETTINGS);
689 EXPECT_EQ(0u, sync_processor_->changes().size());
692 TEST_F(ExtensionSettingsSyncTest, FailingStartSyncingDisablesSync) {
693 syncer::ModelType model_type = syncer::EXTENSION_SETTINGS;
694 Manifest::Type type = Manifest::TYPE_EXTENSION;
696 base::StringValue fooValue("fooValue");
697 base::StringValue barValue("barValue");
699 // There is a bit of a convoluted method to get storage areas that can fail;
700 // hand out TestingValueStore object then toggle them failing/succeeding
701 // as necessary.
702 TestingValueStoreFactory* testing_factory = new TestingValueStoreFactory();
703 storage_factory_->Reset(testing_factory);
705 ValueStore* good = AddExtensionAndGetStorage("good", type);
706 ValueStore* bad = AddExtensionAndGetStorage("bad", type);
708 // Make bad fail for incoming sync changes.
709 testing_factory->GetExisting("bad")->set_error_code(ValueStore::CORRUPTION);
711 syncer::SyncDataList sync_data;
712 sync_data.push_back(settings_sync_util::CreateData(
713 "good", "foo", fooValue, model_type));
714 sync_data.push_back(settings_sync_util::CreateData(
715 "bad", "foo", fooValue, model_type));
716 GetSyncableService(model_type)->MergeDataAndStartSyncing(
717 model_type,
718 sync_data,
719 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
720 scoped_ptr<syncer::SyncErrorFactory>(
721 new syncer::SyncErrorFactoryMock()));
723 testing_factory->GetExisting("bad")->set_error_code(ValueStore::OK);
726 base::DictionaryValue dict;
727 dict.Set("foo", fooValue.DeepCopy());
728 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
731 base::DictionaryValue dict;
732 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
735 // Changes made to good should be sent to sync, changes from bad shouldn't.
736 sync_processor_->ClearChanges();
737 good->Set(DEFAULTS, "bar", barValue);
738 bad->Set(DEFAULTS, "bar", barValue);
740 EXPECT_EQ(
741 syncer::SyncChange::ACTION_ADD,
742 sync_processor_->GetOnlyChange("good", "bar").change_type());
743 EXPECT_EQ(1u, sync_processor_->changes().size());
746 base::DictionaryValue dict;
747 dict.Set("foo", fooValue.DeepCopy());
748 dict.Set("bar", barValue.DeepCopy());
749 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
752 base::DictionaryValue dict;
753 dict.Set("bar", barValue.DeepCopy());
754 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
757 // Changes received from sync should go to good but not bad (even when it's
758 // not failing).
760 syncer::SyncChangeList change_list;
761 change_list.push_back(settings_sync_util::CreateUpdate(
762 "good", "foo", barValue, model_type));
763 // (Sending UPDATE here even though it's adding, since that's what the state
764 // of sync is. In any case, it won't work.)
765 change_list.push_back(settings_sync_util::CreateUpdate(
766 "bad", "foo", barValue, model_type));
767 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
771 base::DictionaryValue dict;
772 dict.Set("foo", barValue.DeepCopy());
773 dict.Set("bar", barValue.DeepCopy());
774 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
777 base::DictionaryValue dict;
778 dict.Set("bar", barValue.DeepCopy());
779 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
782 // Changes made to bad still shouldn't go to sync, even though it didn't fail
783 // last time.
784 sync_processor_->ClearChanges();
785 good->Set(DEFAULTS, "bar", fooValue);
786 bad->Set(DEFAULTS, "bar", fooValue);
788 EXPECT_EQ(
789 syncer::SyncChange::ACTION_UPDATE,
790 sync_processor_->GetOnlyChange("good", "bar").change_type());
791 EXPECT_EQ(1u, sync_processor_->changes().size());
794 base::DictionaryValue dict;
795 dict.Set("foo", barValue.DeepCopy());
796 dict.Set("bar", fooValue.DeepCopy());
797 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
800 base::DictionaryValue dict;
801 dict.Set("bar", fooValue.DeepCopy());
802 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
805 // Failing ProcessSyncChanges shouldn't go to the storage.
806 testing_factory->GetExisting("bad")->set_error_code(ValueStore::CORRUPTION);
808 syncer::SyncChangeList change_list;
809 change_list.push_back(settings_sync_util::CreateUpdate(
810 "good", "foo", fooValue, model_type));
811 // (Ditto.)
812 change_list.push_back(settings_sync_util::CreateUpdate(
813 "bad", "foo", fooValue, model_type));
814 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
816 testing_factory->GetExisting("bad")->set_error_code(ValueStore::OK);
819 base::DictionaryValue dict;
820 dict.Set("foo", fooValue.DeepCopy());
821 dict.Set("bar", fooValue.DeepCopy());
822 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
825 base::DictionaryValue dict;
826 dict.Set("bar", fooValue.DeepCopy());
827 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
830 // Restarting sync should make bad start syncing again.
831 sync_processor_->ClearChanges();
832 GetSyncableService(model_type)->StopSyncing(model_type);
833 sync_processor_wrapper_.reset(
834 new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
835 GetSyncableService(model_type)->MergeDataAndStartSyncing(
836 model_type,
837 syncer::SyncDataList(),
838 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
839 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
841 // Local settings will have been pushed to sync, since it's empty (in this
842 // test; presumably it wouldn't be live, since we've been getting changes).
843 EXPECT_EQ(
844 syncer::SyncChange::ACTION_ADD,
845 sync_processor_->GetOnlyChange("good", "foo").change_type());
846 EXPECT_EQ(
847 syncer::SyncChange::ACTION_ADD,
848 sync_processor_->GetOnlyChange("good", "bar").change_type());
849 EXPECT_EQ(
850 syncer::SyncChange::ACTION_ADD,
851 sync_processor_->GetOnlyChange("bad", "bar").change_type());
852 EXPECT_EQ(3u, sync_processor_->changes().size());
854 // Live local changes now get pushed, too.
855 sync_processor_->ClearChanges();
856 good->Set(DEFAULTS, "bar", barValue);
857 bad->Set(DEFAULTS, "bar", barValue);
859 EXPECT_EQ(
860 syncer::SyncChange::ACTION_UPDATE,
861 sync_processor_->GetOnlyChange("good", "bar").change_type());
862 EXPECT_EQ(
863 syncer::SyncChange::ACTION_UPDATE,
864 sync_processor_->GetOnlyChange("bad", "bar").change_type());
865 EXPECT_EQ(2u, sync_processor_->changes().size());
867 // And ProcessSyncChanges work, too.
869 syncer::SyncChangeList change_list;
870 change_list.push_back(settings_sync_util::CreateUpdate(
871 "good", "bar", fooValue, model_type));
872 change_list.push_back(settings_sync_util::CreateUpdate(
873 "bad", "bar", fooValue, model_type));
874 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
878 base::DictionaryValue dict;
879 dict.Set("foo", fooValue.DeepCopy());
880 dict.Set("bar", fooValue.DeepCopy());
881 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
884 base::DictionaryValue dict;
885 dict.Set("bar", fooValue.DeepCopy());
886 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
890 TEST_F(ExtensionSettingsSyncTest, FailingProcessChangesDisablesSync) {
891 // The test above tests a failing ProcessSyncChanges too, but here test with
892 // an initially passing MergeDataAndStartSyncing.
893 syncer::ModelType model_type = syncer::APP_SETTINGS;
894 Manifest::Type type = Manifest::TYPE_LEGACY_PACKAGED_APP;
896 base::StringValue fooValue("fooValue");
897 base::StringValue barValue("barValue");
899 TestingValueStoreFactory* testing_factory = new TestingValueStoreFactory();
900 storage_factory_->Reset(testing_factory);
902 ValueStore* good = AddExtensionAndGetStorage("good", type);
903 ValueStore* bad = AddExtensionAndGetStorage("bad", type);
905 // Unlike before, initially succeeding MergeDataAndStartSyncing.
907 syncer::SyncDataList sync_data;
908 sync_data.push_back(settings_sync_util::CreateData(
909 "good", "foo", fooValue, model_type));
910 sync_data.push_back(settings_sync_util::CreateData(
911 "bad", "foo", fooValue, model_type));
912 GetSyncableService(model_type)->MergeDataAndStartSyncing(
913 model_type,
914 sync_data,
915 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
916 scoped_ptr<syncer::SyncErrorFactory>(
917 new syncer::SyncErrorFactoryMock()));
920 EXPECT_EQ(0u, sync_processor_->changes().size());
923 base::DictionaryValue dict;
924 dict.Set("foo", fooValue.DeepCopy());
925 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
928 base::DictionaryValue dict;
929 dict.Set("foo", fooValue.DeepCopy());
930 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
933 // Now fail ProcessSyncChanges for bad.
934 testing_factory->GetExisting("bad")->set_error_code(ValueStore::CORRUPTION);
936 syncer::SyncChangeList change_list;
937 change_list.push_back(settings_sync_util::CreateAdd(
938 "good", "bar", barValue, model_type));
939 change_list.push_back(settings_sync_util::CreateAdd(
940 "bad", "bar", barValue, model_type));
941 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
943 testing_factory->GetExisting("bad")->set_error_code(ValueStore::OK);
946 base::DictionaryValue dict;
947 dict.Set("foo", fooValue.DeepCopy());
948 dict.Set("bar", barValue.DeepCopy());
949 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
952 base::DictionaryValue dict;
953 dict.Set("foo", fooValue.DeepCopy());
954 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
957 // No more changes sent to sync for bad.
958 sync_processor_->ClearChanges();
959 good->Set(DEFAULTS, "foo", barValue);
960 bad->Set(DEFAULTS, "foo", barValue);
962 EXPECT_EQ(
963 syncer::SyncChange::ACTION_UPDATE,
964 sync_processor_->GetOnlyChange("good", "foo").change_type());
965 EXPECT_EQ(1u, sync_processor_->changes().size());
967 // No more changes received from sync should go to bad.
969 syncer::SyncChangeList change_list;
970 change_list.push_back(settings_sync_util::CreateAdd(
971 "good", "foo", fooValue, model_type));
972 change_list.push_back(settings_sync_util::CreateAdd(
973 "bad", "foo", fooValue, model_type));
974 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
978 base::DictionaryValue dict;
979 dict.Set("foo", fooValue.DeepCopy());
980 dict.Set("bar", barValue.DeepCopy());
981 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
984 base::DictionaryValue dict;
985 dict.Set("foo", barValue.DeepCopy());
986 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
990 TEST_F(ExtensionSettingsSyncTest, FailingGetAllSyncDataDoesntStopSync) {
991 syncer::ModelType model_type = syncer::EXTENSION_SETTINGS;
992 Manifest::Type type = Manifest::TYPE_EXTENSION;
994 base::StringValue fooValue("fooValue");
995 base::StringValue barValue("barValue");
997 TestingValueStoreFactory* testing_factory = new TestingValueStoreFactory();
998 storage_factory_->Reset(testing_factory);
1000 ValueStore* good = AddExtensionAndGetStorage("good", type);
1001 ValueStore* bad = AddExtensionAndGetStorage("bad", type);
1003 good->Set(DEFAULTS, "foo", fooValue);
1004 bad->Set(DEFAULTS, "foo", fooValue);
1006 // Even though bad will fail to get all sync data, sync data should still
1007 // include that from good.
1008 testing_factory->GetExisting("bad")->set_error_code(ValueStore::CORRUPTION);
1010 syncer::SyncDataList all_sync_data =
1011 GetSyncableService(model_type)->GetAllSyncData(model_type);
1012 EXPECT_EQ(1u, all_sync_data.size());
1013 EXPECT_EQ("good/foo", syncer::SyncDataLocal(all_sync_data[0]).GetTag());
1015 testing_factory->GetExisting("bad")->set_error_code(ValueStore::OK);
1017 // Sync shouldn't be disabled for good (nor bad -- but this is unimportant).
1018 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1019 model_type,
1020 syncer::SyncDataList(),
1021 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1022 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
1024 EXPECT_EQ(
1025 syncer::SyncChange::ACTION_ADD,
1026 sync_processor_->GetOnlyChange("good", "foo").change_type());
1027 EXPECT_EQ(
1028 syncer::SyncChange::ACTION_ADD,
1029 sync_processor_->GetOnlyChange("bad", "foo").change_type());
1030 EXPECT_EQ(2u, sync_processor_->changes().size());
1032 sync_processor_->ClearChanges();
1033 good->Set(DEFAULTS, "bar", barValue);
1034 bad->Set(DEFAULTS, "bar", barValue);
1036 EXPECT_EQ(
1037 syncer::SyncChange::ACTION_ADD,
1038 sync_processor_->GetOnlyChange("good", "bar").change_type());
1039 EXPECT_EQ(
1040 syncer::SyncChange::ACTION_ADD,
1041 sync_processor_->GetOnlyChange("bad", "bar").change_type());
1042 EXPECT_EQ(2u, sync_processor_->changes().size());
1045 TEST_F(ExtensionSettingsSyncTest, FailureToReadChangesToPushDisablesSync) {
1046 syncer::ModelType model_type = syncer::APP_SETTINGS;
1047 Manifest::Type type = Manifest::TYPE_LEGACY_PACKAGED_APP;
1049 base::StringValue fooValue("fooValue");
1050 base::StringValue barValue("barValue");
1052 TestingValueStoreFactory* testing_factory = new TestingValueStoreFactory();
1053 storage_factory_->Reset(testing_factory);
1055 ValueStore* good = AddExtensionAndGetStorage("good", type);
1056 ValueStore* bad = AddExtensionAndGetStorage("bad", type);
1058 good->Set(DEFAULTS, "foo", fooValue);
1059 bad->Set(DEFAULTS, "foo", fooValue);
1061 // good will successfully push foo:fooValue to sync, but bad will fail to
1062 // get them so won't.
1063 testing_factory->GetExisting("bad")->set_error_code(ValueStore::CORRUPTION);
1064 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1065 model_type,
1066 syncer::SyncDataList(),
1067 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1068 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
1069 testing_factory->GetExisting("bad")->set_error_code(ValueStore::OK);
1071 EXPECT_EQ(
1072 syncer::SyncChange::ACTION_ADD,
1073 sync_processor_->GetOnlyChange("good", "foo").change_type());
1074 EXPECT_EQ(1u, sync_processor_->changes().size());
1076 // bad should now be disabled for sync.
1077 sync_processor_->ClearChanges();
1078 good->Set(DEFAULTS, "bar", barValue);
1079 bad->Set(DEFAULTS, "bar", barValue);
1081 EXPECT_EQ(
1082 syncer::SyncChange::ACTION_ADD,
1083 sync_processor_->GetOnlyChange("good", "bar").change_type());
1084 EXPECT_EQ(1u, sync_processor_->changes().size());
1087 syncer::SyncChangeList change_list;
1088 change_list.push_back(settings_sync_util::CreateUpdate(
1089 "good", "foo", barValue, model_type));
1090 // (Sending ADD here even though it's updating, since that's what the state
1091 // of sync is. In any case, it won't work.)
1092 change_list.push_back(settings_sync_util::CreateAdd(
1093 "bad", "foo", barValue, model_type));
1094 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
1098 base::DictionaryValue dict;
1099 dict.Set("foo", barValue.DeepCopy());
1100 dict.Set("bar", barValue.DeepCopy());
1101 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
1104 base::DictionaryValue dict;
1105 dict.Set("foo", fooValue.DeepCopy());
1106 dict.Set("bar", barValue.DeepCopy());
1107 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
1110 // Re-enabling sync without failing should cause the local changes from bad
1111 // to be pushed to sync successfully, as should future changes to bad.
1112 sync_processor_->ClearChanges();
1113 GetSyncableService(model_type)->StopSyncing(model_type);
1114 sync_processor_wrapper_.reset(
1115 new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
1116 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1117 model_type,
1118 syncer::SyncDataList(),
1119 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1120 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
1122 EXPECT_EQ(
1123 syncer::SyncChange::ACTION_ADD,
1124 sync_processor_->GetOnlyChange("good", "foo").change_type());
1125 EXPECT_EQ(
1126 syncer::SyncChange::ACTION_ADD,
1127 sync_processor_->GetOnlyChange("good", "bar").change_type());
1128 EXPECT_EQ(
1129 syncer::SyncChange::ACTION_ADD,
1130 sync_processor_->GetOnlyChange("bad", "foo").change_type());
1131 EXPECT_EQ(
1132 syncer::SyncChange::ACTION_ADD,
1133 sync_processor_->GetOnlyChange("bad", "bar").change_type());
1134 EXPECT_EQ(4u, sync_processor_->changes().size());
1136 sync_processor_->ClearChanges();
1137 good->Set(DEFAULTS, "bar", fooValue);
1138 bad->Set(DEFAULTS, "bar", fooValue);
1140 EXPECT_EQ(
1141 syncer::SyncChange::ACTION_UPDATE,
1142 sync_processor_->GetOnlyChange("good", "bar").change_type());
1143 EXPECT_EQ(
1144 syncer::SyncChange::ACTION_UPDATE,
1145 sync_processor_->GetOnlyChange("good", "bar").change_type());
1146 EXPECT_EQ(2u, sync_processor_->changes().size());
1149 TEST_F(ExtensionSettingsSyncTest, FailureToPushLocalStateDisablesSync) {
1150 syncer::ModelType model_type = syncer::EXTENSION_SETTINGS;
1151 Manifest::Type type = Manifest::TYPE_EXTENSION;
1153 base::StringValue fooValue("fooValue");
1154 base::StringValue barValue("barValue");
1156 TestingValueStoreFactory* testing_factory = new TestingValueStoreFactory();
1157 storage_factory_->Reset(testing_factory);
1159 ValueStore* good = AddExtensionAndGetStorage("good", type);
1160 ValueStore* bad = AddExtensionAndGetStorage("bad", type);
1162 // Only set bad; setting good will cause it to fail below.
1163 bad->Set(DEFAULTS, "foo", fooValue);
1165 sync_processor_->set_fail_all_requests(true);
1166 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1167 model_type,
1168 syncer::SyncDataList(),
1169 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1170 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
1171 sync_processor_->set_fail_all_requests(false);
1173 // Changes from good will be send to sync, changes from bad won't.
1174 sync_processor_->ClearChanges();
1175 good->Set(DEFAULTS, "foo", barValue);
1176 bad->Set(DEFAULTS, "foo", barValue);
1178 EXPECT_EQ(
1179 syncer::SyncChange::ACTION_ADD,
1180 sync_processor_->GetOnlyChange("good", "foo").change_type());
1181 EXPECT_EQ(1u, sync_processor_->changes().size());
1183 // Changes from sync will be sent to good, not to bad.
1185 syncer::SyncChangeList change_list;
1186 change_list.push_back(settings_sync_util::CreateAdd(
1187 "good", "bar", barValue, model_type));
1188 change_list.push_back(settings_sync_util::CreateAdd(
1189 "bad", "bar", barValue, model_type));
1190 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
1194 base::DictionaryValue dict;
1195 dict.Set("foo", barValue.DeepCopy());
1196 dict.Set("bar", barValue.DeepCopy());
1197 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
1200 base::DictionaryValue dict;
1201 dict.Set("foo", barValue.DeepCopy());
1202 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
1205 // Restarting sync makes everything work again.
1206 sync_processor_->ClearChanges();
1207 GetSyncableService(model_type)->StopSyncing(model_type);
1208 sync_processor_wrapper_.reset(
1209 new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
1210 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1211 model_type,
1212 syncer::SyncDataList(),
1213 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1214 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
1216 EXPECT_EQ(
1217 syncer::SyncChange::ACTION_ADD,
1218 sync_processor_->GetOnlyChange("good", "foo").change_type());
1219 EXPECT_EQ(
1220 syncer::SyncChange::ACTION_ADD,
1221 sync_processor_->GetOnlyChange("good", "bar").change_type());
1222 EXPECT_EQ(
1223 syncer::SyncChange::ACTION_ADD,
1224 sync_processor_->GetOnlyChange("bad", "foo").change_type());
1225 EXPECT_EQ(3u, sync_processor_->changes().size());
1227 sync_processor_->ClearChanges();
1228 good->Set(DEFAULTS, "foo", fooValue);
1229 bad->Set(DEFAULTS, "foo", fooValue);
1231 EXPECT_EQ(
1232 syncer::SyncChange::ACTION_UPDATE,
1233 sync_processor_->GetOnlyChange("good", "foo").change_type());
1234 EXPECT_EQ(
1235 syncer::SyncChange::ACTION_UPDATE,
1236 sync_processor_->GetOnlyChange("good", "foo").change_type());
1237 EXPECT_EQ(2u, sync_processor_->changes().size());
1240 TEST_F(ExtensionSettingsSyncTest, FailureToPushLocalChangeDisablesSync) {
1241 syncer::ModelType model_type = syncer::EXTENSION_SETTINGS;
1242 Manifest::Type type = Manifest::TYPE_EXTENSION;
1244 base::StringValue fooValue("fooValue");
1245 base::StringValue barValue("barValue");
1247 TestingValueStoreFactory* testing_factory = new TestingValueStoreFactory();
1248 storage_factory_->Reset(testing_factory);
1250 ValueStore* good = AddExtensionAndGetStorage("good", type);
1251 ValueStore* bad = AddExtensionAndGetStorage("bad", type);
1253 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1254 model_type,
1255 syncer::SyncDataList(),
1256 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1257 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
1259 // bad will fail to send changes.
1260 good->Set(DEFAULTS, "foo", fooValue);
1261 sync_processor_->set_fail_all_requests(true);
1262 bad->Set(DEFAULTS, "foo", fooValue);
1263 sync_processor_->set_fail_all_requests(false);
1265 EXPECT_EQ(
1266 syncer::SyncChange::ACTION_ADD,
1267 sync_processor_->GetOnlyChange("good", "foo").change_type());
1268 EXPECT_EQ(1u, sync_processor_->changes().size());
1270 // No further changes should be sent from bad.
1271 sync_processor_->ClearChanges();
1272 good->Set(DEFAULTS, "foo", barValue);
1273 bad->Set(DEFAULTS, "foo", barValue);
1275 EXPECT_EQ(
1276 syncer::SyncChange::ACTION_UPDATE,
1277 sync_processor_->GetOnlyChange("good", "foo").change_type());
1278 EXPECT_EQ(1u, sync_processor_->changes().size());
1280 // Changes from sync will be sent to good, not to bad.
1282 syncer::SyncChangeList change_list;
1283 change_list.push_back(settings_sync_util::CreateAdd(
1284 "good", "bar", barValue, model_type));
1285 change_list.push_back(settings_sync_util::CreateAdd(
1286 "bad", "bar", barValue, model_type));
1287 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
1291 base::DictionaryValue dict;
1292 dict.Set("foo", barValue.DeepCopy());
1293 dict.Set("bar", barValue.DeepCopy());
1294 EXPECT_PRED_FORMAT2(SettingsEq, dict, good->Get());
1297 base::DictionaryValue dict;
1298 dict.Set("foo", barValue.DeepCopy());
1299 EXPECT_PRED_FORMAT2(SettingsEq, dict, bad->Get());
1302 // Restarting sync makes everything work again.
1303 sync_processor_->ClearChanges();
1304 GetSyncableService(model_type)->StopSyncing(model_type);
1305 sync_processor_wrapper_.reset(
1306 new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get()));
1307 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1308 model_type,
1309 syncer::SyncDataList(),
1310 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1311 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
1313 EXPECT_EQ(
1314 syncer::SyncChange::ACTION_ADD,
1315 sync_processor_->GetOnlyChange("good", "foo").change_type());
1316 EXPECT_EQ(
1317 syncer::SyncChange::ACTION_ADD,
1318 sync_processor_->GetOnlyChange("good", "bar").change_type());
1319 EXPECT_EQ(
1320 syncer::SyncChange::ACTION_ADD,
1321 sync_processor_->GetOnlyChange("bad", "foo").change_type());
1322 EXPECT_EQ(3u, sync_processor_->changes().size());
1324 sync_processor_->ClearChanges();
1325 good->Set(DEFAULTS, "foo", fooValue);
1326 bad->Set(DEFAULTS, "foo", fooValue);
1328 EXPECT_EQ(
1329 syncer::SyncChange::ACTION_UPDATE,
1330 sync_processor_->GetOnlyChange("good", "foo").change_type());
1331 EXPECT_EQ(
1332 syncer::SyncChange::ACTION_UPDATE,
1333 sync_processor_->GetOnlyChange("good", "foo").change_type());
1334 EXPECT_EQ(2u, sync_processor_->changes().size());
1337 TEST_F(ExtensionSettingsSyncTest,
1338 LargeOutgoingChangeRejectedButIncomingAccepted) {
1339 syncer::ModelType model_type = syncer::APP_SETTINGS;
1340 Manifest::Type type = Manifest::TYPE_LEGACY_PACKAGED_APP;
1342 // This value should be larger than the limit in sync_storage_backend.cc.
1343 std::string string_5k;
1344 for (size_t i = 0; i < 5000; ++i) {
1345 string_5k.append("a");
1347 base::StringValue large_value(string_5k);
1349 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1350 model_type,
1351 syncer::SyncDataList(),
1352 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1353 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
1355 // Large local change rejected and doesn't get sent out.
1356 ValueStore* storage1 = AddExtensionAndGetStorage("s1", type);
1357 EXPECT_TRUE(storage1->Set(DEFAULTS, "large_value", large_value)->HasError());
1358 EXPECT_EQ(0u, sync_processor_->changes().size());
1360 // Large incoming change should still get accepted.
1361 ValueStore* storage2 = AddExtensionAndGetStorage("s2", type);
1363 syncer::SyncChangeList change_list;
1364 change_list.push_back(settings_sync_util::CreateAdd(
1365 "s1", "large_value", large_value, model_type));
1366 change_list.push_back(settings_sync_util::CreateAdd(
1367 "s2", "large_value", large_value, model_type));
1368 GetSyncableService(model_type)->ProcessSyncChanges(FROM_HERE, change_list);
1371 base::DictionaryValue expected;
1372 expected.Set("large_value", large_value.DeepCopy());
1373 EXPECT_PRED_FORMAT2(SettingsEq, expected, storage1->Get());
1374 EXPECT_PRED_FORMAT2(SettingsEq, expected, storage2->Get());
1377 GetSyncableService(model_type)->StopSyncing(model_type);
1380 TEST_F(ExtensionSettingsSyncTest, Dots) {
1381 syncer::ModelType model_type = syncer::EXTENSION_SETTINGS;
1382 Manifest::Type type = Manifest::TYPE_EXTENSION;
1384 ValueStore* storage = AddExtensionAndGetStorage("ext", type);
1387 syncer::SyncDataList sync_data_list;
1388 scoped_ptr<base::Value> string_value(new base::StringValue("value"));
1389 sync_data_list.push_back(settings_sync_util::CreateData(
1390 "ext", "key.with.dot", *string_value, model_type));
1392 GetSyncableService(model_type)->MergeDataAndStartSyncing(
1393 model_type,
1394 sync_data_list,
1395 sync_processor_wrapper_.PassAs<syncer::SyncChangeProcessor>(),
1396 scoped_ptr<syncer::SyncErrorFactory>(
1397 new syncer::SyncErrorFactoryMock()));
1400 // Test dots in keys that come from sync.
1402 ValueStore::ReadResult data = storage->Get();
1403 ASSERT_FALSE(data->HasError());
1405 base::DictionaryValue expected_data;
1406 expected_data.SetWithoutPathExpansion(
1407 "key.with.dot",
1408 new base::StringValue("value"));
1409 EXPECT_TRUE(base::Value::Equals(&expected_data, &data->settings()));
1412 // Test dots in keys going to sync.
1414 scoped_ptr<base::Value> string_value(new base::StringValue("spot"));
1415 storage->Set(DEFAULTS, "key.with.spot", *string_value);
1417 ASSERT_EQ(1u, sync_processor_->changes().size());
1418 SettingSyncData sync_data = sync_processor_->changes()[0];
1419 EXPECT_EQ(syncer::SyncChange::ACTION_ADD, sync_data.change_type());
1420 EXPECT_EQ("ext", sync_data.extension_id());
1421 EXPECT_EQ("key.with.spot", sync_data.key());
1422 EXPECT_TRUE(sync_data.value().Equals(string_value.get()));
1426 } // namespace extensions