OLD | NEW |
| (Empty) |
1 // Copyright 2014 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/invalidation/invalidation_logger.h" | |
6 #include "chrome/browser/invalidation/invalidation_logger_observer.h" | |
7 | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 namespace invalidation { | |
11 | |
12 class InvalidationLoggerObserverTest : public InvalidationLoggerObserver { | |
13 public: | |
14 InvalidationLoggerObserverTest() { ResetStates(); } | |
15 | |
16 void ResetStates() { | |
17 registration_change_received = false; | |
18 state_received = false; | |
19 update_id_received = false; | |
20 debug_message_received = false; | |
21 invalidation_received = false; | |
22 detailed_status_received = false; | |
23 update_id_replicated = std::map<std::string, syncer::ObjectIdCountMap>(); | |
24 registered_handlers = std::multiset<std::string>(); | |
25 } | |
26 | |
27 virtual void OnRegistrationChange(const std::multiset<std::string>& handlers) | |
28 OVERRIDE { | |
29 registered_handlers = handlers; | |
30 registration_change_received = true; | |
31 } | |
32 | |
33 virtual void OnStateChange(const syncer::InvalidatorState& new_state, | |
34 const base::Time& last_change_timestamp) | |
35 OVERRIDE { | |
36 state_received = true; | |
37 } | |
38 | |
39 virtual void OnUpdateIds(const std::string& handler, | |
40 const syncer::ObjectIdCountMap& details) OVERRIDE { | |
41 update_id_received = true; | |
42 update_id_replicated[handler] = details; | |
43 } | |
44 | |
45 virtual void OnDebugMessage(const base::DictionaryValue& details) OVERRIDE { | |
46 debug_message_received = true; | |
47 } | |
48 | |
49 virtual void OnInvalidation( | |
50 const syncer::ObjectIdInvalidationMap& new_invalidations) OVERRIDE { | |
51 invalidation_received = true; | |
52 } | |
53 | |
54 virtual void OnDetailedStatus(const base::DictionaryValue& details) OVERRIDE { | |
55 detailed_status_received = true; | |
56 } | |
57 | |
58 bool registration_change_received; | |
59 bool state_received; | |
60 bool update_id_received; | |
61 bool debug_message_received; | |
62 bool invalidation_received; | |
63 bool detailed_status_received; | |
64 std::map<std::string, syncer::ObjectIdCountMap> update_id_replicated; | |
65 std::multiset<std::string> registered_handlers; | |
66 }; | |
67 | |
68 // Test that the callbacks are actually being called when observers are | |
69 // registered and don't produce any other callback in the meantime. | |
70 TEST(InvalidationLoggerTest, TestCallbacks) { | |
71 InvalidationLogger log; | |
72 InvalidationLoggerObserverTest observer_test; | |
73 | |
74 log.RegisterObserver(&observer_test); | |
75 log.OnStateChange(syncer::INVALIDATIONS_ENABLED); | |
76 EXPECT_TRUE(observer_test.state_received); | |
77 EXPECT_FALSE(observer_test.update_id_received); | |
78 EXPECT_FALSE(observer_test.registration_change_received); | |
79 EXPECT_FALSE(observer_test.invalidation_received); | |
80 EXPECT_FALSE(observer_test.debug_message_received); | |
81 EXPECT_FALSE(observer_test.detailed_status_received); | |
82 | |
83 observer_test.ResetStates(); | |
84 | |
85 log.OnInvalidation(syncer::ObjectIdInvalidationMap()); | |
86 EXPECT_TRUE(observer_test.invalidation_received); | |
87 EXPECT_FALSE(observer_test.state_received); | |
88 EXPECT_FALSE(observer_test.update_id_received); | |
89 EXPECT_FALSE(observer_test.registration_change_received); | |
90 EXPECT_FALSE(observer_test.debug_message_received); | |
91 EXPECT_FALSE(observer_test.detailed_status_received); | |
92 | |
93 log.UnregisterObserver(&observer_test); | |
94 } | |
95 | |
96 // Test that after registering an observer and then unregistering it | |
97 // no callbacks regarding that observer are called. | |
98 // (i.e. the observer is cleanly removed) | |
99 TEST(InvalidationLoggerTest, TestReleaseOfObserver) { | |
100 InvalidationLogger log; | |
101 InvalidationLoggerObserverTest observer_test; | |
102 | |
103 log.RegisterObserver(&observer_test); | |
104 log.UnregisterObserver(&observer_test); | |
105 | |
106 log.OnInvalidation(syncer::ObjectIdInvalidationMap()); | |
107 log.OnStateChange(syncer::INVALIDATIONS_ENABLED); | |
108 log.OnRegistration(std::string()); | |
109 log.OnUnregistration(std::string()); | |
110 log.OnDebugMessage(base::DictionaryValue()); | |
111 log.OnUpdateIds(std::map<std::string, syncer::ObjectIdSet>()); | |
112 EXPECT_FALSE(observer_test.registration_change_received); | |
113 EXPECT_FALSE(observer_test.update_id_received); | |
114 EXPECT_FALSE(observer_test.invalidation_received); | |
115 EXPECT_FALSE(observer_test.state_received); | |
116 EXPECT_FALSE(observer_test.debug_message_received); | |
117 EXPECT_FALSE(observer_test.detailed_status_received); | |
118 } | |
119 | |
120 // Test the EmitContet in InvalidationLogger is actually | |
121 // sending state and updateIds notifications. | |
122 TEST(InvalidationLoggerTest, TestEmitContent) { | |
123 InvalidationLogger log; | |
124 InvalidationLoggerObserverTest observer_test; | |
125 | |
126 log.RegisterObserver(&observer_test); | |
127 EXPECT_FALSE(observer_test.state_received); | |
128 EXPECT_FALSE(observer_test.update_id_received); | |
129 log.EmitContent(); | |
130 // Expect state and registered handlers only because no Ids were registered. | |
131 EXPECT_TRUE(observer_test.state_received); | |
132 EXPECT_TRUE(observer_test.registration_change_received); | |
133 EXPECT_FALSE(observer_test.update_id_received); | |
134 EXPECT_FALSE(observer_test.invalidation_received); | |
135 EXPECT_FALSE(observer_test.debug_message_received); | |
136 EXPECT_FALSE(observer_test.detailed_status_received); | |
137 | |
138 observer_test.ResetStates(); | |
139 std::map<std::string, syncer::ObjectIdSet> test_map; | |
140 test_map["Test"] = syncer::ObjectIdSet(); | |
141 log.OnUpdateIds(test_map); | |
142 EXPECT_TRUE(observer_test.update_id_received); | |
143 observer_test.ResetStates(); | |
144 | |
145 log.EmitContent(); | |
146 // Expect now state, ids and registered handlers change. | |
147 EXPECT_TRUE(observer_test.state_received); | |
148 EXPECT_TRUE(observer_test.update_id_received); | |
149 EXPECT_TRUE(observer_test.registration_change_received); | |
150 EXPECT_FALSE(observer_test.invalidation_received); | |
151 EXPECT_FALSE(observer_test.debug_message_received); | |
152 EXPECT_FALSE(observer_test.detailed_status_received); | |
153 log.UnregisterObserver(&observer_test); | |
154 } | |
155 | |
156 // Test that the updateId notification actually sends the same ObjectId that | |
157 // was sent to the Observer. | |
158 // The ObserverTest rebuilds the map that was sent in pieces by the logger. | |
159 TEST(InvalidationLoggerTest, TestUpdateIdsMap) { | |
160 InvalidationLogger log; | |
161 InvalidationLoggerObserverTest observer_test; | |
162 std::map<std::string, syncer::ObjectIdSet> send_test_map; | |
163 std::map<std::string, syncer::ObjectIdCountMap> expected_received_map; | |
164 log.RegisterObserver(&observer_test); | |
165 | |
166 syncer::ObjectIdSet sync_set_A; | |
167 syncer::ObjectIdCountMap counted_sync_set_A; | |
168 | |
169 ObjectId o1(1000, "DataType1"); | |
170 sync_set_A.insert(o1); | |
171 counted_sync_set_A[o1] = 0; | |
172 | |
173 ObjectId o2(1000, "DataType2"); | |
174 sync_set_A.insert(o2); | |
175 counted_sync_set_A[o2] = 0; | |
176 | |
177 syncer::ObjectIdSet sync_set_B; | |
178 syncer::ObjectIdCountMap counted_sync_set_B; | |
179 | |
180 ObjectId o3(1020, "DataTypeA"); | |
181 sync_set_B.insert(o3); | |
182 counted_sync_set_B[o3] = 0; | |
183 | |
184 send_test_map["TestA"] = sync_set_A; | |
185 send_test_map["TestB"] = sync_set_B; | |
186 expected_received_map["TestA"] = counted_sync_set_A; | |
187 expected_received_map["TestB"] = counted_sync_set_B; | |
188 | |
189 // Send the objects ids registered for the two different handler name. | |
190 log.OnUpdateIds(send_test_map); | |
191 EXPECT_EQ(expected_received_map, observer_test.update_id_replicated); | |
192 | |
193 syncer::ObjectIdSet sync_set_B2; | |
194 syncer::ObjectIdCountMap counted_sync_set_B2; | |
195 | |
196 ObjectId o4(1020, "DataTypeF"); | |
197 sync_set_B2.insert(o4); | |
198 counted_sync_set_B2[o4] = 0; | |
199 | |
200 ObjectId o5(1020, "DataTypeG"); | |
201 sync_set_B2.insert(o5); | |
202 counted_sync_set_B2[o5] = 0; | |
203 | |
204 send_test_map["TestB"] = sync_set_B2; | |
205 expected_received_map["TestB"] = counted_sync_set_B2; | |
206 | |
207 // Test now that if we replace the registered datatypes for TestB, the | |
208 // original don't show up again. | |
209 log.OnUpdateIds(send_test_map); | |
210 EXPECT_EQ(expected_received_map, observer_test.update_id_replicated); | |
211 | |
212 // The emit content should return the same map too. | |
213 observer_test.ResetStates(); | |
214 log.EmitContent(); | |
215 EXPECT_EQ(expected_received_map, observer_test.update_id_replicated); | |
216 log.UnregisterObserver(&observer_test); | |
217 } | |
218 | |
219 // Test that the invalidation notification changes the total count | |
220 // of invalidations received for that datatype. | |
221 TEST(InvalidationLoggerTest, TestInvalidtionsTotalCount) { | |
222 InvalidationLogger log; | |
223 InvalidationLoggerObserverTest observer_test; | |
224 log.RegisterObserver(&observer_test); | |
225 | |
226 std::map<std::string, syncer::ObjectIdSet> send_test_map; | |
227 std::map<std::string, syncer::ObjectIdCountMap> expected_received_map; | |
228 syncer::ObjectIdSet sync_set; | |
229 syncer::ObjectIdCountMap counted_sync_set; | |
230 | |
231 ObjectId o1(1020, "DataTypeA"); | |
232 sync_set.insert(o1); | |
233 counted_sync_set[o1] = 1; | |
234 | |
235 // Generate invalidation for datatype A only. | |
236 syncer::ObjectIdInvalidationMap fake_invalidations = | |
237 syncer::ObjectIdInvalidationMap::InvalidateAll(sync_set); | |
238 | |
239 ObjectId o2(1040, "DataTypeB"); | |
240 sync_set.insert(o2); | |
241 counted_sync_set[o2] = 0; | |
242 | |
243 // Registed the two objectIds and send an invalidation only for the | |
244 // Datatype A. | |
245 send_test_map["Test"] = sync_set; | |
246 log.OnUpdateIds(send_test_map); | |
247 log.OnInvalidation(fake_invalidations); | |
248 | |
249 expected_received_map["Test"] = counted_sync_set; | |
250 | |
251 // Reset the state of the observer to receive the ObjectIds with the | |
252 // count of invalidations received (1 and 0). | |
253 observer_test.ResetStates(); | |
254 log.EmitContent(); | |
255 EXPECT_EQ(expected_received_map, observer_test.update_id_replicated); | |
256 | |
257 log.UnregisterObserver(&observer_test); | |
258 } | |
259 | |
260 // Test that registered handlers are being sent to the observers. | |
261 TEST(InvalidationLoggerTest, TestRegisteredHandlers) { | |
262 InvalidationLogger log; | |
263 InvalidationLoggerObserverTest observer_test; | |
264 log.RegisterObserver(&observer_test); | |
265 | |
266 log.OnRegistration(std::string("FakeHandler1")); | |
267 std::multiset<std::string> test_multiset; | |
268 test_multiset.insert("FakeHandler1"); | |
269 EXPECT_TRUE(observer_test.registration_change_received); | |
270 EXPECT_EQ(observer_test.registered_handlers, test_multiset); | |
271 | |
272 observer_test.ResetStates(); | |
273 log.OnRegistration(std::string("FakeHandler2")); | |
274 test_multiset.insert("FakeHandler2"); | |
275 EXPECT_TRUE(observer_test.registration_change_received); | |
276 EXPECT_EQ(observer_test.registered_handlers, test_multiset); | |
277 | |
278 observer_test.ResetStates(); | |
279 log.OnUnregistration(std::string("FakeHandler2")); | |
280 test_multiset.erase("FakeHandler2"); | |
281 EXPECT_TRUE(observer_test.registration_change_received); | |
282 EXPECT_EQ(observer_test.registered_handlers, test_multiset); | |
283 | |
284 log.UnregisterObserver(&observer_test); | |
285 } | |
286 } // namespace invalidation | |
OLD | NEW |