OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012 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/extensions/api/push_messaging/push_messaging_invalidati on_handler.h" | |
6 | |
7 #include "base/basictypes.h" | |
8 #include "base/memory/scoped_ptr.h" | |
9 #include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidati on_handler_observer.h" | |
10 #include "chrome/browser/sync/invalidation_service.h" | |
11 #include "google/cacheinvalidation/types.pb.h" | |
12 #include "testing/gmock/include/gmock/gmock.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 using ::testing::_; | |
16 using ::testing::InSequence; | |
17 using ::testing::NotNull; | |
18 using ::testing::SaveArg; | |
19 using ::testing::StrictMock; | |
20 | |
21 namespace extensions { | |
22 | |
23 namespace { | |
Munjal (Google)
2012/08/20 19:26:00
NIt: Put hte anonymous namesapce outside of extens
dcheng
2012/08/20 20:58:21
This is for convenience: that way, I don't need to
| |
24 | |
25 class MockInvalidationService : public InvalidationService { | |
26 public: | |
27 MockInvalidationService(); | |
28 ~MockInvalidationService(); | |
29 MOCK_METHOD1(RegisterInvalidationHandler, | |
30 void(syncer::SyncNotifierObserver*)); | |
31 MOCK_METHOD2(UpdateRegisteredInvalidationIds, | |
32 void(syncer::SyncNotifierObserver*, const syncer::ObjectIdSet&)); | |
33 MOCK_METHOD1(UnregisterInvalidationHandler, | |
34 void(syncer::SyncNotifierObserver*)); | |
35 | |
36 private: | |
37 DISALLOW_COPY_AND_ASSIGN(MockInvalidationService); | |
38 }; | |
39 | |
40 MockInvalidationService::MockInvalidationService() {} | |
41 MockInvalidationService::~MockInvalidationService() {} | |
42 | |
43 class MockInvalidationHandlerObserver | |
44 : public PushMessagingInvalidationHandlerObserver { | |
45 public: | |
46 MockInvalidationHandlerObserver(); | |
47 ~MockInvalidationHandlerObserver(); | |
48 MOCK_METHOD3(OnMessage, | |
49 void(const std::string&, int, const std::string&)); | |
50 | |
51 private: | |
52 DISALLOW_COPY_AND_ASSIGN(MockInvalidationHandlerObserver); | |
53 }; | |
54 | |
55 MockInvalidationHandlerObserver::MockInvalidationHandlerObserver() {} | |
56 MockInvalidationHandlerObserver::~MockInvalidationHandlerObserver() {} | |
57 | |
58 class PushMessagingInvalidationHandlerTest : public ::testing::Test { | |
59 protected: | |
60 virtual void SetUp() OVERRIDE { | |
61 SetUpWithArgs(std::set<std::string>(), syncer::ObjectIdSet()); | |
62 } | |
63 | |
64 virtual void SetUpWithArgs(const std::set<std::string>& extension_ids, | |
65 const syncer::ObjectIdSet& expected_ids) { | |
66 InSequence seq; | |
67 syncer::SyncNotifierObserver* handler[2] = {}; | |
68 EXPECT_CALL(service_, RegisterInvalidationHandler(NotNull())) | |
69 .WillOnce(SaveArg<0>(&handler[0])); | |
70 EXPECT_CALL(service_, | |
71 UpdateRegisteredInvalidationIds(NotNull(), expected_ids)) | |
72 .WillOnce(SaveArg<0>(&handler[1])); | |
73 handler_.reset(new PushMessagingInvalidationHandler( | |
74 &service_, &observer_, extension_ids)); | |
75 EXPECT_EQ(handler[0], handler[1]); | |
76 EXPECT_EQ(handler_.get(), handler[0]); | |
77 | |
78 } | |
79 virtual void TearDown() OVERRIDE { | |
80 EXPECT_CALL(service_, UnregisterInvalidationHandler(handler_.get())); | |
81 handler_.reset(); | |
82 } | |
83 StrictMock<MockInvalidationService> service_; | |
84 StrictMock<MockInvalidationHandlerObserver> observer_; | |
85 scoped_ptr<PushMessagingInvalidationHandler> handler_; | |
86 }; | |
87 | |
88 // Tests that we correctly register any extensions passed in when constructed. | |
89 TEST_F(PushMessagingInvalidationHandlerTest, Construction) { | |
90 TearDown(); | |
91 | |
92 InSequence seq; | |
93 std::set<std::string> extension_ids; | |
94 extension_ids.insert("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); | |
95 extension_ids.insert("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); | |
96 syncer::ObjectIdSet expected_ids; | |
97 expected_ids.insert(invalidation::ObjectId( | |
98 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
99 "U/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/0")); | |
100 expected_ids.insert(invalidation::ObjectId( | |
101 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
102 "U/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/1")); | |
103 expected_ids.insert(invalidation::ObjectId( | |
104 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
105 "U/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/2")); | |
106 expected_ids.insert(invalidation::ObjectId( | |
107 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
108 "U/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/3")); | |
109 expected_ids.insert(invalidation::ObjectId( | |
110 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
111 "U/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/0")); | |
112 expected_ids.insert(invalidation::ObjectId( | |
113 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
114 "U/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/1")); | |
115 expected_ids.insert(invalidation::ObjectId( | |
116 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
117 "U/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/2")); | |
118 expected_ids.insert(invalidation::ObjectId( | |
119 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
120 "U/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/3")); | |
121 | |
122 SetUpWithArgs(extension_ids, expected_ids); | |
123 } | |
124 | |
125 TEST_F(PushMessagingInvalidationHandlerTest, RegisterUnregisterExtension) { | |
126 syncer::ObjectIdSet expected_ids; | |
127 expected_ids.insert(invalidation::ObjectId( | |
128 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
129 "U/cccccccccccccccccccccccccccccccc/0")); | |
130 expected_ids.insert(invalidation::ObjectId( | |
131 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
132 "U/cccccccccccccccccccccccccccccccc/1")); | |
133 expected_ids.insert(invalidation::ObjectId( | |
134 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
135 "U/cccccccccccccccccccccccccccccccc/2")); | |
136 expected_ids.insert(invalidation::ObjectId( | |
137 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
138 "U/cccccccccccccccccccccccccccccccc/3")); | |
139 EXPECT_CALL(service_, | |
140 UpdateRegisteredInvalidationIds(handler_.get(), expected_ids)); | |
141 handler_->RegisterExtension("cccccccccccccccccccccccccccccccc"); | |
142 EXPECT_CALL(service_, | |
143 UpdateRegisteredInvalidationIds(handler_.get(), | |
144 syncer::ObjectIdSet())); | |
145 handler_->UnregisterExtension("cccccccccccccccccccccccccccccccc"); | |
146 } | |
147 | |
148 TEST_F(PushMessagingInvalidationHandlerTest, Dispatch) { | |
149 syncer::ObjectIdSet ids; | |
150 ids.insert(invalidation::ObjectId( | |
151 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
152 "U/dddddddddddddddddddddddddddddddd/0")); | |
153 ids.insert(invalidation::ObjectId( | |
154 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
155 "U/dddddddddddddddddddddddddddddddd/3")); | |
156 EXPECT_CALL(observer_, | |
157 OnMessage("dddddddddddddddddddddddddddddddd", 0, "payload")); | |
158 EXPECT_CALL(observer_, | |
159 OnMessage("dddddddddddddddddddddddddddddddd", 3, "payload")); | |
160 handler_->OnIncomingNotification(ObjectIdSetToPayloadMap(ids, "payload"), | |
161 syncer::REMOTE_NOTIFICATION); | |
162 } | |
163 | |
164 // Tests that malformed object IDs don't trigger spurious callbacks. | |
165 TEST_F(PushMessagingInvalidationHandlerTest, DispatchInvalidObjectIds) { | |
166 syncer::ObjectIdSet ids; | |
167 // Incorrect source. | |
168 ids.insert(invalidation::ObjectId( | |
169 ipc::invalidation::ObjectSource::TEST, | |
170 "U/dddddddddddddddddddddddddddddddd/3")); | |
171 // Incorrect format type. | |
172 ids.insert(invalidation::ObjectId( | |
173 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
174 "V/dddddddddddddddddddddddddddddddd/3")); | |
175 // Invalid extension ID length. | |
176 ids.insert(invalidation::ObjectId( | |
177 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
178 "U/ddddddddddddddddddddddddddddddddd/3")); | |
179 // Non-numeric subchannel. | |
180 ids.insert(invalidation::ObjectId( | |
181 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
182 "U/dddddddddddddddddddddddddddddddd/z")); | |
183 // Subchannel out of range. | |
184 ids.insert(invalidation::ObjectId( | |
185 ipc::invalidation::ObjectSource::CHROME_COMPONENTS, | |
186 "U/dddddddddddddddddddddddddddddddd/4")); | |
187 handler_->OnIncomingNotification(ObjectIdSetToPayloadMap(ids, "payload"), | |
188 syncer::REMOTE_NOTIFICATION); | |
189 } | |
190 | |
191 } // namespace | |
192 | |
193 } // namespace extensions | |
OLD | NEW |