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