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

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

Powered by Google App Engine
This is Rietveld 408576698