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

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

Powered by Google App Engine
This is Rietveld 408576698