13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_change_registrar.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/test/testing_pref_service.h"
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_details.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_observer_mock.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_source.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_type.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "testing/gmock/include/gmock/gmock.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "testing/gtest/include/gtest/gtest.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickusing testing::Mock;
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickusing testing::Eq;
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace {
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// A mock provider that allows us to capture pref observer changes.
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass MockPrefService : public TestingPrefService {
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MockPrefService() {}
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~MockPrefService() {}
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MOCK_METHOD2(AddPrefObserver, void(const char*, NotificationObserver*));
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MOCK_METHOD2(RemovePrefObserver, void(const char*, NotificationObserver*));
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}  // namespace
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass PrefChangeRegistrarTest : public testing::Test {
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PrefChangeRegistrarTest() {}
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~PrefChangeRegistrarTest() {}
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetUp();
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NotificationObserver* observer() const { return observer_.get(); }
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MockPrefService* service() const { return service_.get(); }
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<MockPrefService> service_;
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<NotificationObserverMock> observer_;
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid PrefChangeRegistrarTest::SetUp() {
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  service_.reset(new MockPrefService());
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  observer_.reset(new NotificationObserverMock());
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(PrefChangeRegistrarTest, AddAndRemove) {
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PrefChangeRegistrar registrar;
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Init(service());
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Test adding.
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              AddPrefObserver(Eq(std::string("test.pref.2")), observer()));
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Add("test.pref.1", observer());
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Add("test.pref.2", observer());
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(registrar.IsEmpty());
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Test removing.
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Mock::VerifyAndClearExpectations(service());
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              RemovePrefObserver(Eq(std::string("test.pref.2")), observer()));
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Remove("test.pref.1", observer());
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Remove("test.pref.2", observer());
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(registrar.IsEmpty());
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Explicitly check the expectations now to make sure that the Removes
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // worked (rather than the registrar destructor doing the work).
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Mock::VerifyAndClearExpectations(service());
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(PrefChangeRegistrarTest, AutoRemove) {
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PrefChangeRegistrar registrar;
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Init(service());
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Setup of auto-remove.
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Add("test.pref.1", observer());
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Mock::VerifyAndClearExpectations(service());
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(registrar.IsEmpty());
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Test auto-removing.
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(PrefChangeRegistrarTest, RemoveAll) {
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PrefChangeRegistrar registrar;
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Init(service());
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              AddPrefObserver(Eq(std::string("test.pref.2")), observer()));
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Add("test.pref.1", observer());
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.Add("test.pref.2", observer());
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Mock::VerifyAndClearExpectations(service());
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_CALL(*service(),
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              RemovePrefObserver(Eq(std::string("test.pref.2")), observer()));
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar.RemoveAll();
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(registrar.IsEmpty());
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Explicitly check the expectations now to make sure that the RemoveAll
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // worked (rather than the registrar destructor doing the work).
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Mock::VerifyAndClearExpectations(service());
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
119