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

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

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