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

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

Issue 544363002: [GCM] Adding GCMAccountMapper tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Use of this source code is governed by a BSD-style license that can be
jianli 2014/09/05 22:52:01 ?
1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // 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. 3 // found in the LICENSE file.
4 4
5 #include "components/gcm_driver/gcm_account_mapper.h" 5 #include "components/gcm_driver/gcm_account_mapper.h"
6 6
7 #include "base/test/simple_test_clock.h" 7 #include "base/test/simple_test_clock.h"
8 #include "base/time/time.h" 8 #include "base/time/time.h"
9 #include "components/gcm_driver/fake_gcm_driver.h" 9 #include "components/gcm_driver/fake_gcm_driver.h"
10 #include "google_apis/gcm/engine/account_mapping.h" 10 #include "google_apis/gcm/engine/account_mapping.h"
11 #include "google_apis/gcm/engine/gcm_store.h" 11 #include "google_apis/gcm/engine/gcm_store.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 24 matching lines...) Expand all
37 const std::string& account_id) { 37 const std::string& account_id) {
38 GCMClient::AccountTokenInfo account_token; 38 GCMClient::AccountTokenInfo account_token;
39 account_token.account_id = account_id; 39 account_token.account_id = account_id;
40 account_token.email = account_id + "@gmail.com"; 40 account_token.email = account_id + "@gmail.com";
41 account_token.access_token = account_id + "_token"; 41 account_token.access_token = account_id + "_token";
42 return account_token; 42 return account_token;
43 } 43 }
44 44
45 class CustomFakeGCMDriver : public FakeGCMDriver { 45 class CustomFakeGCMDriver : public FakeGCMDriver {
46 public: 46 public:
47 enum LastMessageAction {
48 NONE,
49 SEND_STARTED,
50 SEND_FINISHED,
51 SEND_ACKNOWLEDGED
52 };
53
47 CustomFakeGCMDriver(); 54 CustomFakeGCMDriver();
48 virtual ~CustomFakeGCMDriver(); 55 virtual ~CustomFakeGCMDriver();
49 56
50 virtual void UpdateAccountMapping( 57 virtual void UpdateAccountMapping(
51 const AccountMapping& account_mapping) OVERRIDE; 58 const AccountMapping& account_mapping) OVERRIDE;
52 virtual void RemoveAccountMapping(const std::string& account_id) OVERRIDE; 59 virtual void RemoveAccountMapping(const std::string& account_id) OVERRIDE;
53 virtual void AddAppHandler(const std::string& app_id, 60 virtual void AddAppHandler(const std::string& app_id,
54 GCMAppHandler* handler) OVERRIDE; 61 GCMAppHandler* handler) OVERRIDE;
55 virtual void RemoveAppHandler(const std::string& app_id) OVERRIDE; 62 virtual void RemoveAppHandler(const std::string& app_id) OVERRIDE;
56 63
57 void CompleteSend(const std::string& message_id, GCMClient::Result result); 64 void CompleteSend(const std::string& message_id, GCMClient::Result result);
58 void SendAcknowledged(const std::string& message_id); 65 void AcknowledgeSend(const std::string& message_id);
59 void MessageSendError(const std::string& message_id); 66 void MessageSendError(const std::string& message_id);
60 67
68 void CompleteSendAllMessages();
69 void AcknowledgeSendAllMessages();
70
71 void SetLastMessageAction(const std::string& message_id,
72 LastMessageAction action);
73 void Clear();
74
61 const AccountMapping& last_account_mapping() const { 75 const AccountMapping& last_account_mapping() const {
62 return account_mapping_; 76 return account_mapping_;
63 } 77 }
64 const std::string& last_message_id() const { return last_message_id_; } 78 const std::string& last_message_id() const { return last_message_id_; }
65 const std::string& last_removed_account_id() const { 79 const std::string& last_removed_account_id() const {
66 return last_removed_account_id_; 80 return last_removed_account_id_;
67 } 81 }
82 LastMessageAction last_action() const { return last_action_; }
68 83
69 protected: 84 protected:
70 virtual void SendImpl(const std::string& app_id, 85 virtual void SendImpl(const std::string& app_id,
71 const std::string& receiver_id, 86 const std::string& receiver_id,
72 const GCMClient::OutgoingMessage& message) OVERRIDE; 87 const GCMClient::OutgoingMessage& message) OVERRIDE;
73 88
74 private: 89 private:
75 AccountMapping account_mapping_; 90 AccountMapping account_mapping_;
76 std::string last_message_id_; 91 std::string last_message_id_;
77 std::string last_removed_account_id_; 92 std::string last_removed_account_id_;
93 LastMessageAction last_action_;
jianli 2014/09/05 22:52:01 This variable needs to be initialized.
94 std::map<std::string, LastMessageAction> all_messages_;
78 }; 95 };
79 96
80 CustomFakeGCMDriver::CustomFakeGCMDriver() { 97 CustomFakeGCMDriver::CustomFakeGCMDriver() {
81 } 98 }
82 99
83 CustomFakeGCMDriver::~CustomFakeGCMDriver() { 100 CustomFakeGCMDriver::~CustomFakeGCMDriver() {
84 } 101 }
85 102
86 void CustomFakeGCMDriver::UpdateAccountMapping( 103 void CustomFakeGCMDriver::UpdateAccountMapping(
87 const AccountMapping& account_mapping) { 104 const AccountMapping& account_mapping) {
(...skipping 15 matching lines...) Expand all
103 GCMDriver::AddAppHandler(app_id, handler); 120 GCMDriver::AddAppHandler(app_id, handler);
104 } 121 }
105 122
106 void CustomFakeGCMDriver::RemoveAppHandler(const std::string& app_id) { 123 void CustomFakeGCMDriver::RemoveAppHandler(const std::string& app_id) {
107 GCMDriver::RemoveAppHandler(app_id); 124 GCMDriver::RemoveAppHandler(app_id);
108 } 125 }
109 126
110 void CustomFakeGCMDriver::CompleteSend(const std::string& message_id, 127 void CustomFakeGCMDriver::CompleteSend(const std::string& message_id,
111 GCMClient::Result result) { 128 GCMClient::Result result) {
112 SendFinished(kGCMAccountMapperAppId, message_id, result); 129 SendFinished(kGCMAccountMapperAppId, message_id, result);
130 SetLastMessageAction(message_id, SEND_FINISHED);
113 } 131 }
114 132
115 void CustomFakeGCMDriver::SendAcknowledged(const std::string& message_id) { 133 void CustomFakeGCMDriver::AcknowledgeSend(const std::string& message_id) {
116 GetAppHandler(kGCMAccountMapperAppId) 134 GetAppHandler(kGCMAccountMapperAppId)
117 ->OnSendAcknowledged(kGCMAccountMapperAppId, message_id); 135 ->OnSendAcknowledged(kGCMAccountMapperAppId, message_id);
136 SetLastMessageAction(message_id, SEND_ACKNOWLEDGED);
118 } 137 }
119 138
120 void CustomFakeGCMDriver::MessageSendError(const std::string& message_id) { 139 void CustomFakeGCMDriver::MessageSendError(const std::string& message_id) {
121 GCMClient::SendErrorDetails send_error; 140 GCMClient::SendErrorDetails send_error;
122 send_error.message_id = message_id; 141 send_error.message_id = message_id;
123 send_error.result = GCMClient::TTL_EXCEEDED; 142 send_error.result = GCMClient::TTL_EXCEEDED;
124 GetAppHandler(kGCMAccountMapperAppId) 143 GetAppHandler(kGCMAccountMapperAppId)
125 ->OnSendError(kGCMAccountMapperAppId, send_error); 144 ->OnSendError(kGCMAccountMapperAppId, send_error);
126 } 145 }
127 146
128 void CustomFakeGCMDriver::SendImpl(const std::string& app_id, 147 void CustomFakeGCMDriver::SendImpl(const std::string& app_id,
129 const std::string& receiver_id, 148 const std::string& receiver_id,
130 const GCMClient::OutgoingMessage& message) { 149 const GCMClient::OutgoingMessage& message) {
131 DCHECK_EQ(kGCMAccountMapperAppId, app_id); 150 DCHECK_EQ(kGCMAccountMapperAppId, app_id);
132 DCHECK_EQ(kGCMAccountMapperSenderId, receiver_id); 151 DCHECK_EQ(kGCMAccountMapperSenderId, receiver_id);
133 152
134 last_message_id_ = message.id; 153 SetLastMessageAction(message.id, SEND_STARTED);
154 }
155
156 void CustomFakeGCMDriver::CompleteSendAllMessages() {
157 for (std::map<std::string, LastMessageAction>::const_iterator iter =
158 all_messages_.begin();
159 iter != all_messages_.end();
160 ++iter) {
161 if (iter->second == SEND_STARTED)
162 CompleteSend(iter->first, GCMClient::SUCCESS);
163 }
164 }
165
166 void CustomFakeGCMDriver::AcknowledgeSendAllMessages() {
167 for (std::map<std::string, LastMessageAction>::const_iterator iter =
168 all_messages_.begin();
169 iter != all_messages_.end();
170 ++iter) {
171 if (iter->second == SEND_FINISHED)
172 AcknowledgeSend(iter->first);
173 }
174 }
175
176 void CustomFakeGCMDriver::Clear() {
177 account_mapping_ = AccountMapping();
178 last_message_id_.clear();
179 last_removed_account_id_.clear();
180 last_action_ = NONE;
181 }
182
183 void CustomFakeGCMDriver::SetLastMessageAction(const std::string& message_id,
184 LastMessageAction action) {
185 last_action_ = action;
186 last_message_id_ = message_id;
187 all_messages_[message_id] = action;
135 } 188 }
136 189
137 } // namespace 190 } // namespace
138 191
139 class GCMAccountMapperTest : public testing::Test { 192 class GCMAccountMapperTest : public testing::Test {
140 public: 193 public:
141 GCMAccountMapperTest(); 194 GCMAccountMapperTest();
142 virtual ~GCMAccountMapperTest(); 195 virtual ~GCMAccountMapperTest();
143 196
144 void Restart(); 197 void Restart();
145 198
146 const std::vector<AccountMapping>& GetAccounts() const { 199 const GCMAccountMapper::AccountMappings& GetAccounts() const {
147 return account_mapper_->accounts_; 200 return account_mapper_->accounts_;
148 } 201 }
149 202
150 GCMAccountMapper* mapper() { return account_mapper_.get(); } 203 GCMAccountMapper* mapper() { return account_mapper_.get(); }
151 204
152 CustomFakeGCMDriver& gcm_driver() { return gcm_driver_; } 205 CustomFakeGCMDriver& gcm_driver() { return gcm_driver_; }
153 206
154 base::SimpleTestClock* clock() { return clock_; } 207 base::SimpleTestClock* clock() { return clock_; }
155 208
156 private: 209 private:
(...skipping 13 matching lines...) Expand all
170 if (account_mapper_) 223 if (account_mapper_)
171 account_mapper_->ShutdownHandler(); 224 account_mapper_->ShutdownHandler();
172 account_mapper_.reset(new GCMAccountMapper(&gcm_driver_)); 225 account_mapper_.reset(new GCMAccountMapper(&gcm_driver_));
173 scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock); 226 scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock);
174 clock_ = clock.get(); 227 clock_ = clock.get();
175 account_mapper_->SetClockForTesting(clock.PassAs<base::Clock>()); 228 account_mapper_->SetClockForTesting(clock.PassAs<base::Clock>());
176 } 229 }
177 230
178 // Tests the initialization of account mappings (from the store) when empty. 231 // Tests the initialization of account mappings (from the store) when empty.
179 TEST_F(GCMAccountMapperTest, InitializeAccountMappingsEmpty) { 232 TEST_F(GCMAccountMapperTest, InitializeAccountMappingsEmpty) {
180 std::vector<AccountMapping> account_mappings; 233 GCMAccountMapper::AccountMappings account_mappings;
181 mapper()->Initialize(account_mappings, ""); 234 mapper()->Initialize(account_mappings, "");
182 EXPECT_TRUE(GetAccounts().empty()); 235 EXPECT_TRUE(GetAccounts().empty());
183 } 236 }
184 237
185 // Tests the initialization of account mappings (from the store). 238 // Tests the initialization of account mappings (from the store).
186 TEST_F(GCMAccountMapperTest, InitializeAccountMappings) { 239 TEST_F(GCMAccountMapperTest, InitializeAccountMappings) {
187 std::vector<AccountMapping> account_mappings; 240 GCMAccountMapper::AccountMappings account_mappings;
188 AccountMapping account_mapping1 = MakeAccountMapping("acc_id1", 241 AccountMapping account_mapping1 = MakeAccountMapping("acc_id1",
189 AccountMapping::MAPPED, 242 AccountMapping::MAPPED,
190 base::Time::Now(), 243 base::Time::Now(),
191 std::string()); 244 std::string());
192 AccountMapping account_mapping2 = MakeAccountMapping("acc_id2", 245 AccountMapping account_mapping2 = MakeAccountMapping("acc_id2",
193 AccountMapping::ADDING, 246 AccountMapping::ADDING,
194 base::Time::Now(), 247 base::Time::Now(),
195 "add_message_1"); 248 "add_message_1");
196 account_mappings.push_back(account_mapping1); 249 account_mappings.push_back(account_mapping1);
197 account_mappings.push_back(account_mapping2); 250 account_mappings.push_back(account_mapping2);
198 251
199 mapper()->Initialize(account_mappings, ""); 252 mapper()->Initialize(account_mappings, "");
200 253
201 std::vector<AccountMapping> mappings = GetAccounts(); 254 GCMAccountMapper::AccountMappings mappings = GetAccounts();
202 EXPECT_EQ(2UL, mappings.size()); 255 EXPECT_EQ(2UL, mappings.size());
203 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 256 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
204 257
205 EXPECT_EQ(account_mapping1.account_id, iter->account_id); 258 EXPECT_EQ(account_mapping1.account_id, iter->account_id);
206 EXPECT_EQ(account_mapping1.email, iter->email); 259 EXPECT_EQ(account_mapping1.email, iter->email);
207 EXPECT_TRUE(account_mapping1.access_token.empty()); 260 EXPECT_TRUE(account_mapping1.access_token.empty());
208 EXPECT_EQ(account_mapping1.status, iter->status); 261 EXPECT_EQ(account_mapping1.status, iter->status);
209 EXPECT_EQ(account_mapping1.status_change_timestamp, 262 EXPECT_EQ(account_mapping1.status_change_timestamp,
210 iter->status_change_timestamp); 263 iter->status_change_timestamp);
211 EXPECT_TRUE(account_mapping1.last_message_id.empty()); 264 EXPECT_TRUE(account_mapping1.last_message_id.empty());
212 265
213 ++iter; 266 ++iter;
214 EXPECT_EQ(account_mapping2.account_id, iter->account_id); 267 EXPECT_EQ(account_mapping2.account_id, iter->account_id);
215 EXPECT_EQ(account_mapping2.email, iter->email); 268 EXPECT_EQ(account_mapping2.email, iter->email);
216 EXPECT_TRUE(account_mapping2.access_token.empty()); 269 EXPECT_TRUE(account_mapping2.access_token.empty());
217 EXPECT_EQ(account_mapping2.status, iter->status); 270 EXPECT_EQ(account_mapping2.status, iter->status);
218 EXPECT_EQ(account_mapping2.status_change_timestamp, 271 EXPECT_EQ(account_mapping2.status_change_timestamp,
219 iter->status_change_timestamp); 272 iter->status_change_timestamp);
220 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); 273 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id);
221 } 274 }
222 275
223 // Tests the part where a new account is added with a token, to the point when 276 // Tests the part where a new account is added with a token, to the point when
224 // GCM message is sent. 277 // GCM message is sent.
225 TEST_F(GCMAccountMapperTest, AddMappingToMessageSent) { 278 TEST_F(GCMAccountMapperTest, AddMappingToMessageSent) {
226 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); 279 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId);
227 280
228 std::vector<GCMClient::AccountTokenInfo> account_tokens; 281 std::vector<GCMClient::AccountTokenInfo> account_tokens;
229 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); 282 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
230 account_tokens.push_back(account_token); 283 account_tokens.push_back(account_token);
231 mapper()->SetAccountTokens(account_tokens); 284 mapper()->SetAccountTokens(account_tokens);
232 285
233 std::vector<AccountMapping> mappings = GetAccounts(); 286 GCMAccountMapper::AccountMappings mappings = GetAccounts();
234 EXPECT_EQ(1UL, mappings.size()); 287 EXPECT_EQ(1UL, mappings.size());
235 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 288 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
236 EXPECT_EQ("acc_id", iter->account_id); 289 EXPECT_EQ("acc_id", iter->account_id);
237 EXPECT_EQ("acc_id@gmail.com", iter->email); 290 EXPECT_EQ("acc_id@gmail.com", iter->email);
238 EXPECT_EQ("acc_id_token", iter->access_token); 291 EXPECT_EQ("acc_id_token", iter->access_token);
239 EXPECT_EQ(AccountMapping::NEW, iter->status); 292 EXPECT_EQ(AccountMapping::NEW, iter->status);
240 EXPECT_EQ(base::Time(), iter->status_change_timestamp); 293 EXPECT_EQ(base::Time(), iter->status_change_timestamp);
241 294
242 EXPECT_TRUE(!gcm_driver().last_message_id().empty()); 295 EXPECT_TRUE(!gcm_driver().last_message_id().empty());
243 } 296 }
244 297
245 // Tests the part where GCM message is successfully queued. 298 // Tests the part where GCM message is successfully queued.
(...skipping 12 matching lines...) Expand all
258 EXPECT_EQ(account_token.account_id, 311 EXPECT_EQ(account_token.account_id,
259 gcm_driver().last_account_mapping().account_id); 312 gcm_driver().last_account_mapping().account_id);
260 EXPECT_EQ(account_token.access_token, 313 EXPECT_EQ(account_token.access_token,
261 gcm_driver().last_account_mapping().access_token); 314 gcm_driver().last_account_mapping().access_token);
262 EXPECT_EQ(AccountMapping::ADDING, gcm_driver().last_account_mapping().status); 315 EXPECT_EQ(AccountMapping::ADDING, gcm_driver().last_account_mapping().status);
263 EXPECT_EQ(clock()->Now(), 316 EXPECT_EQ(clock()->Now(),
264 gcm_driver().last_account_mapping().status_change_timestamp); 317 gcm_driver().last_account_mapping().status_change_timestamp);
265 EXPECT_EQ(gcm_driver().last_message_id(), 318 EXPECT_EQ(gcm_driver().last_message_id(),
266 gcm_driver().last_account_mapping().last_message_id); 319 gcm_driver().last_account_mapping().last_message_id);
267 320
268 std::vector<AccountMapping> mappings = GetAccounts(); 321 GCMAccountMapper::AccountMappings mappings = GetAccounts();
269 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 322 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
270 EXPECT_EQ(account_token.email, iter->email); 323 EXPECT_EQ(account_token.email, iter->email);
271 EXPECT_EQ(account_token.account_id, iter->account_id); 324 EXPECT_EQ(account_token.account_id, iter->account_id);
272 EXPECT_EQ(account_token.access_token, iter->access_token); 325 EXPECT_EQ(account_token.access_token, iter->access_token);
273 EXPECT_EQ(AccountMapping::ADDING, iter->status); 326 EXPECT_EQ(AccountMapping::ADDING, iter->status);
274 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); 327 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp);
275 EXPECT_EQ(gcm_driver().last_message_id(), iter->last_message_id); 328 EXPECT_EQ(gcm_driver().last_message_id(), iter->last_message_id);
276 } 329 }
277 330
278 // Tests status change from ADDING to MAPPED (Message is acknowledged). 331 // Tests status change from ADDING to MAPPED (Message is acknowledged).
279 TEST_F(GCMAccountMapperTest, AddMappingMessageAcknowledged) { 332 TEST_F(GCMAccountMapperTest, AddMappingMessageAcknowledged) {
280 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); 333 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId);
281 334
282 std::vector<GCMClient::AccountTokenInfo> account_tokens; 335 std::vector<GCMClient::AccountTokenInfo> account_tokens;
283 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); 336 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
284 account_tokens.push_back(account_token); 337 account_tokens.push_back(account_token);
285 mapper()->SetAccountTokens(account_tokens); 338 mapper()->SetAccountTokens(account_tokens);
286 339
287 clock()->SetNow(base::Time::Now()); 340 clock()->SetNow(base::Time::Now());
288 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); 341 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS);
289 clock()->SetNow(base::Time::Now()); 342 clock()->SetNow(base::Time::Now());
290 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); 343 gcm_driver().AcknowledgeSend(gcm_driver().last_message_id());
291 344
292 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); 345 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email);
293 EXPECT_EQ(account_token.account_id, 346 EXPECT_EQ(account_token.account_id,
294 gcm_driver().last_account_mapping().account_id); 347 gcm_driver().last_account_mapping().account_id);
295 EXPECT_EQ(account_token.access_token, 348 EXPECT_EQ(account_token.access_token,
296 gcm_driver().last_account_mapping().access_token); 349 gcm_driver().last_account_mapping().access_token);
297 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status); 350 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status);
298 EXPECT_EQ(clock()->Now(), 351 EXPECT_EQ(clock()->Now(),
299 gcm_driver().last_account_mapping().status_change_timestamp); 352 gcm_driver().last_account_mapping().status_change_timestamp);
300 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); 353 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty());
301 354
302 std::vector<AccountMapping> mappings = GetAccounts(); 355 GCMAccountMapper::AccountMappings mappings = GetAccounts();
303 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 356 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
304 EXPECT_EQ(account_token.email, iter->email); 357 EXPECT_EQ(account_token.email, iter->email);
305 EXPECT_EQ(account_token.account_id, iter->account_id); 358 EXPECT_EQ(account_token.account_id, iter->account_id);
306 EXPECT_EQ(account_token.access_token, iter->access_token); 359 EXPECT_EQ(account_token.access_token, iter->access_token);
307 EXPECT_EQ(AccountMapping::MAPPED, iter->status); 360 EXPECT_EQ(AccountMapping::MAPPED, iter->status);
308 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); 361 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp);
309 EXPECT_TRUE(iter->last_message_id.empty()); 362 EXPECT_TRUE(iter->last_message_id.empty());
310 } 363 }
311 364
312 // Tests status change form ADDING to MAPPED (When message was acknowledged, 365 // Tests status change form ADDING to MAPPED (When message was acknowledged,
313 // after Chrome was restarted). 366 // after Chrome was restarted).
314 TEST_F(GCMAccountMapperTest, AddMappingMessageAckedAfterRestart) { 367 TEST_F(GCMAccountMapperTest, AddMappingMessageAckedAfterRestart) {
315 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); 368 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId);
316 369
317 std::vector<GCMClient::AccountTokenInfo> account_tokens; 370 std::vector<GCMClient::AccountTokenInfo> account_tokens;
318 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); 371 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
319 account_tokens.push_back(account_token); 372 account_tokens.push_back(account_token);
320 mapper()->SetAccountTokens(account_tokens); 373 mapper()->SetAccountTokens(account_tokens);
321 374
322 clock()->SetNow(base::Time::Now()); 375 clock()->SetNow(base::Time::Now());
323 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); 376 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS);
324 377
325 Restart(); 378 Restart();
326 std::vector<AccountMapping> stored_mappings; 379 GCMAccountMapper::AccountMappings stored_mappings;
327 stored_mappings.push_back(gcm_driver().last_account_mapping()); 380 stored_mappings.push_back(gcm_driver().last_account_mapping());
328 mapper()->Initialize(stored_mappings, kRegistrationId); 381 mapper()->Initialize(stored_mappings, kRegistrationId);
329 382
330 clock()->SetNow(base::Time::Now()); 383 clock()->SetNow(base::Time::Now());
331 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); 384 gcm_driver().AcknowledgeSend(gcm_driver().last_message_id());
332 385
333 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); 386 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email);
334 EXPECT_EQ(account_token.account_id, 387 EXPECT_EQ(account_token.account_id,
335 gcm_driver().last_account_mapping().account_id); 388 gcm_driver().last_account_mapping().account_id);
336 EXPECT_EQ(account_token.access_token, 389 EXPECT_EQ(account_token.access_token,
337 gcm_driver().last_account_mapping().access_token); 390 gcm_driver().last_account_mapping().access_token);
338 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status); 391 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status);
339 EXPECT_EQ(clock()->Now(), 392 EXPECT_EQ(clock()->Now(),
340 gcm_driver().last_account_mapping().status_change_timestamp); 393 gcm_driver().last_account_mapping().status_change_timestamp);
341 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); 394 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty());
342 395
343 std::vector<AccountMapping> mappings = GetAccounts(); 396 GCMAccountMapper::AccountMappings mappings = GetAccounts();
344 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 397 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
345 EXPECT_EQ(account_token.email, iter->email); 398 EXPECT_EQ(account_token.email, iter->email);
346 EXPECT_EQ(account_token.account_id, iter->account_id); 399 EXPECT_EQ(account_token.account_id, iter->account_id);
347 EXPECT_EQ(account_token.access_token, iter->access_token); 400 EXPECT_EQ(account_token.access_token, iter->access_token);
348 EXPECT_EQ(AccountMapping::MAPPED, iter->status); 401 EXPECT_EQ(AccountMapping::MAPPED, iter->status);
349 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); 402 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp);
350 EXPECT_TRUE(iter->last_message_id.empty()); 403 EXPECT_TRUE(iter->last_message_id.empty());
351 } 404 }
352 405
353 // Tests a case when ADD message times out for a new account. 406 // Tests a case when ADD message times out for a new account.
354 TEST_F(GCMAccountMapperTest, AddMappingMessageSendErrorForNewAccount) { 407 TEST_F(GCMAccountMapperTest, AddMappingMessageSendErrorForNewAccount) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 stored_mappings.push_back(mapping); 439 stored_mappings.push_back(mapping);
387 mapper()->Initialize(stored_mappings, kRegistrationId); 440 mapper()->Initialize(stored_mappings, kRegistrationId);
388 441
389 clock()->SetNow(base::Time::Now()); 442 clock()->SetNow(base::Time::Now());
390 gcm_driver().MessageSendError("add_message_id"); 443 gcm_driver().MessageSendError("add_message_id");
391 444
392 // No new message is sent because of the send error, as the token is stale. 445 // 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. 446 // Because the account was new, the entry should be deleted.
394 EXPECT_TRUE(gcm_driver().last_message_id().empty()); 447 EXPECT_TRUE(gcm_driver().last_message_id().empty());
395 448
396 std::vector<AccountMapping> mappings = GetAccounts(); 449 GCMAccountMapper::AccountMappings mappings = GetAccounts();
397 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 450 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
398 EXPECT_EQ(mapping.email, iter->email); 451 EXPECT_EQ(mapping.email, iter->email);
399 EXPECT_EQ(mapping.account_id, iter->account_id); 452 EXPECT_EQ(mapping.account_id, iter->account_id);
400 EXPECT_EQ(mapping.access_token, iter->access_token); 453 EXPECT_EQ(mapping.access_token, iter->access_token);
401 EXPECT_EQ(AccountMapping::MAPPED, iter->status); 454 EXPECT_EQ(AccountMapping::MAPPED, iter->status);
402 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); 455 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp);
403 EXPECT_TRUE(iter->last_message_id.empty()); 456 EXPECT_TRUE(iter->last_message_id.empty());
404 } 457 }
405 458
406 // Tests that a missing token for an account will trigger removing of that 459 // 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. 460 // account. This test goes only until the message is passed to GCM.
(...skipping 12 matching lines...) Expand all
420 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); 473 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>());
421 474
422 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); 475 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id);
423 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); 476 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email);
424 EXPECT_EQ(AccountMapping::REMOVING, 477 EXPECT_EQ(AccountMapping::REMOVING,
425 gcm_driver().last_account_mapping().status); 478 gcm_driver().last_account_mapping().status);
426 EXPECT_EQ(clock()->Now(), 479 EXPECT_EQ(clock()->Now(),
427 gcm_driver().last_account_mapping().status_change_timestamp); 480 gcm_driver().last_account_mapping().status_change_timestamp);
428 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); 481 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty());
429 482
430 std::vector<AccountMapping> mappings = GetAccounts(); 483 GCMAccountMapper::AccountMappings mappings = GetAccounts();
431 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 484 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
432 EXPECT_EQ(mapping.email, iter->email); 485 EXPECT_EQ(mapping.email, iter->email);
433 EXPECT_EQ(mapping.account_id, iter->account_id); 486 EXPECT_EQ(mapping.account_id, iter->account_id);
434 EXPECT_EQ(mapping.access_token, iter->access_token); 487 EXPECT_EQ(mapping.access_token, iter->access_token);
435 EXPECT_EQ(AccountMapping::REMOVING, iter->status); 488 EXPECT_EQ(AccountMapping::REMOVING, iter->status);
436 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); 489 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp);
437 EXPECT_TRUE(iter->last_message_id.empty()); 490 EXPECT_TRUE(iter->last_message_id.empty());
438 } 491 }
439 492
440 // Tests that a missing token for an account will trigger removing of that 493 // 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. 494 // account. This test goes until the message is queued by GCM.
(...skipping 15 matching lines...) Expand all
457 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); 510 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS);
458 511
459 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); 512 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id);
460 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); 513 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email);
461 EXPECT_EQ(AccountMapping::REMOVING, 514 EXPECT_EQ(AccountMapping::REMOVING,
462 gcm_driver().last_account_mapping().status); 515 gcm_driver().last_account_mapping().status);
463 EXPECT_EQ(status_change_timestamp, 516 EXPECT_EQ(status_change_timestamp,
464 gcm_driver().last_account_mapping().status_change_timestamp); 517 gcm_driver().last_account_mapping().status_change_timestamp);
465 EXPECT_TRUE(!gcm_driver().last_account_mapping().last_message_id.empty()); 518 EXPECT_TRUE(!gcm_driver().last_account_mapping().last_message_id.empty());
466 519
467 std::vector<AccountMapping> mappings = GetAccounts(); 520 GCMAccountMapper::AccountMappings mappings = GetAccounts();
468 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 521 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
469 EXPECT_EQ(mapping.email, iter->email); 522 EXPECT_EQ(mapping.email, iter->email);
470 EXPECT_EQ(mapping.account_id, iter->account_id); 523 EXPECT_EQ(mapping.account_id, iter->account_id);
471 EXPECT_EQ(mapping.access_token, iter->access_token); 524 EXPECT_EQ(mapping.access_token, iter->access_token);
472 EXPECT_EQ(AccountMapping::REMOVING, iter->status); 525 EXPECT_EQ(AccountMapping::REMOVING, iter->status);
473 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); 526 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp);
474 EXPECT_EQ(gcm_driver().last_account_mapping().last_message_id, 527 EXPECT_EQ(gcm_driver().last_account_mapping().last_message_id,
475 iter->last_message_id); 528 iter->last_message_id);
476 } 529 }
477 530
478 // Tests that a missing token for an account will trigger removing of that 531 // 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. 532 // 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 533 // This is a complete success scenario for account removal, and it end with
481 // account mapping being completely gone. 534 // account mapping being completely gone.
482 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAcknowledged) { 535 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAcknowledged) {
483 // Start with one account that is mapped. 536 // Start with one account that is mapped.
484 AccountMapping mapping = MakeAccountMapping("acc_id", 537 AccountMapping mapping = MakeAccountMapping("acc_id",
485 AccountMapping::MAPPED, 538 AccountMapping::MAPPED,
486 base::Time::Now(), 539 base::Time::Now(),
487 std::string()); 540 std::string());
488 541
489 GCMAccountMapper::AccountMappings stored_mappings; 542 GCMAccountMapper::AccountMappings stored_mappings;
490 stored_mappings.push_back(mapping); 543 stored_mappings.push_back(mapping);
491 mapper()->Initialize(stored_mappings, kRegistrationId); 544 mapper()->Initialize(stored_mappings, kRegistrationId);
492 clock()->SetNow(base::Time::Now()); 545 clock()->SetNow(base::Time::Now());
493 546
494 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); 547 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>());
495 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); 548 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS);
496 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); 549 gcm_driver().AcknowledgeSend(gcm_driver().last_message_id());
497 550
498 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id()); 551 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id());
499 552
500 std::vector<AccountMapping> mappings = GetAccounts(); 553 GCMAccountMapper::AccountMappings mappings = GetAccounts();
501 EXPECT_TRUE(mappings.empty()); 554 EXPECT_TRUE(mappings.empty());
502 } 555 }
503 556
504 // Tests that account removing proceeds, when a removing message is acked after 557 // Tests that account removing proceeds, when a removing message is acked after
505 // Chrome was restarted. 558 // Chrome was restarted.
506 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAckedAfterRestart) { 559 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAckedAfterRestart) {
507 // Start with one account that is mapped. 560 // Start with one account that is mapped.
508 AccountMapping mapping = MakeAccountMapping("acc_id", 561 AccountMapping mapping = MakeAccountMapping("acc_id",
509 AccountMapping::REMOVING, 562 AccountMapping::REMOVING,
510 base::Time::Now(), 563 base::Time::Now(),
511 "remove_message_id"); 564 "remove_message_id");
512 565
513 GCMAccountMapper::AccountMappings stored_mappings; 566 GCMAccountMapper::AccountMappings stored_mappings;
514 stored_mappings.push_back(mapping); 567 stored_mappings.push_back(mapping);
515 mapper()->Initialize(stored_mappings, kRegistrationId); 568 mapper()->Initialize(stored_mappings, kRegistrationId);
516 569
517 gcm_driver().SendAcknowledged("remove_message_id"); 570 gcm_driver().AcknowledgeSend("remove_message_id");
518 571
519 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id()); 572 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id());
520 573
521 std::vector<AccountMapping> mappings = GetAccounts(); 574 GCMAccountMapper::AccountMappings mappings = GetAccounts();
522 EXPECT_TRUE(mappings.empty()); 575 EXPECT_TRUE(mappings.empty());
523 } 576 }
524 577
525 // Tests that account removing proceeds, when a removing message is acked after 578 // Tests that account removing proceeds, when a removing message is acked after
526 // Chrome was restarted. 579 // Chrome was restarted.
527 TEST_F(GCMAccountMapperTest, RemoveMappingMessageSendError) { 580 TEST_F(GCMAccountMapperTest, RemoveMappingMessageSendError) {
528 // Start with one account that is mapped. 581 // Start with one account that is mapped.
529 base::Time status_change_timestamp = base::Time::Now(); 582 base::Time status_change_timestamp = base::Time::Now();
530 AccountMapping mapping = MakeAccountMapping("acc_id", 583 AccountMapping mapping = MakeAccountMapping("acc_id",
531 AccountMapping::REMOVING, 584 AccountMapping::REMOVING,
(...skipping 11 matching lines...) Expand all
543 596
544 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); 597 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id);
545 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); 598 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email);
546 EXPECT_EQ(AccountMapping::REMOVING, 599 EXPECT_EQ(AccountMapping::REMOVING,
547 gcm_driver().last_account_mapping().status); 600 gcm_driver().last_account_mapping().status);
548 EXPECT_EQ(status_change_timestamp, 601 EXPECT_EQ(status_change_timestamp,
549 gcm_driver().last_account_mapping().status_change_timestamp); 602 gcm_driver().last_account_mapping().status_change_timestamp);
550 // Message is not persisted, until send is completed. 603 // Message is not persisted, until send is completed.
551 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); 604 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty());
552 605
553 std::vector<AccountMapping> mappings = GetAccounts(); 606 GCMAccountMapper::AccountMappings mappings = GetAccounts();
554 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); 607 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
555 EXPECT_EQ(mapping.email, iter->email); 608 EXPECT_EQ(mapping.email, iter->email);
556 EXPECT_EQ(mapping.account_id, iter->account_id); 609 EXPECT_EQ(mapping.account_id, iter->account_id);
557 EXPECT_TRUE(iter->access_token.empty()); 610 EXPECT_TRUE(iter->access_token.empty());
558 EXPECT_EQ(AccountMapping::REMOVING, iter->status); 611 EXPECT_EQ(AccountMapping::REMOVING, iter->status);
559 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); 612 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp);
560 EXPECT_TRUE(iter->last_message_id.empty()); 613 EXPECT_TRUE(iter->last_message_id.empty());
561 } 614 }
562 615
616 // Tests that, if a new token arrives when the adding message is in progress
617 // no new message is sent and account mapper still waits for the first one to
618 // complete.
619 TEST_F(GCMAccountMapperTest, TokenIsRefreshedWhenAdding) {
620 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId);
621
622 clock()->SetNow(base::Time::Now());
623 std::vector<GCMClient::AccountTokenInfo> account_tokens;
624 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
625 account_tokens.push_back(account_token);
626 mapper()->SetAccountTokens(account_tokens);
627 DCHECK_EQ(CustomFakeGCMDriver::SEND_STARTED, gcm_driver().last_action());
628
629 clock()->SetNow(base::Time::Now());
630 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS);
631 DCHECK_EQ(CustomFakeGCMDriver::SEND_FINISHED, gcm_driver().last_action());
632
633 // Providing another token and clearing status.
634 gcm_driver().Clear();
635 mapper()->SetAccountTokens(account_tokens);
636 DCHECK_EQ(CustomFakeGCMDriver::NONE, gcm_driver().last_action());
637 }
638
639 // Tests that, if a new token arrives when a removing message is in progress
640 // a new adding message is sent and while account mapping status is changed to
641 // mapped. If the original Removing message arrives it is discarded.
642 TEST_F(GCMAccountMapperTest, TokenIsRefreshedWhenRemoving) {
643 // Start with one account that is mapped.
644 AccountMapping mapping = MakeAccountMapping(
645 "acc_id", AccountMapping::MAPPED, base::Time::Now(), std::string());
646
647 GCMAccountMapper::AccountMappings stored_mappings;
648 stored_mappings.push_back(mapping);
649 mapper()->Initialize(stored_mappings, kRegistrationId);
650 clock()->SetNow(base::Time::Now());
651
652 // Remove the token to trigger a remove message to be sent
653 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>());
654 EXPECT_EQ(CustomFakeGCMDriver::SEND_STARTED, gcm_driver().last_action());
655 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS);
656 EXPECT_EQ(CustomFakeGCMDriver::SEND_FINISHED, gcm_driver().last_action());
657
658 std::string remove_message_id = gcm_driver().last_message_id();
659 gcm_driver().Clear();
660
661 // The account mapping for acc_id is now in status REMOVING.
662 // Adding the token for that account.
663 clock()->SetNow(base::Time::Now());
664 std::vector<GCMClient::AccountTokenInfo> account_tokens;
665 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id");
666 account_tokens.push_back(account_token);
667 mapper()->SetAccountTokens(account_tokens);
668 DCHECK_EQ(CustomFakeGCMDriver::SEND_STARTED, gcm_driver().last_action());
669 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS);
670 EXPECT_EQ(CustomFakeGCMDriver::SEND_FINISHED, gcm_driver().last_action());
671
672 std::string add_message_id = gcm_driver().last_message_id();
673
674 // A remove message confirmation arrives now, but should be ignored.
675 gcm_driver().AcknowledgeSend(remove_message_id);
676
677 GCMAccountMapper::AccountMappings mappings = GetAccounts();
678 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin();
679 EXPECT_EQ(mapping.email, iter->email);
680 EXPECT_EQ(mapping.account_id, iter->account_id);
681 EXPECT_FALSE(iter->access_token.empty());
682 EXPECT_EQ(AccountMapping::MAPPED, iter->status);
683 // Status change timestamp is set to very long time ago, to make sure the next
684 // round of mapping picks it up.
685 EXPECT_EQ(base::Time(), iter->status_change_timestamp);
686 EXPECT_EQ(add_message_id, iter->last_message_id);
687 }
688
689 // Tests adding/removing works for multiple accounts, after a restart and when
690 // tokens are periodically delierverd.
691 TEST_F(GCMAccountMapperTest, MultipleAccountMappings) {
692 clock()->SetNow(base::Time::Now());
693 base::Time half_hour_ago = clock()->Now() - base::TimeDelta::FromMinutes(30);
694 GCMAccountMapper::AccountMappings stored_mappings;
695 stored_mappings.push_back(MakeAccountMapping(
696 "acc_id_0", AccountMapping::ADDING, half_hour_ago, "acc_id_0_msg"));
697 stored_mappings.push_back(MakeAccountMapping(
698 "acc_id_1", AccountMapping::MAPPED, half_hour_ago, "acc_id_1_msg"));
699 stored_mappings.push_back(MakeAccountMapping(
700 "acc_id_2", AccountMapping::REMOVING, half_hour_ago, "acc_id_2_msg"));
701
702 mapper()->Initialize(stored_mappings, kRegistrationId);
703
704 GCMAccountMapper::AccountMappings expected_mappings(stored_mappings);
705
706 // Finish messages after a restart.
707 clock()->SetNow(base::Time::Now());
708 gcm_driver().AcknowledgeSend(expected_mappings[0].last_message_id);
709 expected_mappings[0].status_change_timestamp = clock()->Now();
710 expected_mappings[0].status = AccountMapping::MAPPED;
711 expected_mappings[0].last_message_id.clear();
712
713 clock()->SetNow(base::Time::Now());
714 gcm_driver().AcknowledgeSend(expected_mappings[1].last_message_id);
715 expected_mappings[1].status_change_timestamp = clock()->Now();
716 expected_mappings[1].status = AccountMapping::MAPPED;
717 expected_mappings[1].last_message_id.clear();
718
719 // Upon success last element is removed.
720 clock()->SetNow(base::Time::Now());
721 gcm_driver().AcknowledgeSend(expected_mappings[2].last_message_id);
722 expected_mappings.pop_back();
723
724 GCMAccountMapper::AccountMappings mappings = GetAccounts();
725
726 EXPECT_EQ(expected_mappings.size(), mappings.size());
727 GCMAccountMapper::AccountMappings::const_iterator expected_iter =
728 expected_mappings.begin();
729 GCMAccountMapper::AccountMappings::const_iterator actual_iter =
730 mappings.begin();
731
732 for (; expected_iter != expected_mappings.end() &&
733 actual_iter != mappings.end();
734 ++expected_iter, ++actual_iter) {
735 EXPECT_EQ(expected_iter->email, actual_iter->email);
736 EXPECT_EQ(expected_iter->account_id, actual_iter->account_id);
737 EXPECT_EQ(expected_iter->status, actual_iter->status);
738 EXPECT_EQ(expected_iter->status_change_timestamp,
739 actual_iter->status_change_timestamp);
740 }
741
742 // One of accounts gets removed.
743 std::vector<GCMClient::AccountTokenInfo> account_tokens;
744 account_tokens.push_back(MakeAccountTokenInfo("acc_id_0"));
745
746 // Advance a day to make sure existing mappings will be reported.
747 clock()->SetNow(clock()->Now() + base::TimeDelta::FromDays(1));
748 mapper()->SetAccountTokens(account_tokens);
749
750 expected_mappings[0].status = AccountMapping::MAPPED;
751 expected_mappings[1].status = AccountMapping::REMOVING;
752 expected_mappings[1].status_change_timestamp = clock()->Now();
753
754 gcm_driver().CompleteSendAllMessages();
755
756 for (; expected_iter != expected_mappings.end() &&
757 actual_iter != mappings.end();
758 ++expected_iter, ++actual_iter) {
759 EXPECT_EQ(expected_iter->email, actual_iter->email);
760 EXPECT_EQ(expected_iter->account_id, actual_iter->account_id);
761 EXPECT_EQ(expected_iter->status, actual_iter->status);
762 EXPECT_EQ(expected_iter->status_change_timestamp,
763 actual_iter->status_change_timestamp);
764 }
765
766 clock()->SetNow(clock()->Now() + base::TimeDelta::FromSeconds(5));
767 gcm_driver().AcknowledgeSendAllMessages();
768
769 expected_mappings[0].status_change_timestamp = clock()->Now();
770 expected_mappings.pop_back();
771
772 for (; expected_iter != expected_mappings.end() &&
773 actual_iter != mappings.end();
774 ++expected_iter, ++actual_iter) {
775 EXPECT_EQ(expected_iter->email, actual_iter->email);
776 EXPECT_EQ(expected_iter->account_id, actual_iter->account_id);
777 EXPECT_EQ(expected_iter->status, actual_iter->status);
778 EXPECT_EQ(expected_iter->status_change_timestamp,
779 actual_iter->status_change_timestamp);
780 }
781
782 account_tokens.clear();
783 account_tokens.push_back(MakeAccountTokenInfo("acc_id_0"));
784 account_tokens.push_back(MakeAccountTokenInfo("acc_id_3"));
785 account_tokens.push_back(MakeAccountTokenInfo("acc_id_4"));
786
787 // Advance a day to make sure existing mappings will be reported.
788 clock()->SetNow(clock()->Now() + base::TimeDelta::FromDays(1));
789 mapper()->SetAccountTokens(account_tokens);
790
791 // Mapping from acc_id_0 still in position 0
792 expected_mappings.push_back(MakeAccountMapping(
793 "acc_id_3", AccountMapping::ADDING, base::Time(), std::string()));
794 expected_mappings.push_back(MakeAccountMapping(
795 "acc_id_4", AccountMapping::ADDING, base::Time(), std::string()));
796
797 for (; expected_iter != expected_mappings.end() &&
798 actual_iter != mappings.end();
799 ++expected_iter, ++actual_iter) {
800 EXPECT_EQ(expected_iter->email, actual_iter->email);
801 EXPECT_EQ(expected_iter->account_id, actual_iter->account_id);
802 EXPECT_EQ(expected_iter->status, actual_iter->status);
803 EXPECT_EQ(expected_iter->status_change_timestamp,
804 actual_iter->status_change_timestamp);
805 }
806
807 clock()->SetNow(clock()->Now() + base::TimeDelta::FromSeconds(1));
808 gcm_driver().CompleteSendAllMessages();
809
810 expected_mappings[1].status_change_timestamp = clock()->Now();
811 expected_mappings[2].status_change_timestamp = clock()->Now();
812
813 for (; expected_iter != expected_mappings.end() &&
814 actual_iter != mappings.end();
815 ++expected_iter, ++actual_iter) {
816 EXPECT_EQ(expected_iter->email, actual_iter->email);
817 EXPECT_EQ(expected_iter->account_id, actual_iter->account_id);
818 EXPECT_EQ(expected_iter->status, actual_iter->status);
819 EXPECT_EQ(expected_iter->status_change_timestamp,
820 actual_iter->status_change_timestamp);
821 }
822
823 clock()->SetNow(clock()->Now() + base::TimeDelta::FromSeconds(5));
824 gcm_driver().AcknowledgeSendAllMessages();
825
826 expected_mappings[0].status_change_timestamp = clock()->Now();
827 expected_mappings[1].status_change_timestamp = clock()->Now();
828 expected_mappings[1].status = AccountMapping::MAPPED;
829 expected_mappings[2].status_change_timestamp = clock()->Now();
830 expected_mappings[2].status = AccountMapping::MAPPED;
831
832 for (; expected_iter != expected_mappings.end() &&
833 actual_iter != mappings.end();
834 ++expected_iter, ++actual_iter) {
835 EXPECT_EQ(expected_iter->email, actual_iter->email);
836 EXPECT_EQ(expected_iter->account_id, actual_iter->account_id);
837 EXPECT_EQ(expected_iter->status, actual_iter->status);
838 EXPECT_EQ(expected_iter->status_change_timestamp,
839 actual_iter->status_change_timestamp);
840 }
841 }
842
563 } // namespace gcm 843 } // namespace gcm
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698