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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "google/cacheinvalidation/include/invalidation-client.h" | 8 #include "google/cacheinvalidation/include/invalidation-client.h" |
9 #include "google/cacheinvalidation/include/types.h" | 9 #include "google/cacheinvalidation/include/types.h" |
10 #include "google/cacheinvalidation/v2/types.pb.h" | 10 #include "google/cacheinvalidation/v2/types.pb.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 MOCK_METHOD1(Unregister, void(const std::vector<invalidation::ObjectId>&)); | 39 MOCK_METHOD1(Unregister, void(const std::vector<invalidation::ObjectId>&)); |
40 MOCK_METHOD1(Acknowledge, void(const invalidation::AckHandle&)); | 40 MOCK_METHOD1(Acknowledge, void(const invalidation::AckHandle&)); |
41 }; | 41 }; |
42 | 42 |
43 class MockListener : public ChromeInvalidationClient::Listener { | 43 class MockListener : public ChromeInvalidationClient::Listener { |
44 public: | 44 public: |
45 MOCK_METHOD1(OnInvalidate, void(const syncable::ModelTypePayloadMap&)); | 45 MOCK_METHOD1(OnInvalidate, void(const syncable::ModelTypePayloadMap&)); |
46 MOCK_METHOD1(OnSessionStatusChanged, void(bool)); | 46 MOCK_METHOD1(OnSessionStatusChanged, void(bool)); |
47 }; | 47 }; |
48 | 48 |
49 class MockInvalidationVersionTracker | 49 class MockInvalidationStateTracker |
50 : public InvalidationVersionTracker, | 50 : public InvalidationStateTracker, |
51 public base::SupportsWeakPtr<MockInvalidationVersionTracker> { | 51 public base::SupportsWeakPtr<MockInvalidationStateTracker> { |
52 public: | 52 public: |
53 MOCK_CONST_METHOD0(GetAllMaxVersions, InvalidationVersionMap()); | 53 MOCK_CONST_METHOD0(GetAllMaxVersions, InvalidationVersionMap()); |
54 MOCK_METHOD2(SetMaxVersion, void(syncable::ModelType, int64)); | 54 MOCK_METHOD2(SetMaxVersion, void(syncable::ModelType, int64)); |
55 }; | 55 }; |
56 | 56 |
57 class MockStateWriter : public StateWriter { | 57 class MockStateWriter : public StateWriter { |
58 public: | 58 public: |
59 MOCK_METHOD1(WriteState, void(const std::string&)); | 59 MOCK_METHOD1(WriteState, void(const std::string&)); |
60 }; | 60 }; |
61 | 61 |
62 } // namespace | 62 } // namespace |
63 | 63 |
64 class ChromeInvalidationClientTest : public testing::Test { | 64 class ChromeInvalidationClientTest : public testing::Test { |
65 protected: | 65 protected: |
66 virtual void SetUp() { | 66 virtual void SetUp() { |
67 client_.Start(kClientId, kClientInfo, kState, | 67 client_.Start(kClientId, kClientInfo, kState, |
68 InvalidationVersionMap(), | 68 InvalidationVersionMap(), |
69 browser_sync::MakeWeakHandle( | 69 browser_sync::MakeWeakHandle( |
70 mock_invalidation_version_tracker_.AsWeakPtr()), | 70 mock_invalidation_state_tracker_.AsWeakPtr()), |
71 &mock_listener_, &mock_state_writer_, | 71 &mock_listener_, &mock_state_writer_, |
72 fake_base_task_.AsWeakPtr()); | 72 fake_base_task_.AsWeakPtr()); |
73 } | 73 } |
74 | 74 |
75 virtual void TearDown() { | 75 virtual void TearDown() { |
76 // client_.Stop() stops the invalidation scheduler, which deletes any | 76 // client_.Stop() stops the invalidation scheduler, which deletes any |
77 // pending tasks without running them. Some tasks "run and delete" another | 77 // pending tasks without running them. Some tasks "run and delete" another |
78 // task, so they must be run in order to avoid leaking the inner task. | 78 // task, so they must be run in order to avoid leaking the inner task. |
79 // client_.Stop() does not schedule any tasks, so it's both necessary and | 79 // client_.Stop() does not schedule any tasks, so it's both necessary and |
80 // sufficient to drain the task queue before calling it. | 80 // sufficient to drain the task queue before calling it. |
(...skipping 10 matching lines...) Expand all Loading... |
91 invalidation::Invalidation inv; | 91 invalidation::Invalidation inv; |
92 if (payload) { | 92 if (payload) { |
93 inv = invalidation::Invalidation(object_id, version, payload); | 93 inv = invalidation::Invalidation(object_id, version, payload); |
94 } else { | 94 } else { |
95 inv = invalidation::Invalidation(object_id, version); | 95 inv = invalidation::Invalidation(object_id, version); |
96 } | 96 } |
97 invalidation::AckHandle ack_handle("fakedata"); | 97 invalidation::AckHandle ack_handle("fakedata"); |
98 EXPECT_CALL(mock_invalidation_client_, Acknowledge(ack_handle)); | 98 EXPECT_CALL(mock_invalidation_client_, Acknowledge(ack_handle)); |
99 client_.Invalidate(&mock_invalidation_client_, inv, ack_handle); | 99 client_.Invalidate(&mock_invalidation_client_, inv, ack_handle); |
100 // Pump message loop to trigger | 100 // Pump message loop to trigger |
101 // InvalidationVersionTracker::SetMaxVersion(). | 101 // InvalidationStateTracker::SetMaxVersion(). |
102 message_loop_.RunAllPending(); | 102 message_loop_.RunAllPending(); |
103 } | 103 } |
104 | 104 |
105 // |payload| can be NULL, but not |type_name|. | 105 // |payload| can be NULL, but not |type_name|. |
106 void FireInvalidateUnknownVersion(const char* type_name) { | 106 void FireInvalidateUnknownVersion(const char* type_name) { |
107 const invalidation::ObjectId object_id( | 107 const invalidation::ObjectId object_id( |
108 ipc::invalidation::ObjectSource::CHROME_SYNC, type_name); | 108 ipc::invalidation::ObjectSource::CHROME_SYNC, type_name); |
109 | 109 |
110 invalidation::AckHandle ack_handle("fakedata"); | 110 invalidation::AckHandle ack_handle("fakedata"); |
111 EXPECT_CALL(mock_invalidation_client_, Acknowledge(ack_handle)); | 111 EXPECT_CALL(mock_invalidation_client_, Acknowledge(ack_handle)); |
112 client_.InvalidateUnknownVersion(&mock_invalidation_client_, object_id, | 112 client_.InvalidateUnknownVersion(&mock_invalidation_client_, object_id, |
113 ack_handle); | 113 ack_handle); |
114 } | 114 } |
115 | 115 |
116 void FireInvalidateAll() { | 116 void FireInvalidateAll() { |
117 invalidation::AckHandle ack_handle("fakedata"); | 117 invalidation::AckHandle ack_handle("fakedata"); |
118 EXPECT_CALL(mock_invalidation_client_, Acknowledge(ack_handle)); | 118 EXPECT_CALL(mock_invalidation_client_, Acknowledge(ack_handle)); |
119 client_.InvalidateAll(&mock_invalidation_client_, ack_handle); | 119 client_.InvalidateAll(&mock_invalidation_client_, ack_handle); |
120 } | 120 } |
121 | 121 |
122 MessageLoop message_loop_; | 122 MessageLoop message_loop_; |
123 StrictMock<MockListener> mock_listener_; | 123 StrictMock<MockListener> mock_listener_; |
124 StrictMock<MockInvalidationVersionTracker> | 124 StrictMock<MockInvalidationStateTracker> |
125 mock_invalidation_version_tracker_; | 125 mock_invalidation_state_tracker_; |
126 StrictMock<MockStateWriter> mock_state_writer_; | 126 StrictMock<MockStateWriter> mock_state_writer_; |
127 StrictMock<MockInvalidationClient> mock_invalidation_client_; | 127 StrictMock<MockInvalidationClient> mock_invalidation_client_; |
128 notifier::FakeBaseTask fake_base_task_; | 128 notifier::FakeBaseTask fake_base_task_; |
129 ChromeInvalidationClient client_; | 129 ChromeInvalidationClient client_; |
130 }; | 130 }; |
131 | 131 |
132 namespace { | 132 namespace { |
133 | 133 |
134 syncable::ModelTypePayloadMap MakeMap(syncable::ModelType model_type, | 134 syncable::ModelTypePayloadMap MakeMap(syncable::ModelType model_type, |
135 const std::string& payload) { | 135 const std::string& payload) { |
(...skipping 13 matching lines...) Expand all Loading... |
149 syncable::ModelTypeSet types(syncable::BOOKMARKS, syncable::APPS); | 149 syncable::ModelTypeSet types(syncable::BOOKMARKS, syncable::APPS); |
150 client_.RegisterTypes(types); | 150 client_.RegisterTypes(types); |
151 EXPECT_CALL(mock_listener_, OnInvalidate(MakeMapFromSet(types, ""))); | 151 EXPECT_CALL(mock_listener_, OnInvalidate(MakeMapFromSet(types, ""))); |
152 FireInvalidate("bad", 1, NULL); | 152 FireInvalidate("bad", 1, NULL); |
153 message_loop_.RunAllPending(); | 153 message_loop_.RunAllPending(); |
154 } | 154 } |
155 | 155 |
156 TEST_F(ChromeInvalidationClientTest, InvalidateNoPayload) { | 156 TEST_F(ChromeInvalidationClientTest, InvalidateNoPayload) { |
157 EXPECT_CALL(mock_listener_, | 157 EXPECT_CALL(mock_listener_, |
158 OnInvalidate(MakeMap(syncable::BOOKMARKS, ""))); | 158 OnInvalidate(MakeMap(syncable::BOOKMARKS, ""))); |
159 EXPECT_CALL(mock_invalidation_version_tracker_, | 159 EXPECT_CALL(mock_invalidation_state_tracker_, |
160 SetMaxVersion(syncable::BOOKMARKS, 1)); | 160 SetMaxVersion(syncable::BOOKMARKS, 1)); |
161 FireInvalidate("BOOKMARK", 1, NULL); | 161 FireInvalidate("BOOKMARK", 1, NULL); |
162 } | 162 } |
163 | 163 |
164 TEST_F(ChromeInvalidationClientTest, InvalidateWithPayload) { | 164 TEST_F(ChromeInvalidationClientTest, InvalidateWithPayload) { |
165 EXPECT_CALL(mock_listener_, | 165 EXPECT_CALL(mock_listener_, |
166 OnInvalidate(MakeMap(syncable::PREFERENCES, "payload"))); | 166 OnInvalidate(MakeMap(syncable::PREFERENCES, "payload"))); |
167 EXPECT_CALL(mock_invalidation_version_tracker_, | 167 EXPECT_CALL(mock_invalidation_state_tracker_, |
168 SetMaxVersion(syncable::PREFERENCES, 1)); | 168 SetMaxVersion(syncable::PREFERENCES, 1)); |
169 FireInvalidate("PREFERENCE", 1, "payload"); | 169 FireInvalidate("PREFERENCE", 1, "payload"); |
170 } | 170 } |
171 | 171 |
172 TEST_F(ChromeInvalidationClientTest, InvalidateVersion) { | 172 TEST_F(ChromeInvalidationClientTest, InvalidateVersion) { |
173 using ::testing::Mock; | 173 using ::testing::Mock; |
174 | 174 |
175 EXPECT_CALL(mock_listener_, | 175 EXPECT_CALL(mock_listener_, |
176 OnInvalidate(MakeMap(syncable::APPS, ""))); | 176 OnInvalidate(MakeMap(syncable::APPS, ""))); |
177 EXPECT_CALL(mock_invalidation_version_tracker_, | 177 EXPECT_CALL(mock_invalidation_state_tracker_, |
178 SetMaxVersion(syncable::APPS, 1)); | 178 SetMaxVersion(syncable::APPS, 1)); |
179 | 179 |
180 // Should trigger. | 180 // Should trigger. |
181 FireInvalidate("APP", 1, NULL); | 181 FireInvalidate("APP", 1, NULL); |
182 | 182 |
183 Mock::VerifyAndClearExpectations(&mock_listener_); | 183 Mock::VerifyAndClearExpectations(&mock_listener_); |
184 | 184 |
185 // Should be dropped. | 185 // Should be dropped. |
186 FireInvalidate("APP", 1, NULL); | 186 FireInvalidate("APP", 1, NULL); |
187 } | 187 } |
(...skipping 12 matching lines...) Expand all Loading... |
200 using ::testing::Mock; | 200 using ::testing::Mock; |
201 | 201 |
202 syncable::ModelTypeSet types(syncable::BOOKMARKS, syncable::APPS); | 202 syncable::ModelTypeSet types(syncable::BOOKMARKS, syncable::APPS); |
203 client_.RegisterTypes(types); | 203 client_.RegisterTypes(types); |
204 | 204 |
205 EXPECT_CALL(mock_listener_, | 205 EXPECT_CALL(mock_listener_, |
206 OnInvalidate(MakeMap(syncable::APPS, ""))); | 206 OnInvalidate(MakeMap(syncable::APPS, ""))); |
207 EXPECT_CALL(mock_listener_, | 207 EXPECT_CALL(mock_listener_, |
208 OnInvalidate(MakeMap(syncable::EXTENSIONS, ""))); | 208 OnInvalidate(MakeMap(syncable::EXTENSIONS, ""))); |
209 | 209 |
210 EXPECT_CALL(mock_invalidation_version_tracker_, | 210 EXPECT_CALL(mock_invalidation_state_tracker_, |
211 SetMaxVersion(syncable::APPS, 3)); | 211 SetMaxVersion(syncable::APPS, 3)); |
212 EXPECT_CALL(mock_invalidation_version_tracker_, | 212 EXPECT_CALL(mock_invalidation_state_tracker_, |
213 SetMaxVersion(syncable::EXTENSIONS, 2)); | 213 SetMaxVersion(syncable::EXTENSIONS, 2)); |
214 | 214 |
215 // Should trigger both. | 215 // Should trigger both. |
216 FireInvalidate("APP", 3, NULL); | 216 FireInvalidate("APP", 3, NULL); |
217 FireInvalidate("EXTENSION", 2, NULL); | 217 FireInvalidate("EXTENSION", 2, NULL); |
218 | 218 |
219 Mock::VerifyAndClearExpectations(&mock_listener_); | 219 Mock::VerifyAndClearExpectations(&mock_listener_); |
220 Mock::VerifyAndClearExpectations(&mock_invalidation_version_tracker_); | 220 Mock::VerifyAndClearExpectations(&mock_invalidation_state_tracker_); |
221 | 221 |
222 // Should both be dropped. | 222 // Should both be dropped. |
223 FireInvalidate("APP", 1, NULL); | 223 FireInvalidate("APP", 1, NULL); |
224 FireInvalidate("EXTENSION", 1, NULL); | 224 FireInvalidate("EXTENSION", 1, NULL); |
225 | 225 |
226 Mock::VerifyAndClearExpectations(&mock_listener_); | 226 Mock::VerifyAndClearExpectations(&mock_listener_); |
227 Mock::VerifyAndClearExpectations(&mock_invalidation_version_tracker_); | 227 Mock::VerifyAndClearExpectations(&mock_invalidation_state_tracker_); |
228 | 228 |
229 // InvalidateAll shouldn't change any version state. | 229 // InvalidateAll shouldn't change any version state. |
230 EXPECT_CALL(mock_listener_, OnInvalidate(MakeMapFromSet(types, ""))); | 230 EXPECT_CALL(mock_listener_, OnInvalidate(MakeMapFromSet(types, ""))); |
231 FireInvalidateAll(); | 231 FireInvalidateAll(); |
232 | 232 |
233 Mock::VerifyAndClearExpectations(&mock_listener_); | 233 Mock::VerifyAndClearExpectations(&mock_listener_); |
234 Mock::VerifyAndClearExpectations(&mock_invalidation_version_tracker_); | 234 Mock::VerifyAndClearExpectations(&mock_invalidation_state_tracker_); |
235 | 235 |
236 EXPECT_CALL(mock_listener_, | 236 EXPECT_CALL(mock_listener_, |
237 OnInvalidate(MakeMap(syncable::PREFERENCES, ""))); | 237 OnInvalidate(MakeMap(syncable::PREFERENCES, ""))); |
238 EXPECT_CALL(mock_listener_, | 238 EXPECT_CALL(mock_listener_, |
239 OnInvalidate(MakeMap(syncable::EXTENSIONS, ""))); | 239 OnInvalidate(MakeMap(syncable::EXTENSIONS, ""))); |
240 EXPECT_CALL(mock_listener_, | 240 EXPECT_CALL(mock_listener_, |
241 OnInvalidate(MakeMap(syncable::APPS, ""))); | 241 OnInvalidate(MakeMap(syncable::APPS, ""))); |
242 | 242 |
243 EXPECT_CALL(mock_invalidation_version_tracker_, | 243 EXPECT_CALL(mock_invalidation_state_tracker_, |
244 SetMaxVersion(syncable::PREFERENCES, 5)); | 244 SetMaxVersion(syncable::PREFERENCES, 5)); |
245 EXPECT_CALL(mock_invalidation_version_tracker_, | 245 EXPECT_CALL(mock_invalidation_state_tracker_, |
246 SetMaxVersion(syncable::EXTENSIONS, 3)); | 246 SetMaxVersion(syncable::EXTENSIONS, 3)); |
247 EXPECT_CALL(mock_invalidation_version_tracker_, | 247 EXPECT_CALL(mock_invalidation_state_tracker_, |
248 SetMaxVersion(syncable::APPS, 4)); | 248 SetMaxVersion(syncable::APPS, 4)); |
249 | 249 |
250 // Should trigger all three. | 250 // Should trigger all three. |
251 FireInvalidate("PREFERENCE", 5, NULL); | 251 FireInvalidate("PREFERENCE", 5, NULL); |
252 FireInvalidate("EXTENSION", 3, NULL); | 252 FireInvalidate("EXTENSION", 3, NULL); |
253 FireInvalidate("APP", 4, NULL); | 253 FireInvalidate("APP", 4, NULL); |
254 } | 254 } |
255 | 255 |
256 TEST_F(ChromeInvalidationClientTest, InvalidateAll) { | 256 TEST_F(ChromeInvalidationClientTest, InvalidateAll) { |
257 syncable::ModelTypeSet types(syncable::PREFERENCES, syncable::EXTENSIONS); | 257 syncable::ModelTypeSet types(syncable::PREFERENCES, syncable::EXTENSIONS); |
258 client_.RegisterTypes(types); | 258 client_.RegisterTypes(types); |
259 EXPECT_CALL(mock_listener_, OnInvalidate(MakeMapFromSet(types, ""))); | 259 EXPECT_CALL(mock_listener_, OnInvalidate(MakeMapFromSet(types, ""))); |
260 FireInvalidateAll(); | 260 FireInvalidateAll(); |
261 } | 261 } |
262 | 262 |
263 TEST_F(ChromeInvalidationClientTest, RegisterTypes) { | 263 TEST_F(ChromeInvalidationClientTest, RegisterTypes) { |
264 syncable::ModelTypeSet types(syncable::PREFERENCES, syncable::EXTENSIONS); | 264 syncable::ModelTypeSet types(syncable::PREFERENCES, syncable::EXTENSIONS); |
265 client_.RegisterTypes(types); | 265 client_.RegisterTypes(types); |
266 // Registered types should be preserved across Stop/Start. | 266 // Registered types should be preserved across Stop/Start. |
267 TearDown(); | 267 TearDown(); |
268 SetUp(); | 268 SetUp(); |
269 EXPECT_CALL(mock_listener_, OnInvalidate(MakeMapFromSet(types, ""))); | 269 EXPECT_CALL(mock_listener_, OnInvalidate(MakeMapFromSet(types, ""))); |
270 FireInvalidateAll(); | 270 FireInvalidateAll(); |
271 } | 271 } |
272 | 272 |
273 // TODO(akalin): Flesh out unit tests. | 273 // TODO(akalin): Flesh out unit tests. |
274 | 274 |
275 } // namespace sync_notifier | 275 } // namespace sync_notifier |
OLD | NEW |