| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" |
| 6 #include "base/bind_helpers.h" |
| 5 #include "base/prefs/public/pref_change_registrar.h" | 7 #include "base/prefs/public/pref_change_registrar.h" |
| 6 #include "base/prefs/public/pref_observer.h" | 8 #include "base/prefs/public/pref_observer.h" |
| 7 #include "chrome/test/base/testing_pref_service.h" | 9 #include "chrome/test/base/testing_pref_service.h" |
| 8 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 12 |
| 11 using testing::Mock; | 13 using testing::Mock; |
| 12 using testing::Eq; | 14 using testing::Eq; |
| 13 | 15 |
| 14 namespace { | 16 namespace { |
| 15 | 17 |
| 16 const char kHomePage[] = "homepage"; | 18 const char kHomePage[] = "homepage"; |
| 17 const char kHomePageIsNewTabPage[] = "homepage_is_newtabpage"; | 19 const char kHomePageIsNewTabPage[] = "homepage_is_newtabpage"; |
| 18 const char kApplicationLocale[] = "intl.app_locale"; | 20 const char kApplicationLocale[] = "intl.app_locale"; |
| 19 | 21 |
| 20 // TODO(joi): Use PrefObserverMock once it moves to base/prefs/. | |
| 21 class MockPrefObserver : public PrefObserver { | |
| 22 public: | |
| 23 virtual ~MockPrefObserver() {} | |
| 24 | |
| 25 MOCK_METHOD2(OnPreferenceChanged, void(PrefServiceBase*, const std::string&)); | |
| 26 }; | |
| 27 | |
| 28 // A mock provider that allows us to capture pref observer changes. | 22 // A mock provider that allows us to capture pref observer changes. |
| 29 class MockPrefService : public TestingPrefService { | 23 class MockPrefService : public TestingPrefService { |
| 30 public: | 24 public: |
| 31 MockPrefService() {} | 25 MockPrefService() {} |
| 32 virtual ~MockPrefService() {} | 26 virtual ~MockPrefService() {} |
| 33 | 27 |
| 34 MOCK_METHOD2(AddPrefObserver, | 28 MOCK_METHOD2(AddPrefObserver, |
| 35 void(const char*, PrefObserver*)); | 29 void(const char*, PrefObserver*)); |
| 36 MOCK_METHOD2(RemovePrefObserver, | 30 MOCK_METHOD2(RemovePrefObserver, |
| 37 void(const char*, PrefObserver*)); | 31 void(const char*, PrefObserver*)); |
| 38 }; | 32 }; |
| 39 | 33 |
| 34 // TODO(joi): Switch to MockPrefChangeCallback from |
| 35 // chrome/browser/prefs/mock_pref_change_callback.h once it can move |
| 36 // to base/prefs. |
| 37 class MockPrefChangeCallback { |
| 38 public: |
| 39 virtual ~MockPrefChangeCallback() {} |
| 40 |
| 41 MOCK_METHOD1(OnPreferenceChanged, void(const std::string&)); |
| 42 }; |
| 43 |
| 40 } // namespace | 44 } // namespace |
| 41 | 45 |
| 42 class PrefChangeRegistrarTest : public testing::Test { | 46 class PrefChangeRegistrarTest : public testing::Test { |
| 43 public: | 47 public: |
| 44 PrefChangeRegistrarTest() {} | 48 PrefChangeRegistrarTest() {} |
| 45 virtual ~PrefChangeRegistrarTest() {} | 49 virtual ~PrefChangeRegistrarTest() {} |
| 46 | 50 |
| 47 protected: | 51 protected: |
| 48 virtual void SetUp(); | 52 virtual void SetUp(); |
| 49 | 53 |
| 50 PrefObserver* observer() const { return observer_.get(); } | 54 base::Closure observer() const { |
| 55 return base::Bind(&base::DoNothing); |
| 56 } |
| 57 |
| 51 MockPrefService* service() const { return service_.get(); } | 58 MockPrefService* service() const { return service_.get(); } |
| 52 | 59 |
| 53 private: | 60 private: |
| 54 scoped_ptr<MockPrefService> service_; | 61 scoped_ptr<MockPrefService> service_; |
| 55 scoped_ptr<MockPrefObserver> observer_; | |
| 56 }; | 62 }; |
| 57 | 63 |
| 58 void PrefChangeRegistrarTest::SetUp() { | 64 void PrefChangeRegistrarTest::SetUp() { |
| 59 service_.reset(new MockPrefService()); | 65 service_.reset(new MockPrefService()); |
| 60 observer_.reset(new MockPrefObserver()); | |
| 61 } | 66 } |
| 62 | 67 |
| 63 TEST_F(PrefChangeRegistrarTest, AddAndRemove) { | 68 TEST_F(PrefChangeRegistrarTest, AddAndRemove) { |
| 64 PrefChangeRegistrar registrar; | 69 PrefChangeRegistrar registrar; |
| 65 registrar.Init(service()); | 70 registrar.Init(service()); |
| 66 | 71 |
| 67 // Test adding. | 72 // Test adding. |
| 68 EXPECT_CALL(*service(), | 73 EXPECT_CALL(*service(), |
| 69 AddPrefObserver(Eq(std::string("test.pref.1")), ®istrar)); | 74 AddPrefObserver(Eq(std::string("test.pref.1")), ®istrar)); |
| 70 EXPECT_CALL(*service(), | 75 EXPECT_CALL(*service(), |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 EXPECT_CALL(*service(), | 126 EXPECT_CALL(*service(), |
| 122 RemovePrefObserver(Eq(std::string("test.pref.2")), ®istrar)); | 127 RemovePrefObserver(Eq(std::string("test.pref.2")), ®istrar)); |
| 123 registrar.RemoveAll(); | 128 registrar.RemoveAll(); |
| 124 EXPECT_TRUE(registrar.IsEmpty()); | 129 EXPECT_TRUE(registrar.IsEmpty()); |
| 125 | 130 |
| 126 // Explicitly check the expectations now to make sure that the RemoveAll | 131 // Explicitly check the expectations now to make sure that the RemoveAll |
| 127 // worked (rather than the registrar destructor doing the work). | 132 // worked (rather than the registrar destructor doing the work). |
| 128 Mock::VerifyAndClearExpectations(service()); | 133 Mock::VerifyAndClearExpectations(service()); |
| 129 } | 134 } |
| 130 | 135 |
| 131 class ObserveSetOfPreferencesTest : public testing::Test, | 136 class ObserveSetOfPreferencesTest : public testing::Test { |
| 132 public PrefObserver { | |
| 133 public: | 137 public: |
| 134 virtual void SetUp() { | 138 virtual void SetUp() { |
| 135 pref_service_.reset(new TestingPrefService); | 139 pref_service_.reset(new TestingPrefService); |
| 136 pref_service_->RegisterStringPref(kHomePage, | 140 pref_service_->RegisterStringPref(kHomePage, |
| 137 "http://google.com", | 141 "http://google.com", |
| 138 PrefService::UNSYNCABLE_PREF); | 142 PrefService::UNSYNCABLE_PREF); |
| 139 pref_service_->RegisterBooleanPref(kHomePageIsNewTabPage, | 143 pref_service_->RegisterBooleanPref(kHomePageIsNewTabPage, |
| 140 false, | 144 false, |
| 141 PrefService::UNSYNCABLE_PREF); | 145 PrefService::UNSYNCABLE_PREF); |
| 142 pref_service_->RegisterStringPref(kApplicationLocale, | 146 pref_service_->RegisterStringPref(kApplicationLocale, |
| 143 "", | 147 "", |
| 144 PrefService::UNSYNCABLE_PREF); | 148 PrefService::UNSYNCABLE_PREF); |
| 145 } | 149 } |
| 146 | 150 |
| 147 PrefChangeRegistrar* CreatePrefChangeRegistrar( | 151 PrefChangeRegistrar* CreatePrefChangeRegistrar() { |
| 148 PrefObserver* observer) { | |
| 149 if (!observer) | |
| 150 observer = this; | |
| 151 PrefChangeRegistrar* pref_set = new PrefChangeRegistrar(); | 152 PrefChangeRegistrar* pref_set = new PrefChangeRegistrar(); |
| 153 base::Closure callback = base::Bind(&base::DoNothing); |
| 152 pref_set->Init(pref_service_.get()); | 154 pref_set->Init(pref_service_.get()); |
| 153 pref_set->Add(kHomePage, observer); | 155 pref_set->Add(kHomePage, callback); |
| 154 pref_set->Add(kHomePageIsNewTabPage, observer); | 156 pref_set->Add(kHomePageIsNewTabPage, callback); |
| 155 return pref_set; | 157 return pref_set; |
| 156 } | 158 } |
| 157 | 159 |
| 158 // PrefObserver (used to enable NULL as parameter to | |
| 159 // CreatePrefChangeRegistrar above). | |
| 160 virtual void OnPreferenceChanged(PrefServiceBase* service, | |
| 161 const std::string& pref_name) OVERRIDE { | |
| 162 } | |
| 163 | |
| 164 scoped_ptr<TestingPrefService> pref_service_; | 160 scoped_ptr<TestingPrefService> pref_service_; |
| 165 }; | 161 }; |
| 166 | 162 |
| 167 TEST_F(ObserveSetOfPreferencesTest, IsObserved) { | 163 TEST_F(ObserveSetOfPreferencesTest, IsObserved) { |
| 168 scoped_ptr<PrefChangeRegistrar> pref_set(CreatePrefChangeRegistrar(NULL)); | 164 scoped_ptr<PrefChangeRegistrar> pref_set(CreatePrefChangeRegistrar()); |
| 169 EXPECT_TRUE(pref_set->IsObserved(kHomePage)); | 165 EXPECT_TRUE(pref_set->IsObserved(kHomePage)); |
| 170 EXPECT_TRUE(pref_set->IsObserved(kHomePageIsNewTabPage)); | 166 EXPECT_TRUE(pref_set->IsObserved(kHomePageIsNewTabPage)); |
| 171 EXPECT_FALSE(pref_set->IsObserved(kApplicationLocale)); | 167 EXPECT_FALSE(pref_set->IsObserved(kApplicationLocale)); |
| 172 } | 168 } |
| 173 | 169 |
| 174 TEST_F(ObserveSetOfPreferencesTest, IsManaged) { | 170 TEST_F(ObserveSetOfPreferencesTest, IsManaged) { |
| 175 scoped_ptr<PrefChangeRegistrar> pref_set(CreatePrefChangeRegistrar(NULL)); | 171 scoped_ptr<PrefChangeRegistrar> pref_set(CreatePrefChangeRegistrar()); |
| 176 EXPECT_FALSE(pref_set->IsManaged()); | 172 EXPECT_FALSE(pref_set->IsManaged()); |
| 177 pref_service_->SetManagedPref(kHomePage, | 173 pref_service_->SetManagedPref(kHomePage, |
| 178 Value::CreateStringValue("http://crbug.com")); | 174 Value::CreateStringValue("http://crbug.com")); |
| 179 EXPECT_TRUE(pref_set->IsManaged()); | 175 EXPECT_TRUE(pref_set->IsManaged()); |
| 180 pref_service_->SetManagedPref(kHomePageIsNewTabPage, | 176 pref_service_->SetManagedPref(kHomePageIsNewTabPage, |
| 181 Value::CreateBooleanValue(true)); | 177 Value::CreateBooleanValue(true)); |
| 182 EXPECT_TRUE(pref_set->IsManaged()); | 178 EXPECT_TRUE(pref_set->IsManaged()); |
| 183 pref_service_->RemoveManagedPref(kHomePage); | 179 pref_service_->RemoveManagedPref(kHomePage); |
| 184 EXPECT_TRUE(pref_set->IsManaged()); | 180 EXPECT_TRUE(pref_set->IsManaged()); |
| 185 pref_service_->RemoveManagedPref(kHomePageIsNewTabPage); | 181 pref_service_->RemoveManagedPref(kHomePageIsNewTabPage); |
| 186 EXPECT_FALSE(pref_set->IsManaged()); | 182 EXPECT_FALSE(pref_set->IsManaged()); |
| 187 } | 183 } |
| 188 | 184 |
| 189 TEST_F(ObserveSetOfPreferencesTest, Observe) { | 185 TEST_F(ObserveSetOfPreferencesTest, Observe) { |
| 190 using testing::_; | 186 using testing::_; |
| 191 using testing::Mock; | 187 using testing::Mock; |
| 192 | 188 |
| 193 MockPrefObserver observer; | 189 MockPrefChangeCallback observer; |
| 194 scoped_ptr<PrefChangeRegistrar> pref_set( | 190 PrefChangeRegistrar pref_set; |
| 195 CreatePrefChangeRegistrar(&observer)); | 191 PrefChangeRegistrar::NamedChangeCallback callback = base::Bind( |
| 192 &MockPrefChangeCallback::OnPreferenceChanged, |
| 193 base::Unretained(&observer)); |
| 194 pref_set.Init(pref_service_.get()); |
| 195 pref_set.Add(kHomePage, callback); |
| 196 pref_set.Add(kHomePageIsNewTabPage, callback); |
| 196 | 197 |
| 197 EXPECT_CALL(observer, OnPreferenceChanged(pref_service_.get(), kHomePage)); | 198 EXPECT_CALL(observer, OnPreferenceChanged(kHomePage)); |
| 198 pref_service_->SetUserPref(kHomePage, | 199 pref_service_->SetUserPref(kHomePage, |
| 199 Value::CreateStringValue("http://crbug.com")); | 200 Value::CreateStringValue("http://crbug.com")); |
| 200 Mock::VerifyAndClearExpectations(&observer); | 201 Mock::VerifyAndClearExpectations(&observer); |
| 201 | 202 |
| 202 EXPECT_CALL(observer, OnPreferenceChanged(pref_service_.get(), | 203 EXPECT_CALL(observer, OnPreferenceChanged(kHomePageIsNewTabPage)); |
| 203 kHomePageIsNewTabPage)); | |
| 204 pref_service_->SetUserPref(kHomePageIsNewTabPage, | 204 pref_service_->SetUserPref(kHomePageIsNewTabPage, |
| 205 Value::CreateBooleanValue(true)); | 205 Value::CreateBooleanValue(true)); |
| 206 Mock::VerifyAndClearExpectations(&observer); | 206 Mock::VerifyAndClearExpectations(&observer); |
| 207 | 207 |
| 208 EXPECT_CALL(observer, OnPreferenceChanged(_, _)).Times(0); | 208 EXPECT_CALL(observer, OnPreferenceChanged(_)).Times(0); |
| 209 pref_service_->SetUserPref(kApplicationLocale, | 209 pref_service_->SetUserPref(kApplicationLocale, |
| 210 Value::CreateStringValue("en_US.utf8")); | 210 Value::CreateStringValue("en_US.utf8")); |
| 211 Mock::VerifyAndClearExpectations(&observer); | 211 Mock::VerifyAndClearExpectations(&observer); |
| 212 } | 212 } |
| OLD | NEW |