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 26 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 | |
54 CustomFakeGCMDriver(); | 47 CustomFakeGCMDriver(); |
55 virtual ~CustomFakeGCMDriver(); | 48 virtual ~CustomFakeGCMDriver(); |
56 | 49 |
57 virtual void UpdateAccountMapping( | 50 virtual void UpdateAccountMapping( |
58 const AccountMapping& account_mapping) OVERRIDE; | 51 const AccountMapping& account_mapping) OVERRIDE; |
59 virtual void RemoveAccountMapping(const std::string& account_id) OVERRIDE; | 52 virtual void RemoveAccountMapping(const std::string& account_id) OVERRIDE; |
60 virtual void AddAppHandler(const std::string& app_id, | 53 virtual void AddAppHandler(const std::string& app_id, |
61 GCMAppHandler* handler) OVERRIDE; | 54 GCMAppHandler* handler) OVERRIDE; |
62 virtual void RemoveAppHandler(const std::string& app_id) OVERRIDE; | 55 virtual void RemoveAppHandler(const std::string& app_id) OVERRIDE; |
63 | 56 |
64 void CompleteSend(const std::string& message_id, GCMClient::Result result); | 57 void CompleteSend(const std::string& message_id, GCMClient::Result result); |
65 void AcknowledgeSend(const std::string& message_id); | 58 void SendAcknowledged(const std::string& message_id); |
66 void MessageSendError(const std::string& message_id); | 59 void MessageSendError(const std::string& message_id); |
67 | 60 |
68 void CompleteSendAllMessages(); | |
69 void AcknowledgeSendAllMessages(); | |
70 | |
71 void SetLastMessageAction(const std::string& message_id, | |
72 LastMessageAction action); | |
73 void Clear(); | |
74 | |
75 const AccountMapping& last_account_mapping() const { | 61 const AccountMapping& last_account_mapping() const { |
76 return account_mapping_; | 62 return account_mapping_; |
77 } | 63 } |
78 const std::string& last_message_id() const { return last_message_id_; } | 64 const std::string& last_message_id() const { return last_message_id_; } |
79 const std::string& last_removed_account_id() const { | 65 const std::string& last_removed_account_id() const { |
80 return last_removed_account_id_; | 66 return last_removed_account_id_; |
81 } | 67 } |
82 LastMessageAction last_action() const { return last_action_; } | |
83 | 68 |
84 protected: | 69 protected: |
85 virtual void SendImpl(const std::string& app_id, | 70 virtual void SendImpl(const std::string& app_id, |
86 const std::string& receiver_id, | 71 const std::string& receiver_id, |
87 const GCMClient::OutgoingMessage& message) OVERRIDE; | 72 const GCMClient::OutgoingMessage& message) OVERRIDE; |
88 | 73 |
89 private: | 74 private: |
90 AccountMapping account_mapping_; | 75 AccountMapping account_mapping_; |
91 std::string last_message_id_; | 76 std::string last_message_id_; |
92 std::string last_removed_account_id_; | 77 std::string last_removed_account_id_; |
93 LastMessageAction last_action_; | |
94 std::map<std::string, LastMessageAction> all_messages_; | |
95 }; | 78 }; |
96 | 79 |
97 CustomFakeGCMDriver::CustomFakeGCMDriver() : last_action_(NONE) { | 80 CustomFakeGCMDriver::CustomFakeGCMDriver() { |
98 } | 81 } |
99 | 82 |
100 CustomFakeGCMDriver::~CustomFakeGCMDriver() { | 83 CustomFakeGCMDriver::~CustomFakeGCMDriver() { |
101 } | 84 } |
102 | 85 |
103 void CustomFakeGCMDriver::UpdateAccountMapping( | 86 void CustomFakeGCMDriver::UpdateAccountMapping( |
104 const AccountMapping& account_mapping) { | 87 const AccountMapping& account_mapping) { |
105 account_mapping_.email = account_mapping.email; | 88 account_mapping_.email = account_mapping.email; |
106 account_mapping_.account_id = account_mapping.account_id; | 89 account_mapping_.account_id = account_mapping.account_id; |
107 account_mapping_.access_token = account_mapping.access_token; | 90 account_mapping_.access_token = account_mapping.access_token; |
(...skipping 12 matching lines...) Expand all Loading... |
120 GCMDriver::AddAppHandler(app_id, handler); | 103 GCMDriver::AddAppHandler(app_id, handler); |
121 } | 104 } |
122 | 105 |
123 void CustomFakeGCMDriver::RemoveAppHandler(const std::string& app_id) { | 106 void CustomFakeGCMDriver::RemoveAppHandler(const std::string& app_id) { |
124 GCMDriver::RemoveAppHandler(app_id); | 107 GCMDriver::RemoveAppHandler(app_id); |
125 } | 108 } |
126 | 109 |
127 void CustomFakeGCMDriver::CompleteSend(const std::string& message_id, | 110 void CustomFakeGCMDriver::CompleteSend(const std::string& message_id, |
128 GCMClient::Result result) { | 111 GCMClient::Result result) { |
129 SendFinished(kGCMAccountMapperAppId, message_id, result); | 112 SendFinished(kGCMAccountMapperAppId, message_id, result); |
130 SetLastMessageAction(message_id, SEND_FINISHED); | |
131 } | 113 } |
132 | 114 |
133 void CustomFakeGCMDriver::AcknowledgeSend(const std::string& message_id) { | 115 void CustomFakeGCMDriver::SendAcknowledged(const std::string& message_id) { |
134 GetAppHandler(kGCMAccountMapperAppId) | 116 GetAppHandler(kGCMAccountMapperAppId) |
135 ->OnSendAcknowledged(kGCMAccountMapperAppId, message_id); | 117 ->OnSendAcknowledged(kGCMAccountMapperAppId, message_id); |
136 SetLastMessageAction(message_id, SEND_ACKNOWLEDGED); | |
137 } | 118 } |
138 | 119 |
139 void CustomFakeGCMDriver::MessageSendError(const std::string& message_id) { | 120 void CustomFakeGCMDriver::MessageSendError(const std::string& message_id) { |
140 GCMClient::SendErrorDetails send_error; | 121 GCMClient::SendErrorDetails send_error; |
141 send_error.message_id = message_id; | 122 send_error.message_id = message_id; |
142 send_error.result = GCMClient::TTL_EXCEEDED; | 123 send_error.result = GCMClient::TTL_EXCEEDED; |
143 GetAppHandler(kGCMAccountMapperAppId) | 124 GetAppHandler(kGCMAccountMapperAppId) |
144 ->OnSendError(kGCMAccountMapperAppId, send_error); | 125 ->OnSendError(kGCMAccountMapperAppId, send_error); |
145 } | 126 } |
146 | 127 |
147 void CustomFakeGCMDriver::SendImpl(const std::string& app_id, | 128 void CustomFakeGCMDriver::SendImpl(const std::string& app_id, |
148 const std::string& receiver_id, | 129 const std::string& receiver_id, |
149 const GCMClient::OutgoingMessage& message) { | 130 const GCMClient::OutgoingMessage& message) { |
150 DCHECK_EQ(kGCMAccountMapperAppId, app_id); | 131 DCHECK_EQ(kGCMAccountMapperAppId, app_id); |
151 DCHECK_EQ(kGCMAccountMapperSenderId, receiver_id); | 132 DCHECK_EQ(kGCMAccountMapperSenderId, receiver_id); |
152 | 133 |
153 SetLastMessageAction(message.id, SEND_STARTED); | 134 last_message_id_ = message.id; |
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; | |
188 } | 135 } |
189 | 136 |
190 } // namespace | 137 } // namespace |
191 | 138 |
192 class GCMAccountMapperTest : public testing::Test { | 139 class GCMAccountMapperTest : public testing::Test { |
193 public: | 140 public: |
194 GCMAccountMapperTest(); | 141 GCMAccountMapperTest(); |
195 virtual ~GCMAccountMapperTest(); | 142 virtual ~GCMAccountMapperTest(); |
196 | 143 |
197 void Restart(); | 144 void Restart(); |
198 | 145 |
199 const GCMAccountMapper::AccountMappings& GetAccounts() const { | 146 const std::vector<AccountMapping>& GetAccounts() const { |
200 return account_mapper_->accounts_; | 147 return account_mapper_->accounts_; |
201 } | 148 } |
202 | 149 |
203 GCMAccountMapper* mapper() { return account_mapper_.get(); } | 150 GCMAccountMapper* mapper() { return account_mapper_.get(); } |
204 | 151 |
205 CustomFakeGCMDriver& gcm_driver() { return gcm_driver_; } | 152 CustomFakeGCMDriver& gcm_driver() { return gcm_driver_; } |
206 | 153 |
207 base::SimpleTestClock* clock() { return clock_; } | 154 base::SimpleTestClock* clock() { return clock_; } |
208 | 155 |
209 private: | 156 private: |
(...skipping 13 matching lines...) Expand all Loading... |
223 if (account_mapper_) | 170 if (account_mapper_) |
224 account_mapper_->ShutdownHandler(); | 171 account_mapper_->ShutdownHandler(); |
225 account_mapper_.reset(new GCMAccountMapper(&gcm_driver_)); | 172 account_mapper_.reset(new GCMAccountMapper(&gcm_driver_)); |
226 scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock); | 173 scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock); |
227 clock_ = clock.get(); | 174 clock_ = clock.get(); |
228 account_mapper_->SetClockForTesting(clock.PassAs<base::Clock>()); | 175 account_mapper_->SetClockForTesting(clock.PassAs<base::Clock>()); |
229 } | 176 } |
230 | 177 |
231 // Tests the initialization of account mappings (from the store) when empty. | 178 // Tests the initialization of account mappings (from the store) when empty. |
232 TEST_F(GCMAccountMapperTest, InitializeAccountMappingsEmpty) { | 179 TEST_F(GCMAccountMapperTest, InitializeAccountMappingsEmpty) { |
233 GCMAccountMapper::AccountMappings account_mappings; | 180 std::vector<AccountMapping> account_mappings; |
234 mapper()->Initialize(account_mappings, ""); | 181 mapper()->Initialize(account_mappings, ""); |
235 EXPECT_TRUE(GetAccounts().empty()); | 182 EXPECT_TRUE(GetAccounts().empty()); |
236 } | 183 } |
237 | 184 |
238 // Tests the initialization of account mappings (from the store). | 185 // Tests the initialization of account mappings (from the store). |
239 TEST_F(GCMAccountMapperTest, InitializeAccountMappings) { | 186 TEST_F(GCMAccountMapperTest, InitializeAccountMappings) { |
240 GCMAccountMapper::AccountMappings account_mappings; | 187 std::vector<AccountMapping> account_mappings; |
241 AccountMapping account_mapping1 = MakeAccountMapping("acc_id1", | 188 AccountMapping account_mapping1 = MakeAccountMapping("acc_id1", |
242 AccountMapping::MAPPED, | 189 AccountMapping::MAPPED, |
243 base::Time::Now(), | 190 base::Time::Now(), |
244 std::string()); | 191 std::string()); |
245 AccountMapping account_mapping2 = MakeAccountMapping("acc_id2", | 192 AccountMapping account_mapping2 = MakeAccountMapping("acc_id2", |
246 AccountMapping::ADDING, | 193 AccountMapping::ADDING, |
247 base::Time::Now(), | 194 base::Time::Now(), |
248 "add_message_1"); | 195 "add_message_1"); |
249 account_mappings.push_back(account_mapping1); | 196 account_mappings.push_back(account_mapping1); |
250 account_mappings.push_back(account_mapping2); | 197 account_mappings.push_back(account_mapping2); |
251 | 198 |
252 mapper()->Initialize(account_mappings, ""); | 199 mapper()->Initialize(account_mappings, ""); |
253 | 200 |
254 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 201 std::vector<AccountMapping> mappings = GetAccounts(); |
255 EXPECT_EQ(2UL, mappings.size()); | 202 EXPECT_EQ(2UL, mappings.size()); |
256 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 203 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
257 | 204 |
258 EXPECT_EQ(account_mapping1.account_id, iter->account_id); | 205 EXPECT_EQ(account_mapping1.account_id, iter->account_id); |
259 EXPECT_EQ(account_mapping1.email, iter->email); | 206 EXPECT_EQ(account_mapping1.email, iter->email); |
260 EXPECT_TRUE(account_mapping1.access_token.empty()); | 207 EXPECT_TRUE(account_mapping1.access_token.empty()); |
261 EXPECT_EQ(account_mapping1.status, iter->status); | 208 EXPECT_EQ(account_mapping1.status, iter->status); |
262 EXPECT_EQ(account_mapping1.status_change_timestamp, | 209 EXPECT_EQ(account_mapping1.status_change_timestamp, |
263 iter->status_change_timestamp); | 210 iter->status_change_timestamp); |
264 EXPECT_TRUE(account_mapping1.last_message_id.empty()); | 211 EXPECT_TRUE(account_mapping1.last_message_id.empty()); |
265 | 212 |
266 ++iter; | 213 ++iter; |
267 EXPECT_EQ(account_mapping2.account_id, iter->account_id); | 214 EXPECT_EQ(account_mapping2.account_id, iter->account_id); |
268 EXPECT_EQ(account_mapping2.email, iter->email); | 215 EXPECT_EQ(account_mapping2.email, iter->email); |
269 EXPECT_TRUE(account_mapping2.access_token.empty()); | 216 EXPECT_TRUE(account_mapping2.access_token.empty()); |
270 EXPECT_EQ(account_mapping2.status, iter->status); | 217 EXPECT_EQ(account_mapping2.status, iter->status); |
271 EXPECT_EQ(account_mapping2.status_change_timestamp, | 218 EXPECT_EQ(account_mapping2.status_change_timestamp, |
272 iter->status_change_timestamp); | 219 iter->status_change_timestamp); |
273 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); | 220 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); |
274 } | 221 } |
275 | 222 |
276 // Tests the part where a new account is added with a token, to the point when | 223 // Tests the part where a new account is added with a token, to the point when |
277 // GCM message is sent. | 224 // GCM message is sent. |
278 TEST_F(GCMAccountMapperTest, AddMappingToMessageSent) { | 225 TEST_F(GCMAccountMapperTest, AddMappingToMessageSent) { |
279 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); | 226 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); |
280 | 227 |
281 std::vector<GCMClient::AccountTokenInfo> account_tokens; | 228 std::vector<GCMClient::AccountTokenInfo> account_tokens; |
282 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); | 229 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); |
283 account_tokens.push_back(account_token); | 230 account_tokens.push_back(account_token); |
284 mapper()->SetAccountTokens(account_tokens); | 231 mapper()->SetAccountTokens(account_tokens); |
285 | 232 |
286 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 233 std::vector<AccountMapping> mappings = GetAccounts(); |
287 EXPECT_EQ(1UL, mappings.size()); | 234 EXPECT_EQ(1UL, mappings.size()); |
288 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 235 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
289 EXPECT_EQ("acc_id", iter->account_id); | 236 EXPECT_EQ("acc_id", iter->account_id); |
290 EXPECT_EQ("acc_id@gmail.com", iter->email); | 237 EXPECT_EQ("acc_id@gmail.com", iter->email); |
291 EXPECT_EQ("acc_id_token", iter->access_token); | 238 EXPECT_EQ("acc_id_token", iter->access_token); |
292 EXPECT_EQ(AccountMapping::NEW, iter->status); | 239 EXPECT_EQ(AccountMapping::NEW, iter->status); |
293 EXPECT_EQ(base::Time(), iter->status_change_timestamp); | 240 EXPECT_EQ(base::Time(), iter->status_change_timestamp); |
294 | 241 |
295 EXPECT_TRUE(!gcm_driver().last_message_id().empty()); | 242 EXPECT_TRUE(!gcm_driver().last_message_id().empty()); |
296 } | 243 } |
297 | 244 |
298 // Tests the part where GCM message is successfully queued. | 245 // Tests the part where GCM message is successfully queued. |
(...skipping 12 matching lines...) Expand all Loading... |
311 EXPECT_EQ(account_token.account_id, | 258 EXPECT_EQ(account_token.account_id, |
312 gcm_driver().last_account_mapping().account_id); | 259 gcm_driver().last_account_mapping().account_id); |
313 EXPECT_EQ(account_token.access_token, | 260 EXPECT_EQ(account_token.access_token, |
314 gcm_driver().last_account_mapping().access_token); | 261 gcm_driver().last_account_mapping().access_token); |
315 EXPECT_EQ(AccountMapping::ADDING, gcm_driver().last_account_mapping().status); | 262 EXPECT_EQ(AccountMapping::ADDING, gcm_driver().last_account_mapping().status); |
316 EXPECT_EQ(clock()->Now(), | 263 EXPECT_EQ(clock()->Now(), |
317 gcm_driver().last_account_mapping().status_change_timestamp); | 264 gcm_driver().last_account_mapping().status_change_timestamp); |
318 EXPECT_EQ(gcm_driver().last_message_id(), | 265 EXPECT_EQ(gcm_driver().last_message_id(), |
319 gcm_driver().last_account_mapping().last_message_id); | 266 gcm_driver().last_account_mapping().last_message_id); |
320 | 267 |
321 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 268 std::vector<AccountMapping> mappings = GetAccounts(); |
322 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 269 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
323 EXPECT_EQ(account_token.email, iter->email); | 270 EXPECT_EQ(account_token.email, iter->email); |
324 EXPECT_EQ(account_token.account_id, iter->account_id); | 271 EXPECT_EQ(account_token.account_id, iter->account_id); |
325 EXPECT_EQ(account_token.access_token, iter->access_token); | 272 EXPECT_EQ(account_token.access_token, iter->access_token); |
326 EXPECT_EQ(AccountMapping::ADDING, iter->status); | 273 EXPECT_EQ(AccountMapping::ADDING, iter->status); |
327 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); | 274 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); |
328 EXPECT_EQ(gcm_driver().last_message_id(), iter->last_message_id); | 275 EXPECT_EQ(gcm_driver().last_message_id(), iter->last_message_id); |
329 } | 276 } |
330 | 277 |
331 // Tests status change from ADDING to MAPPED (Message is acknowledged). | 278 // Tests status change from ADDING to MAPPED (Message is acknowledged). |
332 TEST_F(GCMAccountMapperTest, AddMappingMessageAcknowledged) { | 279 TEST_F(GCMAccountMapperTest, AddMappingMessageAcknowledged) { |
333 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); | 280 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); |
334 | 281 |
335 std::vector<GCMClient::AccountTokenInfo> account_tokens; | 282 std::vector<GCMClient::AccountTokenInfo> account_tokens; |
336 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); | 283 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); |
337 account_tokens.push_back(account_token); | 284 account_tokens.push_back(account_token); |
338 mapper()->SetAccountTokens(account_tokens); | 285 mapper()->SetAccountTokens(account_tokens); |
339 | 286 |
340 clock()->SetNow(base::Time::Now()); | 287 clock()->SetNow(base::Time::Now()); |
341 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | 288 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); |
342 clock()->SetNow(base::Time::Now()); | 289 clock()->SetNow(base::Time::Now()); |
343 gcm_driver().AcknowledgeSend(gcm_driver().last_message_id()); | 290 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); |
344 | 291 |
345 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); | 292 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); |
346 EXPECT_EQ(account_token.account_id, | 293 EXPECT_EQ(account_token.account_id, |
347 gcm_driver().last_account_mapping().account_id); | 294 gcm_driver().last_account_mapping().account_id); |
348 EXPECT_EQ(account_token.access_token, | 295 EXPECT_EQ(account_token.access_token, |
349 gcm_driver().last_account_mapping().access_token); | 296 gcm_driver().last_account_mapping().access_token); |
350 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status); | 297 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status); |
351 EXPECT_EQ(clock()->Now(), | 298 EXPECT_EQ(clock()->Now(), |
352 gcm_driver().last_account_mapping().status_change_timestamp); | 299 gcm_driver().last_account_mapping().status_change_timestamp); |
353 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); | 300 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); |
354 | 301 |
355 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 302 std::vector<AccountMapping> mappings = GetAccounts(); |
356 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 303 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
357 EXPECT_EQ(account_token.email, iter->email); | 304 EXPECT_EQ(account_token.email, iter->email); |
358 EXPECT_EQ(account_token.account_id, iter->account_id); | 305 EXPECT_EQ(account_token.account_id, iter->account_id); |
359 EXPECT_EQ(account_token.access_token, iter->access_token); | 306 EXPECT_EQ(account_token.access_token, iter->access_token); |
360 EXPECT_EQ(AccountMapping::MAPPED, iter->status); | 307 EXPECT_EQ(AccountMapping::MAPPED, iter->status); |
361 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); | 308 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); |
362 EXPECT_TRUE(iter->last_message_id.empty()); | 309 EXPECT_TRUE(iter->last_message_id.empty()); |
363 } | 310 } |
364 | 311 |
365 // Tests status change form ADDING to MAPPED (When message was acknowledged, | 312 // Tests status change form ADDING to MAPPED (When message was acknowledged, |
366 // after Chrome was restarted). | 313 // after Chrome was restarted). |
367 TEST_F(GCMAccountMapperTest, AddMappingMessageAckedAfterRestart) { | 314 TEST_F(GCMAccountMapperTest, AddMappingMessageAckedAfterRestart) { |
368 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); | 315 mapper()->Initialize(GCMAccountMapper::AccountMappings(), kRegistrationId); |
369 | 316 |
370 std::vector<GCMClient::AccountTokenInfo> account_tokens; | 317 std::vector<GCMClient::AccountTokenInfo> account_tokens; |
371 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); | 318 GCMClient::AccountTokenInfo account_token = MakeAccountTokenInfo("acc_id"); |
372 account_tokens.push_back(account_token); | 319 account_tokens.push_back(account_token); |
373 mapper()->SetAccountTokens(account_tokens); | 320 mapper()->SetAccountTokens(account_tokens); |
374 | 321 |
375 clock()->SetNow(base::Time::Now()); | 322 clock()->SetNow(base::Time::Now()); |
376 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | 323 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); |
377 | 324 |
378 Restart(); | 325 Restart(); |
379 GCMAccountMapper::AccountMappings stored_mappings; | 326 std::vector<AccountMapping> stored_mappings; |
380 stored_mappings.push_back(gcm_driver().last_account_mapping()); | 327 stored_mappings.push_back(gcm_driver().last_account_mapping()); |
381 mapper()->Initialize(stored_mappings, kRegistrationId); | 328 mapper()->Initialize(stored_mappings, kRegistrationId); |
382 | 329 |
383 clock()->SetNow(base::Time::Now()); | 330 clock()->SetNow(base::Time::Now()); |
384 gcm_driver().AcknowledgeSend(gcm_driver().last_message_id()); | 331 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); |
385 | 332 |
386 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); | 333 EXPECT_EQ(account_token.email, gcm_driver().last_account_mapping().email); |
387 EXPECT_EQ(account_token.account_id, | 334 EXPECT_EQ(account_token.account_id, |
388 gcm_driver().last_account_mapping().account_id); | 335 gcm_driver().last_account_mapping().account_id); |
389 EXPECT_EQ(account_token.access_token, | 336 EXPECT_EQ(account_token.access_token, |
390 gcm_driver().last_account_mapping().access_token); | 337 gcm_driver().last_account_mapping().access_token); |
391 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status); | 338 EXPECT_EQ(AccountMapping::MAPPED, gcm_driver().last_account_mapping().status); |
392 EXPECT_EQ(clock()->Now(), | 339 EXPECT_EQ(clock()->Now(), |
393 gcm_driver().last_account_mapping().status_change_timestamp); | 340 gcm_driver().last_account_mapping().status_change_timestamp); |
394 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); | 341 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); |
395 | 342 |
396 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 343 std::vector<AccountMapping> mappings = GetAccounts(); |
397 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 344 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
398 EXPECT_EQ(account_token.email, iter->email); | 345 EXPECT_EQ(account_token.email, iter->email); |
399 EXPECT_EQ(account_token.account_id, iter->account_id); | 346 EXPECT_EQ(account_token.account_id, iter->account_id); |
400 EXPECT_EQ(account_token.access_token, iter->access_token); | 347 EXPECT_EQ(account_token.access_token, iter->access_token); |
401 EXPECT_EQ(AccountMapping::MAPPED, iter->status); | 348 EXPECT_EQ(AccountMapping::MAPPED, iter->status); |
402 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); | 349 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); |
403 EXPECT_TRUE(iter->last_message_id.empty()); | 350 EXPECT_TRUE(iter->last_message_id.empty()); |
404 } | 351 } |
405 | 352 |
406 // Tests a case when ADD message times out for a new account. | 353 // Tests a case when ADD message times out for a new account. |
407 TEST_F(GCMAccountMapperTest, AddMappingMessageSendErrorForNewAccount) { | 354 TEST_F(GCMAccountMapperTest, AddMappingMessageSendErrorForNewAccount) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 stored_mappings.push_back(mapping); | 386 stored_mappings.push_back(mapping); |
440 mapper()->Initialize(stored_mappings, kRegistrationId); | 387 mapper()->Initialize(stored_mappings, kRegistrationId); |
441 | 388 |
442 clock()->SetNow(base::Time::Now()); | 389 clock()->SetNow(base::Time::Now()); |
443 gcm_driver().MessageSendError("add_message_id"); | 390 gcm_driver().MessageSendError("add_message_id"); |
444 | 391 |
445 // No new message is sent because of the send error, as the token is stale. | 392 // No new message is sent because of the send error, as the token is stale. |
446 // Because the account was new, the entry should be deleted. | 393 // Because the account was new, the entry should be deleted. |
447 EXPECT_TRUE(gcm_driver().last_message_id().empty()); | 394 EXPECT_TRUE(gcm_driver().last_message_id().empty()); |
448 | 395 |
449 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 396 std::vector<AccountMapping> mappings = GetAccounts(); |
450 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 397 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
451 EXPECT_EQ(mapping.email, iter->email); | 398 EXPECT_EQ(mapping.email, iter->email); |
452 EXPECT_EQ(mapping.account_id, iter->account_id); | 399 EXPECT_EQ(mapping.account_id, iter->account_id); |
453 EXPECT_EQ(mapping.access_token, iter->access_token); | 400 EXPECT_EQ(mapping.access_token, iter->access_token); |
454 EXPECT_EQ(AccountMapping::MAPPED, iter->status); | 401 EXPECT_EQ(AccountMapping::MAPPED, iter->status); |
455 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); | 402 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); |
456 EXPECT_TRUE(iter->last_message_id.empty()); | 403 EXPECT_TRUE(iter->last_message_id.empty()); |
457 } | 404 } |
458 | 405 |
459 // Tests that a missing token for an account will trigger removing of that | 406 // Tests that a missing token for an account will trigger removing of that |
460 // account. This test goes only until the message is passed to GCM. | 407 // account. This test goes only until the message is passed to GCM. |
(...skipping 12 matching lines...) Expand all Loading... |
473 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); | 420 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); |
474 | 421 |
475 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); | 422 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); |
476 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); | 423 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); |
477 EXPECT_EQ(AccountMapping::REMOVING, | 424 EXPECT_EQ(AccountMapping::REMOVING, |
478 gcm_driver().last_account_mapping().status); | 425 gcm_driver().last_account_mapping().status); |
479 EXPECT_EQ(clock()->Now(), | 426 EXPECT_EQ(clock()->Now(), |
480 gcm_driver().last_account_mapping().status_change_timestamp); | 427 gcm_driver().last_account_mapping().status_change_timestamp); |
481 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); | 428 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); |
482 | 429 |
483 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 430 std::vector<AccountMapping> mappings = GetAccounts(); |
484 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 431 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
485 EXPECT_EQ(mapping.email, iter->email); | 432 EXPECT_EQ(mapping.email, iter->email); |
486 EXPECT_EQ(mapping.account_id, iter->account_id); | 433 EXPECT_EQ(mapping.account_id, iter->account_id); |
487 EXPECT_EQ(mapping.access_token, iter->access_token); | 434 EXPECT_EQ(mapping.access_token, iter->access_token); |
488 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | 435 EXPECT_EQ(AccountMapping::REMOVING, iter->status); |
489 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); | 436 EXPECT_EQ(clock()->Now(), iter->status_change_timestamp); |
490 EXPECT_TRUE(iter->last_message_id.empty()); | 437 EXPECT_TRUE(iter->last_message_id.empty()); |
491 } | 438 } |
492 | 439 |
493 // Tests that a missing token for an account will trigger removing of that | 440 // Tests that a missing token for an account will trigger removing of that |
494 // account. This test goes until the message is queued by GCM. | 441 // account. This test goes until the message is queued by GCM. |
(...skipping 15 matching lines...) Expand all Loading... |
510 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | 457 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); |
511 | 458 |
512 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); | 459 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); |
513 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); | 460 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); |
514 EXPECT_EQ(AccountMapping::REMOVING, | 461 EXPECT_EQ(AccountMapping::REMOVING, |
515 gcm_driver().last_account_mapping().status); | 462 gcm_driver().last_account_mapping().status); |
516 EXPECT_EQ(status_change_timestamp, | 463 EXPECT_EQ(status_change_timestamp, |
517 gcm_driver().last_account_mapping().status_change_timestamp); | 464 gcm_driver().last_account_mapping().status_change_timestamp); |
518 EXPECT_TRUE(!gcm_driver().last_account_mapping().last_message_id.empty()); | 465 EXPECT_TRUE(!gcm_driver().last_account_mapping().last_message_id.empty()); |
519 | 466 |
520 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 467 std::vector<AccountMapping> mappings = GetAccounts(); |
521 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 468 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
522 EXPECT_EQ(mapping.email, iter->email); | 469 EXPECT_EQ(mapping.email, iter->email); |
523 EXPECT_EQ(mapping.account_id, iter->account_id); | 470 EXPECT_EQ(mapping.account_id, iter->account_id); |
524 EXPECT_EQ(mapping.access_token, iter->access_token); | 471 EXPECT_EQ(mapping.access_token, iter->access_token); |
525 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | 472 EXPECT_EQ(AccountMapping::REMOVING, iter->status); |
526 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); | 473 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); |
527 EXPECT_EQ(gcm_driver().last_account_mapping().last_message_id, | 474 EXPECT_EQ(gcm_driver().last_account_mapping().last_message_id, |
528 iter->last_message_id); | 475 iter->last_message_id); |
529 } | 476 } |
530 | 477 |
531 // Tests that a missing token for an account will trigger removing of that | 478 // Tests that a missing token for an account will trigger removing of that |
532 // account. This test goes until the message is acknowledged by GCM. | 479 // account. This test goes until the message is acknowledged by GCM. |
533 // This is a complete success scenario for account removal, and it end with | 480 // This is a complete success scenario for account removal, and it end with |
534 // account mapping being completely gone. | 481 // account mapping being completely gone. |
535 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAcknowledged) { | 482 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAcknowledged) { |
536 // Start with one account that is mapped. | 483 // Start with one account that is mapped. |
537 AccountMapping mapping = MakeAccountMapping("acc_id", | 484 AccountMapping mapping = MakeAccountMapping("acc_id", |
538 AccountMapping::MAPPED, | 485 AccountMapping::MAPPED, |
539 base::Time::Now(), | 486 base::Time::Now(), |
540 std::string()); | 487 std::string()); |
541 | 488 |
542 GCMAccountMapper::AccountMappings stored_mappings; | 489 GCMAccountMapper::AccountMappings stored_mappings; |
543 stored_mappings.push_back(mapping); | 490 stored_mappings.push_back(mapping); |
544 mapper()->Initialize(stored_mappings, kRegistrationId); | 491 mapper()->Initialize(stored_mappings, kRegistrationId); |
545 clock()->SetNow(base::Time::Now()); | 492 clock()->SetNow(base::Time::Now()); |
546 | 493 |
547 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); | 494 mapper()->SetAccountTokens(std::vector<GCMClient::AccountTokenInfo>()); |
548 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); | 495 gcm_driver().CompleteSend(gcm_driver().last_message_id(), GCMClient::SUCCESS); |
549 gcm_driver().AcknowledgeSend(gcm_driver().last_message_id()); | 496 gcm_driver().SendAcknowledged(gcm_driver().last_message_id()); |
550 | 497 |
551 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id()); | 498 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id()); |
552 | 499 |
553 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 500 std::vector<AccountMapping> mappings = GetAccounts(); |
554 EXPECT_TRUE(mappings.empty()); | 501 EXPECT_TRUE(mappings.empty()); |
555 } | 502 } |
556 | 503 |
557 // Tests that account removing proceeds, when a removing message is acked after | 504 // Tests that account removing proceeds, when a removing message is acked after |
558 // Chrome was restarted. | 505 // Chrome was restarted. |
559 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAckedAfterRestart) { | 506 TEST_F(GCMAccountMapperTest, RemoveMappingMessageAckedAfterRestart) { |
560 // Start with one account that is mapped. | 507 // Start with one account that is mapped. |
561 AccountMapping mapping = MakeAccountMapping("acc_id", | 508 AccountMapping mapping = MakeAccountMapping("acc_id", |
562 AccountMapping::REMOVING, | 509 AccountMapping::REMOVING, |
563 base::Time::Now(), | 510 base::Time::Now(), |
564 "remove_message_id"); | 511 "remove_message_id"); |
565 | 512 |
566 GCMAccountMapper::AccountMappings stored_mappings; | 513 GCMAccountMapper::AccountMappings stored_mappings; |
567 stored_mappings.push_back(mapping); | 514 stored_mappings.push_back(mapping); |
568 mapper()->Initialize(stored_mappings, kRegistrationId); | 515 mapper()->Initialize(stored_mappings, kRegistrationId); |
569 | 516 |
570 gcm_driver().AcknowledgeSend("remove_message_id"); | 517 gcm_driver().SendAcknowledged("remove_message_id"); |
571 | 518 |
572 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id()); | 519 EXPECT_EQ(mapping.account_id, gcm_driver().last_removed_account_id()); |
573 | 520 |
574 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 521 std::vector<AccountMapping> mappings = GetAccounts(); |
575 EXPECT_TRUE(mappings.empty()); | 522 EXPECT_TRUE(mappings.empty()); |
576 } | 523 } |
577 | 524 |
578 // Tests that account removing proceeds, when a removing message is acked after | 525 // Tests that account removing proceeds, when a removing message is acked after |
579 // Chrome was restarted. | 526 // Chrome was restarted. |
580 TEST_F(GCMAccountMapperTest, RemoveMappingMessageSendError) { | 527 TEST_F(GCMAccountMapperTest, RemoveMappingMessageSendError) { |
581 // Start with one account that is mapped. | 528 // Start with one account that is mapped. |
582 base::Time status_change_timestamp = base::Time::Now(); | 529 base::Time status_change_timestamp = base::Time::Now(); |
583 AccountMapping mapping = MakeAccountMapping("acc_id", | 530 AccountMapping mapping = MakeAccountMapping("acc_id", |
584 AccountMapping::REMOVING, | 531 AccountMapping::REMOVING, |
(...skipping 11 matching lines...) Expand all Loading... |
596 | 543 |
597 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); | 544 EXPECT_EQ(mapping.account_id, gcm_driver().last_account_mapping().account_id); |
598 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); | 545 EXPECT_EQ(mapping.email, gcm_driver().last_account_mapping().email); |
599 EXPECT_EQ(AccountMapping::REMOVING, | 546 EXPECT_EQ(AccountMapping::REMOVING, |
600 gcm_driver().last_account_mapping().status); | 547 gcm_driver().last_account_mapping().status); |
601 EXPECT_EQ(status_change_timestamp, | 548 EXPECT_EQ(status_change_timestamp, |
602 gcm_driver().last_account_mapping().status_change_timestamp); | 549 gcm_driver().last_account_mapping().status_change_timestamp); |
603 // Message is not persisted, until send is completed. | 550 // Message is not persisted, until send is completed. |
604 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); | 551 EXPECT_TRUE(gcm_driver().last_account_mapping().last_message_id.empty()); |
605 | 552 |
606 GCMAccountMapper::AccountMappings mappings = GetAccounts(); | 553 std::vector<AccountMapping> mappings = GetAccounts(); |
607 GCMAccountMapper::AccountMappings::const_iterator iter = mappings.begin(); | 554 std::vector<AccountMapping>::const_iterator iter = mappings.begin(); |
608 EXPECT_EQ(mapping.email, iter->email); | 555 EXPECT_EQ(mapping.email, iter->email); |
609 EXPECT_EQ(mapping.account_id, iter->account_id); | 556 EXPECT_EQ(mapping.account_id, iter->account_id); |
610 EXPECT_TRUE(iter->access_token.empty()); | 557 EXPECT_TRUE(iter->access_token.empty()); |
611 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | 558 EXPECT_EQ(AccountMapping::REMOVING, iter->status); |
612 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); | 559 EXPECT_EQ(status_change_timestamp, iter->status_change_timestamp); |
613 EXPECT_TRUE(iter->last_message_id.empty()); | 560 EXPECT_TRUE(iter->last_message_id.empty()); |
614 } | 561 } |
615 | 562 |
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 | |
843 } // namespace gcm | 563 } // namespace gcm |
OLD | NEW |