15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/pref_model_associator.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AbstractPreferenceMergeTest : public testing::Test {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_service_ = profile_.GetPrefs();
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetContentPattern(base::DictionaryValue* patterns_dict,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string& expression,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string& content_type,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int setting) {
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* expression_dict;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool found =
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        patterns_dict->GetDictionaryWithoutPathExpansion(expression,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         &expression_dict);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!found) {
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      expression_dict = new base::DictionaryValue;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      patterns_dict->SetWithoutPathExpansion(expression, expression_dict);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expression_dict->SetWithoutPathExpansion(
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        content_type, new base::FundamentalValue(setting));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPrefToEmpty(const std::string& pref_name) {
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<base::Value> empty_value;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PrefService::Preference* pref =
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pref_service_->FindPreference(pref_name.c_str());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(pref);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Value::Type type = pref->GetType();
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (type == base::Value::TYPE_DICTIONARY)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      empty_value.reset(new base::DictionaryValue);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (type == base::Value::TYPE_LIST)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      empty_value.reset(new base::ListValue);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FAIL();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_service_->Set(pref_name.c_str(), *empty_value);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListPreferenceMergeTest : public AbstractPreferenceMergeTest {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListPreferenceMergeTest() :
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      server_url0_("http://example.com/server0"),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      server_url1_("http://example.com/server1"),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      local_url0_("http://example.com/local0"),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      local_url1_("http://example.com/local1") {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractPreferenceMergeTest::SetUp();
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    server_url_list_.Append(new base::StringValue(server_url0_));
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    server_url_list_.Append(new base::StringValue(server_url1_));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string server_url0_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string server_url1_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string local_url0_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string local_url1_;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue server_url_list_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ListPreferenceMergeTest, NotListOrDictionary) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetString(prefs::kHomePage, local_url0_);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service_->FindPreference(prefs::kHomePage);
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<base::Value> server_value(new base::StringValue(server_url0_));
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *server_value));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(server_value.get()));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ListPreferenceMergeTest, LocalEmpty) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPrefToEmpty(prefs::kURLsToRestoreOnStartup);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service_->FindPreference(prefs::kURLsToRestoreOnStartup);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           server_url_list_));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(&server_url_list_));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ListPreferenceMergeTest, ServerNull) {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> null_value(base::Value::CreateNullValue());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListPrefUpdate update(pref_service_, prefs::kURLsToRestoreOnStartup);
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* local_list_value = update.Get();
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(local_url0_));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service_->FindPreference(prefs::kURLsToRestoreOnStartup);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *null_value));
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::ListValue* local_list_value =
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pref_service_->GetList(prefs::kURLsToRestoreOnStartup);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(local_list_value));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ListPreferenceMergeTest, ServerEmpty) {
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> empty_value(new base::ListValue);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListPrefUpdate update(pref_service_, prefs::kURLsToRestoreOnStartup);
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* local_list_value = update.Get();
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(local_url0_));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service_->FindPreference(prefs::kURLsToRestoreOnStartup);
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *empty_value));
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::ListValue* local_list_value =
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pref_service_->GetList(prefs::kURLsToRestoreOnStartup);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(local_list_value));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ListPreferenceMergeTest, Merge) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListPrefUpdate update(pref_service_, prefs::kURLsToRestoreOnStartup);
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* local_list_value = update.Get();
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(local_url0_));
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(local_url1_));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service_->FindPreference(prefs::kURLsToRestoreOnStartup);
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           server_url_list_));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue expected;
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected.Append(new base::StringValue(server_url0_));
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected.Append(new base::StringValue(server_url1_));
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected.Append(new base::StringValue(local_url0_));
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected.Append(new base::StringValue(local_url1_));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(&expected));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ListPreferenceMergeTest, Duplicates) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListPrefUpdate update(pref_service_, prefs::kURLsToRestoreOnStartup);
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* local_list_value = update.Get();
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(local_url0_));
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(server_url0_));
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(server_url1_));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service_->FindPreference(prefs::kURLsToRestoreOnStartup);
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           server_url_list_));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue expected;
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected.Append(new base::StringValue(server_url0_));
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected.Append(new base::StringValue(server_url1_));
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected.Append(new base::StringValue(local_url0_));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(&expected));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ListPreferenceMergeTest, Equals) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListPrefUpdate update(pref_service_, prefs::kURLsToRestoreOnStartup);
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* local_list_value = update.Get();
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(server_url0_));
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_list_value->Append(new base::StringValue(server_url1_));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> original(server_url_list_.DeepCopy());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service_->FindPreference(prefs::kURLsToRestoreOnStartup);
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           server_url_list_));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(original.get()));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryPreferenceMergeTest : public AbstractPreferenceMergeTest {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryPreferenceMergeTest() :
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expression0_("expression0"),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expression1_("expression1"),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expression2_("expression2"),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type0_("content_type0"),
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type1_("content_type1") {}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractPreferenceMergeTest::SetUp();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(&server_patterns_, expression0_, content_type0_, 1);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(&server_patterns_, expression0_, content_type1_, 2);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(&server_patterns_, expression1_, content_type0_, 1);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expression0_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expression1_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expression2_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content_type0_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content_type1_;
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue server_patterns_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DictionaryPreferenceMergeTest, LocalEmpty) {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetPrefToEmpty(prefs::kContentSettingsPatternPairs);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service_->FindPreference(prefs::kContentSettingsPatternPairs);
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           server_patterns_));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(&server_patterns_));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DictionaryPreferenceMergeTest, ServerNull) {
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> null_value(base::Value::CreateNullValue());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate update(pref_service_,
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                prefs::kContentSettingsPatternPairs);
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* local_dict_value = update.Get();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression2_, content_type0_, 1);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service_->FindPreference(prefs::kContentSettingsPatternPairs);
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *null_value));
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::DictionaryValue* local_dict_value =
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service_->GetDictionary(prefs::kContentSettingsPatternPairs);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(local_dict_value));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DictionaryPreferenceMergeTest, ServerEmpty) {
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> empty_value(new base::DictionaryValue);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate update(pref_service_,
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                prefs::kContentSettingsPatternPairs);
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* local_dict_value = update.Get();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression2_, content_type0_, 1);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrefService::Preference* pref =
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service_->FindPreference(prefs::kContentSettingsPatternPairs);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefModelAssociator::MergePreference(pref->name(),
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *pref->GetValue(),
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           *empty_value));
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::DictionaryValue* local_dict_value =
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service_->GetDictionary(prefs::kContentSettingsPatternPairs);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(local_dict_value));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DictionaryPreferenceMergeTest, MergeNoConflicts) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate update(pref_service_,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                prefs::kContentSettingsPatternPairs);
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* local_dict_value = update.Get();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression2_, content_type0_, 1);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(PrefModelAssociator::MergePreference(
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     prefs::kContentSettingsPatternPairs,
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *pref_service_->FindPreference(prefs::kContentSettingsPatternPairs)->
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetValue(),
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      server_patterns_));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue expected;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression0_, content_type0_, 1);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression0_, content_type1_, 2);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression1_, content_type0_, 1);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression2_, content_type0_, 1);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(&expected));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DictionaryPreferenceMergeTest, MergeConflicts) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate update(pref_service_,
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                prefs::kContentSettingsPatternPairs);
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* local_dict_value = update.Get();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression0_, content_type0_, 2);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression1_, content_type0_, 1);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression1_, content_type1_, 1);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression2_, content_type0_, 2);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(PrefModelAssociator::MergePreference(
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kContentSettingsPatternPairs,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *pref_service_->FindPreference(prefs::kContentSettingsPatternPairs)->
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetValue(),
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      server_patterns_));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue expected;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression0_, content_type0_, 1);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression0_, content_type1_, 2);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression1_, content_type0_, 1);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression1_, content_type1_, 1);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentPattern(&expected, expression2_, content_type0_, 2);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(&expected));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DictionaryPreferenceMergeTest, Equal) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate update(pref_service_,
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                prefs::kContentSettingsPatternPairs);
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* local_dict_value = update.Get();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression0_, content_type0_, 1);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression0_, content_type1_, 2);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression1_, content_type0_, 1);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(PrefModelAssociator::MergePreference(
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kContentSettingsPatternPairs,
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *pref_service_->
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FindPreference(prefs::kContentSettingsPatternPairs)->GetValue(),
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      server_patterns_));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(&server_patterns_));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DictionaryPreferenceMergeTest, ConflictButServerWins) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate update(pref_service_,
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                prefs::kContentSettingsPatternPairs);
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* local_dict_value = update.Get();
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression0_, content_type0_, 2);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression0_, content_type1_, 2);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(local_dict_value, expression1_, content_type0_, 1);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> merged_value(PrefModelAssociator::MergePreference(
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kContentSettingsPatternPairs,
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *pref_service_->
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FindPreference(prefs::kContentSettingsPatternPairs)->GetValue(),
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      server_patterns_));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_value->Equals(&server_patterns_));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndividualPreferenceMergeTest : public AbstractPreferenceMergeTest {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndividualPreferenceMergeTest() :
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url0_("http://example.com/server0"),
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url1_("http://example.com/server1"),
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expression0_("expression0"),
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expression1_("expression1"),
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type0_("content_type0") {}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractPreferenceMergeTest::SetUp();
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    server_url_list_.Append(new base::StringValue(url0_));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(&server_patterns_, expression0_, content_type0_, 1);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MergeListPreference(const char* pref) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ListPrefUpdate update(pref_service_, pref);
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ListValue* local_list_value = update.Get();
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      local_list_value->Append(new base::StringValue(url1_));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<base::Value> merged_value(PrefModelAssociator::MergePreference(
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pref,
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *pref_service_->GetUserPrefValue(pref),
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        server_url_list_));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue expected;
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected.Append(new base::StringValue(url0_));
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected.Append(new base::StringValue(url1_));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return merged_value->Equals(&expected);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MergeDictionaryPreference(const char* pref) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryPrefUpdate update(pref_service_, pref);
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::DictionaryValue* local_dict_value = update.Get();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetContentPattern(local_dict_value, expression1_, content_type0_, 1);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<base::Value> merged_value(PrefModelAssociator::MergePreference(
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pref,
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *pref_service_->GetUserPrefValue(pref),
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        server_patterns_));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue expected;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(&expected, expression0_, content_type0_, 1);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentPattern(&expected, expression1_, content_type0_, 1);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return merged_value->Equals(&expected);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url0_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url1_;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expression0_;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expression1_;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content_type0_;
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue server_url_list_;
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue server_patterns_;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IndividualPreferenceMergeTest, URLsToRestoreOnStartup) {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(MergeListPreference(prefs::kURLsToRestoreOnStartup));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
422