Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(350)

Side by Side Diff: chrome/browser/prefs/prefs_syncable_service_unittest.cc

Issue 258753002: prefs / sync: rewrite ProfileSyncServicePreferenceTest to rely on sync/api instead of c/b/s/glue. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: TestPrefSyncableService Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 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.
4
5 #include "base/json/json_reader.h"
6 #include "base/json/json_string_value_serializer.h"
7 #include "base/json/json_writer.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/prefs/scoped_user_pref_update.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/prefs/pref_model_associator.h"
12 #include "chrome/browser/prefs/pref_service_syncable.h"
13 #include "chrome/common/pref_names.h"
14 #include "chrome/test/base/testing_pref_service_syncable.h"
15 #include "components/user_prefs/pref_registry_syncable.h"
16 #include "grit/locale_settings.h"
17 #include "sync/api/attachments/attachment_id.h"
18 #include "sync/api/attachments/attachment_service_proxy_for_test.h"
19 #include "sync/api/sync_change.h"
20 #include "sync/api/sync_data.h"
21 #include "sync/api/sync_error_factory_mock.h"
22 #include "sync/api/syncable_service.h"
23 #include "sync/protocol/preference_specifics.pb.h"
24 #include "sync/protocol/sync.pb.h"
25 #include "testing/gtest/include/gtest/gtest.h"
26
27 using syncer::SyncChange;
28 using syncer::SyncData;
29
30 namespace {
31 const char kExampleUrl0[] = "http://example.com/0";
32 const char kExampleUrl1[] = "http://example.com/1";
33 const char kExampleUrl2[] = "http://example.com/2";
34 const char kUnsyncedPreferenceName[] = "nonsense_pref_name";
35 const char kUnsyncedPreferenceDefaultValue[] = "default";
36 const char kNonDefaultCharsetValue[] = "foo";
37 } // namespace
38
39 class TestSyncProcessorStub : public syncer::SyncChangeProcessor {
40 public:
41 explicit TestSyncProcessorStub(syncer::SyncChangeList* output)
42 : output_(output), fail_next_(false) {}
43 virtual syncer::SyncError ProcessSyncChanges(
44 const tracked_objects::Location& from_here,
45 const syncer::SyncChangeList& change_list) OVERRIDE {
46 if (output_)
47 output_->insert(output_->end(), change_list.begin(), change_list.end());
48 if (fail_next_) {
49 fail_next_ = false;
50 return syncer::SyncError(
51 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, "Error",
52 syncer::PREFERENCES);
53 }
54 return syncer::SyncError();
55 }
56
57 void FailNextProcessSyncChanges() {
58 fail_next_ = true;
59 }
60
61 virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type)
62 const OVERRIDE {
63 return syncer::SyncDataList();
64 }
65 private:
66 syncer::SyncChangeList* output_;
67 bool fail_next_;
68 };
69
70 class PrefsSyncableServiceTest : public testing::Test {
71 public:
72 PrefsSyncableServiceTest() :
73 pref_sync_service_(NULL),
74 test_processor_(NULL),
75 next_pref_remote_sync_node_id_(0) {}
76
77 virtual void SetUp() {
78 prefs_.reset(new TestingPrefServiceSyncable());
79
80 prefs_->registry()->RegisterStringPref(
81 kUnsyncedPreferenceName,
82 kUnsyncedPreferenceDefaultValue,
83 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
84 prefs_->registry()->RegisterStringPref(
85 prefs::kHomePage,
86 std::string(),
87 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
88 prefs_->registry()->RegisterListPref(
89 prefs::kURLsToRestoreOnStartup,
90 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
91 prefs_->registry()->RegisterListPref(
92 prefs::kURLsToRestoreOnStartupOld,
93 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
94 prefs_->registry()->RegisterLocalizedStringPref(
95 prefs::kDefaultCharset,
96 IDS_DEFAULT_ENCODING,
97 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
98
99 pref_sync_service_ = reinterpret_cast<PrefModelAssociator*>(
100 prefs_->GetSyncableService(syncer::PREFERENCES));
101 ASSERT_TRUE(pref_sync_service_);
102 next_pref_remote_sync_node_id_ = 0;
103 }
104
105 syncer::SyncChange MakeRemoteChange(
106 int64 id,
107 const std::string& name,
108 const base::Value& value,
109 SyncChange::SyncChangeType type) {
110 std::string serialized;
111 JSONStringValueSerializer json(&serialized);
112 if (!json.Serialize(value))
113 return syncer::SyncChange();
114 sync_pb::EntitySpecifics entity;
115 sync_pb::PreferenceSpecifics* pref_one = entity.mutable_preference();
116 pref_one->set_name(name);
117 pref_one->set_value(serialized);
118 return syncer::SyncChange(
119 FROM_HERE,
120 type,
121 syncer::SyncData::CreateRemoteData(
122 id,
123 entity,
124 base::Time(),
125 syncer::AttachmentIdList(),
126 syncer::AttachmentServiceProxyForTest::Create()));
127 }
128
129 void AddToRemoteDataList(const std::string& name,
130 const base::Value& value,
131 syncer::SyncDataList* out) {
132 std::string serialized;
133 JSONStringValueSerializer json(&serialized);
134 ASSERT_TRUE(json.Serialize(value));
135 sync_pb::EntitySpecifics one;
136 sync_pb::PreferenceSpecifics* pref_one = one.mutable_preference();
137 pref_one->set_name(name);
138 pref_one->set_value(serialized);
139 out->push_back(SyncData::CreateRemoteData(
140 ++next_pref_remote_sync_node_id_,
141 one,
142 base::Time(),
143 syncer::AttachmentIdList(),
144 syncer::AttachmentServiceProxyForTest::Create()));
145 }
146
147 void InitWithSyncDataTakeOutput(const syncer::SyncDataList& initial_data,
148 syncer::SyncChangeList* output) {
149 test_processor_ = new TestSyncProcessorStub(output);
150 syncer::SyncMergeResult r = pref_sync_service_->MergeDataAndStartSyncing(
151 syncer::PREFERENCES, initial_data,
152 scoped_ptr<syncer::SyncChangeProcessor>(test_processor_),
153 scoped_ptr<syncer::SyncErrorFactory>(
154 new syncer::SyncErrorFactoryMock()));
155 EXPECT_FALSE(r.error().IsSet());
156 }
157
158 void InitWithNoSyncData() {
159 InitWithSyncDataTakeOutput(syncer::SyncDataList(), NULL);
160 }
161
162 const base::Value& GetPreferenceValue(const std::string& name) {
163 const PrefService::Preference* preference =
164 prefs_->FindPreference(name.c_str());
165 return *preference->GetValue();
166 }
167
168 scoped_ptr<base::Value> FindValue(const std::string& name,
169 const syncer::SyncChangeList& list) {
170 syncer::SyncChangeList::const_iterator it = list.begin();
171 for (; it != list.end(); ++it) {
172 if (syncer::SyncDataLocal(it->sync_data()).GetTag() == name) {
173 return make_scoped_ptr(base::JSONReader::Read(
174 it->sync_data().GetSpecifics().preference().value()));
175 }
176 }
177 return scoped_ptr<base::Value>();
178 }
179
180 bool IsSynced(const std::string& pref_name) {
181 return pref_sync_service_->registered_preferences().count(pref_name) > 0;
182 }
183
184 bool HasSyncData(const std::string& pref_name) {
185 return pref_sync_service_->IsPrefSynced(pref_name);
186 }
187
188 // Returns whether a given preference name is a new name of a migrated
189 // preference. Exposed here for testing.
190 static bool IsMigratedPreference(const char* preference_name) {
191 return PrefModelAssociator::IsMigratedPreference(preference_name);
192 }
193 static bool IsOldMigratedPreference(const char* old_preference_name) {
194 return PrefModelAssociator::IsOldMigratedPreference(old_preference_name);
195 }
196
197 PrefService* GetPrefs() { return prefs_.get(); }
198 TestingPrefServiceSyncable* GetTestingPrefService() { return prefs_.get(); }
199
200 protected:
201 scoped_ptr<TestingPrefServiceSyncable> prefs_;
Nicolas Zea 2014/04/28 20:10:28 nit: does this need to be a scoped ptr? Can you ju
202
203 PrefModelAssociator* pref_sync_service_;
204 TestSyncProcessorStub* test_processor_;
205
206 // TODO(tim): Remove this by fixing AttachmentServiceProxyForTest.
207 base::MessageLoop loop_;
208
209 int next_pref_remote_sync_node_id_;
210 };
211
212 TEST_F(PrefsSyncableServiceTest, CreatePrefSyncData) {
213 prefs_->SetString(prefs::kHomePage, kExampleUrl0);
214
215 const PrefService::Preference* pref =
216 prefs_->FindPreference(prefs::kHomePage);
217 syncer::SyncData sync_data;
218 EXPECT_TRUE(pref_sync_service_->CreatePrefSyncData(pref->name(),
219 *pref->GetValue(), &sync_data));
220 EXPECT_EQ(std::string(prefs::kHomePage),
221 syncer::SyncDataLocal(sync_data).GetTag());
222 const sync_pb::PreferenceSpecifics& specifics(sync_data.GetSpecifics().
223 preference());
224 EXPECT_EQ(std::string(prefs::kHomePage), specifics.name());
225
226 scoped_ptr<base::Value> value(base::JSONReader::Read(specifics.value()));
227 EXPECT_TRUE(pref->GetValue()->Equals(value.get()));
228 }
229
230 TEST_F(PrefsSyncableServiceTest, ModelAssociationDoNotSyncDefaults) {
231 const PrefService::Preference* pref =
232 prefs_->FindPreference(prefs::kHomePage);
233 EXPECT_TRUE(pref->IsDefaultValue());
234 syncer::SyncChangeList out;
235 InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out);
236
237 EXPECT_TRUE(IsSynced(prefs::kHomePage));
238 EXPECT_TRUE(pref->IsDefaultValue());
239 EXPECT_FALSE(FindValue(prefs::kHomePage, out).get());
240 }
241
242 TEST_F(PrefsSyncableServiceTest, ModelAssociationEmptyCloud) {
243 prefs_->SetString(prefs::kHomePage, kExampleUrl0);
244 {
245 ListPrefUpdate update(prefs_.get(), prefs::kURLsToRestoreOnStartup);
246 base::ListValue* url_list = update.Get();
247 url_list->Append(new base::StringValue(kExampleUrl0));
248 url_list->Append(new base::StringValue(kExampleUrl1));
249 }
250 syncer::SyncChangeList out;
251 InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out);
252
253 scoped_ptr<base::Value> value(FindValue(prefs::kHomePage, out));
254 ASSERT_TRUE(value.get());
255 EXPECT_TRUE(GetPreferenceValue(prefs::kHomePage).Equals(value.get()));
256 value = FindValue(prefs::kURLsToRestoreOnStartup, out).Pass();
257 ASSERT_TRUE(value.get());
258 EXPECT_TRUE(
259 GetPreferenceValue(prefs::kURLsToRestoreOnStartup).Equals(value.get()));
260 }
261
262 TEST_F(PrefsSyncableServiceTest, ModelAssociationCloudHasData) {
263 prefs_->SetString(prefs::kHomePage, kExampleUrl0);
264 {
265 ListPrefUpdate update(prefs_.get(), prefs::kURLsToRestoreOnStartup);
266 base::ListValue* url_list = update.Get();
267 url_list->Append(new base::StringValue(kExampleUrl0));
268 url_list->Append(new base::StringValue(kExampleUrl1));
269 }
270
271 syncer::SyncDataList in;
272 syncer::SyncChangeList out;
273 AddToRemoteDataList(prefs::kHomePage, base::StringValue(kExampleUrl1), &in);
274 base::ListValue urls_to_restore;
275 urls_to_restore.Append(new base::StringValue(kExampleUrl1));
276 urls_to_restore.Append(new base::StringValue(kExampleUrl2));
277 AddToRemoteDataList(prefs::kURLsToRestoreOnStartup, urls_to_restore, &in);
278 AddToRemoteDataList(prefs::kDefaultCharset,
279 base::StringValue(kNonDefaultCharsetValue),
280 &in);
281 InitWithSyncDataTakeOutput(in, &out);
282
283 ASSERT_FALSE(FindValue(prefs::kHomePage, out).get());
284 ASSERT_FALSE(FindValue(prefs::kDefaultCharset, out).get());
285
286 EXPECT_EQ(kExampleUrl1, prefs_->GetString(prefs::kHomePage));
287
288 scoped_ptr<base::ListValue> expected_urls(new base::ListValue);
289 expected_urls->Append(new base::StringValue(kExampleUrl1));
290 expected_urls->Append(new base::StringValue(kExampleUrl2));
291 expected_urls->Append(new base::StringValue(kExampleUrl0));
292 scoped_ptr<base::Value> value(
293 FindValue(prefs::kURLsToRestoreOnStartup, out));
294 ASSERT_TRUE(value.get());
295 EXPECT_TRUE(value->Equals(expected_urls.get()));
296 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup).
297 Equals(expected_urls.get()));
298 EXPECT_EQ(kNonDefaultCharsetValue,
299 prefs_->GetString(prefs::kDefaultCharset));
300 }
301
302 TEST_F(PrefsSyncableServiceTest, ModelAssociationMigrateOldData) {
303 ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup));
304 ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld));
305
306 syncer::SyncDataList in;
307 syncer::SyncChangeList out;
308 base::ListValue urls_to_restore;
309 urls_to_restore.Append(new base::StringValue(kExampleUrl1));
310 urls_to_restore.Append(new base::StringValue(kExampleUrl2));
311 AddToRemoteDataList(prefs::kURLsToRestoreOnStartupOld, urls_to_restore,
312 &in);
313 InitWithSyncDataTakeOutput(in, &out);
314
315 // Expect that the new preference data contains the old pref's values.
316 scoped_ptr<base::ListValue> expected_urls(new base::ListValue);
317 expected_urls->Append(new base::StringValue(kExampleUrl1));
318 expected_urls->Append(new base::StringValue(kExampleUrl2));
319
320 ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup));
321 scoped_ptr<base::Value> value(
322 FindValue(prefs::kURLsToRestoreOnStartup, out));
323 ASSERT_TRUE(value.get());
324 EXPECT_TRUE(value->Equals(expected_urls.get()));
325 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup).
326 Equals(expected_urls.get()));
327
328 // The old preference value should be the same.
329 expected_urls.reset(new base::ListValue);
330 ASSERT_FALSE(FindValue(prefs::kURLsToRestoreOnStartupOld, out).get());
331 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld).
332 Equals(expected_urls.get()));
333 }
334
335 TEST_F(PrefsSyncableServiceTest,
336 ModelAssociationCloudHasOldMigratedData) {
337 ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup));
338 ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld));
339 prefs_->SetString(prefs::kHomePage, kExampleUrl0);
340 {
341 ListPrefUpdate update(prefs_.get(), prefs::kURLsToRestoreOnStartup);
342 base::ListValue* url_list = update.Get();
343 url_list->Append(new base::StringValue(kExampleUrl0));
344 url_list->Append(new base::StringValue(kExampleUrl1));
345 }
346
347 syncer::SyncDataList in;
348 syncer::SyncChangeList out;
349 base::ListValue urls_to_restore;
350 urls_to_restore.Append(new base::StringValue(kExampleUrl1));
351 urls_to_restore.Append(new base::StringValue(kExampleUrl2));
352 AddToRemoteDataList(prefs::kURLsToRestoreOnStartupOld, urls_to_restore, &in);
353 AddToRemoteDataList(prefs::kHomePage, base::StringValue(kExampleUrl1), &in);
354 InitWithSyncDataTakeOutput(in, &out);
355
356 ASSERT_FALSE(FindValue(prefs::kHomePage, out).get());
357
358 // Expect that the new preference data contains the merged old prefs values.
359 scoped_ptr<base::ListValue> expected_urls(new base::ListValue);
360 expected_urls->Append(new base::StringValue(kExampleUrl1));
361 expected_urls->Append(new base::StringValue(kExampleUrl2));
362 expected_urls->Append(new base::StringValue(kExampleUrl0));
363
364 ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup));
365 scoped_ptr<base::Value> value(
366 FindValue(prefs::kURLsToRestoreOnStartup, out));
367 ASSERT_TRUE(value.get());
368 EXPECT_TRUE(value->Equals(expected_urls.get()));
369 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup).
370 Equals(expected_urls.get()));
371
372 expected_urls.reset(new base::ListValue);
373 value = FindValue(prefs::kURLsToRestoreOnStartupOld, out).Pass();
374 ASSERT_TRUE(value.get());
375 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld).
376 Equals(expected_urls.get()));
377 }
378
379 TEST_F(PrefsSyncableServiceTest,
380 ModelAssociationCloudHasNewMigratedData) {
381 ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup));
382 ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld));
383 prefs_->SetString(prefs::kHomePage, kExampleUrl0);
384 {
385 ListPrefUpdate update(prefs_.get(), prefs::kURLsToRestoreOnStartupOld);
386 base::ListValue* url_list = update.Get();
387 url_list->Append(new base::StringValue(kExampleUrl0));
388 url_list->Append(new base::StringValue(kExampleUrl1));
389 }
390
391 syncer::SyncDataList in;
392 syncer::SyncChangeList out;
393 base::ListValue urls_to_restore;
394 urls_to_restore.Append(new base::StringValue(kExampleUrl1));
395 urls_to_restore.Append(new base::StringValue(kExampleUrl2));
396 AddToRemoteDataList(prefs::kURLsToRestoreOnStartupOld, urls_to_restore, &in);
397 AddToRemoteDataList(prefs::kHomePage, base::StringValue(kExampleUrl1), &in);
398 InitWithSyncDataTakeOutput(in, &out);
399
400 scoped_ptr<base::Value> value(FindValue(prefs::kHomePage, out));
401 ASSERT_FALSE(value.get());
402
403 // Expect that the cloud data under the new migrated preference name sticks.
404 scoped_ptr<base::ListValue> expected_urls(new base::ListValue);
405 expected_urls->Append(new base::StringValue(kExampleUrl1));
406 expected_urls->Append(new base::StringValue(kExampleUrl2));
407
408 ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup));
409 value = FindValue(prefs::kURLsToRestoreOnStartup, out).Pass();
410 ASSERT_TRUE(value.get());
411 EXPECT_TRUE(value->Equals(expected_urls.get()));
412 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup).
413 Equals(expected_urls.get()));
414
415 // The old preference data should still be here, though not synced.
416 expected_urls.reset(new base::ListValue);
417 expected_urls->Append(new base::StringValue(kExampleUrl0));
418 expected_urls->Append(new base::StringValue(kExampleUrl1));
419
420 value = FindValue(prefs::kURLsToRestoreOnStartupOld, out).Pass();
421 ASSERT_FALSE(value.get());
422 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld).
423 Equals(expected_urls.get()));
424 }
425
426 TEST_F(PrefsSyncableServiceTest,
427 ModelAssociationCloudAddsOldAndNewMigratedData) {
428 ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup));
429 ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld));
430 prefs_->SetString(prefs::kHomePage, kExampleUrl0);
431 {
432 ListPrefUpdate update_old(prefs_.get(), prefs::kURLsToRestoreOnStartupOld);
433 base::ListValue* url_list_old = update_old.Get();
434 url_list_old->Append(new base::StringValue(kExampleUrl0));
435 url_list_old->Append(new base::StringValue(kExampleUrl1));
436 ListPrefUpdate update(prefs_.get(), prefs::kURLsToRestoreOnStartup);
437 base::ListValue* url_list = update.Get();
438 url_list->Append(new base::StringValue(kExampleUrl1));
439 url_list->Append(new base::StringValue(kExampleUrl2));
440 }
441
442 syncer::SyncDataList in;
443 syncer::SyncChangeList out;
444 AddToRemoteDataList(prefs::kHomePage, base::StringValue(kExampleUrl1), &in);
445 InitWithSyncDataTakeOutput(in, &out);
446
447 scoped_ptr<base::Value> value(FindValue(prefs::kHomePage, out));
448 ASSERT_FALSE(value.get());
449
450 // Expect that the cloud data under the new migrated preference name sticks.
451 scoped_ptr<base::ListValue> expected_urls(new base::ListValue);
452 expected_urls->Append(new base::StringValue(kExampleUrl1));
453 expected_urls->Append(new base::StringValue(kExampleUrl2));
454
455 ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup));
456 value = FindValue(prefs::kURLsToRestoreOnStartup, out).Pass();
457 ASSERT_TRUE(value.get());
458 EXPECT_TRUE(value->Equals(expected_urls.get()));
459 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup).
460 Equals(expected_urls.get()));
461
462 // Should not have synced in the old startup url values.
463 value = FindValue(prefs::kURLsToRestoreOnStartupOld, out).Pass();
464 ASSERT_FALSE(value.get());
465 EXPECT_FALSE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld).
466 Equals(expected_urls.get()));
467 }
468
469 TEST_F(PrefsSyncableServiceTest, FailModelAssociation) {
470 syncer::SyncChangeList output;
471 TestSyncProcessorStub* stub = new TestSyncProcessorStub(&output);
472 stub->FailNextProcessSyncChanges();
473 syncer::SyncMergeResult r = pref_sync_service_->MergeDataAndStartSyncing(
474 syncer::PREFERENCES, syncer::SyncDataList(),
475 scoped_ptr<syncer::SyncChangeProcessor>(stub),
476 scoped_ptr<syncer::SyncErrorFactory>(
477 new syncer::SyncErrorFactoryMock()));
478 EXPECT_TRUE(r.error().IsSet());
479 }
480
481 TEST_F(PrefsSyncableServiceTest, UpdatedPreferenceWithDefaultValue) {
482 const PrefService::Preference* pref =
483 prefs_->FindPreference(prefs::kHomePage);
484 EXPECT_TRUE(pref->IsDefaultValue());
485
486 syncer::SyncChangeList out;
487 InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out);
488 out.clear();
489
490 base::StringValue expected(kExampleUrl0);
491 GetPrefs()->Set(prefs::kHomePage, expected);
492
493 scoped_ptr<base::Value> actual(FindValue(prefs::kHomePage, out));
494 ASSERT_TRUE(actual.get());
495 EXPECT_TRUE(expected.Equals(actual.get()));
496 }
497
498 TEST_F(PrefsSyncableServiceTest, UpdatedPreferenceWithValue) {
499 GetPrefs()->SetString(prefs::kHomePage, kExampleUrl0);
500 syncer::SyncChangeList out;
501 InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out);
502 out.clear();
503
504 base::StringValue expected(kExampleUrl1);
505 GetPrefs()->Set(prefs::kHomePage, expected);
506
507 scoped_ptr<base::Value> actual(FindValue(prefs::kHomePage, out));
508 ASSERT_TRUE(actual.get());
509 EXPECT_TRUE(expected.Equals(actual.get()));
510 }
511
512 TEST_F(PrefsSyncableServiceTest, UpdatedSyncNodeActionUpdate) {
513 GetPrefs()->SetString(prefs::kHomePage, kExampleUrl0);
514 InitWithNoSyncData();
515
516 base::StringValue expected(kExampleUrl1);
517 syncer::SyncChangeList list;
518 list.push_back(MakeRemoteChange(
519 1, prefs::kHomePage, expected, SyncChange::ACTION_UPDATE));
520 pref_sync_service_->ProcessSyncChanges(FROM_HERE, list);
521
522 const base::Value& actual = GetPreferenceValue(prefs::kHomePage);
523 EXPECT_TRUE(expected.Equals(&actual));
524 }
525
526 TEST_F(PrefsSyncableServiceTest, UpdatedSyncNodeActionAdd) {
527 InitWithNoSyncData();
528
529 base::StringValue expected(kExampleUrl0);
530 syncer::SyncChangeList list;
531 list.push_back(MakeRemoteChange(
532 1, prefs::kHomePage, expected, SyncChange::ACTION_ADD));
533 pref_sync_service_->ProcessSyncChanges(FROM_HERE, list);
534
535 const base::Value& actual = GetPreferenceValue(prefs::kHomePage);
536 EXPECT_TRUE(expected.Equals(&actual));
537 EXPECT_EQ(1U,
538 pref_sync_service_->registered_preferences().count(prefs::kHomePage));
539 }
540
541 TEST_F(PrefsSyncableServiceTest, UpdatedSyncNodeUnknownPreference) {
542 InitWithNoSyncData();
543 syncer::SyncChangeList list;
544 base::StringValue expected(kExampleUrl0);
545 list.push_back(MakeRemoteChange(
546 1, "unknown preference", expected, SyncChange::ACTION_UPDATE));
547 pref_sync_service_->ProcessSyncChanges(FROM_HERE, list);
548 // Nothing interesting happens on the client when it gets an update
549 // of an unknown preference. We just should not crash.
550 }
551
552 TEST_F(PrefsSyncableServiceTest, ManagedPreferences) {
553 // Make the homepage preference managed.
554 base::StringValue managed_value("http://example.com");
555 prefs_->SetManagedPref(prefs::kHomePage, managed_value.DeepCopy());
556
557 syncer::SyncChangeList out;
558 InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out);
559 out.clear();
560
561 // Changing the homepage preference should not sync anything.
562 base::StringValue user_value("http://chromium..com");
563 prefs_->SetUserPref(prefs::kHomePage, user_value.DeepCopy());
564 EXPECT_TRUE(out.empty());
565
566 // An incoming sync transaction should change the user value, not the managed
567 // value.
568 base::StringValue sync_value("http://crbug.com");
569 syncer::SyncChangeList list;
570 list.push_back(MakeRemoteChange(
571 1, prefs::kHomePage, sync_value, SyncChange::ACTION_UPDATE));
572 pref_sync_service_->ProcessSyncChanges(FROM_HERE, list);
573
574 EXPECT_TRUE(managed_value.Equals(prefs_->GetManagedPref(prefs::kHomePage)));
575 EXPECT_TRUE(sync_value.Equals(prefs_->GetUserPref(prefs::kHomePage)));
576 }
577
578 // List preferences have special handling at association time due to our ability
579 // to merge the local and sync value. Make sure the merge logic doesn't merge
580 // managed preferences.
581 TEST_F(PrefsSyncableServiceTest, ManagedListPreferences) {
582 // Make the list of urls to restore on startup managed.
583 base::ListValue managed_value;
584 managed_value.Append(new base::StringValue(kExampleUrl0));
585 managed_value.Append(new base::StringValue(kExampleUrl1));
586 prefs_->SetManagedPref(prefs::kURLsToRestoreOnStartup,
587 managed_value.DeepCopy());
588
589 // Set a cloud version.
590 syncer::SyncDataList in;
591 syncer::SyncChangeList out;
592 base::ListValue urls_to_restore;
593 urls_to_restore.Append(new base::StringValue(kExampleUrl1));
594 urls_to_restore.Append(new base::StringValue(kExampleUrl2));
595 AddToRemoteDataList(prefs::kURLsToRestoreOnStartup, urls_to_restore, &in);
596
597 // Start sync and verify the synced value didn't get merged.
598 InitWithSyncDataTakeOutput(in, &out);
599 EXPECT_FALSE(FindValue(prefs::kURLsToRestoreOnStartup, out).get());
600 out.clear();
601
602 // Changing the user's urls to restore on startup pref should not sync
603 // anything.
604 base::ListValue user_value;
605 user_value.Append(new base::StringValue("http://chromium.org"));
606 prefs_->SetUserPref(prefs::kURLsToRestoreOnStartup, user_value.DeepCopy());
607 EXPECT_FALSE(FindValue(prefs::kURLsToRestoreOnStartup, out).get());
608
609 // An incoming sync transaction should change the user value, not the managed
610 // value.
611 base::ListValue sync_value;
612 sync_value.Append(new base::StringValue("http://crbug.com"));
613 syncer::SyncChangeList list;
614 list.push_back(MakeRemoteChange(
615 1, prefs::kURLsToRestoreOnStartup, sync_value,
616 SyncChange::ACTION_UPDATE));
617 pref_sync_service_->ProcessSyncChanges(FROM_HERE, list);
618
619 EXPECT_TRUE(managed_value.Equals(
620 prefs_->GetManagedPref(prefs::kURLsToRestoreOnStartup)));
621 EXPECT_TRUE(sync_value.Equals(
622 prefs_->GetUserPref(prefs::kURLsToRestoreOnStartup)));
623 }
624
625 TEST_F(PrefsSyncableServiceTest, DynamicManagedPreferences) {
626 syncer::SyncChangeList out;
627 InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out);
628 out.clear();
629 base::StringValue initial_value("http://example.com/initial");
630 GetPrefs()->Set(prefs::kHomePage, initial_value);
631 scoped_ptr<base::Value> actual(FindValue(prefs::kHomePage, out));
632 ASSERT_TRUE(actual.get());
633 EXPECT_TRUE(initial_value.Equals(actual.get()));
634
635 // Switch kHomePage to managed and set a different value.
636 base::StringValue managed_value("http://example.com/managed");
637 GetTestingPrefService()->SetManagedPref(prefs::kHomePage,
638 managed_value.DeepCopy());
639
640 // The pref value should be the one dictated by policy.
641 EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage)));
642
643 // Switch kHomePage back to unmanaged.
644 GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage);
645
646 // The original value should be picked up.
647 EXPECT_TRUE(initial_value.Equals(&GetPreferenceValue(prefs::kHomePage)));
648 }
649
650 TEST_F(PrefsSyncableServiceTest,
651 DynamicManagedPreferencesWithSyncChange) {
652 syncer::SyncChangeList out;
653 InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out);
654 out.clear();
655
656 base::StringValue initial_value("http://example.com/initial");
657 GetPrefs()->Set(prefs::kHomePage, initial_value);
658 scoped_ptr<base::Value> actual(FindValue(prefs::kHomePage, out));
659 EXPECT_TRUE(initial_value.Equals(actual.get()));
660
661 // Switch kHomePage to managed and set a different value.
662 base::StringValue managed_value("http://example.com/managed");
663 GetTestingPrefService()->SetManagedPref(prefs::kHomePage,
664 managed_value.DeepCopy());
665
666 // Change the sync value.
667 base::StringValue sync_value("http://example.com/sync");
668 syncer::SyncChangeList list;
669 list.push_back(MakeRemoteChange(
670 1, prefs::kHomePage, sync_value, SyncChange::ACTION_UPDATE));
671 pref_sync_service_->ProcessSyncChanges(FROM_HERE, list);
672
673 // The pref value should still be the one dictated by policy.
674 EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage)));
675
676 // Switch kHomePage back to unmanaged.
677 GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage);
678
679 // Sync value should be picked up.
680 EXPECT_TRUE(sync_value.Equals(&GetPreferenceValue(prefs::kHomePage)));
681 }
682
683 TEST_F(PrefsSyncableServiceTest, DynamicManagedDefaultPreferences) {
684 const PrefService::Preference* pref =
685 prefs_->FindPreference(prefs::kHomePage);
686 EXPECT_TRUE(pref->IsDefaultValue());
687 syncer::SyncChangeList out;
688 InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out);
689
690 EXPECT_TRUE(IsSynced(prefs::kHomePage));
691 EXPECT_TRUE(pref->IsDefaultValue());
692 EXPECT_FALSE(FindValue(prefs::kHomePage, out).get());
693 out.clear();
694
695 // Switch kHomePage to managed and set a different value.
696 base::StringValue managed_value("http://example.com/managed");
697 GetTestingPrefService()->SetManagedPref(prefs::kHomePage,
698 managed_value.DeepCopy());
699 // The pref value should be the one dictated by policy.
700 EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage)));
701 EXPECT_FALSE(pref->IsDefaultValue());
702 // There should be no synced value.
703 EXPECT_FALSE(FindValue(prefs::kHomePage, out).get());
704 // Switch kHomePage back to unmanaged.
705 GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage);
706 // The original value should be picked up.
707 EXPECT_TRUE(pref->IsDefaultValue());
708 // There should still be no synced value.
709 EXPECT_FALSE(FindValue(prefs::kHomePage, out).get());
710 }
OLDNEW
« no previous file with comments | « chrome/browser/prefs/pref_model_associator.h ('k') | chrome/browser/sync/profile_sync_service_preference_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698