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.
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
;
31 using content::BrowserThread
;
33 namespace extensions
{
35 namespace util
= settings_test_util
;
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
) {
45 base::JSONWriter::WriteWithOptions(&value
,
46 base::JSONWriter::OPTIONS_PRETTY_PRINT
,
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
{
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(
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
114 return syncer::SyncDataList();
119 const SettingSyncDataList
& changes() { return changes_
; }
121 void ClearChanges() {
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
,
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];
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
{
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
;
179 // Testing value stores don't actually create a real database. Don't delete
181 virtual void DeleteDatabaseIfExists(
182 const base::FilePath
& base_path
,
183 const std::string
& extension_id
) OVERRIDE
{}
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_
;
196 class ExtensionSettingsSyncTest
: public testing::Test
{
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());
211 StorageFrontend::CreateForTesting(storage_factory_
, profile_
.get()));
214 virtual void TearDown() OVERRIDE
{
217 // Execute any pending deletion tasks.
218 message_loop_
.RunUntilIdle();
222 // Adds a record of an extension or app to the extension service, then returns
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
);
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(
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(
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(
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(
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(
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
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
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
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(
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
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
567 sync_processor_
->ClearChanges();
568 storage1
->Remove("foo");
569 storage2
->Remove("bar");
570 storage3
->Remove("foo");
571 storage4
->Remove("bar");
574 syncer::SyncChange::ACTION_DELETE
,
575 sync_processor_
->GetOnlyChange("s1", "foo").change_type());
577 syncer::SyncChange::ACTION_DELETE
,
578 sync_processor_
->GetOnlyChange("s2", "bar").change_type());
580 syncer::SyncChange::ACTION_DELETE
,
581 sync_processor_
->GetOnlyChange("s3", "foo").change_type());
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();
609 syncer::SyncChange::ACTION_DELETE
,
610 sync_processor_
->GetOnlyChange("s1", "foo").change_type());
612 syncer::SyncChange::ACTION_DELETE
,
613 sync_processor_
->GetOnlyChange("s1", "bar").change_type());
615 syncer::SyncChange::ACTION_DELETE
,
616 sync_processor_
->GetOnlyChange("s2", "foo").change_type());
618 syncer::SyncChange::ACTION_DELETE
,
619 sync_processor_
->GetOnlyChange("s2", "bar").change_type());
621 syncer::SyncChange::ACTION_DELETE
,
622 sync_processor_
->GetOnlyChange("s3", "foo").change_type());
624 syncer::SyncChange::ACTION_DELETE
,
625 sync_processor_
->GetOnlyChange("s3", "bar").change_type());
627 syncer::SyncChange::ACTION_DELETE
,
628 sync_processor_
->GetOnlyChange("s4", "foo").change_type());
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
,
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());
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
,
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
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(
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
);
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
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
784 sync_processor_
->ClearChanges();
785 good
->Set(DEFAULTS
, "bar", fooValue
);
786 bad
->Set(DEFAULTS
, "bar", fooValue
);
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
));
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(
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).
844 syncer::SyncChange::ACTION_ADD
,
845 sync_processor_
->GetOnlyChange("good", "foo").change_type());
847 syncer::SyncChange::ACTION_ADD
,
848 sync_processor_
->GetOnlyChange("good", "bar").change_type());
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
);
860 syncer::SyncChange::ACTION_UPDATE
,
861 sync_processor_
->GetOnlyChange("good", "bar").change_type());
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(
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
);
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(
1020 syncer::SyncDataList(),
1021 sync_processor_wrapper_
.PassAs
<syncer::SyncChangeProcessor
>(),
1022 scoped_ptr
<syncer::SyncErrorFactory
>(new syncer::SyncErrorFactoryMock()));
1025 syncer::SyncChange::ACTION_ADD
,
1026 sync_processor_
->GetOnlyChange("good", "foo").change_type());
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
);
1037 syncer::SyncChange::ACTION_ADD
,
1038 sync_processor_
->GetOnlyChange("good", "bar").change_type());
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(
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
);
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
);
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(
1118 syncer::SyncDataList(),
1119 sync_processor_wrapper_
.PassAs
<syncer::SyncChangeProcessor
>(),
1120 scoped_ptr
<syncer::SyncErrorFactory
>(new syncer::SyncErrorFactoryMock()));
1123 syncer::SyncChange::ACTION_ADD
,
1124 sync_processor_
->GetOnlyChange("good", "foo").change_type());
1126 syncer::SyncChange::ACTION_ADD
,
1127 sync_processor_
->GetOnlyChange("good", "bar").change_type());
1129 syncer::SyncChange::ACTION_ADD
,
1130 sync_processor_
->GetOnlyChange("bad", "foo").change_type());
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
);
1141 syncer::SyncChange::ACTION_UPDATE
,
1142 sync_processor_
->GetOnlyChange("good", "bar").change_type());
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(
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
);
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(
1212 syncer::SyncDataList(),
1213 sync_processor_wrapper_
.PassAs
<syncer::SyncChangeProcessor
>(),
1214 scoped_ptr
<syncer::SyncErrorFactory
>(new syncer::SyncErrorFactoryMock()));
1217 syncer::SyncChange::ACTION_ADD
,
1218 sync_processor_
->GetOnlyChange("good", "foo").change_type());
1220 syncer::SyncChange::ACTION_ADD
,
1221 sync_processor_
->GetOnlyChange("good", "bar").change_type());
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
);
1232 syncer::SyncChange::ACTION_UPDATE
,
1233 sync_processor_
->GetOnlyChange("good", "foo").change_type());
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(
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);
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
);
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(
1309 syncer::SyncDataList(),
1310 sync_processor_wrapper_
.PassAs
<syncer::SyncChangeProcessor
>(),
1311 scoped_ptr
<syncer::SyncErrorFactory
>(new syncer::SyncErrorFactoryMock()));
1314 syncer::SyncChange::ACTION_ADD
,
1315 sync_processor_
->GetOnlyChange("good", "foo").change_type());
1317 syncer::SyncChange::ACTION_ADD
,
1318 sync_processor_
->GetOnlyChange("good", "bar").change_type());
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
);
1329 syncer::SyncChange::ACTION_UPDATE
,
1330 sync_processor_
->GetOnlyChange("good", "foo").change_type());
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(
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(
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(
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