OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <map> | |
6 #include <string> | |
7 #include <utility> | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/bind_helpers.h" | |
11 #include "base/callback.h" | |
12 #include "base/json/json_reader.h" | |
13 #include "base/json/json_string_value_serializer.h" | |
14 #include "base/json/json_writer.h" | |
15 #include "base/location.h" | |
16 #include "base/prefs/scoped_user_pref_update.h" | |
17 #include "base/stl_util.h" | |
18 #include "base/strings/string_piece.h" | |
19 #include "base/strings/utf_string_conversions.h" | |
20 #include "chrome/browser/invalidation/fake_invalidation_service.h" | |
21 #include "chrome/browser/invalidation/invalidation_service_factory.h" | |
22 #include "chrome/browser/prefs/pref_model_associator.h" | |
23 #include "chrome/browser/prefs/pref_service_syncable.h" | |
24 #include "chrome/browser/signin/fake_profile_oauth2_token_service.h" | |
25 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" | |
26 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | |
27 #include "chrome/browser/signin/signin_manager_factory.h" | |
28 #include "chrome/browser/sync/abstract_profile_sync_service_test.h" | |
29 #include "chrome/browser/sync/glue/sync_backend_host.h" | |
30 #include "chrome/browser/sync/glue/ui_data_type_controller.h" | |
31 #include "chrome/browser/sync/profile_sync_service_factory.h" | |
32 #include "chrome/browser/sync/profile_sync_test_util.h" | |
33 #include "chrome/browser/sync/test_profile_sync_service.h" | |
34 #include "chrome/common/pref_names.h" | |
35 #include "chrome/test/base/testing_browser_process.h" | |
36 #include "chrome/test/base/testing_pref_service_syncable.h" | |
37 #include "chrome/test/base/testing_profile.h" | |
38 #include "chrome/test/base/testing_profile_manager.h" | |
39 #include "components/signin/core/browser/signin_manager.h" | |
40 #include "components/sync_driver/generic_change_processor.h" | |
41 #include "components/user_prefs/pref_registry_syncable.h" | |
42 #include "google_apis/gaia/gaia_constants.h" | |
43 #include "sync/api/attachments/fake_attachment_service.h" | |
44 #include "sync/api/sync_data.h" | |
45 #include "sync/internal_api/public/base/model_type.h" | |
46 #include "sync/internal_api/public/change_record.h" | |
47 #include "sync/internal_api/public/data_type_debug_info_listener.h" | |
48 #include "sync/internal_api/public/read_node.h" | |
49 #include "sync/internal_api/public/read_transaction.h" | |
50 #include "sync/internal_api/public/write_node.h" | |
51 #include "sync/internal_api/public/write_transaction.h" | |
52 #include "sync/protocol/preference_specifics.pb.h" | |
53 #include "testing/gmock/include/gmock/gmock.h" | |
54 #include "testing/gtest/include/gtest/gtest.h" | |
55 | |
56 using base::JSONReader; | |
57 using browser_sync::GenericChangeProcessor; | |
58 using browser_sync::SharedChangeProcessor; | |
59 using browser_sync::UIDataTypeController; | |
60 using syncer::ChangeRecord; | |
61 using testing::Invoke; | |
62 using testing::Return; | |
63 using testing::_; | |
64 | |
65 namespace { | |
66 const char kTestProfileName[] = "test-profile"; | |
67 } | |
68 | |
69 typedef std::map<const std::string, const base::Value*> PreferenceValues; | |
70 | |
71 ACTION_P(CreateAndSaveChangeProcessor, change_processor) { | |
72 syncer::UserShare* user_share = arg0->GetUserShare(); | |
73 *change_processor = new GenericChangeProcessor( | |
74 arg1, | |
75 arg2, | |
76 arg3, | |
77 user_share, | |
78 syncer::FakeAttachmentService::CreateForTest()); | |
79 return *change_processor; | |
80 } | |
81 | |
82 ACTION_P(ReturnNewDataTypeManagerWithDebugListener, debug_listener) { | |
83 return new browser_sync::DataTypeManagerImpl( | |
84 debug_listener, | |
85 arg1, | |
86 arg2, | |
87 arg3, | |
88 arg4, | |
89 arg5); | |
90 } | |
91 | |
92 // TODO(zea): Refactor to remove the ProfileSyncService usage. | |
93 class ProfileSyncServicePreferenceTest | |
94 : public AbstractProfileSyncServiceTest, | |
95 public syncer::DataTypeDebugInfoListener { | |
96 public: | |
97 int64 SetSyncedValue(const std::string& name, const base::Value& value) { | |
98 syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
99 syncer::ReadNode root(&trans); | |
100 if (root.InitByTagLookup(syncer::ModelTypeToRootTag( | |
101 syncer::PREFERENCES)) != syncer::BaseNode::INIT_OK) { | |
102 return syncer::kInvalidId; | |
103 } | |
104 | |
105 syncer::WriteNode tag_node(&trans); | |
106 syncer::WriteNode node(&trans); | |
107 | |
108 if (tag_node.InitByClientTagLookup(syncer::PREFERENCES, name) == | |
109 syncer::BaseNode::INIT_OK) { | |
110 return WriteSyncedValue(name, value, &tag_node); | |
111 } | |
112 | |
113 syncer::WriteNode::InitUniqueByCreationResult result = | |
114 node.InitUniqueByCreation(syncer::PREFERENCES, root, name); | |
115 if (result == syncer::WriteNode::INIT_SUCCESS) | |
116 return WriteSyncedValue(name, value, &node); | |
117 | |
118 return syncer::kInvalidId; | |
119 } | |
120 | |
121 // DataTypeDebugInfoListener implementation. | |
122 virtual void OnDataTypeConfigureComplete( | |
123 const std::vector<syncer::DataTypeConfigurationStats>& | |
124 configuration_stats) OVERRIDE { | |
125 ASSERT_EQ(1u, configuration_stats.size()); | |
126 association_stats_ = configuration_stats[0].association_stats; | |
127 } | |
128 | |
129 protected: | |
130 ProfileSyncServicePreferenceTest() | |
131 : profile_manager_(TestingBrowserProcess::GetGlobal()), | |
132 debug_ptr_factory_(this), | |
133 example_url0_("http://example.com/0"), | |
134 example_url1_("http://example.com/1"), | |
135 example_url2_("http://example.com/2"), | |
136 not_synced_preference_name_("nonsense_pref_name"), | |
137 not_synced_preference_default_value_("default"), | |
138 non_default_charset_value_("foo") {} | |
139 | |
140 virtual void SetUp() { | |
141 AbstractProfileSyncServiceTest::SetUp(); | |
142 ASSERT_TRUE(profile_manager_.SetUp()); | |
143 TestingProfile::TestingFactories testing_factories; | |
144 testing_factories.push_back(std::make_pair( | |
145 ProfileOAuth2TokenServiceFactory::GetInstance(), | |
146 BuildAutoIssuingFakeProfileOAuth2TokenService)); | |
147 profile_ = profile_manager_.CreateTestingProfile( | |
148 kTestProfileName, | |
149 scoped_ptr<PrefServiceSyncable>(), | |
150 base::UTF8ToUTF16(kTestProfileName), | |
151 0, | |
152 std::string(), | |
153 testing_factories); | |
154 invalidation::InvalidationServiceFactory::GetInstance()->SetTestingFactory( | |
155 profile_, invalidation::FakeInvalidationService::Build); | |
156 prefs_ = profile_->GetTestingPrefService(); | |
157 | |
158 prefs_->registry()->RegisterStringPref( | |
159 not_synced_preference_name_.c_str(), | |
160 not_synced_preference_default_value_, | |
161 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | |
162 } | |
163 | |
164 virtual void TearDown() { | |
165 profile_ = NULL; | |
166 profile_manager_.DeleteTestingProfile(kTestProfileName); | |
167 AbstractProfileSyncServiceTest::TearDown(); | |
168 } | |
169 | |
170 int GetSyncPreferenceCount() { | |
171 syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
172 syncer::ReadNode node(&trans); | |
173 if (node.InitByTagLookup(syncer::ModelTypeToRootTag(syncer::PREFERENCES)) != | |
174 syncer::BaseNode::INIT_OK) | |
175 return 0; | |
176 return node.GetTotalNodeCount() - 1; | |
177 } | |
178 | |
179 bool StartSyncService(const base::Closure& callback, | |
180 bool will_fail_association) { | |
181 if (sync_service_) | |
182 return false; | |
183 | |
184 SigninManagerBase* signin = | |
185 SigninManagerFactory::GetForProfile(profile_); | |
186 signin->SetAuthenticatedUsername("test"); | |
187 sync_service_ = TestProfileSyncService::BuildAutoStartAsyncInit(profile_, | |
188 callback); | |
189 pref_sync_service_ = reinterpret_cast<PrefModelAssociator*>( | |
190 prefs_->GetSyncableService(syncer::PREFERENCES)); | |
191 if (!pref_sync_service_) | |
192 return false; | |
193 ProfileSyncComponentsFactoryMock* components = | |
194 sync_service_->components_factory_mock(); | |
195 EXPECT_CALL(*components, GetSyncableServiceForType(syncer::PREFERENCES)). | |
196 WillOnce(Return(pref_sync_service_->AsWeakPtr())); | |
197 | |
198 EXPECT_CALL(*components, CreateDataTypeManager(_, _, _, _, _, _)). | |
199 WillOnce(ReturnNewDataTypeManagerWithDebugListener( | |
200 syncer::MakeWeakHandle(debug_ptr_factory_.GetWeakPtr()))); | |
201 dtc_ = new UIDataTypeController(base::MessageLoopProxy::current(), | |
202 base::Closure(), | |
203 syncer::PREFERENCES, | |
204 components, | |
205 profile_, | |
206 sync_service_); | |
207 EXPECT_CALL(*components, CreateSharedChangeProcessor()). | |
208 WillOnce(Return(new SharedChangeProcessor())); | |
209 EXPECT_CALL(*components, CreateGenericChangeProcessor(_, _, _, _)). | |
210 WillOnce(CreateAndSaveChangeProcessor( | |
211 &change_processor_)); | |
212 sync_service_->RegisterDataTypeController(dtc_); | |
213 ProfileOAuth2TokenServiceFactory::GetForProfile(profile_) | |
214 ->UpdateCredentials("test", "oauth2_login_token"); | |
215 | |
216 sync_service_->Initialize(); | |
217 base::MessageLoop::current()->Run(); | |
218 | |
219 // It's possible this test triggered an unrecoverable error, in which case | |
220 // we can't get the preference count. | |
221 if (sync_service_->ShouldPushChanges()) { | |
222 EXPECT_EQ(GetSyncPreferenceCount(), | |
223 association_stats_.num_sync_items_after_association); | |
224 } | |
225 EXPECT_EQ(association_stats_.num_sync_items_after_association, | |
226 association_stats_.num_sync_items_before_association + | |
227 association_stats_.num_sync_items_added - | |
228 association_stats_.num_sync_items_deleted); | |
229 | |
230 return true; | |
231 } | |
232 | |
233 const base::Value& GetPreferenceValue(const std::string& name) { | |
234 const PrefService::Preference* preference = | |
235 prefs_->FindPreference(name.c_str()); | |
236 return *preference->GetValue(); | |
237 } | |
238 | |
239 // Caller gets ownership of the returned value. | |
240 const base::Value* GetSyncedValue(const std::string& name) { | |
241 syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
242 syncer::ReadNode node(&trans); | |
243 | |
244 if (node.InitByClientTagLookup(syncer::PREFERENCES, name) != | |
245 syncer::BaseNode::INIT_OK) { | |
246 return NULL; | |
247 } | |
248 | |
249 const sync_pb::PreferenceSpecifics& specifics( | |
250 node.GetEntitySpecifics().preference()); | |
251 | |
252 return base::JSONReader::Read(specifics.value()); | |
253 } | |
254 | |
255 int64 WriteSyncedValue(const std::string& name, | |
256 const base::Value& value, | |
257 syncer::WriteNode* node) { | |
258 syncer::SyncData sync_data; | |
259 if (!pref_sync_service_->CreatePrefSyncData(name, | |
260 value, | |
261 &sync_data)) { | |
262 return syncer::kInvalidId; | |
263 } | |
264 node->SetEntitySpecifics(sync_data.GetSpecifics()); | |
265 return node->GetId(); | |
266 } | |
267 | |
268 bool IsSynced(const std::string& pref_name) { | |
269 return pref_sync_service_->registered_preferences().count(pref_name) > 0; | |
270 } | |
271 | |
272 bool HasSyncData(const std::string& pref_name) { | |
273 return pref_sync_service_->IsPrefSynced(pref_name); | |
274 } | |
275 | |
276 std::string ValueString(const base::Value& value) { | |
277 std::string serialized; | |
278 JSONStringValueSerializer json(&serialized); | |
279 json.Serialize(value); | |
280 return serialized; | |
281 } | |
282 | |
283 // Returns whether a given preference name is a new name of a migrated | |
284 // preference. Exposed here for testing. | |
285 static bool IsMigratedPreference(const char* preference_name) { | |
286 return PrefModelAssociator::IsMigratedPreference(preference_name); | |
287 } | |
288 static bool IsOldMigratedPreference(const char* old_preference_name) { | |
289 return PrefModelAssociator::IsOldMigratedPreference(old_preference_name); | |
290 } | |
291 | |
292 TestingProfileManager profile_manager_; | |
293 TestingProfile* profile_; | |
294 TestingPrefServiceSyncable* prefs_; | |
295 | |
296 UIDataTypeController* dtc_; | |
297 PrefModelAssociator* pref_sync_service_; | |
298 GenericChangeProcessor* change_processor_; | |
299 syncer::DataTypeAssociationStats association_stats_; | |
300 base::WeakPtrFactory<DataTypeDebugInfoListener> debug_ptr_factory_; | |
301 | |
302 std::string example_url0_; | |
303 std::string example_url1_; | |
304 std::string example_url2_; | |
305 std::string not_synced_preference_name_; | |
306 std::string not_synced_preference_default_value_; | |
307 std::string non_default_charset_value_; | |
308 }; | |
309 | |
310 class AddPreferenceEntriesHelper { | |
311 public: | |
312 AddPreferenceEntriesHelper(ProfileSyncServicePreferenceTest* test, | |
313 const PreferenceValues& entries) | |
314 : callback_(base::Bind( | |
315 &AddPreferenceEntriesHelper::AddPreferenceEntriesCallback, | |
316 base::Unretained(this), test, entries)), | |
317 success_(false) { | |
318 } | |
319 | |
320 const base::Closure& callback() const { return callback_; } | |
321 bool success() { return success_; } | |
322 | |
323 private: | |
324 void AddPreferenceEntriesCallback(ProfileSyncServicePreferenceTest* test, | |
325 const PreferenceValues& entries) { | |
326 if (!test->CreateRoot(syncer::PREFERENCES)) | |
327 return; | |
328 | |
329 for (PreferenceValues::const_iterator i = entries.begin(); | |
330 i != entries.end(); ++i) { | |
331 if (test->SetSyncedValue(i->first, *i->second) == syncer::kInvalidId) | |
332 return; | |
333 } | |
334 success_ = true; | |
335 } | |
336 | |
337 base::Closure callback_; | |
338 bool success_; | |
339 }; | |
340 | |
341 TEST_F(ProfileSyncServicePreferenceTest, CreatePrefSyncData) { | |
342 prefs_->SetString(prefs::kHomePage, example_url0_); | |
343 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
344 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
345 ASSERT_TRUE(create_root.success()); | |
346 | |
347 const PrefService::Preference* pref = | |
348 prefs_->FindPreference(prefs::kHomePage); | |
349 syncer::SyncData sync_data; | |
350 EXPECT_TRUE(pref_sync_service_->CreatePrefSyncData(pref->name(), | |
351 *pref->GetValue(), &sync_data)); | |
352 EXPECT_EQ(std::string(prefs::kHomePage), | |
353 syncer::SyncDataLocal(sync_data).GetTag()); | |
354 const sync_pb::PreferenceSpecifics& specifics(sync_data.GetSpecifics(). | |
355 preference()); | |
356 EXPECT_EQ(std::string(prefs::kHomePage), specifics.name()); | |
357 | |
358 scoped_ptr<base::Value> value(base::JSONReader::Read(specifics.value())); | |
359 EXPECT_TRUE(pref->GetValue()->Equals(value.get())); | |
360 } | |
361 | |
362 TEST_F(ProfileSyncServicePreferenceTest, ModelAssociationDoNotSyncDefaults) { | |
363 const PrefService::Preference* pref = | |
364 prefs_->FindPreference(prefs::kHomePage); | |
365 EXPECT_TRUE(pref->IsDefaultValue()); | |
366 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
367 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
368 ASSERT_TRUE(create_root.success()); | |
369 EXPECT_TRUE(IsSynced(prefs::kHomePage)); | |
370 EXPECT_TRUE(pref->IsDefaultValue()); | |
371 EXPECT_TRUE(GetSyncedValue(prefs::kHomePage) == NULL); | |
372 EXPECT_TRUE(GetSyncedValue(not_synced_preference_name_) == NULL); | |
373 } | |
374 | |
375 TEST_F(ProfileSyncServicePreferenceTest, ModelAssociationEmptyCloud) { | |
376 prefs_->SetString(prefs::kHomePage, example_url0_); | |
377 { | |
378 ListPrefUpdate update(prefs_, prefs::kURLsToRestoreOnStartup); | |
379 base::ListValue* url_list = update.Get(); | |
380 url_list->Append(new base::StringValue(example_url0_)); | |
381 url_list->Append(new base::StringValue(example_url1_)); | |
382 } | |
383 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
384 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
385 ASSERT_TRUE(create_root.success()); | |
386 | |
387 scoped_ptr<const base::Value> value(GetSyncedValue(prefs::kHomePage)); | |
388 ASSERT_TRUE(value.get()); | |
389 EXPECT_TRUE(GetPreferenceValue(prefs::kHomePage).Equals(value.get())); | |
390 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartup)); | |
391 ASSERT_TRUE(value.get()); | |
392 EXPECT_TRUE( | |
393 GetPreferenceValue(prefs::kURLsToRestoreOnStartup).Equals(value.get())); | |
394 } | |
395 | |
396 TEST_F(ProfileSyncServicePreferenceTest, ModelAssociationCloudHasData) { | |
397 prefs_->SetString(prefs::kHomePage, example_url0_); | |
398 { | |
399 ListPrefUpdate update(prefs_, prefs::kURLsToRestoreOnStartup); | |
400 base::ListValue* url_list = update.Get(); | |
401 url_list->Append(new base::StringValue(example_url0_)); | |
402 url_list->Append(new base::StringValue(example_url1_)); | |
403 } | |
404 | |
405 PreferenceValues cloud_data; | |
406 STLValueDeleter<PreferenceValues> cloud_data_deleter(&cloud_data); | |
407 cloud_data[prefs::kHomePage] = new base::StringValue(example_url1_); | |
408 base::ListValue* urls_to_restore = new base::ListValue; | |
409 urls_to_restore->Append(new base::StringValue(example_url1_)); | |
410 urls_to_restore->Append(new base::StringValue(example_url2_)); | |
411 cloud_data[prefs::kURLsToRestoreOnStartup] = urls_to_restore; | |
412 cloud_data[prefs::kDefaultCharset] = | |
413 new base::StringValue(non_default_charset_value_); | |
414 | |
415 AddPreferenceEntriesHelper helper(this, cloud_data); | |
416 ASSERT_TRUE(StartSyncService(helper.callback(), false)); | |
417 ASSERT_TRUE(helper.success()); | |
418 | |
419 scoped_ptr<const base::Value> value(GetSyncedValue(prefs::kHomePage)); | |
420 ASSERT_TRUE(value.get()); | |
421 std::string string_value; | |
422 EXPECT_TRUE(value->GetAsString(&string_value)); | |
423 EXPECT_EQ(example_url1_, string_value); | |
424 EXPECT_EQ(example_url1_, prefs_->GetString(prefs::kHomePage)); | |
425 | |
426 scoped_ptr<base::ListValue> expected_urls(new base::ListValue); | |
427 expected_urls->Append(new base::StringValue(example_url1_)); | |
428 expected_urls->Append(new base::StringValue(example_url2_)); | |
429 expected_urls->Append(new base::StringValue(example_url0_)); | |
430 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartup)); | |
431 ASSERT_TRUE(value.get()); | |
432 EXPECT_TRUE(value->Equals(expected_urls.get())); | |
433 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). | |
434 Equals(expected_urls.get())); | |
435 | |
436 value.reset(GetSyncedValue(prefs::kDefaultCharset)); | |
437 ASSERT_TRUE(value.get()); | |
438 EXPECT_TRUE(value->GetAsString(&string_value)); | |
439 EXPECT_EQ(non_default_charset_value_, string_value); | |
440 EXPECT_EQ(non_default_charset_value_, | |
441 prefs_->GetString(prefs::kDefaultCharset)); | |
442 } | |
443 | |
444 TEST_F(ProfileSyncServicePreferenceTest, ModelAssociationMigrateOldData) { | |
445 ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup)); | |
446 ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld)); | |
447 | |
448 PreferenceValues cloud_data; | |
449 STLValueDeleter<PreferenceValues> cloud_data_deleter(&cloud_data); | |
450 base::ListValue* urls_to_restore = new base::ListValue; | |
451 urls_to_restore->Append(new base::StringValue(example_url1_)); | |
452 urls_to_restore->Append(new base::StringValue(example_url2_)); | |
453 cloud_data[prefs::kURLsToRestoreOnStartupOld] = urls_to_restore; | |
454 | |
455 AddPreferenceEntriesHelper helper(this, cloud_data); | |
456 ASSERT_TRUE(StartSyncService(helper.callback(), false)); | |
457 ASSERT_TRUE(helper.success()); | |
458 | |
459 // Expect that the new preference data contains the old pref's values. | |
460 scoped_ptr<base::ListValue> expected_urls(new base::ListValue); | |
461 expected_urls->Append(new base::StringValue(example_url1_)); | |
462 expected_urls->Append(new base::StringValue(example_url2_)); | |
463 | |
464 ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup)); | |
465 scoped_ptr<const base::Value> value( | |
466 GetSyncedValue(prefs::kURLsToRestoreOnStartup)); | |
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 // The old preference value should be the same. | |
473 expected_urls.reset(new base::ListValue); | |
474 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartupOld)); | |
475 ASSERT_TRUE(value.get()); | |
476 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld). | |
477 Equals(expected_urls.get())); | |
478 } | |
479 | |
480 TEST_F(ProfileSyncServicePreferenceTest, | |
481 ModelAssociationCloudHasOldMigratedData) { | |
482 ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup)); | |
483 ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld)); | |
484 prefs_->SetString(prefs::kHomePage, example_url0_); | |
485 { | |
486 ListPrefUpdate update(prefs_, prefs::kURLsToRestoreOnStartup); | |
487 base::ListValue* url_list = update.Get(); | |
488 url_list->Append(new base::StringValue(example_url0_)); | |
489 url_list->Append(new base::StringValue(example_url1_)); | |
490 } | |
491 | |
492 PreferenceValues cloud_data; | |
493 STLValueDeleter<PreferenceValues> cloud_data_deleter(&cloud_data); | |
494 cloud_data[prefs::kHomePage] = new base::StringValue(example_url1_); | |
495 base::ListValue* urls_to_restore = new base::ListValue; | |
496 urls_to_restore->Append(new base::StringValue(example_url1_)); | |
497 urls_to_restore->Append(new base::StringValue(example_url2_)); | |
498 cloud_data[prefs::kURLsToRestoreOnStartupOld] = urls_to_restore; | |
499 | |
500 AddPreferenceEntriesHelper helper(this, cloud_data); | |
501 ASSERT_TRUE(StartSyncService(helper.callback(), false)); | |
502 ASSERT_TRUE(helper.success()); | |
503 | |
504 scoped_ptr<const base::Value> value(GetSyncedValue(prefs::kHomePage)); | |
505 ASSERT_TRUE(value.get()); | |
506 std::string string_value; | |
507 EXPECT_TRUE(value->GetAsString(&string_value)); | |
508 EXPECT_EQ(example_url1_, string_value); | |
509 EXPECT_EQ(example_url1_, prefs_->GetString(prefs::kHomePage)); | |
510 | |
511 // Expect that the new preference data contains the merged old prefs values. | |
512 scoped_ptr<base::ListValue> expected_urls(new base::ListValue); | |
513 expected_urls->Append(new base::StringValue(example_url1_)); | |
514 expected_urls->Append(new base::StringValue(example_url2_)); | |
515 expected_urls->Append(new base::StringValue(example_url0_)); | |
516 | |
517 ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup)); | |
518 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartup)); | |
519 ASSERT_TRUE(value.get()); | |
520 EXPECT_TRUE(value->Equals(expected_urls.get())); | |
521 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). | |
522 Equals(expected_urls.get())); | |
523 | |
524 // The old preference name should also contain the merged sync data. | |
525 expected_urls.reset(new base::ListValue); | |
526 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartupOld)); | |
527 ASSERT_TRUE(value.get()); | |
528 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld). | |
529 Equals(expected_urls.get())); | |
530 } | |
531 | |
532 TEST_F(ProfileSyncServicePreferenceTest, | |
533 ModelAssociationCloudHasNewMigratedData) { | |
534 ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup)); | |
535 ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld)); | |
536 prefs_->SetString(prefs::kHomePage, example_url0_); | |
537 { | |
538 ListPrefUpdate update(prefs_, prefs::kURLsToRestoreOnStartupOld); | |
539 base::ListValue* url_list = update.Get(); | |
540 url_list->Append(new base::StringValue(example_url0_)); | |
541 url_list->Append(new base::StringValue(example_url1_)); | |
542 } | |
543 | |
544 PreferenceValues cloud_data; | |
545 STLValueDeleter<PreferenceValues> cloud_data_deleter(&cloud_data); | |
546 cloud_data[prefs::kHomePage] = new base::StringValue(example_url1_); | |
547 base::ListValue* urls_to_restore = new base::ListValue; | |
548 urls_to_restore->Append(new base::StringValue(example_url1_)); | |
549 urls_to_restore->Append(new base::StringValue(example_url2_)); | |
550 cloud_data[prefs::kURLsToRestoreOnStartup] = urls_to_restore; | |
551 | |
552 AddPreferenceEntriesHelper helper(this, cloud_data); | |
553 ASSERT_TRUE(StartSyncService(helper.callback(), false)); | |
554 ASSERT_TRUE(helper.success()); | |
555 | |
556 scoped_ptr<const base::Value> value(GetSyncedValue(prefs::kHomePage)); | |
557 ASSERT_TRUE(value.get()); | |
558 std::string string_value; | |
559 EXPECT_TRUE(value->GetAsString(&string_value)); | |
560 EXPECT_EQ(example_url1_, string_value); | |
561 EXPECT_EQ(example_url1_, prefs_->GetString(prefs::kHomePage)); | |
562 | |
563 // Expect that the cloud data under the new migrated preference name sticks. | |
564 scoped_ptr<base::ListValue> expected_urls(new base::ListValue); | |
565 expected_urls->Append(new base::StringValue(example_url1_)); | |
566 expected_urls->Append(new base::StringValue(example_url2_)); | |
567 | |
568 ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup)); | |
569 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartup)); | |
570 ASSERT_TRUE(value.get()); | |
571 EXPECT_TRUE(value->Equals(expected_urls.get())); | |
572 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). | |
573 Equals(expected_urls.get())); | |
574 | |
575 // The old preference data should still be here, though not synced. | |
576 expected_urls.reset(new base::ListValue); | |
577 expected_urls->Append(new base::StringValue(example_url0_)); | |
578 expected_urls->Append(new base::StringValue(example_url1_)); | |
579 | |
580 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartupOld)); | |
581 ASSERT_FALSE(value.get()); | |
582 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld). | |
583 Equals(expected_urls.get())); | |
584 } | |
585 | |
586 TEST_F(ProfileSyncServicePreferenceTest, | |
587 ModelAssociationCloudAddsOldAndNewMigratedData) { | |
588 ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup)); | |
589 ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld)); | |
590 prefs_->SetString(prefs::kHomePage, example_url0_); | |
591 { | |
592 ListPrefUpdate update_old(prefs_, prefs::kURLsToRestoreOnStartupOld); | |
593 base::ListValue* url_list_old = update_old.Get(); | |
594 url_list_old->Append(new base::StringValue(example_url0_)); | |
595 url_list_old->Append(new base::StringValue(example_url1_)); | |
596 ListPrefUpdate update(prefs_, prefs::kURLsToRestoreOnStartup); | |
597 base::ListValue* url_list = update.Get(); | |
598 url_list->Append(new base::StringValue(example_url1_)); | |
599 url_list->Append(new base::StringValue(example_url2_)); | |
600 } | |
601 | |
602 PreferenceValues cloud_data; | |
603 STLValueDeleter<PreferenceValues> cloud_data_deleter(&cloud_data); | |
604 cloud_data[prefs::kHomePage] = new base::StringValue(example_url1_); | |
605 | |
606 AddPreferenceEntriesHelper helper(this, cloud_data); | |
607 ASSERT_TRUE(StartSyncService(helper.callback(), false)); | |
608 ASSERT_TRUE(helper.success()); | |
609 | |
610 scoped_ptr<const base::Value> value(GetSyncedValue(prefs::kHomePage)); | |
611 ASSERT_TRUE(value.get()); | |
612 std::string string_value; | |
613 EXPECT_TRUE(value->GetAsString(&string_value)); | |
614 EXPECT_EQ(example_url1_, string_value); | |
615 EXPECT_EQ(example_url1_, prefs_->GetString(prefs::kHomePage)); | |
616 | |
617 // Expect that the cloud data under the new migrated preference name sticks. | |
618 scoped_ptr<base::ListValue> expected_urls(new base::ListValue); | |
619 expected_urls->Append(new base::StringValue(example_url1_)); | |
620 expected_urls->Append(new base::StringValue(example_url2_)); | |
621 | |
622 ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup)); | |
623 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartup)); | |
624 ASSERT_TRUE(value.get()); | |
625 EXPECT_TRUE(value->Equals(expected_urls.get())); | |
626 EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). | |
627 Equals(expected_urls.get())); | |
628 | |
629 // Should not have synced in the old startup url values. | |
630 value.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartupOld)); | |
631 ASSERT_FALSE(value.get()); | |
632 EXPECT_FALSE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld). | |
633 Equals(expected_urls.get())); | |
634 } | |
635 | |
636 TEST_F(ProfileSyncServicePreferenceTest, FailModelAssociation) { | |
637 ASSERT_TRUE(StartSyncService(base::Closure(), true)); | |
638 EXPECT_TRUE(sync_service_->HasUnrecoverableError()); | |
639 } | |
640 | |
641 TEST_F(ProfileSyncServicePreferenceTest, UpdatedPreferenceWithDefaultValue) { | |
642 const PrefService::Preference* pref = | |
643 prefs_->FindPreference(prefs::kHomePage); | |
644 EXPECT_TRUE(pref->IsDefaultValue()); | |
645 | |
646 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
647 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
648 ASSERT_TRUE(create_root.success()); | |
649 | |
650 base::StringValue expected(example_url0_); | |
651 profile_->GetPrefs()->Set(prefs::kHomePage, expected); | |
652 | |
653 scoped_ptr<const base::Value> actual(GetSyncedValue(prefs::kHomePage)); | |
654 ASSERT_TRUE(actual.get()); | |
655 EXPECT_TRUE(expected.Equals(actual.get())); | |
656 } | |
657 | |
658 TEST_F(ProfileSyncServicePreferenceTest, UpdatedPreferenceWithValue) { | |
659 profile_->GetPrefs()->SetString(prefs::kHomePage, example_url0_); | |
660 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
661 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
662 ASSERT_TRUE(create_root.success()); | |
663 | |
664 base::StringValue expected(example_url1_); | |
665 profile_->GetPrefs()->Set(prefs::kHomePage, expected); | |
666 | |
667 scoped_ptr<const base::Value> actual(GetSyncedValue(prefs::kHomePage)); | |
668 ASSERT_TRUE(actual.get()); | |
669 EXPECT_TRUE(expected.Equals(actual.get())); | |
670 } | |
671 | |
672 TEST_F(ProfileSyncServicePreferenceTest, UpdatedSyncNodeActionUpdate) { | |
673 profile_->GetPrefs()->SetString(prefs::kHomePage, example_url0_); | |
674 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
675 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
676 ASSERT_TRUE(create_root.success()); | |
677 | |
678 base::StringValue expected(example_url1_); | |
679 int64 node_id = SetSyncedValue(prefs::kHomePage, expected); | |
680 ASSERT_NE(node_id, syncer::kInvalidId); | |
681 { | |
682 syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
683 change_processor_->ApplyChangesFromSyncModel( | |
684 &trans, 0, | |
685 ProfileSyncServiceTestHelper::MakeSingletonChangeRecordList( | |
686 node_id, ChangeRecord::ACTION_UPDATE)); | |
687 } | |
688 change_processor_->CommitChangesFromSyncModel(); | |
689 | |
690 const base::Value& actual = GetPreferenceValue(prefs::kHomePage); | |
691 EXPECT_TRUE(expected.Equals(&actual)); | |
692 } | |
693 | |
694 TEST_F(ProfileSyncServicePreferenceTest, UpdatedSyncNodeActionAdd) { | |
695 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
696 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
697 ASSERT_TRUE(create_root.success()); | |
698 | |
699 base::StringValue expected(example_url0_); | |
700 int64 node_id = SetSyncedValue(prefs::kHomePage, expected); | |
701 ASSERT_NE(node_id, syncer::kInvalidId); | |
702 { | |
703 syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
704 change_processor_->ApplyChangesFromSyncModel( | |
705 &trans, 0, | |
706 ProfileSyncServiceTestHelper::MakeSingletonChangeRecordList( | |
707 node_id, ChangeRecord::ACTION_ADD)); | |
708 } | |
709 change_processor_->CommitChangesFromSyncModel(); | |
710 | |
711 const base::Value& actual = GetPreferenceValue(prefs::kHomePage); | |
712 EXPECT_TRUE(expected.Equals(&actual)); | |
713 EXPECT_EQ(1U, | |
714 pref_sync_service_->registered_preferences().count(prefs::kHomePage)); | |
715 } | |
716 | |
717 TEST_F(ProfileSyncServicePreferenceTest, UpdatedSyncNodeUnknownPreference) { | |
718 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
719 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
720 ASSERT_TRUE(create_root.success()); | |
721 | |
722 base::StringValue expected(example_url0_); | |
723 int64 node_id = SetSyncedValue("unknown preference", expected); | |
724 ASSERT_NE(node_id, syncer::kInvalidId); | |
725 { | |
726 syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
727 change_processor_->ApplyChangesFromSyncModel( | |
728 &trans, 0, | |
729 ProfileSyncServiceTestHelper::MakeSingletonChangeRecordList( | |
730 node_id, ChangeRecord::ACTION_UPDATE)); | |
731 } | |
732 change_processor_->CommitChangesFromSyncModel(); | |
733 | |
734 // Nothing interesting happens on the client when it gets an update | |
735 // of an unknown preference. We just should not crash. | |
736 } | |
737 | |
738 TEST_F(ProfileSyncServicePreferenceTest, ManagedPreferences) { | |
739 // Make the homepage preference managed. | |
740 base::StringValue managed_value("http://example.com"); | |
741 prefs_->SetManagedPref(prefs::kHomePage, managed_value.DeepCopy()); | |
742 | |
743 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
744 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
745 ASSERT_TRUE(create_root.success()); | |
746 | |
747 // Changing the homepage preference should not sync anything. | |
748 base::StringValue user_value("http://chromium..com"); | |
749 prefs_->SetUserPref(prefs::kHomePage, user_value.DeepCopy()); | |
750 EXPECT_EQ(NULL, GetSyncedValue(prefs::kHomePage)); | |
751 | |
752 // An incoming sync transaction should change the user value, not the managed | |
753 // value. | |
754 base::StringValue sync_value("http://crbug.com"); | |
755 int64 node_id = SetSyncedValue(prefs::kHomePage, sync_value); | |
756 ASSERT_NE(node_id, syncer::kInvalidId); | |
757 { | |
758 syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
759 change_processor_->ApplyChangesFromSyncModel( | |
760 &trans, 0, | |
761 ProfileSyncServiceTestHelper::MakeSingletonChangeRecordList( | |
762 node_id, ChangeRecord::ACTION_UPDATE)); | |
763 } | |
764 change_processor_->CommitChangesFromSyncModel(); | |
765 | |
766 EXPECT_TRUE(managed_value.Equals(prefs_->GetManagedPref(prefs::kHomePage))); | |
767 EXPECT_TRUE(sync_value.Equals(prefs_->GetUserPref(prefs::kHomePage))); | |
768 } | |
769 | |
770 // List preferences have special handling at association time due to our ability | |
771 // to merge the local and sync value. Make sure the merge logic doesn't merge | |
772 // managed preferences. | |
773 TEST_F(ProfileSyncServicePreferenceTest, ManagedListPreferences) { | |
774 // Make the list of urls to restore on startup managed. | |
775 base::ListValue managed_value; | |
776 managed_value.Append(new base::StringValue(example_url0_)); | |
777 managed_value.Append(new base::StringValue(example_url1_)); | |
778 prefs_->SetManagedPref(prefs::kURLsToRestoreOnStartup, | |
779 managed_value.DeepCopy()); | |
780 | |
781 // Set a cloud version. | |
782 PreferenceValues cloud_data; | |
783 STLValueDeleter<PreferenceValues> cloud_data_deleter(&cloud_data); | |
784 base::ListValue* urls_to_restore = new base::ListValue; | |
785 urls_to_restore->Append(new base::StringValue(example_url1_)); | |
786 urls_to_restore->Append(new base::StringValue(example_url2_)); | |
787 cloud_data[prefs::kURLsToRestoreOnStartup] = urls_to_restore; | |
788 | |
789 // Start sync and verify the synced value didn't get merged. | |
790 AddPreferenceEntriesHelper helper(this, cloud_data); | |
791 ASSERT_TRUE(StartSyncService(helper.callback(), false)); | |
792 ASSERT_TRUE(helper.success()); | |
793 scoped_ptr<const base::Value> actual( | |
794 GetSyncedValue(prefs::kURLsToRestoreOnStartup)); | |
795 EXPECT_TRUE(cloud_data[prefs::kURLsToRestoreOnStartup]->Equals(actual.get())); | |
796 | |
797 // Changing the user's urls to restore on startup pref should not sync | |
798 // anything. | |
799 base::ListValue user_value; | |
800 user_value.Append(new base::StringValue("http://chromium.org")); | |
801 prefs_->SetUserPref(prefs::kURLsToRestoreOnStartup, user_value.DeepCopy()); | |
802 actual.reset(GetSyncedValue(prefs::kURLsToRestoreOnStartup)); | |
803 EXPECT_TRUE(cloud_data[prefs::kURLsToRestoreOnStartup]->Equals(actual.get())); | |
804 | |
805 // An incoming sync transaction should change the user value, not the managed | |
806 // value. | |
807 base::ListValue sync_value; | |
808 sync_value.Append(new base::StringValue("http://crbug.com")); | |
809 int64 node_id = SetSyncedValue(prefs::kURLsToRestoreOnStartup, sync_value); | |
810 ASSERT_NE(node_id, syncer::kInvalidId); | |
811 { | |
812 syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
813 change_processor_->ApplyChangesFromSyncModel( | |
814 &trans, 0, | |
815 ProfileSyncServiceTestHelper::MakeSingletonChangeRecordList( | |
816 node_id, ChangeRecord::ACTION_UPDATE)); | |
817 } | |
818 change_processor_->CommitChangesFromSyncModel(); | |
819 | |
820 EXPECT_TRUE(managed_value.Equals( | |
821 prefs_->GetManagedPref(prefs::kURLsToRestoreOnStartup))); | |
822 EXPECT_TRUE(sync_value.Equals( | |
823 prefs_->GetUserPref(prefs::kURLsToRestoreOnStartup))); | |
824 } | |
825 | |
826 TEST_F(ProfileSyncServicePreferenceTest, DynamicManagedPreferences) { | |
827 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
828 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
829 ASSERT_TRUE(create_root.success()); | |
830 | |
831 base::StringValue initial_value("http://example.com/initial"); | |
832 profile_->GetPrefs()->Set(prefs::kHomePage, initial_value); | |
833 scoped_ptr<const base::Value> actual(GetSyncedValue(prefs::kHomePage)); | |
834 ASSERT_TRUE(actual.get()); | |
835 EXPECT_TRUE(initial_value.Equals(actual.get())); | |
836 | |
837 // Switch kHomePage to managed and set a different value. | |
838 base::StringValue managed_value("http://example.com/managed"); | |
839 profile_->GetTestingPrefService()->SetManagedPref(prefs::kHomePage, | |
840 managed_value.DeepCopy()); | |
841 | |
842 // The pref value should be the one dictated by policy. | |
843 EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage))); | |
844 | |
845 // Switch kHomePage back to unmanaged. | |
846 profile_->GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage); | |
847 | |
848 // The original value should be picked up. | |
849 EXPECT_TRUE(initial_value.Equals(&GetPreferenceValue(prefs::kHomePage))); | |
850 } | |
851 | |
852 TEST_F(ProfileSyncServicePreferenceTest, | |
853 DynamicManagedPreferencesWithSyncChange) { | |
854 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
855 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
856 ASSERT_TRUE(create_root.success()); | |
857 | |
858 base::StringValue initial_value("http://example.com/initial"); | |
859 profile_->GetPrefs()->Set(prefs::kHomePage, initial_value); | |
860 scoped_ptr<const base::Value> actual(GetSyncedValue(prefs::kHomePage)); | |
861 EXPECT_TRUE(initial_value.Equals(actual.get())); | |
862 | |
863 // Switch kHomePage to managed and set a different value. | |
864 base::StringValue managed_value("http://example.com/managed"); | |
865 profile_->GetTestingPrefService()->SetManagedPref(prefs::kHomePage, | |
866 managed_value.DeepCopy()); | |
867 | |
868 // Change the sync value. | |
869 base::StringValue sync_value("http://example.com/sync"); | |
870 int64 node_id = SetSyncedValue(prefs::kHomePage, sync_value); | |
871 ASSERT_NE(node_id, syncer::kInvalidId); | |
872 { | |
873 syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | |
874 change_processor_->ApplyChangesFromSyncModel( | |
875 &trans, 0, | |
876 ProfileSyncServiceTestHelper::MakeSingletonChangeRecordList( | |
877 node_id, ChangeRecord::ACTION_ADD)); | |
878 } | |
879 change_processor_->CommitChangesFromSyncModel(); | |
880 | |
881 // The pref value should still be the one dictated by policy. | |
882 EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage))); | |
883 | |
884 // Switch kHomePage back to unmanaged. | |
885 profile_->GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage); | |
886 | |
887 // Sync value should be picked up. | |
888 EXPECT_TRUE(sync_value.Equals(&GetPreferenceValue(prefs::kHomePage))); | |
889 } | |
890 | |
891 TEST_F(ProfileSyncServicePreferenceTest, DynamicManagedDefaultPreferences) { | |
892 const PrefService::Preference* pref = | |
893 prefs_->FindPreference(prefs::kHomePage); | |
894 EXPECT_TRUE(pref->IsDefaultValue()); | |
895 CreateRootHelper create_root(this, syncer::PREFERENCES); | |
896 ASSERT_TRUE(StartSyncService(create_root.callback(), false)); | |
897 ASSERT_TRUE(create_root.success()); | |
898 EXPECT_TRUE(IsSynced(prefs::kHomePage)); | |
899 EXPECT_TRUE(pref->IsDefaultValue()); | |
900 EXPECT_TRUE(GetSyncedValue(prefs::kHomePage) == NULL); | |
901 // Switch kHomePage to managed and set a different value. | |
902 base::StringValue managed_value("http://example.com/managed"); | |
903 profile_->GetTestingPrefService()->SetManagedPref(prefs::kHomePage, | |
904 managed_value.DeepCopy()); | |
905 // The pref value should be the one dictated by policy. | |
906 EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage))); | |
907 EXPECT_FALSE(pref->IsDefaultValue()); | |
908 // There should be no synced value. | |
909 EXPECT_TRUE(GetSyncedValue(prefs::kHomePage) == NULL); | |
910 // Switch kHomePage back to unmanaged. | |
911 profile_->GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage); | |
912 // The original value should be picked up. | |
913 EXPECT_TRUE(pref->IsDefaultValue()); | |
914 // There should still be no synced value. | |
915 EXPECT_TRUE(GetSyncedValue(prefs::kHomePage) == NULL); | |
916 } | |
OLD | NEW |