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