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

Side by Side Diff: components/gcm_driver/gcm_account_mapper_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698