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

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: Updating the failing test 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 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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698