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
3// found in the LICENSE file.
4
5#include "chrome/browser/prefs/pref_change_registrar.h"
6#include "chrome/test/testing_pref_service.h"
7#include "content/common/notification_details.h"
8#include "content/common/notification_observer_mock.h"
9#include "content/common/notification_source.h"
10#include "content/common/notification_type.h"
11#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14using testing::Mock;
15using testing::Eq;
16
17namespace {
18
19// A mock provider that allows us to capture pref observer changes.
20class MockPrefService : public TestingPrefService {
21 public:
22  MockPrefService() {}
23  virtual ~MockPrefService() {}
24
25  MOCK_METHOD2(AddPrefObserver, void(const char*, NotificationObserver*));
26  MOCK_METHOD2(RemovePrefObserver, void(const char*, NotificationObserver*));
27};
28
29}  // namespace
30
31class PrefChangeRegistrarTest : public testing::Test {
32 public:
33  PrefChangeRegistrarTest() {}
34  virtual ~PrefChangeRegistrarTest() {}
35
36 protected:
37  virtual void SetUp();
38
39  NotificationObserver* observer() const { return observer_.get(); }
40  MockPrefService* service() const { return service_.get(); }
41
42 private:
43  scoped_ptr<MockPrefService> service_;
44  scoped_ptr<NotificationObserverMock> observer_;
45};
46
47void PrefChangeRegistrarTest::SetUp() {
48  service_.reset(new MockPrefService());
49  observer_.reset(new NotificationObserverMock());
50}
51
52TEST_F(PrefChangeRegistrarTest, AddAndRemove) {
53  PrefChangeRegistrar registrar;
54  registrar.Init(service());
55
56  // Test adding.
57  EXPECT_CALL(*service(),
58              AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
59  EXPECT_CALL(*service(),
60              AddPrefObserver(Eq(std::string("test.pref.2")), observer()));
61  registrar.Add("test.pref.1", observer());
62  registrar.Add("test.pref.2", observer());
63  EXPECT_FALSE(registrar.IsEmpty());
64
65  // Test removing.
66  Mock::VerifyAndClearExpectations(service());
67  EXPECT_CALL(*service(),
68              RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
69  EXPECT_CALL(*service(),
70              RemovePrefObserver(Eq(std::string("test.pref.2")), observer()));
71  registrar.Remove("test.pref.1", observer());
72  registrar.Remove("test.pref.2", observer());
73  EXPECT_TRUE(registrar.IsEmpty());
74
75  // Explicitly check the expectations now to make sure that the Removes
76  // worked (rather than the registrar destructor doing the work).
77  Mock::VerifyAndClearExpectations(service());
78}
79
80TEST_F(PrefChangeRegistrarTest, AutoRemove) {
81  PrefChangeRegistrar registrar;
82  registrar.Init(service());
83
84  // Setup of auto-remove.
85  EXPECT_CALL(*service(),
86              AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
87  registrar.Add("test.pref.1", observer());
88  Mock::VerifyAndClearExpectations(service());
89  EXPECT_FALSE(registrar.IsEmpty());
90
91  // Test auto-removing.
92  EXPECT_CALL(*service(),
93              RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
94}
95
96TEST_F(PrefChangeRegistrarTest, RemoveAll) {
97  PrefChangeRegistrar registrar;
98  registrar.Init(service());
99
100  EXPECT_CALL(*service(),
101              AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
102  EXPECT_CALL(*service(),
103              AddPrefObserver(Eq(std::string("test.pref.2")), observer()));
104  registrar.Add("test.pref.1", observer());
105  registrar.Add("test.pref.2", observer());
106  Mock::VerifyAndClearExpectations(service());
107
108  EXPECT_CALL(*service(),
109              RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
110  EXPECT_CALL(*service(),
111              RemovePrefObserver(Eq(std::string("test.pref.2")), observer()));
112  registrar.RemoveAll();
113  EXPECT_TRUE(registrar.IsEmpty());
114
115  // Explicitly check the expectations now to make sure that the RemoveAll
116  // worked (rather than the registrar destructor doing the work).
117  Mock::VerifyAndClearExpectations(service());
118}
119