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