pref_member_unittest.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
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" 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/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"); 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) registry->RegisterListPref(kStringListPref, new base::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 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::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. 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::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