OLD | NEW |
---|---|
(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 } | |
OLD | NEW |