15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/json/json_reader.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/json/json_string_value_serializer.h" 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/json/json_writer.h" 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/message_loop/message_loop.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/prefs/scoped_user_pref_update.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/utf_string_conversions.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/prefs/pref_model_associator.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/prefs/pref_service_syncable.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/pref_names.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/locale_settings.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/test/base/testing_pref_service_syncable.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "sync/api/attachments/attachment_id.h" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "sync/api/sync_change.h" 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "sync/api/sync_data.h" 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "sync/api/sync_error_factory_mock.h" 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "sync/api/syncable_service.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h" 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "sync/protocol/preference_specifics.pb.h" 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "sync/protocol/sync.pb.h" 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gtest/include/gtest/gtest.h" 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing syncer::SyncChange; 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing syncer::SyncData; 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace { 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kExampleUrl0[] = "http://example.com/0"; 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kExampleUrl1[] = "http://example.com/1"; 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kExampleUrl2[] = "http://example.com/2"; 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kUnsyncedPreferenceName[] = "nonsense_pref_name"; 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kUnsyncedPreferenceDefaultValue[] = "default"; 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kNonDefaultCharsetValue[] = "foo"; 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass TestSyncProcessorStub : public syncer::SyncChangeProcessor { 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu explicit TestSyncProcessorStub(syncer::SyncChangeList* output) 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : output_(output), fail_next_(false) {} 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual syncer::SyncError ProcessSyncChanges( 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const tracked_objects::Location& from_here, 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const syncer::SyncChangeList& change_list) OVERRIDE { 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (output_) 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu output_->insert(output_->end(), change_list.begin(), change_list.end()); 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (fail_next_) { 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu fail_next_ = false; 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return syncer::SyncError( 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, syncer::SyncError::DATATYPE_ERROR, "Error", 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::PREFERENCES); 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return syncer::SyncError(); 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void FailNextProcessSyncChanges() { 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu fail_next_ = true; 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const OVERRIDE { 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return syncer::SyncDataList(); 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList* output_; 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool fail_next_; 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass PrefsSyncableServiceTest : public testing::Test { 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrefsSyncableServiceTest() : 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_(NULL), 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_processor_(NULL), 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu next_pref_remote_sync_node_id_(0) {} 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void SetUp() { 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.registry()->RegisterStringPref( 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu kUnsyncedPreferenceName, 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu kUnsyncedPreferenceDefaultValue, 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.registry()->RegisterStringPref( 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs::kHomePage, 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string(), 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.registry()->RegisterListPref( 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs::kURLsToRestoreOnStartup, 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.registry()->RegisterListPref( 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs::kURLsToRestoreOnStartupOld, 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.registry()->RegisterLocalizedStringPref( 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs::kDefaultCharset, 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu IDS_DEFAULT_ENCODING, 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_ = reinterpret_cast<PrefModelAssociator*>( 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.GetSyncableService(syncer::PREFERENCES)); 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(pref_sync_service_); 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu next_pref_remote_sync_node_id_ = 0; 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChange MakeRemoteChange( 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int64 id, 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& name, 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Value& value, 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SyncChange::SyncChangeType type) { 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string serialized; 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu JSONStringValueSerializer json(&serialized); 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!json.Serialize(value)) 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return syncer::SyncChange(); 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu sync_pb::EntitySpecifics entity; 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu sync_pb::PreferenceSpecifics* pref_one = entity.mutable_preference(); 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_one->set_name(name); 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_one->set_value(serialized); 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return syncer::SyncChange( 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type, 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncData::CreateRemoteData( 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu id, 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu entity, 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Time(), 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::AttachmentIdList(), 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::AttachmentServiceProxyForTest::Create())); 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void AddToRemoteDataList(const std::string& name, 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Value& value, 1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncDataList* out) { 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string serialized; 1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu JSONStringValueSerializer json(&serialized); 1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(json.Serialize(value)); 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu sync_pb::EntitySpecifics one; 1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu sync_pb::PreferenceSpecifics* pref_one = one.mutable_preference(); 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_one->set_name(name); 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_one->set_value(serialized); 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out->push_back(SyncData::CreateRemoteData( 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++next_pref_remote_sync_node_id_, 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu one, 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Time(), 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::AttachmentIdList(), 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::AttachmentServiceProxyForTest::Create())); 1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void InitWithSyncDataTakeOutput(const syncer::SyncDataList& initial_data, 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList* output) { 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_processor_ = new TestSyncProcessorStub(output); 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncMergeResult r = pref_sync_service_->MergeDataAndStartSyncing( 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::PREFERENCES, initial_data, 1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<syncer::SyncChangeProcessor>(test_processor_), 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<syncer::SyncErrorFactory>( 1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu new syncer::SyncErrorFactoryMock())); 1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(r.error().IsSet()); 1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void InitWithNoSyncData() { 1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), NULL); 1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Value& GetPreferenceValue(const std::string& name) { 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const PrefService::Preference* preference = 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.FindPreference(name.c_str()); 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return *preference->GetValue(); 1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> FindValue(const std::string& name, 1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const syncer::SyncChangeList& list) { 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList::const_iterator it = list.begin(); 1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (; it != list.end(); ++it) { 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (syncer::SyncDataLocal(it->sync_data()).GetTag() == name) { 1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return make_scoped_ptr(base::JSONReader::Read( 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu it->sync_data().GetSpecifics().preference().value())); 1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return scoped_ptr<base::Value>(); 1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool IsSynced(const std::string& pref_name) { 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return pref_sync_service_->registered_preferences().count(pref_name) > 0; 1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool HasSyncData(const std::string& pref_name) { 1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return pref_sync_service_->IsPrefSynced(pref_name); 1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Returns whether a given preference name is a new name of a migrated 1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // preference. Exposed here for testing. 1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static bool IsMigratedPreference(const char* preference_name) { 1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return PrefModelAssociator::IsMigratedPreference(preference_name); 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static bool IsOldMigratedPreference(const char* old_preference_name) { 1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return PrefModelAssociator::IsOldMigratedPreference(old_preference_name); 1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrefService* GetPrefs() { return &prefs_; } 1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TestingPrefServiceSyncable* GetTestingPrefService() { return &prefs_; } 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected: 1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TestingPrefServiceSyncable prefs_; 2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrefModelAssociator* pref_sync_service_; 2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TestSyncProcessorStub* test_processor_; 2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(tim): Remove this by fixing AttachmentServiceProxyForTest. 2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::MessageLoop loop_; 2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int next_pref_remote_sync_node_id_; 2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, CreatePrefSyncData) { 2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetString(prefs::kHomePage, kExampleUrl0); 2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const PrefService::Preference* pref = 2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.FindPreference(prefs::kHomePage); 2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncData sync_data; 2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(pref_sync_service_->CreatePrefSyncData(pref->name(), 2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *pref->GetValue(), &sync_data)); 2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(std::string(prefs::kHomePage), 2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncDataLocal(sync_data).GetTag()); 2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const sync_pb::PreferenceSpecifics& specifics(sync_data.GetSpecifics(). 2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu preference()); 2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(std::string(prefs::kHomePage), specifics.name()); 2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> value(base::JSONReader::Read(specifics.value())); 2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(pref->GetValue()->Equals(value.get())); 2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, ModelAssociationDoNotSyncDefaults) { 2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const PrefService::Preference* pref = 2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.FindPreference(prefs::kHomePage); 2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(pref->IsDefaultValue()); 2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); 2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(IsSynced(prefs::kHomePage)); 2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(pref->IsDefaultValue()); 2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(FindValue(prefs::kHomePage, out).get()); 2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, ModelAssociationEmptyCloud) { 2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetString(prefs::kHomePage, kExampleUrl0); 2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ListPrefUpdate update(GetPrefs(), prefs::kURLsToRestoreOnStartup); 2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue* url_list = update.Get(); 2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl0)); 2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl1)); 2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); 2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> value(FindValue(prefs::kHomePage, out)); 2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(value.get()); 2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kHomePage).Equals(value.get())); 2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value = FindValue(prefs::kURLsToRestoreOnStartup, out).Pass(); 2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(value.get()); 2565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE( 2575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetPreferenceValue(prefs::kURLsToRestoreOnStartup).Equals(value.get())); 2585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, ModelAssociationCloudHasData) { 2615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetString(prefs::kHomePage, kExampleUrl0); 2625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 2635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ListPrefUpdate update(GetPrefs(), prefs::kURLsToRestoreOnStartup); 2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue* url_list = update.Get(); 2655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl0)); 2665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl1)); 2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncDataList in; 2705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kHomePage, base::StringValue(kExampleUrl1), &in); 2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue urls_to_restore; 2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl1)); 2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl2)); 2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kURLsToRestoreOnStartup, urls_to_restore, &in); 2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kDefaultCharset, 2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue(kNonDefaultCharsetValue), 2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &in); 2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(in, &out); 2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(FindValue(prefs::kHomePage, out).get()); 2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(FindValue(prefs::kDefaultCharset, out).get()); 2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(kExampleUrl1, prefs_.GetString(prefs::kHomePage)); 2855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::ListValue> expected_urls(new base::ListValue); 2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl1)); 2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl2)); 2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl0)); 2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> value( 2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FindValue(prefs::kURLsToRestoreOnStartup, out)); 2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(value.get()); 2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(value->Equals(expected_urls.get())); 2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). 2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(kNonDefaultCharsetValue, 2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.GetString(prefs::kDefaultCharset)); 2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, ModelAssociationMigrateOldData) { 3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup)); 3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld)); 3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncDataList in; 3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue urls_to_restore; 3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl1)); 3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl2)); 3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kURLsToRestoreOnStartupOld, urls_to_restore, 3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &in); 3115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(in, &out); 3125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Expect that the new preference data contains the old pref's values. 3145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::ListValue> expected_urls(new base::ListValue); 3155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl1)); 3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl2)); 3175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup)); 3195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> value( 3205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FindValue(prefs::kURLsToRestoreOnStartup, out)); 3215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(value.get()); 3225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(value->Equals(expected_urls.get())); 3235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). 3245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 3255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The old preference value should be the same. 3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls.reset(new base::ListValue); 3285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(FindValue(prefs::kURLsToRestoreOnStartupOld, out).get()); 3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld). 3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 3315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 3325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, 3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ModelAssociationCloudHasOldMigratedData) { 3355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup)); 3365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld)); 3375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetString(prefs::kHomePage, kExampleUrl0); 3385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ListPrefUpdate update(GetPrefs(), prefs::kURLsToRestoreOnStartup); 3405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue* url_list = update.Get(); 3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl0)); 3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl1)); 3435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 3445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncDataList in; 3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 3475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue urls_to_restore; 3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl1)); 3495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl2)); 3505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kURLsToRestoreOnStartupOld, urls_to_restore, &in); 3515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kHomePage, base::StringValue(kExampleUrl1), &in); 3525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(in, &out); 3535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(FindValue(prefs::kHomePage, out).get()); 3555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Expect that the new preference data contains the merged old prefs values. 3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::ListValue> expected_urls(new base::ListValue); 3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl1)); 3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl2)); 3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl0)); 3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup)); 3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> value( 3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FindValue(prefs::kURLsToRestoreOnStartup, out)); 3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(value.get()); 3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(value->Equals(expected_urls.get())); 3675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). 3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls.reset(new base::ListValue); 3715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value = FindValue(prefs::kURLsToRestoreOnStartupOld, out).Pass(); 3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(value.get()); 3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld). 3745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 3755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 3765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, 3785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ModelAssociationCloudHasNewMigratedData) { 3795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup)); 3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld)); 3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetString(prefs::kHomePage, kExampleUrl0); 3825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 3835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ListPrefUpdate update(GetPrefs(), prefs::kURLsToRestoreOnStartupOld); 3845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue* url_list = update.Get(); 3855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl0)); 3865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl1)); 3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncDataList in; 3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue urls_to_restore; 3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl1)); 3935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl2)); 3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kURLsToRestoreOnStartupOld, urls_to_restore, &in); 3955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kHomePage, base::StringValue(kExampleUrl1), &in); 3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(in, &out); 3975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> value(FindValue(prefs::kHomePage, out)); 3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(value.get()); 4005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Expect that the cloud data under the new migrated preference name sticks. 4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::ListValue> expected_urls(new base::ListValue); 4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl1)); 4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl2)); 4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup)); 4075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value = FindValue(prefs::kURLsToRestoreOnStartup, out).Pass(); 4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(value.get()); 4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(value->Equals(expected_urls.get())); 4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). 4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The old preference data should still be here, though not synced. 4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls.reset(new base::ListValue); 4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl0)); 4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl1)); 4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value = FindValue(prefs::kURLsToRestoreOnStartupOld, out).Pass(); 4195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(value.get()); 4205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld). 4215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, 4255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ModelAssociationCloudAddsOldAndNewMigratedData) { 4265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(IsMigratedPreference(prefs::kURLsToRestoreOnStartup)); 4275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(IsOldMigratedPreference(prefs::kURLsToRestoreOnStartupOld)); 4285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetString(prefs::kHomePage, kExampleUrl0); 4295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 4305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ListPrefUpdate update_old(GetPrefs(), prefs::kURLsToRestoreOnStartupOld); 4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue* url_list_old = update_old.Get(); 4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list_old->Append(new base::StringValue(kExampleUrl0)); 4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list_old->Append(new base::StringValue(kExampleUrl1)); 4345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ListPrefUpdate update(GetPrefs(), prefs::kURLsToRestoreOnStartup); 4355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue* url_list = update.Get(); 4365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl1)); 4375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url_list->Append(new base::StringValue(kExampleUrl2)); 4385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncDataList in; 4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kHomePage, base::StringValue(kExampleUrl1), &in); 4435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(in, &out); 4445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> value(FindValue(prefs::kHomePage, out)); 4465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(value.get()); 4475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Expect that the cloud data under the new migrated preference name sticks. 4495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::ListValue> expected_urls(new base::ListValue); 4505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl1)); 4515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu expected_urls->Append(new base::StringValue(kExampleUrl2)); 4525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(HasSyncData(prefs::kURLsToRestoreOnStartup)); 4545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value = FindValue(prefs::kURLsToRestoreOnStartup, out).Pass(); 4555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(value.get()); 4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(value->Equals(expected_urls.get())); 4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(GetPreferenceValue(prefs::kURLsToRestoreOnStartup). 4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Should not have synced in the old startup url values. 4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value = FindValue(prefs::kURLsToRestoreOnStartupOld, out).Pass(); 4625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_FALSE(value.get()); 4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(GetPreferenceValue(prefs::kURLsToRestoreOnStartupOld). 4645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Equals(expected_urls.get())); 4655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 4665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, FailModelAssociation) { 4685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList output; 4695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TestSyncProcessorStub* stub = new TestSyncProcessorStub(&output); 4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu stub->FailNextProcessSyncChanges(); 4715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncMergeResult r = pref_sync_service_->MergeDataAndStartSyncing( 4725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::PREFERENCES, syncer::SyncDataList(), 4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<syncer::SyncChangeProcessor>(stub), 4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<syncer::SyncErrorFactory>( 4755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu new syncer::SyncErrorFactoryMock())); 4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(r.error().IsSet()); 4775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, UpdatedPreferenceWithDefaultValue) { 4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const PrefService::Preference* pref = 4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.FindPreference(prefs::kHomePage); 4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(pref->IsDefaultValue()); 4835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 4855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); 4865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out.clear(); 4875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue expected(kExampleUrl0); 4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetPrefs()->Set(prefs::kHomePage, expected); 4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> actual(FindValue(prefs::kHomePage, out)); 4925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(actual.get()); 4935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(expected.Equals(actual.get())); 4945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 4955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, UpdatedPreferenceWithValue) { 4975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetPrefs()->SetString(prefs::kHomePage, kExampleUrl0); 4985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 4995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); 5005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out.clear(); 5015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue expected(kExampleUrl1); 5035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetPrefs()->Set(prefs::kHomePage, expected); 5045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> actual(FindValue(prefs::kHomePage, out)); 5065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(actual.get()); 5075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(expected.Equals(actual.get())); 5085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, UpdatedSyncNodeActionUpdate) { 5115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetPrefs()->SetString(prefs::kHomePage, kExampleUrl0); 5125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithNoSyncData(); 5135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue expected(kExampleUrl1); 5155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList list; 5165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu list.push_back(MakeRemoteChange( 5175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1, prefs::kHomePage, expected, SyncChange::ACTION_UPDATE)); 5185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_->ProcessSyncChanges(FROM_HERE, list); 5195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Value& actual = GetPreferenceValue(prefs::kHomePage); 5215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(expected.Equals(&actual)); 5225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, UpdatedSyncNodeActionAdd) { 5255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithNoSyncData(); 5265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue expected(kExampleUrl0); 5285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList list; 5295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu list.push_back(MakeRemoteChange( 5305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1, prefs::kHomePage, expected, SyncChange::ACTION_ADD)); 5315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_->ProcessSyncChanges(FROM_HERE, list); 5325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Value& actual = GetPreferenceValue(prefs::kHomePage); 5345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(expected.Equals(&actual)); 5355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(1U, 5365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_->registered_preferences().count(prefs::kHomePage)); 5375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, UpdatedSyncNodeUnknownPreference) { 5405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithNoSyncData(); 5415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList list; 5425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue expected(kExampleUrl0); 5435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu list.push_back(MakeRemoteChange( 5445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1, "unknown preference", expected, SyncChange::ACTION_UPDATE)); 5455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_->ProcessSyncChanges(FROM_HERE, list); 5465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Nothing interesting happens on the client when it gets an update 5475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // of an unknown preference. We just should not crash. 5485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, ManagedPreferences) { 5515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Make the homepage preference managed. 5525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue managed_value("http://example.com"); 5535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetManagedPref(prefs::kHomePage, managed_value.DeepCopy()); 5545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 5565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); 5575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out.clear(); 5585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Changing the homepage preference should not sync anything. 5605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue user_value("http://chromium..com"); 5615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetUserPref(prefs::kHomePage, user_value.DeepCopy()); 5625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(out.empty()); 5635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // An incoming sync transaction should change the user value, not the managed 5655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // value. 5665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue sync_value("http://crbug.com"); 5675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList list; 5685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu list.push_back(MakeRemoteChange( 5695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1, prefs::kHomePage, sync_value, SyncChange::ACTION_UPDATE)); 5705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_->ProcessSyncChanges(FROM_HERE, list); 5715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(managed_value.Equals(prefs_.GetManagedPref(prefs::kHomePage))); 5735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(sync_value.Equals(prefs_.GetUserPref(prefs::kHomePage))); 5745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// List preferences have special handling at association time due to our ability 5775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// to merge the local and sync value. Make sure the merge logic doesn't merge 5785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// managed preferences. 5795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, ManagedListPreferences) { 5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Make the list of urls to restore on startup managed. 5815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue managed_value; 5825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu managed_value.Append(new base::StringValue(kExampleUrl0)); 5835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu managed_value.Append(new base::StringValue(kExampleUrl1)); 5845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetManagedPref(prefs::kURLsToRestoreOnStartup, 5855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu managed_value.DeepCopy()); 5865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Set a cloud version. 5885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncDataList in; 5895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 5905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue urls_to_restore; 5915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl1)); 5925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu urls_to_restore.Append(new base::StringValue(kExampleUrl2)); 5935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToRemoteDataList(prefs::kURLsToRestoreOnStartup, urls_to_restore, &in); 5945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Start sync and verify the synced value didn't get merged. 5965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(in, &out); 5975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(FindValue(prefs::kURLsToRestoreOnStartup, out).get()); 5985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out.clear(); 5995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Changing the user's urls to restore on startup pref should not sync 6015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // anything. 6025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue user_value; 6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_value.Append(new base::StringValue("http://chromium.org")); 6045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.SetUserPref(prefs::kURLsToRestoreOnStartup, user_value.DeepCopy()); 6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(FindValue(prefs::kURLsToRestoreOnStartup, out).get()); 6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // An incoming sync transaction should change the user value, not the managed 6085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // value. 6095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ListValue sync_value; 6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu sync_value.Append(new base::StringValue("http://crbug.com")); 6115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList list; 6125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu list.push_back(MakeRemoteChange( 6135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1, prefs::kURLsToRestoreOnStartup, sync_value, 6145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SyncChange::ACTION_UPDATE)); 6155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_->ProcessSyncChanges(FROM_HERE, list); 6165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(managed_value.Equals( 6185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.GetManagedPref(prefs::kURLsToRestoreOnStartup))); 6195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(sync_value.Equals( 6205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.GetUserPref(prefs::kURLsToRestoreOnStartup))); 6215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 6225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, DynamicManagedPreferences) { 6245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 6255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); 6265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out.clear(); 6275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue initial_value("http://example.com/initial"); 6285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetPrefs()->Set(prefs::kHomePage, initial_value); 6295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> actual(FindValue(prefs::kHomePage, out)); 6305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(actual.get()); 6315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(initial_value.Equals(actual.get())); 6325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Switch kHomePage to managed and set a different value. 6345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue managed_value("http://example.com/managed"); 6355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetTestingPrefService()->SetManagedPref(prefs::kHomePage, 6365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu managed_value.DeepCopy()); 6375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The pref value should be the one dictated by policy. 6395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage))); 6405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Switch kHomePage back to unmanaged. 6425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage); 6435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The original value should be picked up. 6455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(initial_value.Equals(&GetPreferenceValue(prefs::kHomePage))); 6465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 6475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, 6495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DynamicManagedPreferencesWithSyncChange) { 6505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 6515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); 6525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out.clear(); 6535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue initial_value("http://example.com/initial"); 6555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetPrefs()->Set(prefs::kHomePage, initial_value); 6565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::Value> actual(FindValue(prefs::kHomePage, out)); 6575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(initial_value.Equals(actual.get())); 6585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Switch kHomePage to managed and set a different value. 6605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue managed_value("http://example.com/managed"); 6615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetTestingPrefService()->SetManagedPref(prefs::kHomePage, 6625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu managed_value.DeepCopy()); 6635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Change the sync value. 6655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue sync_value("http://example.com/sync"); 6665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList list; 6675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu list.push_back(MakeRemoteChange( 6685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1, prefs::kHomePage, sync_value, SyncChange::ACTION_UPDATE)); 6695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pref_sync_service_->ProcessSyncChanges(FROM_HERE, list); 6705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The pref value should still be the one dictated by policy. 6725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage))); 6735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Switch kHomePage back to unmanaged. 6755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage); 6765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Sync value should be picked up. 6785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(sync_value.Equals(&GetPreferenceValue(prefs::kHomePage))); 6795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 6805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PrefsSyncableServiceTest, DynamicManagedDefaultPreferences) { 6825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const PrefService::Preference* pref = 6835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prefs_.FindPreference(prefs::kHomePage); 6845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(pref->IsDefaultValue()); 6855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu syncer::SyncChangeList out; 6865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InitWithSyncDataTakeOutput(syncer::SyncDataList(), &out); 6875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(IsSynced(prefs::kHomePage)); 6895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(pref->IsDefaultValue()); 6905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(FindValue(prefs::kHomePage, out).get()); 6915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out.clear(); 6925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Switch kHomePage to managed and set a different value. 6945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::StringValue managed_value("http://example.com/managed"); 6955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetTestingPrefService()->SetManagedPref(prefs::kHomePage, 6966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) managed_value.DeepCopy()); 6975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The pref value should be the one dictated by policy. 6985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(managed_value.Equals(&GetPreferenceValue(prefs::kHomePage))); 6995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(pref->IsDefaultValue()); 7005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // There should be no synced value. 7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(FindValue(prefs::kHomePage, out).get()); 7025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Switch kHomePage back to unmanaged. 7035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetTestingPrefService()->RemoveManagedPref(prefs::kHomePage); 7045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The original value should be picked up. 7055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(pref->IsDefaultValue()); 7065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // There should still be no synced value. 7075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(FindValue(prefs::kHomePage, out).get()); 7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 7096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PrefsSyncableServiceTest, DeletePreference) { 7116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) prefs_.SetString(prefs::kHomePage, kExampleUrl0); 7126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const PrefService::Preference* pref = 7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) prefs_.FindPreference(prefs::kHomePage); 7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(pref->IsDefaultValue()); 7156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InitWithNoSyncData(); 7176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<base::Value> null_value(base::Value::CreateNullValue()); 7196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) syncer::SyncChangeList list; 7206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) list.push_back(MakeRemoteChange( 7216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1, prefs::kHomePage, *null_value, SyncChange::ACTION_DELETE)); 7226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) pref_sync_service_->ProcessSyncChanges(FROM_HERE, list); 7236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(pref->IsDefaultValue()); 7246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 725