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