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 "components/gcm_driver/gcm_account_mapper.h" | |
6 | |
7 #include "base/test/simple_test_clock.h" | |
8 #include "base/time/time.h" | |
9 #include "components/gcm_driver/fake_gcm_driver.h" | |
10 #include "google_apis/gcm/engine/account_mapping.h" | |
11 #include "google_apis/gcm/engine/gcm_store.h" | |
12 #include "testing/gtest/include/gtest/gtest.h" | |
13 | |
14 namespace gcm { | |
15 | |
16 namespace { | |
17 | |
18 const char kGCMAccountMapperSenderId[] = "745476177629"; | |
19 const char kGCMAccountMapperAppId[] = "com.google.android.gms"; | |
20 const char kRegistrationId[] = "reg_id"; | |
21 | |
22 AccountMapping MakeAccountMapping(const std::string& account_id, | |
23 AccountMapping::MappingStatus status, | |
24 const base::Time& status_change_timestamp, | |
25 AccountMapping::MessageType last_message_type, | |
26 const std::string& last_message_id) { | |
27 AccountMapping account_mapping; | |
28 account_mapping.account_id = account_id; | |
29 account_mapping.email = account_id + "@gmail.com"; | |
30 // account_mapping.access_token intentionally left empty. | |
31 account_mapping.status = status; | |
32 account_mapping.status_change_timestamp = status_change_timestamp; | |
33 account_mapping.last_message_type = last_message_type; | |
34 account_mapping.last_message_id = last_message_id; | |
35 return account_mapping; | |
36 } | |
37 | |
38 GCMClient::AccountTokenInfo MakeAccountTokenInfo( | |
39 const std::string& account_id) { | |
40 GCMClient::AccountTokenInfo account_token; | |
41 account_token.account_id = account_id; | |
42 account_token.email = account_id + "@gmail.com"; | |
43 account_token.access_token = account_id + "_token"; | |
44 return account_token; | |
45 } | |
46 | |
47 class CustomFakeGCMDriver : public FakeGCMDriver { | |
48 public: | |
49 CustomFakeGCMDriver(); | |
50 virtual ~CustomFakeGCMDriver(); | |
51 | |
52 virtual void UpdateAccountMapping( | |
53 const AccountMapping& account_mapping) OVERRIDE; | |
54 virtual void RemoveAccountMapping(const std::string& account_id) OVERRIDE; | |
55 virtual void AddAppHandler(const std::string& app_id, | |
56 GCMAppHandler* handler) OVERRIDE; | |
57 virtual void RemoveAppHandler(const std::string& app_id) OVERRIDE; | |
58 | |
59 void CompleteSend(const std::string& message_id, GCMClient::Result result); | |
60 void SendAcknowledged(const std::string& message_id); | |
61 void MessageSendError(const std::string& message_id); | |
62 | |
63 const AccountMapping& last_account_mapping() const { | |
64 return account_mapping_; | |
65 } | |
66 const std::string& last_message_id() const { return last_message_id_; } | |
67 const std::string& last_removed_account_id() const { | |
68 return last_removed_account_id_; | |
69 } | |
70 | |
71 protected: | |
72 virtual void SendImpl(const std::string& app_id, | |
73 const std::string& receiver_id, | |
74 const GCMClient::OutgoingMessage& message) OVERRIDE; | |
75 | |
76 private: | |
77 AccountMapping account_mapping_; | |
78 std::string last_message_id_; | |
79 std::string last_removed_account_id_; | |
80 }; | |
81 | |
82 CustomFakeGCMDriver::CustomFakeGCMDriver() { | |
83 } | |
84 | |
85 CustomFakeGCMDriver::~CustomFakeGCMDriver() { | |
86 } | |
87 | |
88 void CustomFakeGCMDriver::UpdateAccountMapping( | |
89 const AccountMapping& account_mapping) { | |
90 account_mapping_.email = account_mapping.email; | |
91 account_mapping_.account_id = account_mapping.account_id; | |
92 account_mapping_.access_token = account_mapping.access_token; | |
93 account_mapping_.status = account_mapping.status; | |
94 account_mapping_.status_change_timestamp = | |
95 account_mapping.status_change_timestamp; | |
96 account_mapping_.last_message_type = account_mapping.last_message_type; | |
97 account_mapping_.last_message_id = account_mapping.last_message_id; | |
98 } | |
99 | |
100 void CustomFakeGCMDriver::RemoveAccountMapping(const std::string& account_id) { | |
101 last_removed_account_id_ = account_id; | |
102 } | |
103 | |
104 void CustomFakeGCMDriver::AddAppHandler(const std::string& app_id, | |
105 GCMAppHandler* handler) { | |
106 GCMDriver::AddAppHandler(app_id, handler); | |
107 } | |
108 | |
109 void CustomFakeGCMDriver::RemoveAppHandler(const std::string& app_id) { | |
110 GCMDriver::RemoveAppHandler(app_id); | |
111 } | |
112 | |
113 void CustomFakeGCMDriver::CompleteSend(const std::string& message_id, | |
114 GCMClient::Result result) { | |
115 SendFinished(kGCMAccountMapperAppId, message_id, result); | |
116 } | |
117 | |
118 void CustomFakeGCMDriver::SendAcknowledged(const std::string& message_id) { | |
119 GetAppHandler(kGCMAccountMapperAppId) | |
120 ->OnSendAcknowledged(kGCMAccountMapperAppId, message_id); | |
121 } | |
122 | |
123 void CustomFakeGCMDriver::MessageSendError(const std::string& message_id) { | |
124 GCMClient::SendErrorDetails send_error; | |
125 send_error.message_id = message_id; | |
126 send_error.result = GCMClient::TTL_EXCEEDED; | |
127 GetAppHandler(kGCMAccountMapperAppId) | |
128 ->OnSendError(kGCMAccountMapperAppId, send_error); | |
129 } | |
130 | |
131 void CustomFakeGCMDriver::SendImpl(const std::string& app_id, | |
132 const std::string& receiver_id, | |
133 const GCMClient::OutgoingMessage& message) { | |
134 DCHECK_EQ(kGCMAccountMapperAppId, app_id); | |
135 DCHECK_EQ(kGCMAccountMapperSenderId, receiver_id); | |
136 | |
137 last_message_id_ = message.id; | |
138 } | |
139 | |
140 } // namespace | |
141 | |
142 class GCMAccountMapperTest : public testing::Test { | |
143 public: | |
144 GCMAccountMapperTest(); | |
145 virtual ~GCMAccountMapperTest(); | |
146 | |
147 void Restart(); | |
148 | |
149 const std::vector<AccountMapping>& GetAccounts() const { | |
150 return account_mapper_->accounts_; | |
151 } | |
152 | |
153 GCMAccountMapper* mapper() { return account_mapper_.get(); } | |
154 | |
155 CustomFakeGCMDriver& gcm_driver() { return gcm_driver_; } | |
156 | |
157 base::SimpleTestClock* clock() { return clock_; } | |
158 | |
159 private: | |
160 CustomFakeGCMDriver gcm_driver_; | |
161 scoped_ptr<GCMAccountMapper> account_mapper_; | |
162 base::SimpleTestClock* clock_; | |
163 }; | |
164 | |
165 GCMAccountMapperTest::GCMAccountMapperTest() { | |
166 Restart(); | |
167 } | |
168 | |
169 GCMAccountMapperTest::~GCMAccountMapperTest() { | |
170 } | |
171 | |
172 void GCMAccountMapperTest::Restart() { | |
173 if (account_mapper_) | |
174 account_mapper_->ShutdownHandler(); | |
175 account_mapper_.reset(new GCMAccountMapper(&gcm_driver_)); | |
176 scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock); | |
177 clock_ = clock.get(); | |
178 account_mapper_->SetClockForTesting(clock.PassAs<base::Clock>()); | |
179 } | |
180 | |
181 // Tests the initialization of account mappings (from the store) when empty. | |
182 TEST_F(GCMAccountMapperTest, InitializeAccountMappingsEmpty) { | |
183 std::vector<AccountMapping> account_mappings; | |
184 mapper()->Initialize(account_mappings, ""); | |
185 EXPECT_TRUE(GetAccounts().empty()); | |
186 } | |
187 | |
188 // Tests the initialization of account mappings (from the store). | |
189 TEST_F(GCMAccountMapperTest, InitializeAccountMappings) { | |
190 std::vector<AccountMapping> account_mappings; | |
191 AccountMapping account_mapping1 = MakeAccountMapping("acc_id1", | |
192 AccountMapping::MAPPED, | |
193 base::Time::Now(), | |
194 AccountMapping::MSG_NONE, | |
195 std::string()); | |
196 AccountMapping account_mapping2 = MakeAccountMapping("acc_id2", | |
197 AccountMapping::ADDING, | |
198 base::Time::Now(), | |
199 AccountMapping::MSG_ADD, | |
200 "add_message_1"); | |
201 account_mappings.push_back(account_mapping1); | |
202 account_mappings.push_back(account_mapping2); | |
203 | |
204 mapper()->Initialize(account_mappings, ""); | |
205 | |
206 std::vector<AccountMapping> mappings = GetAccounts(); | |
207 EXPECT_EQ(2UL, mappings.size()); | |
208 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
209 | |
210 EXPECT_EQ(account_mapping1.account_id, iter->account_id); | |
211 EXPECT_EQ(account_mapping1.email, iter->email); | |
212 EXPECT_TRUE(account_mapping1.access_token.empty()); | |
213 EXPECT_EQ(account_mapping1.status, iter->status); | |
214 EXPECT_EQ(account_mapping1.status_change_timestamp, | |
215 iter->status_change_timestamp); | |
216 EXPECT_EQ(account_mapping1.last_message_type, iter->last_message_type); | |
217 EXPECT_TRUE(account_mapping1.last_message_id.empty()); | |
218 | |
219 ++iter; | |
220 EXPECT_EQ(account_mapping2.account_id, iter->account_id); | |
221 EXPECT_EQ(account_mapping2.email, iter->email); | |
222 EXPECT_TRUE(account_mapping2.access_token.empty()); | |
223 EXPECT_EQ(account_mapping2.status, iter->status); | |
224 EXPECT_EQ(account_mapping2.status_change_timestamp, | |
225 iter->status_change_timestamp); | |
226 EXPECT_EQ(account_mapping2.last_message_type, iter->last_message_type); | |
227 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); | |
228 } | |
229 | |
230 // Tests the part where a new account is added with a token, to the point when | |
231 // GCM message is sent. | |
232 TEST_F(GCMAccountMapperTest, AddMappingToMessageSent) { | |
233 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); | |
234 | |
235 std::vector<GCMClient::AccountTokenInfo> account_tokens; | |
236 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); | |
237 account_tokens.push_back(account_token); | |
238 mapper()->SetAccountTokens(account_tokens); | |
239 | |
240 std::vector<AccountMapping> mappings = GetAccounts(); | |
241 EXPECT_EQ(1UL, mappings.size()); | |
242 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
243 EXPECT_EQ("acc_id", iter->account_id); | |
244 EXPECT_EQ("acc_id@gmail.com", iter->email); | |
245 EXPECT_EQ("acc_id_token", iter->access_token); | |
246 EXPECT_EQ(AccountMapping::NEW, iter->status); | |
247 EXPECT_EQ(base::Time(), iter->status_change_timestamp); | |
248 EXPECT_EQ(AccountMapping::MSG_NONE, iter->last_message_type); | |
249 | |
250 EXPECT_TRUE(!gcm_driver().last_message_id().empty()); | |
251 } | |
252 | |
253 // Tests the part where GCM message is successfully queued. | |
254 TEST_F(GCMAccountMapperTest, AddMappingMessageQueued) { | |
255 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); | |
256 | |
257 std::vector<GCMClient::AccountTokenInfo> account_tokens; | |
258 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); | |
259 account_tokens.push_back(account_token); | |
260 mapper()->SetAccountTokens(account_tokens); | |
261 | |
262 clock()->SetNow(base::Time::Now()); | |
263 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | |
264 | |
265 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); | |
266 EXPECT_EQ(account_token.account_id, | |
267 gcm_driver().last_account_mapping().account_id); | |
268 EXPECT_EQ(account_token.access_token, | |
269 gcm_driver().last_account_mapping().access_token); | |
270 EXPECT_EQ(AccountMapping::ADDING, gcm_driver().last_account_mapping().status); | |
271 EXPECT_EQ(clock()->Now(), | |
272 gcm_driver().last_account_mapping().status_change_timestamp); | |
273 EXPECT_EQ(AccountMapping::MSG_ADD, | |
274 gcm_driver().last_account_mapping().last_message_type); | |
275 EXPECT_EQ(gcm_driver().last_message_id(), | |
276 gcm_driver().last_account_mapping().last_message_id); | |
277 | |
278 std::vector<AccountMapping> mappings = GetAccounts(); | |
279 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
280 EXPECT_EQ(account_token.email, iter->email); | |
281 EXPECT_EQ(account_token.account_id, iter->account_id); | |
282 EXPECT_EQ(account_token.access_token, iter->access_token); | |
283 EXPECT_EQ(AccountMapping::ADDING, iter->status); | |
284 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); | |
285 EXPECT_EQ(AccountMapping::MSG_ADD, iter->last_message_type); | |
286 EXPECT_EQ(gcm_driver().last_message_id(), iter->last_message_id); | |
287 } | |
288 | |
289 // Tests status change from ADDED to MAPPED (Message is acknowledged). | |
jianli
2014/08/28 18:43:52
ADDED => ADDING?
fgorski
2014/08/29 02:29:18
Done.
| |
290 TEST_F(GCMAccountMapperTest, AddMappingMessageAcknowledged) { | |
291 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); | |
292 | |
293 std::vector<GCMClient::AccountTokenInfo> account_tokens; | |
294 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); | |
295 account_tokens.push_back(account_token); | |
296 mapper()->SetAccountTokens(account_tokens); | |
297 | |
298 clock()->SetNow(base::Time::Now()); | |
299 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | |
300 clock()->SetNow(base::Time::Now()); | |
301 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); | |
302 | |
303 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); | |
304 EXPECT_EQ(account_token.account_id, | |
305 gcm_driver().last_account_mapping().account_id); | |
306 EXPECT_EQ(account_token.access_token, | |
307 gcm_driver().last_account_mapping().access_token); | |
308 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status); | |
309 EXPECT_EQ(clock()->Now(), | |
310 gcm_driver().last_account_mapping().status_change_timestamp); | |
311 EXPECT_EQ(AccountMapping::MSG_NONE, | |
312 gcm_driver().last_account_mapping().last_message_type); | |
313 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); | |
314 | |
315 std::vector<AccountMapping> mappings = GetAccounts(); | |
316 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
317 EXPECT_EQ(account_token.email, iter->email); | |
318 EXPECT_EQ(account_token.account_id, iter->account_id); | |
319 EXPECT_EQ(account_token.access_token, iter->access_token); | |
320 EXPECT_EQ(AccountMapping::MAPPED, iter->status); | |
321 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); | |
322 EXPECT_EQ(AccountMapping::MSG_NONE, iter->last_message_type); | |
323 EXPECT_TRUE(iter->last_message_id.empty()); | |
324 } | |
325 | |
326 // Tests status change form ADDED to MAPPED (When message was acknowledged, | |
jianli
2014/08/28 18:43:52
ADDED => ADDING?
fgorski
2014/08/29 02:29:18
Done.
| |
327 // after Chrome was restarted). | |
328 TEST_F(GCMAccountMapperTest, AddMappingMessageAckedAfterRestart) { | |
329 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); | |
330 | |
331 std::vector<GCMClient::AccountTokenInfo> account_tokens; | |
332 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); | |
333 account_tokens.push_back(account_token); | |
334 mapper()->SetAccountTokens(account_tokens); | |
335 | |
336 clock()->SetNow(base::Time::Now()); | |
337 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | |
338 | |
339 Restart(); | |
340 std::vector<AccountMapping> stored_mappings; | |
341 stored_mappings.push_back(gcm_driver().last_account_mapping()); | |
342 mapper()->Initialize(stored_mappings, kRegistrationId); | |
343 | |
344 clock()->SetNow(base::Time::Now()); | |
345 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); | |
346 | |
347 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); | |
348 EXPECT_EQ(account_token.account_id, | |
349 gcm_driver().last_account_mapping().account_id); | |
350 EXPECT_EQ(account_token.access_token, | |
351 gcm_driver().last_account_mapping().access_token); | |
352 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status); | |
353 EXPECT_EQ(clock()->Now(), | |
354 gcm_driver().last_account_mapping().status_change_timestamp); | |
355 EXPECT_EQ(AccountMapping::MSG_NONE, | |
356 gcm_driver().last_account_mapping().last_message_type); | |
357 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); | |
358 | |
359 std::vector<AccountMapping> mappings = GetAccounts(); | |
360 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
361 EXPECT_EQ(account_token.email, iter->email); | |
362 EXPECT_EQ(account_token.account_id, iter->account_id); | |
363 EXPECT_EQ(account_token.access_token, iter->access_token); | |
364 EXPECT_EQ(AccountMapping::MAPPED, iter->status); | |
365 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); | |
366 EXPECT_EQ(AccountMapping::MSG_NONE, iter->last_message_type); | |
367 EXPECT_TRUE(iter->last_message_id.empty()); | |
368 } | |
369 | |
370 // Tests a case when ADD message times out for a new account. | |
371 TEST_F(GCMAccountMapperTest, AddMappingMessageSendErrorForNewAccount) { | |
372 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); | |
373 | |
374 std::vector<GCMClient::AccountTokenInfo> account_tokens; | |
375 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); | |
376 account_tokens.push_back(account_token); | |
377 mapper()->SetAccountTokens(account_tokens); | |
378 | |
379 clock()->SetNow(base::Time::Now()); | |
380 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | |
381 | |
382 clock()->SetNow(base::Time::Now()); | |
383 std::string old_message_id = gcm_driver().last_message_id(); | |
384 gcm_driver().MessageSendError(old_message_id); | |
385 | |
386 // No new message is sent because of the send error, as the token is stale. | |
387 // Because the account was new, the entry should be deleted. | |
388 EXPECT_EQ(old_message_id, gcm_driver().last_message_id()); | |
389 EXPECT_EQ(account_token.account_id, gcm_driver().last_removed_account_id()); | |
390 EXPECT_TRUE(GetAccounts().empty()); | |
391 } | |
392 | |
393 /// Tests a case when ADD message times out for a new account. | |
jianli
2014/08/28 18:43:52
new account? The test method name suggests mapped
fgorski
2014/08/29 02:29:18
Done.
| |
394 TEST_F(GCMAccountMapperTest, AddMappingMessageSendErrorForMappedAccount) { | |
395 // Start with one account that is mapped. | |
396 base::Time status_change_timestamp = base::Time::Now(); | |
397 AccountMapping mapping = MakeAccountMapping("acc_id", | |
398 AccountMapping::MAPPED, | |
399 status_change_timestamp, | |
400 AccountMapping::MSG_ADD, | |
401 "add_message_id"); | |
402 | |
403 GCMAccountMapper::AccountMappings stored_mappings; | |
404 stored_mappings.push_back(mapping); | |
405 mapper()->Initialize(stored_mappings, kRegistrationId); | |
406 | |
407 clock()->SetNow(base::Time::Now()); | |
408 gcm_driver().MessageSendError("add_message_id"); | |
409 | |
410 // No new message is sent because of the send error, as the token is stale. | |
411 // Because the account was new, the entry should be deleted. | |
412 EXPECT_TRUE(gcm_driver().last_message_id().empty()); | |
413 | |
414 std::vector<AccountMapping> mappings = GetAccounts(); | |
415 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
416 EXPECT_EQ(mapping.email, iter->email); | |
417 EXPECT_EQ(mapping.account_id, iter->account_id); | |
418 EXPECT_EQ(mapping.access_token, iter->access_token); | |
419 EXPECT_EQ(AccountMapping::MAPPED, iter->status); | |
420 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); | |
421 EXPECT_EQ(AccountMapping::MSG_NONE, iter->last_message_type); | |
422 EXPECT_TRUE(iter->last_message_id.empty()); | |
423 } | |
424 | |
425 // Tests that a missing token for an account will trigger removing of that | |
426 // account. This test goes only until the message is passed to GCM. | |
427 TEST_F(GCMAccountMapperTest, RemoveMappingToMessageSent) { | |
428 // Start with one account that is mapped. | |
429 AccountMapping mapping = MakeAccountMapping("acc_id", | |
430 AccountMapping::MAPPED, | |
431 base::Time::Now(), | |
432 AccountMapping::MSG_NONE, | |
433 std::string()); | |
434 | |
435 GCMAccountMapper::AccountMappings stored_mappings; | |
436 stored_mappings.push_back(mapping); | |
437 mapper()->Initialize(stored_mappings, kRegistrationId); | |
438 clock()->SetNow(base::Time::Now()); | |
439 | |
440 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); | |
441 | |
442 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); | |
443 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); | |
444 EXPECT_EQ(AccountMapping::REMOVING, | |
445 gcm_driver().last_account_mapping().status); | |
446 EXPECT_EQ(clock()->Now(), | |
447 gcm_driver().last_account_mapping().status_change_timestamp); | |
448 EXPECT_EQ(AccountMapping::MSG_NONE, | |
449 gcm_driver().last_account_mapping().last_message_type); | |
450 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); | |
451 | |
452 std::vector<AccountMapping> mappings = GetAccounts(); | |
453 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
454 EXPECT_EQ(mapping.email, iter->email); | |
455 EXPECT_EQ(mapping.account_id, iter->account_id); | |
456 EXPECT_EQ(mapping.access_token, iter->access_token); | |
457 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | |
458 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); | |
459 EXPECT_EQ(AccountMapping::MSG_NONE, iter->last_message_type); | |
460 EXPECT_TRUE(iter->last_message_id.empty()); | |
461 } | |
462 | |
463 // Tests that a missing token for an account will trigger removing of that | |
464 // account. This test goes until the message is queued by GCM. | |
465 TEST_F(GCMAccountMapperTest, RemoveMappingMessageQueued) { | |
466 // Start with one account that is mapped. | |
467 AccountMapping mapping = MakeAccountMapping("acc_id", | |
468 AccountMapping::MAPPED, | |
469 base::Time::Now(), | |
470 AccountMapping::MSG_NONE, | |
471 std::string()); | |
472 | |
473 GCMAccountMapper::AccountMappings stored_mappings; | |
474 stored_mappings.push_back(mapping); | |
475 mapper()->Initialize(stored_mappings, kRegistrationId); | |
476 clock()->SetNow(base::Time::Now()); | |
477 base::Time status_change_timestamp = clock()->Now(); | |
478 | |
479 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); | |
480 clock()->SetNow(base::Time::Now()); | |
481 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | |
482 | |
483 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); | |
484 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); | |
485 EXPECT_EQ(AccountMapping::REMOVING, | |
486 gcm_driver().last_account_mapping().status); | |
487 EXPECT_EQ(status_change_timestamp, | |
488 gcm_driver().last_account_mapping().status_change_timestamp); | |
489 EXPECT_EQ(AccountMapping::MSG_REMOVE, | |
490 gcm_driver().last_account_mapping().last_message_type); | |
491 EXPECT_TRUE(!gcm_driver().last_account_mapping().last_message_id.empty()); | |
492 | |
493 std::vector<AccountMapping> mappings = GetAccounts(); | |
494 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
495 EXPECT_EQ(mapping.email, iter->email); | |
496 EXPECT_EQ(mapping.account_id, iter->account_id); | |
497 EXPECT_EQ(mapping.access_token, iter->access_token); | |
498 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | |
499 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); | |
500 EXPECT_EQ(AccountMapping::MSG_REMOVE, iter->last_message_type); | |
501 EXPECT_EQ(gcm_driver().last_account_mapping().last_message_id, | |
502 iter->last_message_id); | |
503 } | |
504 | |
505 // Tests that a missing token for an account will trigger removing of that | |
506 // account. This test goes until the message is acknowledged by GCM. | |
507 // This is a complete success scenario for account removal, and it end with | |
508 // account mapping being completely gone. | |
509 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAcknowledged) { | |
510 // Start with one account that is mapped. | |
511 AccountMapping mapping = MakeAccountMapping("acc_id", | |
512 AccountMapping::MAPPED, | |
513 base::Time::Now(), | |
514 AccountMapping::MSG_NONE, | |
515 std::string()); | |
516 | |
517 GCMAccountMapper::AccountMappings stored_mappings; | |
518 stored_mappings.push_back(mapping); | |
519 mapper()->Initialize(stored_mappings, kRegistrationId); | |
520 clock()->SetNow(base::Time::Now()); | |
521 | |
522 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); | |
523 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | |
524 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); | |
525 | |
526 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id()); | |
527 | |
528 std::vector<AccountMapping> mappings = GetAccounts(); | |
529 EXPECT_TRUE(mappings.empty()); | |
530 } | |
531 | |
532 // Tests that account removing proceeds, when a removing message is acked after | |
533 // Chrome was restarted. | |
534 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAckedAfterRestart) { | |
535 // Start with one account that is mapped. | |
536 AccountMapping mapping = MakeAccountMapping("acc_id", | |
537 AccountMapping::REMOVING, | |
538 base::Time::Now(), | |
539 AccountMapping::MSG_REMOVE, | |
540 "remove_message_id"); | |
541 | |
542 GCMAccountMapper::AccountMappings stored_mappings; | |
543 stored_mappings.push_back(mapping); | |
544 mapper()->Initialize(stored_mappings, kRegistrationId); | |
545 | |
546 gcm_driver().SendAcknowledged("remove_message_id"); | |
547 | |
548 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id()); | |
549 | |
550 std::vector<AccountMapping> mappings = GetAccounts(); | |
551 EXPECT_TRUE(mappings.empty()); | |
552 } | |
553 | |
554 // Tests that account removing proceeds, when a removing message is acked after | |
555 // Chrome was restarted. | |
556 TEST_F(GCMAccountMapperTest, RemoveMappingMessageSendError) { | |
557 // Start with one account that is mapped. | |
558 base::Time status_change_timestamp = base::Time::Now(); | |
559 AccountMapping mapping = MakeAccountMapping("acc_id", | |
560 AccountMapping::REMOVING, | |
561 status_change_timestamp, | |
562 AccountMapping::MSG_REMOVE, | |
563 "remove_message_id"); | |
564 | |
565 GCMAccountMapper::AccountMappings stored_mappings; | |
566 stored_mappings.push_back(mapping); | |
567 mapper()->Initialize(stored_mappings, kRegistrationId); | |
568 | |
569 clock()->SetNow(base::Time::Now()); | |
570 gcm_driver().MessageSendError("remove_message_id"); | |
571 | |
572 EXPECT_TRUE(gcm_driver().last_removed_account_id().empty()); | |
573 | |
574 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); | |
575 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); | |
576 EXPECT_EQ(AccountMapping::REMOVING, | |
577 gcm_driver().last_account_mapping().status); | |
578 EXPECT_EQ(status_change_timestamp, | |
579 gcm_driver().last_account_mapping().status_change_timestamp); | |
580 // Message is not persisted, until send is completed. | |
581 EXPECT_EQ(AccountMapping::MSG_NONE, | |
582 gcm_driver().last_account_mapping().last_message_type); | |
583 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); | |
584 | |
585 std::vector<AccountMapping> mappings = GetAccounts(); | |
586 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); | |
587 EXPECT_EQ(mapping.email, iter->email); | |
588 EXPECT_EQ(mapping.account_id, iter->account_id); | |
589 EXPECT_TRUE(iter->access_token.empty()); | |
590 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | |
591 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); | |
592 EXPECT_EQ(AccountMapping::MSG_NONE, iter->last_message_type); | |
593 EXPECT_TRUE(iter->last_message_id.empty()); | |
594 } | |
595 | |
596 } // namespace gcm | |
OLD | NEW |