pref_member_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kBoolPref[] = "bool";
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kIntPref[] = "int";
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDoublePref[] = "double";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStringPref[] = "string";
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStringListPref[] = "string_list";
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RegisterTestPrefs(PrefRegistrySimple* registry) {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterBooleanPref(kBoolPref, false);
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterIntegerPref(kIntPref, 0);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterDoublePref(kDoublePref, 0.0);
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterStringPref(kStringPref, "default");
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterListPref(kStringListPref, new ListValue());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GetPrefValueHelper
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public base::RefCountedThreadSafe<GetPrefValueHelper> {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetPrefValueHelper() : value_(false), pref_thread_("pref thread") {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_thread_.Start();
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(const char* pref_name, PrefService* prefs) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_.Init(pref_name, prefs);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_.MoveToThread(pref_thread_.message_loop_proxy());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy() {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_.Destroy();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FetchValue() {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::WaitableEvent event(true, false);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pref_thread_.message_loop_proxy()->PostTask(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            FROM_HERE,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::Bind(&GetPrefValueHelper::GetPrefValue, this, &event)));
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.Wait();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The thread must be stopped on the main thread. GetPrefValueHelper being
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ref-counted, the destructor can be called from any thread.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopThread() {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_thread_.Stop();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool value() { return value_; }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class base::RefCountedThreadSafe<GetPrefValueHelper>;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~GetPrefValueHelper() {}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetPrefValue(base::WaitableEvent* event) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value_ = pref_.GetValue();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->Signal();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BooleanPrefMember pref_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool value_;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Thread pref_thread_;  // The thread |pref_| runs on.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefMemberTestClass {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PrefMemberTestClass(PrefService* prefs)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : observe_cnt_(0), prefs_(prefs) {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    str_.Init(kStringPref, prefs,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::Bind(&PrefMemberTestClass::OnPreferenceChanged,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         base::Unretained(this)));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnPreferenceChanged(const std::string& pref_name) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(pref_name, kStringPref);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(str_.GetValue(), prefs_->GetString(kStringPref));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++observe_cnt_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringPrefMember str_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int observe_cnt_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PrefMemberTest, BasicGetAndSet) {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RegisterTestPrefs(prefs.registry());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test bool
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BooleanPrefMember boolean;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  boolean.Init(kBoolPref, &prefs);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the defaults
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prefs.GetBoolean(kBoolPref));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(boolean.GetValue());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(*boolean);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing through the member variable.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  boolean.SetValue(true);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(boolean.GetValue());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(prefs.GetBoolean(kBoolPref));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(*boolean);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing back through the pref.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetBoolean(kBoolPref, false);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(prefs.GetBoolean(kBoolPref));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(boolean.GetValue());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(*boolean);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test int
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember integer;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  integer.Init(kIntPref, &prefs);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the defaults
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, prefs.GetInteger(kIntPref));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, integer.GetValue());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, *integer);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing through the member variable.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  integer.SetValue(5);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, integer.GetValue());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, prefs.GetInteger(kIntPref));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, *integer);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing back through the pref.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetInteger(kIntPref, 2);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, prefs.GetInteger(kIntPref));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, integer.GetValue());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, *integer);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test double
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoublePrefMember double_member;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double_member.Init(kDoublePref, &prefs);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the defaults
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, prefs.GetDouble(kDoublePref));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, double_member.GetValue());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, *double_member);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing through the member variable.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double_member.SetValue(1.0);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0, double_member.GetValue());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0, prefs.GetDouble(kDoublePref));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0, *double_member);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing back through the pref.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetDouble(kDoublePref, 3.0);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3.0, prefs.GetDouble(kDoublePref));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3.0, double_member.GetValue());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3.0, *double_member);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test string
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringPrefMember string;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string.Init(kStringPref, &prefs);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the defaults
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("default", prefs.GetString(kStringPref));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("default", string.GetValue());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("default", *string);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing through the member variable.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string.SetValue("foo");
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("foo", string.GetValue());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("foo", prefs.GetString(kStringPref));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("foo", *string);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing back through the pref.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetString(kStringPref, "bar");
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bar", prefs.GetString(kStringPref));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bar", string.GetValue());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bar", *string);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test string list
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue expected_list;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_vector;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringListPrefMember string_list;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string_list.Init(kStringListPref, &prefs);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the defaults
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_list.Equals(prefs.GetList(kStringListPref)));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, string_list.GetValue());
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, *string_list);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try changing through the pref member.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_list.AppendString("foo");
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_vector.push_back("foo");
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string_list.SetValue(expected_vector);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_list.Equals(prefs.GetList(kStringListPref)));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, string_list.GetValue());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, *string_list);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try adding through the pref.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_list.AppendString("bar");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_vector.push_back("bar");
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.Set(kStringListPref, expected_list);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_list.Equals(prefs.GetList(kStringListPref)));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, string_list.GetValue());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, *string_list);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try removing through the pref.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_list.Remove(0, NULL);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_vector.erase(expected_vector.begin());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.Set(kStringListPref, expected_list);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_list.Equals(prefs.GetList(kStringListPref)));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, string_list.GetValue());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, *string_list);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PrefMemberTest, InvalidList) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the vector to an initial good value.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_vector;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_vector.push_back("foo");
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to add a valid list first.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue list;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.AppendString("foo");
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> vector;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(subtle::PrefMemberVectorStringUpdate(list, &vector));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, vector);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try to add an invalid list.  |vector| should not be changed.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.AppendInteger(0);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(subtle::PrefMemberVectorStringUpdate(list, &vector));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_vector, vector);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PrefMemberTest, TwoPrefs) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure two DoublePrefMembers stay in sync.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RegisterTestPrefs(prefs.registry());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoublePrefMember pref1;
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref1.Init(kDoublePref, &prefs);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoublePrefMember pref2;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref2.Init(kDoublePref, &prefs);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref1.SetValue(2.3);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2.3, *pref2);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref2.SetValue(3.5);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3.5, *pref1);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetDouble(kDoublePref, 4.2);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4.2, *pref1);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4.2, *pref2);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PrefMemberTest, Observer) {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RegisterTestPrefs(prefs.registry());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefMemberTestClass test_obj(&prefs);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("default", *test_obj.str_);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calling SetValue should not fire the observer.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_obj.str_.SetValue("hello");
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, test_obj.observe_cnt_);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hello", prefs.GetString(kStringPref));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changing the pref does fire the observer.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetString(kStringPref, "world");
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, test_obj.observe_cnt_);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("world", *(test_obj.str_));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not changing the value should not fire the observer.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetString(kStringPref, "world");
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, test_obj.observe_cnt_);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("world", *(test_obj.str_));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetString(kStringPref, "hello");
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, test_obj.observe_cnt_);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hello", prefs.GetString(kStringPref));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PrefMemberTest, NoInit) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure not calling Init on a PrefMember doesn't cause problems.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember pref;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PrefMemberTest, MoveToThread) {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<GetPrefValueHelper> helper(new GetPrefValueHelper());
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RegisterTestPrefs(prefs.registry());
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper->Init(kBoolPref, &prefs);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper->FetchValue();
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper->value());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs.SetBoolean(kBoolPref, true);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper->FetchValue();
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper->value());
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper->Destroy();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper->FetchValue();
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper->value());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper->StopThread();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
322