OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |