OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "google/cacheinvalidation/types.pb.h" | 5 #include "google/cacheinvalidation/types.pb.h" |
| 6 #include "sync/notifier/mock_sync_notifier_observer.h" |
6 #include "sync/notifier/sync_notifier_helper.h" | 7 #include "sync/notifier/sync_notifier_helper.h" |
7 #include "sync/notifier/mock_sync_notifier_observer.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 using testing::StrictMock; | |
11 | |
12 namespace syncer { | 10 namespace syncer { |
13 | 11 |
| 12 namespace { |
| 13 |
| 14 using testing::InSequence; |
| 15 using testing::StrictMock; |
| 16 |
| 17 const char kHandlerName1[] = "handler_name1"; |
| 18 const char kHandlerName2[] = "handler_name2"; |
| 19 |
14 class SyncNotifierHelperTest : public testing::Test { | 20 class SyncNotifierHelperTest : public testing::Test { |
15 protected: | 21 protected: |
16 SyncNotifierHelperTest() | 22 SyncNotifierHelperTest() |
17 : kObjectId1(ipc::invalidation::ObjectSource::TEST, "a"), | 23 : kObjectId1(ipc::invalidation::ObjectSource::TEST, "a"), |
18 kObjectId2(ipc::invalidation::ObjectSource::TEST, "b"), | 24 kObjectId2(ipc::invalidation::ObjectSource::TEST, "b"), |
19 kObjectId3(ipc::invalidation::ObjectSource::TEST, "c") { | 25 kObjectId3(ipc::invalidation::ObjectSource::TEST, "c") { |
20 } | 26 } |
21 | 27 |
22 invalidation::ObjectId kObjectId1; | 28 invalidation::ObjectId kObjectId1; |
23 invalidation::ObjectId kObjectId2; | 29 invalidation::ObjectId kObjectId2; |
24 invalidation::ObjectId kObjectId3; | 30 invalidation::ObjectId kObjectId3; |
25 }; | 31 }; |
26 | 32 |
27 // Basic check that registrations are correctly updated for one handler. | 33 // Basic check that registrations are correctly updated for one handler. |
28 TEST_F(SyncNotifierHelperTest, Basic) { | 34 TEST_F(SyncNotifierHelperTest, Basic) { |
| 35 InSequence dummy; |
| 36 |
29 SyncNotifierHelper helper; | 37 SyncNotifierHelper helper; |
| 38 |
30 StrictMock<MockSyncNotifierObserver> observer; | 39 StrictMock<MockSyncNotifierObserver> observer; |
| 40 |
| 41 ObjectIdPayloadMap expected_payload1; |
| 42 expected_payload1[kObjectId1] = "1"; |
| 43 expected_payload1[kObjectId2] = "2"; |
| 44 EXPECT_CALL(observer, OnIncomingNotification(expected_payload1, |
| 45 REMOTE_NOTIFICATION)); |
| 46 |
| 47 ObjectIdPayloadMap expected_payload2; |
| 48 expected_payload2[kObjectId2] = "2"; |
| 49 expected_payload2[kObjectId3] = "3"; |
| 50 EXPECT_CALL(observer, OnIncomingNotification(expected_payload2, |
| 51 REMOTE_NOTIFICATION)); |
| 52 |
| 53 helper.SetHandler(kHandlerName1, &observer); |
| 54 |
31 ObjectIdSet ids; | 55 ObjectIdSet ids; |
32 ids.insert(kObjectId1); | 56 ids.insert(kObjectId1); |
33 ids.insert(kObjectId2); | 57 ids.insert(kObjectId2); |
34 helper.UpdateRegisteredIds(&observer, ids); | 58 helper.UpdateRegisteredIds(kHandlerName1, ids); |
35 | 59 |
36 ObjectIdPayloadMap dispatched_payloads; | 60 ObjectIdPayloadMap dispatched_payloads; |
37 dispatched_payloads[kObjectId1] = "1"; | 61 dispatched_payloads[kObjectId1] = "1"; |
38 dispatched_payloads[kObjectId2] = "2"; | 62 dispatched_payloads[kObjectId2] = "2"; |
39 dispatched_payloads[kObjectId3] = "3"; | 63 dispatched_payloads[kObjectId3] = "3"; |
40 | 64 |
41 // A object ID with no registration should be ignored. | 65 // A object ID with no registration should be ignored. |
42 ObjectIdPayloadMap expected_payload1; | |
43 expected_payload1[kObjectId1] = "1"; | |
44 expected_payload1[kObjectId2] = "2"; | |
45 EXPECT_CALL(observer, OnIncomingNotification(expected_payload1, | |
46 REMOTE_NOTIFICATION)); | |
47 helper.DispatchInvalidationsToHandlers(dispatched_payloads, | 66 helper.DispatchInvalidationsToHandlers(dispatched_payloads, |
48 REMOTE_NOTIFICATION); | 67 REMOTE_NOTIFICATION); |
49 | 68 |
50 // Removed object IDs should not be notified, newly-added ones should. | 69 // Removed object IDs should not be notified, newly-added ones should. |
51 ids.erase(kObjectId1); | 70 ids.erase(kObjectId1); |
52 ids.insert(kObjectId3); | 71 ids.insert(kObjectId3); |
53 helper.UpdateRegisteredIds(&observer, ids); | 72 helper.UpdateRegisteredIds(kHandlerName1, ids); |
54 | 73 |
55 ObjectIdPayloadMap expected_payload2; | |
56 expected_payload2[kObjectId2] = "2"; | |
57 expected_payload2[kObjectId3] = "3"; | |
58 EXPECT_CALL(observer, OnIncomingNotification(expected_payload2, | |
59 REMOTE_NOTIFICATION)); | |
60 helper.DispatchInvalidationsToHandlers(dispatched_payloads, | 74 helper.DispatchInvalidationsToHandlers(dispatched_payloads, |
61 REMOTE_NOTIFICATION); | 75 REMOTE_NOTIFICATION); |
62 } | 76 } |
63 | 77 |
64 // Tests that we correctly bucket and dispatch invalidations on multiple objects | 78 // Register some IDs and fire an invalidation. Since there are no set |
65 // to the corresponding handlers. | 79 // handlers when the invalidation is fired, nothing should happen. |
66 TEST_F(SyncNotifierHelperTest, MultipleHandlers) { | 80 TEST_F(SyncNotifierHelperTest, NullHandler) { |
67 SyncNotifierHelper helper; | 81 SyncNotifierHelper helper; |
| 82 |
68 StrictMock<MockSyncNotifierObserver> observer; | 83 StrictMock<MockSyncNotifierObserver> observer; |
| 84 helper.SetHandler(kHandlerName1, &observer); |
| 85 |
69 ObjectIdSet ids; | 86 ObjectIdSet ids; |
70 ids.insert(kObjectId1); | 87 ids.insert(kObjectId1); |
71 ids.insert(kObjectId2); | 88 ids.insert(kObjectId2); |
72 helper.UpdateRegisteredIds(&observer, ids); | 89 helper.UpdateRegisteredIds(kHandlerName1, ids); |
73 StrictMock<MockSyncNotifierObserver> observer2; | |
74 ObjectIdSet ids2; | |
75 ids2.insert(kObjectId3); | |
76 helper.UpdateRegisteredIds(&observer2, ids2); | |
77 | 90 |
| 91 helper.SetHandler(kHandlerName1, NULL); |
| 92 |
| 93 ObjectIdPayloadMap dispatched_payloads; |
| 94 dispatched_payloads[kObjectId1] = "1"; |
| 95 dispatched_payloads[kObjectId2] = "2"; |
| 96 helper.DispatchInvalidationsToHandlers(dispatched_payloads, |
| 97 REMOTE_NOTIFICATION); |
| 98 } |
| 99 |
| 100 // Tests that we correctly bucket and dispatch invalidations on |
| 101 // multiple objects to the corresponding handlers. |
| 102 TEST_F(SyncNotifierHelperTest, MultipleHandlers) { |
| 103 SyncNotifierHelper helper; |
| 104 |
| 105 StrictMock<MockSyncNotifierObserver> observer1; |
78 ObjectIdPayloadMap expected_payload1; | 106 ObjectIdPayloadMap expected_payload1; |
79 expected_payload1[kObjectId1] = "1"; | 107 expected_payload1[kObjectId1] = "1"; |
80 expected_payload1[kObjectId2] = "2"; | 108 expected_payload1[kObjectId2] = "2"; |
81 EXPECT_CALL(observer, OnIncomingNotification(expected_payload1, | 109 EXPECT_CALL(observer1, OnIncomingNotification(expected_payload1, |
82 REMOTE_NOTIFICATION)); | 110 REMOTE_NOTIFICATION)); |
| 111 EXPECT_CALL(observer1, OnNotificationsEnabled()); |
| 112 EXPECT_CALL(observer1, |
| 113 OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); |
| 114 |
| 115 StrictMock<MockSyncNotifierObserver> observer2; |
83 ObjectIdPayloadMap expected_payload2; | 116 ObjectIdPayloadMap expected_payload2; |
84 expected_payload2[kObjectId3] = "3"; | 117 expected_payload2[kObjectId3] = "3"; |
85 EXPECT_CALL(observer2, OnIncomingNotification(expected_payload2, | 118 EXPECT_CALL(observer2, OnIncomingNotification(expected_payload2, |
86 REMOTE_NOTIFICATION)); | 119 REMOTE_NOTIFICATION)); |
| 120 EXPECT_CALL(observer2, OnNotificationsEnabled()); |
| 121 EXPECT_CALL(observer2, |
| 122 OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); |
| 123 |
| 124 helper.SetHandler(kHandlerName1, &observer1); |
| 125 helper.SetHandler(kHandlerName2, &observer2); |
| 126 |
| 127 ObjectIdSet ids; |
| 128 ids.insert(kObjectId1); |
| 129 ids.insert(kObjectId2); |
| 130 helper.UpdateRegisteredIds(kHandlerName1, ids); |
| 131 |
| 132 ObjectIdSet ids2; |
| 133 ids2.insert(kObjectId3); |
| 134 helper.UpdateRegisteredIds(kHandlerName2, ids2); |
87 | 135 |
88 ObjectIdPayloadMap dispatched_payloads; | 136 ObjectIdPayloadMap dispatched_payloads; |
89 dispatched_payloads[kObjectId1] = "1"; | 137 dispatched_payloads[kObjectId1] = "1"; |
90 dispatched_payloads[kObjectId2] = "2"; | 138 dispatched_payloads[kObjectId2] = "2"; |
91 dispatched_payloads[kObjectId3] = "3"; | 139 dispatched_payloads[kObjectId3] = "3"; |
92 helper.DispatchInvalidationsToHandlers(dispatched_payloads, | 140 helper.DispatchInvalidationsToHandlers(dispatched_payloads, |
93 REMOTE_NOTIFICATION); | 141 REMOTE_NOTIFICATION); |
94 | 142 |
95 // Also verify that the callbacks for OnNotificationsEnabled/Disabled work. | |
96 EXPECT_CALL(observer, OnNotificationsEnabled()); | |
97 EXPECT_CALL(observer2, OnNotificationsEnabled()); | |
98 EXPECT_CALL(observer, | |
99 OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); | |
100 EXPECT_CALL(observer2, | |
101 OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); | |
102 helper.EmitOnNotificationsEnabled(); | 143 helper.EmitOnNotificationsEnabled(); |
103 helper.EmitOnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR); | 144 helper.EmitOnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR); |
104 } | 145 } |
105 | 146 |
106 // Multiple registrations by different handlers on the same object ID should | 147 // Multiple registrations by different handlers on the same object ID should |
107 // cause a CHECK. | 148 // cause a CHECK. |
108 TEST_F(SyncNotifierHelperTest, MultipleRegistration) { | 149 TEST_F(SyncNotifierHelperTest, MultipleRegistration) { |
109 SyncNotifierHelper helper; | 150 SyncNotifierHelper helper; |
| 151 |
110 StrictMock<MockSyncNotifierObserver> observer; | 152 StrictMock<MockSyncNotifierObserver> observer; |
| 153 helper.SetHandler(kHandlerName1, &observer); |
| 154 |
111 ObjectIdSet ids; | 155 ObjectIdSet ids; |
112 ids.insert(kObjectId1); | 156 ids.insert(kObjectId1); |
113 ids.insert(kObjectId2); | 157 ids.insert(kObjectId2); |
114 helper.UpdateRegisteredIds(&observer, ids); | 158 helper.UpdateRegisteredIds(kHandlerName1, ids); |
115 | 159 |
116 StrictMock<MockSyncNotifierObserver> observer2; | 160 helper.DetachFromThreadForTest(); |
117 EXPECT_DEATH({ helper.UpdateRegisteredIds(&observer2, ids); }, | 161 EXPECT_DEATH({ helper.UpdateRegisteredIds(kHandlerName2, ids); }, |
118 "Duplicate registration for .*"); | 162 "Duplicate registration: .*"); |
| 163 } |
| 164 |
| 165 // Setting the same handler for different names should cause a CHECK. |
| 166 TEST_F(SyncNotifierHelperTest, SameHandlerDifferentName) { |
| 167 SyncNotifierHelper helper; |
| 168 |
| 169 StrictMock<MockSyncNotifierObserver> observer; |
| 170 helper.SetHandler(kHandlerName1, &observer); |
| 171 |
| 172 helper.DetachFromThreadForTest(); |
| 173 EXPECT_DEATH({ helper.SetHandler(kHandlerName2, &observer); }, |
| 174 "Observers can only be added once!"); |
119 } | 175 } |
120 | 176 |
121 // Make sure that passing an empty set to UpdateRegisteredIds clears the | 177 // Make sure that passing an empty set to UpdateRegisteredIds clears the |
122 // corresponding entries for the handler. | 178 // corresponding entries for the handler. |
123 TEST_F(SyncNotifierHelperTest, EmptySetUnregisters) { | 179 TEST_F(SyncNotifierHelperTest, EmptySetUnregisters) { |
124 SyncNotifierHelper helper; | 180 SyncNotifierHelper helper; |
125 StrictMock<MockSyncNotifierObserver> observer; | 181 |
| 182 StrictMock<MockSyncNotifierObserver> observer1; |
| 183 EXPECT_CALL(observer1, OnNotificationsEnabled()); |
| 184 EXPECT_CALL(observer1, |
| 185 OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); |
| 186 |
| 187 helper.SetHandler(kHandlerName1, &observer1); |
| 188 |
126 ObjectIdSet ids; | 189 ObjectIdSet ids; |
127 ids.insert(kObjectId1); | 190 ids.insert(kObjectId1); |
128 ids.insert(kObjectId2); | 191 ids.insert(kObjectId2); |
129 helper.UpdateRegisteredIds(&observer, ids); | 192 helper.UpdateRegisteredIds(kHandlerName1, ids); |
| 193 |
130 // Control observer. | 194 // Control observer. |
131 StrictMock<MockSyncNotifierObserver> observer2; | 195 StrictMock<MockSyncNotifierObserver> observer2; |
132 ObjectIdSet ids2; | |
133 ids2.insert(kObjectId3); | |
134 helper.UpdateRegisteredIds(&observer2, ids2); | |
135 // Unregister the first observer. It should not receive any further callbacks. | |
136 helper.UpdateRegisteredIds(&observer, ObjectIdSet()); | |
137 | |
138 ObjectIdPayloadMap expected_payload2; | 196 ObjectIdPayloadMap expected_payload2; |
139 expected_payload2[kObjectId3] = "3"; | 197 expected_payload2[kObjectId3] = "3"; |
140 EXPECT_CALL(observer2, OnIncomingNotification(expected_payload2, | 198 EXPECT_CALL(observer2, OnIncomingNotification(expected_payload2, |
141 REMOTE_NOTIFICATION)); | 199 REMOTE_NOTIFICATION)); |
142 EXPECT_CALL(observer2, OnNotificationsEnabled()); | 200 EXPECT_CALL(observer2, OnNotificationsEnabled()); |
143 EXPECT_CALL(observer2, | 201 EXPECT_CALL(observer2, |
144 OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); | 202 OnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR)); |
145 | 203 |
| 204 helper.SetHandler(kHandlerName2, &observer2); |
| 205 |
| 206 ObjectIdSet ids2; |
| 207 ids2.insert(kObjectId3); |
| 208 helper.UpdateRegisteredIds(kHandlerName2, ids2); |
| 209 |
| 210 // Unregister the first observer. It should not receive any further |
| 211 // invalidations. |
| 212 helper.UpdateRegisteredIds(kHandlerName1, ObjectIdSet()); |
| 213 |
146 ObjectIdPayloadMap dispatched_payloads; | 214 ObjectIdPayloadMap dispatched_payloads; |
147 dispatched_payloads[kObjectId1] = "1"; | 215 dispatched_payloads[kObjectId1] = "1"; |
148 dispatched_payloads[kObjectId2] = "2"; | 216 dispatched_payloads[kObjectId2] = "2"; |
149 dispatched_payloads[kObjectId3] = "3"; | 217 dispatched_payloads[kObjectId3] = "3"; |
150 helper.DispatchInvalidationsToHandlers(dispatched_payloads, | 218 helper.DispatchInvalidationsToHandlers(dispatched_payloads, |
151 REMOTE_NOTIFICATION); | 219 REMOTE_NOTIFICATION); |
152 helper.EmitOnNotificationsEnabled(); | 220 helper.EmitOnNotificationsEnabled(); |
153 helper.EmitOnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR); | 221 helper.EmitOnNotificationsDisabled(TRANSIENT_NOTIFICATION_ERROR); |
154 } | 222 } |
155 | 223 |
| 224 } // namespace |
| 225 |
156 } // namespace syncer | 226 } // namespace syncer |
OLD | NEW |