Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: chrome/browser/sync/notifier/registration_manager_unittest.cc

Issue 2861034: Decomped registration logic into its own class. (Closed)
Patch Set: synced to head Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/sync/notifier/registration_manager.cc ('k') | chrome/chrome.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2010 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/sync/notifier/registration_manager.h"
6
7 #include <cstddef>
8 #include <deque>
9 #include <vector>
10
11 #include "base/basictypes.h"
12 #include "base/logging.h"
13 #include "chrome/browser/sync/notifier/invalidation_util.h"
14 #include "chrome/browser/sync/syncable/model_type.h"
15 #include "google/cacheinvalidation/invalidation-client.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 namespace sync_notifier {
19 namespace {
20
21 // Fake invalidation client that just stores the args of calls to
22 // Register().
23 class FakeInvalidationClient : public invalidation::InvalidationClient {
24 public:
25 struct Args {
26 Args() : callback(NULL) {}
27
28 Args(const invalidation::ObjectId& oid,
29 invalidation::RegistrationCallback* callback)
30 : oid(oid), callback(callback) {}
31
32 invalidation::ObjectId oid;
33 invalidation::RegistrationCallback* callback;
34 };
35
36 FakeInvalidationClient() {}
37
38 virtual ~FakeInvalidationClient() {
39 for (std::deque<Args>::iterator it = register_calls.begin();
40 it != register_calls.end(); ++it) {
41 delete it->callback;
42 }
43 }
44
45 void Register(const invalidation::ObjectId& oid,
46 invalidation::RegistrationCallback* callback) {
47 register_calls.push_back(Args(oid, callback));
48 }
49
50 void Unregister(const invalidation::ObjectId& oid,
51 invalidation::RegistrationCallback* callback) {
52 ADD_FAILURE();
53 delete callback;
54 }
55
56 invalidation::NetworkEndpoint* network_endpoint() {
57 ADD_FAILURE();
58 return NULL;
59 }
60
61 void GetClientUniquifier(invalidation::string* uniquifier) const {
62 ADD_FAILURE();
63 }
64
65 std::deque<Args> register_calls;
66
67 private:
68 DISALLOW_COPY_AND_ASSIGN(FakeInvalidationClient);
69 };
70
71 class RegistrationManagerTest : public testing::Test {
72 protected:
73 RegistrationManagerTest()
74 : registration_manager_(&fake_invalidation_client_) {}
75
76 virtual ~RegistrationManagerTest() {}
77
78 FakeInvalidationClient fake_invalidation_client_;
79 RegistrationManager registration_manager_;
80
81 private:
82 DISALLOW_COPY_AND_ASSIGN(RegistrationManagerTest);
83 };
84
85 invalidation::ObjectId ModelTypeToObjectId(
86 syncable::ModelType model_type) {
87 invalidation::ObjectId object_id;
88 EXPECT_TRUE(RealModelTypeToObjectId(model_type, &object_id));
89 return object_id;
90 }
91
92 syncable::ModelType ObjectIdToModelType(
93 const invalidation::ObjectId& object_id) {
94 syncable::ModelType model_type = syncable::UNSPECIFIED;
95 EXPECT_TRUE(ObjectIdToRealModelType(object_id, &model_type));
96 return model_type;
97 }
98
99 invalidation::RegistrationUpdateResult MakeRegistrationUpdateResult(
100 syncable::ModelType model_type) {
101 invalidation::RegistrationUpdateResult result;
102 result.mutable_operation()->
103 set_type(invalidation::RegistrationUpdate::REGISTER);
104 *result.mutable_operation()->mutable_object_id() =
105 ModelTypeToObjectId(model_type);
106 result.mutable_status()->set_code(invalidation::Status::SUCCESS);
107 return result;
108 }
109
110 TEST_F(RegistrationManagerTest, RegisterType) {
111 const syncable::ModelType kModelTypes[] = {
112 syncable::BOOKMARKS,
113 syncable::PREFERENCES,
114 syncable::THEMES,
115 syncable::AUTOFILL,
116 syncable::EXTENSIONS,
117 };
118 const size_t kModelTypeCount = arraysize(kModelTypes);
119
120 // Register types.
121 for (size_t i = 0; i < kModelTypeCount; ++i) {
122 // Register twice; it shouldn't matter.
123 registration_manager_.RegisterType(kModelTypes[i]);
124 registration_manager_.RegisterType(kModelTypes[i]);
125 }
126
127 ASSERT_EQ(kModelTypeCount,
128 fake_invalidation_client_.register_calls.size());
129
130 // Nothing should be registered yet.
131 for (size_t i = 0; i < kModelTypeCount; ++i) {
132 EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i]));
133 }
134
135 // Check object IDs.
136 for (size_t i = 0; i < kModelTypeCount; ++i) {
137 EXPECT_EQ(kModelTypes[i],
138 ObjectIdToModelType(
139 fake_invalidation_client_.register_calls[i].oid));
140 }
141
142 // Prepare results.
143 std::vector<invalidation::RegistrationUpdateResult> results(
144 kModelTypeCount);
145 for (size_t i = 0; i < kModelTypeCount; ++i) {
146 results[i] = MakeRegistrationUpdateResult(kModelTypes[i]);
147 }
148
149 // Generate a variety of error conditions in all but the first
150 // result.
151 results[1].mutable_operation()->set_type(
152 invalidation::RegistrationUpdate::UNREGISTER);
153 results[2].mutable_operation()->mutable_object_id()->
154 mutable_name()->set_string_value("garbage");
155 results[3].mutable_status()->
156 set_code(invalidation::Status::UNKNOWN_ERROR);
157 *results[4].mutable_operation()->mutable_object_id() =
158 ModelTypeToObjectId(syncable::TYPED_URLS);
159
160
161 // Send the registration results back.
162 for (size_t i = 0; i < kModelTypeCount; ++i) {
163 fake_invalidation_client_.register_calls[i].callback->Run(results[i]);
164 }
165
166 // Only the first one should be registered.
167 EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[0]));
168 for (size_t i = 1; i < kModelTypeCount; ++i) {
169 EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i]));
170 }
171 }
172
173 TEST_F(RegistrationManagerTest, MarkRegistrationLost) {
174 const syncable::ModelType kModelTypes[] = {
175 syncable::BOOKMARKS,
176 syncable::PREFERENCES,
177 syncable::THEMES,
178 syncable::AUTOFILL,
179 syncable::EXTENSIONS,
180 };
181 const size_t kModelTypeCount = arraysize(kModelTypes);
182
183 // Register types.
184 for (size_t i = 0; i < kModelTypeCount; ++i) {
185 registration_manager_.RegisterType(kModelTypes[i]);
186 }
187
188 ASSERT_EQ(kModelTypeCount,
189 fake_invalidation_client_.register_calls.size());
190
191 // Send the registration results back.
192 for (size_t i = 0; i < kModelTypeCount; ++i) {
193 fake_invalidation_client_.register_calls[i].callback->Run(
194 MakeRegistrationUpdateResult(kModelTypes[i]));
195 }
196
197 // All should be registered.
198 for (size_t i = 0; i < kModelTypeCount; ++i) {
199 EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i]));
200 }
201
202 // Mark the registrations of all but the first one lost.
203 for (size_t i = 1; i < kModelTypeCount; ++i) {
204 registration_manager_.MarkRegistrationLost(kModelTypes[i]);
205 }
206
207 ASSERT_EQ(2 * kModelTypeCount - 1,
208 fake_invalidation_client_.register_calls.size());
209
210 // Only the first one should be registered.
211 EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[0]));
212 for (size_t i = 1; i < kModelTypeCount; ++i) {
213 EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i]));
214 }
215
216 // Send more registration results back.
217 for (size_t i = 1; i < kModelTypeCount; ++i) {
218 fake_invalidation_client_.register_calls[kModelTypeCount + i - 1].
219 callback->Run(
220 MakeRegistrationUpdateResult(kModelTypes[i]));
221 }
222
223 // All should be registered.
224 for (size_t i = 0; i < kModelTypeCount; ++i) {
225 EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i]));
226 }
227 }
228
229 TEST_F(RegistrationManagerTest, MarkAllRegistrationsLost) {
230 const syncable::ModelType kModelTypes[] = {
231 syncable::BOOKMARKS,
232 syncable::PREFERENCES,
233 syncable::THEMES,
234 syncable::AUTOFILL,
235 syncable::EXTENSIONS,
236 };
237 const size_t kModelTypeCount = arraysize(kModelTypes);
238
239 // Register types.
240 for (size_t i = 0; i < kModelTypeCount; ++i) {
241 registration_manager_.RegisterType(kModelTypes[i]);
242 }
243
244 ASSERT_EQ(kModelTypeCount,
245 fake_invalidation_client_.register_calls.size());
246
247 // Send the registration results back.
248 for (size_t i = 0; i < kModelTypeCount; ++i) {
249 fake_invalidation_client_.register_calls[i].callback->Run(
250 MakeRegistrationUpdateResult(kModelTypes[i]));
251 }
252
253 // All should be registered.
254 for (size_t i = 0; i < kModelTypeCount; ++i) {
255 EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i]));
256 }
257
258 // Mark the registrations of all but the first one lost. Then mark
259 // everything lost.
260 for (size_t i = 1; i < kModelTypeCount; ++i) {
261 registration_manager_.MarkRegistrationLost(kModelTypes[i]);
262 }
263 registration_manager_.MarkAllRegistrationsLost();
264
265 ASSERT_EQ(3 * kModelTypeCount - 1,
266 fake_invalidation_client_.register_calls.size());
267
268 // None should be registered.
269 for (size_t i = 0; i < kModelTypeCount; ++i) {
270 EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i]));
271 }
272
273 // Send more registration results back.
274 for (size_t i = 0; i < kModelTypeCount; ++i) {
275 fake_invalidation_client_.register_calls[2 * kModelTypeCount + i - 1].
276 callback->Run(
277 MakeRegistrationUpdateResult(kModelTypes[i]));
278 }
279
280 // All should be registered.
281 for (size_t i = 0; i < kModelTypeCount; ++i) {
282 EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i]));
283 }
284 }
285
286 } // namespace
287 } // namespace notifier
OLDNEW
« no previous file with comments | « chrome/browser/sync/notifier/registration_manager.cc ('k') | chrome/chrome.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698