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 "google_apis/gcm/engine/gcm_store_impl.h" | 5 #include "google_apis/gcm/engine/gcm_store_impl.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 | 40 |
41 const uint64 kDeviceId = 22; | 41 const uint64 kDeviceId = 22; |
42 const uint64 kDeviceToken = 55; | 42 const uint64 kDeviceToken = 55; |
43 | 43 |
44 class GCMStoreImplTest : public testing::Test { | 44 class GCMStoreImplTest : public testing::Test { |
45 public: | 45 public: |
46 GCMStoreImplTest(); | 46 GCMStoreImplTest(); |
47 ~GCMStoreImplTest() override; | 47 ~GCMStoreImplTest() override; |
48 | 48 |
49 scoped_ptr<GCMStoreImpl> BuildGCMStore(); | 49 scoped_ptr<GCMStoreImpl> BuildGCMStore(); |
| 50 void LoadGCMStore( |
| 51 GCMStoreImpl* gcm_store, scoped_ptr<GCMStore::LoadResult>* result_dst); |
50 | 52 |
51 std::string GetNextPersistentId(); | 53 std::string GetNextPersistentId(); |
52 | 54 |
53 void PumpLoop(); | 55 void PumpLoop(); |
54 | 56 |
55 void LoadCallback(scoped_ptr<GCMStore::LoadResult>* result_dst, | 57 void LoadCallback(scoped_ptr<GCMStore::LoadResult>* result_dst, |
56 scoped_ptr<GCMStore::LoadResult> result); | 58 scoped_ptr<GCMStore::LoadResult> result); |
| 59 void LoadWithoutCheckCallback(scoped_ptr<GCMStore::LoadResult>* result_dst, |
| 60 scoped_ptr<GCMStore::LoadResult> result); |
57 void UpdateCallback(bool success); | 61 void UpdateCallback(bool success); |
58 | 62 |
59 protected: | 63 protected: |
60 base::MessageLoop message_loop_; | 64 base::MessageLoop message_loop_; |
61 base::ScopedTempDir temp_directory_; | 65 base::ScopedTempDir temp_directory_; |
62 bool expected_success_; | 66 bool expected_success_; |
63 uint64 next_persistent_id_; | 67 uint64 next_persistent_id_; |
64 scoped_ptr<base::RunLoop> run_loop_; | 68 scoped_ptr<base::RunLoop> run_loop_; |
65 }; | 69 }; |
66 | 70 |
67 GCMStoreImplTest::GCMStoreImplTest() | 71 GCMStoreImplTest::GCMStoreImplTest() |
68 : expected_success_(true), | 72 : expected_success_(true), |
69 next_persistent_id_(base::Time::Now().ToInternalValue()) { | 73 next_persistent_id_(base::Time::Now().ToInternalValue()) { |
70 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir()); | 74 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir()); |
71 run_loop_.reset(new base::RunLoop()); | 75 run_loop_.reset(new base::RunLoop()); |
72 } | 76 } |
73 | 77 |
74 GCMStoreImplTest::~GCMStoreImplTest() {} | 78 GCMStoreImplTest::~GCMStoreImplTest() {} |
75 | 79 |
76 scoped_ptr<GCMStoreImpl> GCMStoreImplTest::BuildGCMStore() { | 80 scoped_ptr<GCMStoreImpl> GCMStoreImplTest::BuildGCMStore() { |
77 return scoped_ptr<GCMStoreImpl>(new GCMStoreImpl( | 81 return scoped_ptr<GCMStoreImpl>(new GCMStoreImpl( |
78 temp_directory_.path(), | 82 // Pass an non-existent directory as store path to match the exact |
| 83 // behavior in the production code. Currently GCMStoreImpl checks if |
| 84 // the directory exist or not to determine the store existence. |
| 85 temp_directory_.path().Append(FILE_PATH_LITERAL("GCM Store")), |
79 message_loop_.message_loop_proxy(), | 86 message_loop_.message_loop_proxy(), |
80 make_scoped_ptr<Encryptor>(new FakeEncryptor))); | 87 make_scoped_ptr<Encryptor>(new FakeEncryptor))); |
81 } | 88 } |
82 | 89 |
| 90 void GCMStoreImplTest::LoadGCMStore( |
| 91 GCMStoreImpl* gcm_store, scoped_ptr<GCMStore::LoadResult>* result_dst) { |
| 92 gcm_store->Load( |
| 93 GCMStore::CREATE_IF_MISSING, |
| 94 base::Bind(&GCMStoreImplTest::LoadCallback, |
| 95 base::Unretained(this), |
| 96 result_dst)); |
| 97 PumpLoop(); |
| 98 } |
| 99 |
83 std::string GCMStoreImplTest::GetNextPersistentId() { | 100 std::string GCMStoreImplTest::GetNextPersistentId() { |
84 return base::Uint64ToString(next_persistent_id_++); | 101 return base::Uint64ToString(next_persistent_id_++); |
85 } | 102 } |
86 | 103 |
87 void GCMStoreImplTest::PumpLoop() { message_loop_.RunUntilIdle(); } | 104 void GCMStoreImplTest::PumpLoop() { message_loop_.RunUntilIdle(); } |
88 | 105 |
89 void GCMStoreImplTest::LoadCallback( | 106 void GCMStoreImplTest::LoadCallback( |
90 scoped_ptr<GCMStore::LoadResult>* result_dst, | 107 scoped_ptr<GCMStore::LoadResult>* result_dst, |
91 scoped_ptr<GCMStore::LoadResult> result) { | 108 scoped_ptr<GCMStore::LoadResult> result) { |
92 ASSERT_TRUE(result->success); | 109 ASSERT_TRUE(result->success); |
| 110 LoadWithoutCheckCallback(result_dst, result.Pass()); |
| 111 } |
| 112 |
| 113 void GCMStoreImplTest::LoadWithoutCheckCallback( |
| 114 scoped_ptr<GCMStore::LoadResult>* result_dst, |
| 115 scoped_ptr<GCMStore::LoadResult> result) { |
93 *result_dst = result.Pass(); | 116 *result_dst = result.Pass(); |
94 run_loop_->Quit(); | 117 run_loop_->Quit(); |
95 run_loop_.reset(new base::RunLoop()); | 118 run_loop_.reset(new base::RunLoop()); |
96 } | 119 } |
97 | 120 |
98 void GCMStoreImplTest::UpdateCallback(bool success) { | 121 void GCMStoreImplTest::UpdateCallback(bool success) { |
99 ASSERT_EQ(expected_success_, success); | 122 ASSERT_EQ(expected_success_, success); |
100 } | 123 } |
101 | 124 |
102 // Verify creating a new database and loading it. | 125 // Verify creating a new database and loading it. |
103 TEST_F(GCMStoreImplTest, LoadNew) { | 126 TEST_F(GCMStoreImplTest, LoadNew) { |
104 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 127 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
105 scoped_ptr<GCMStore::LoadResult> load_result; | 128 scoped_ptr<GCMStore::LoadResult> load_result; |
106 gcm_store->Load(base::Bind( | 129 LoadGCMStore(gcm_store.get(), &load_result); |
107 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
108 PumpLoop(); | |
109 | 130 |
110 EXPECT_EQ(0U, load_result->device_android_id); | 131 EXPECT_EQ(0U, load_result->device_android_id); |
111 EXPECT_EQ(0U, load_result->device_security_token); | 132 EXPECT_EQ(0U, load_result->device_security_token); |
112 EXPECT_TRUE(load_result->incoming_messages.empty()); | 133 EXPECT_TRUE(load_result->incoming_messages.empty()); |
113 EXPECT_TRUE(load_result->outgoing_messages.empty()); | 134 EXPECT_TRUE(load_result->outgoing_messages.empty()); |
114 EXPECT_TRUE(load_result->gservices_settings.empty()); | 135 EXPECT_TRUE(load_result->gservices_settings.empty()); |
115 EXPECT_EQ(base::Time::FromInternalValue(0LL), load_result->last_checkin_time); | 136 EXPECT_EQ(base::Time::FromInternalValue(0LL), load_result->last_checkin_time); |
116 } | 137 } |
117 | 138 |
| 139 // Verify new database is not created when DO_NOT_CREATE_NEW_STORE is passed. |
| 140 TEST_F(GCMStoreImplTest, LoadWithoutCreatingNewStore) { |
| 141 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 142 scoped_ptr<GCMStore::LoadResult> load_result; |
| 143 gcm_store->Load( |
| 144 GCMStore::DO_NOT_CREATE, |
| 145 base::Bind(&GCMStoreImplTest::LoadWithoutCheckCallback, |
| 146 base::Unretained(this), |
| 147 &load_result)); |
| 148 PumpLoop(); |
| 149 |
| 150 EXPECT_FALSE(load_result->success); |
| 151 EXPECT_TRUE(load_result->store_does_not_exist); |
| 152 } |
| 153 |
118 TEST_F(GCMStoreImplTest, DeviceCredentials) { | 154 TEST_F(GCMStoreImplTest, DeviceCredentials) { |
119 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 155 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
120 scoped_ptr<GCMStore::LoadResult> load_result; | 156 scoped_ptr<GCMStore::LoadResult> load_result; |
121 gcm_store->Load(base::Bind( | 157 LoadGCMStore(gcm_store.get(), &load_result); |
122 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
123 PumpLoop(); | |
124 | 158 |
125 gcm_store->SetDeviceCredentials( | 159 gcm_store->SetDeviceCredentials( |
126 kDeviceId, | 160 kDeviceId, |
127 kDeviceToken, | 161 kDeviceToken, |
128 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 162 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
129 PumpLoop(); | 163 PumpLoop(); |
130 | 164 |
131 gcm_store = BuildGCMStore().Pass(); | 165 gcm_store = BuildGCMStore().Pass(); |
132 gcm_store->Load(base::Bind( | 166 LoadGCMStore(gcm_store.get(), &load_result); |
133 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
134 PumpLoop(); | |
135 | 167 |
136 ASSERT_EQ(kDeviceId, load_result->device_android_id); | 168 ASSERT_EQ(kDeviceId, load_result->device_android_id); |
137 ASSERT_EQ(kDeviceToken, load_result->device_security_token); | 169 ASSERT_EQ(kDeviceToken, load_result->device_security_token); |
138 } | 170 } |
139 | 171 |
140 TEST_F(GCMStoreImplTest, LastCheckinInfo) { | 172 TEST_F(GCMStoreImplTest, LastCheckinInfo) { |
141 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); | 173 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
142 scoped_ptr<GCMStore::LoadResult> load_result; | 174 scoped_ptr<GCMStore::LoadResult> load_result; |
143 gcm_store->Load(base::Bind( | 175 LoadGCMStore(gcm_store.get(), &load_result); |
144 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
145 PumpLoop(); | |
146 | 176 |
147 base::Time last_checkin_time = base::Time::Now(); | 177 base::Time last_checkin_time = base::Time::Now(); |
148 std::set<std::string> accounts; | 178 std::set<std::string> accounts; |
149 accounts.insert("test_user1@gmail.com"); | 179 accounts.insert("test_user1@gmail.com"); |
150 accounts.insert("test_user2@gmail.com"); | 180 accounts.insert("test_user2@gmail.com"); |
151 | 181 |
152 gcm_store->SetLastCheckinInfo( | 182 gcm_store->SetLastCheckinInfo( |
153 last_checkin_time, | 183 last_checkin_time, |
154 accounts, | 184 accounts, |
155 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 185 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
156 PumpLoop(); | 186 PumpLoop(); |
157 | 187 |
158 gcm_store = BuildGCMStore().Pass(); | 188 gcm_store = BuildGCMStore().Pass(); |
159 gcm_store->Load(base::Bind( | 189 LoadGCMStore(gcm_store.get(), &load_result); |
160 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
161 PumpLoop(); | |
162 ASSERT_EQ(last_checkin_time, load_result->last_checkin_time); | 190 ASSERT_EQ(last_checkin_time, load_result->last_checkin_time); |
163 ASSERT_EQ(accounts, load_result->last_checkin_accounts); | 191 ASSERT_EQ(accounts, load_result->last_checkin_accounts); |
164 | 192 |
165 // Negative cases, where the value read is gibberish. | 193 // Negative cases, where the value read is gibberish. |
166 gcm_store->SetValueForTesting( | 194 gcm_store->SetValueForTesting( |
167 "last_checkin_time", | 195 "last_checkin_time", |
168 "gibberish", | 196 "gibberish", |
169 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 197 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
170 PumpLoop(); | 198 PumpLoop(); |
171 | 199 |
172 gcm_store = BuildGCMStore().Pass(); | 200 gcm_store = BuildGCMStore().Pass(); |
173 gcm_store->Load(base::Bind( | 201 LoadGCMStore(gcm_store.get(), &load_result); |
174 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
175 PumpLoop(); | |
176 EXPECT_EQ(base::Time(), load_result->last_checkin_time); | 202 EXPECT_EQ(base::Time(), load_result->last_checkin_time); |
177 } | 203 } |
178 | 204 |
179 TEST_F(GCMStoreImplTest, GServicesSettings_ProtocolV2) { | 205 TEST_F(GCMStoreImplTest, GServicesSettings_ProtocolV2) { |
180 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 206 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
181 scoped_ptr<GCMStore::LoadResult> load_result; | 207 scoped_ptr<GCMStore::LoadResult> load_result; |
182 gcm_store->Load(base::Bind( | 208 LoadGCMStore(gcm_store.get(), &load_result); |
183 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
184 PumpLoop(); | |
185 | 209 |
186 std::map<std::string, std::string> settings; | 210 std::map<std::string, std::string> settings; |
187 settings["checkin_interval"] = "12345"; | 211 settings["checkin_interval"] = "12345"; |
188 settings["mcs_port"] = "438"; | 212 settings["mcs_port"] = "438"; |
189 settings["checkin_url"] = "http://checkin.google.com"; | 213 settings["checkin_url"] = "http://checkin.google.com"; |
190 std::string digest = "digest1"; | 214 std::string digest = "digest1"; |
191 | 215 |
192 gcm_store->SetGServicesSettings( | 216 gcm_store->SetGServicesSettings( |
193 settings, | 217 settings, |
194 digest, | 218 digest, |
195 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 219 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
196 PumpLoop(); | 220 PumpLoop(); |
197 | 221 |
198 gcm_store = BuildGCMStore().Pass(); | 222 gcm_store = BuildGCMStore().Pass(); |
199 gcm_store->Load(base::Bind( | 223 LoadGCMStore(gcm_store.get(), &load_result); |
200 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
201 PumpLoop(); | |
202 | 224 |
203 ASSERT_EQ(settings, load_result->gservices_settings); | 225 ASSERT_EQ(settings, load_result->gservices_settings); |
204 ASSERT_EQ(digest, load_result->gservices_digest); | 226 ASSERT_EQ(digest, load_result->gservices_digest); |
205 | 227 |
206 // Remove some, and add some. | 228 // Remove some, and add some. |
207 settings.clear(); | 229 settings.clear(); |
208 settings["checkin_interval"] = "54321"; | 230 settings["checkin_interval"] = "54321"; |
209 settings["registration_url"] = "http://registration.google.com"; | 231 settings["registration_url"] = "http://registration.google.com"; |
210 digest = "digest2"; | 232 digest = "digest2"; |
211 | 233 |
212 gcm_store->SetGServicesSettings( | 234 gcm_store->SetGServicesSettings( |
213 settings, | 235 settings, |
214 digest, | 236 digest, |
215 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 237 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
216 PumpLoop(); | 238 PumpLoop(); |
217 | 239 |
218 gcm_store = BuildGCMStore().Pass(); | 240 gcm_store = BuildGCMStore().Pass(); |
219 gcm_store->Load(base::Bind( | 241 LoadGCMStore(gcm_store.get(), &load_result); |
220 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
221 PumpLoop(); | |
222 | 242 |
223 ASSERT_EQ(settings, load_result->gservices_settings); | 243 ASSERT_EQ(settings, load_result->gservices_settings); |
224 ASSERT_EQ(digest, load_result->gservices_digest); | 244 ASSERT_EQ(digest, load_result->gservices_digest); |
225 } | 245 } |
226 | 246 |
227 TEST_F(GCMStoreImplTest, Registrations) { | 247 TEST_F(GCMStoreImplTest, Registrations) { |
228 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 248 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
229 scoped_ptr<GCMStore::LoadResult> load_result; | 249 scoped_ptr<GCMStore::LoadResult> load_result; |
230 gcm_store->Load(base::Bind( | 250 LoadGCMStore(gcm_store.get(), &load_result); |
231 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
232 PumpLoop(); | |
233 | 251 |
234 // Add one registration with one sender. | 252 // Add one registration with one sender. |
235 std::string registration = "sender1=registration1"; | 253 std::string registration = "sender1=registration1"; |
236 gcm_store->AddRegistration( | 254 gcm_store->AddRegistration( |
237 kAppName, | 255 kAppName, |
238 registration, | 256 registration, |
239 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 257 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
240 PumpLoop(); | 258 PumpLoop(); |
241 | 259 |
242 // Add one registration with multiple senders. | 260 // Add one registration with multiple senders. |
243 std::string registration2 = "sender1,sender2=registration2"; | 261 std::string registration2 = "sender1,sender2=registration2"; |
244 gcm_store->AddRegistration( | 262 gcm_store->AddRegistration( |
245 kAppName2, | 263 kAppName2, |
246 registration2, | 264 registration2, |
247 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 265 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
248 PumpLoop(); | 266 PumpLoop(); |
249 | 267 |
250 gcm_store = BuildGCMStore().Pass(); | 268 gcm_store = BuildGCMStore().Pass(); |
251 gcm_store->Load(base::Bind( | 269 LoadGCMStore(gcm_store.get(), &load_result); |
252 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
253 PumpLoop(); | |
254 | 270 |
255 ASSERT_EQ(2u, load_result->registrations.size()); | 271 ASSERT_EQ(2u, load_result->registrations.size()); |
256 ASSERT_TRUE(load_result->registrations.find(kAppName) != | 272 ASSERT_TRUE(load_result->registrations.find(kAppName) != |
257 load_result->registrations.end()); | 273 load_result->registrations.end()); |
258 EXPECT_EQ(registration, load_result->registrations[kAppName]); | 274 EXPECT_EQ(registration, load_result->registrations[kAppName]); |
259 ASSERT_TRUE(load_result->registrations.find(kAppName2) != | 275 ASSERT_TRUE(load_result->registrations.find(kAppName2) != |
260 load_result->registrations.end()); | 276 load_result->registrations.end()); |
261 EXPECT_EQ(registration2, load_result->registrations[kAppName2]); | 277 EXPECT_EQ(registration2, load_result->registrations[kAppName2]); |
262 | 278 |
263 gcm_store->RemoveRegistration( | 279 gcm_store->RemoveRegistration( |
264 kAppName2, | 280 kAppName2, |
265 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 281 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
266 PumpLoop(); | 282 PumpLoop(); |
267 | 283 |
268 gcm_store = BuildGCMStore().Pass(); | 284 gcm_store = BuildGCMStore().Pass(); |
269 gcm_store->Load(base::Bind( | 285 LoadGCMStore(gcm_store.get(), &load_result); |
270 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
271 PumpLoop(); | |
272 | 286 |
273 ASSERT_EQ(1u, load_result->registrations.size()); | 287 ASSERT_EQ(1u, load_result->registrations.size()); |
274 ASSERT_TRUE(load_result->registrations.find(kAppName) != | 288 ASSERT_TRUE(load_result->registrations.find(kAppName) != |
275 load_result->registrations.end()); | 289 load_result->registrations.end()); |
276 EXPECT_EQ(registration, load_result->registrations[kAppName]); | 290 EXPECT_EQ(registration, load_result->registrations[kAppName]); |
277 } | 291 } |
278 | 292 |
279 // Verify saving some incoming messages, reopening the directory, and then | 293 // Verify saving some incoming messages, reopening the directory, and then |
280 // removing those incoming messages. | 294 // removing those incoming messages. |
281 TEST_F(GCMStoreImplTest, IncomingMessages) { | 295 TEST_F(GCMStoreImplTest, IncomingMessages) { |
282 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 296 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
283 scoped_ptr<GCMStore::LoadResult> load_result; | 297 scoped_ptr<GCMStore::LoadResult> load_result; |
284 gcm_store->Load(base::Bind( | 298 LoadGCMStore(gcm_store.get(), &load_result); |
285 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
286 PumpLoop(); | |
287 | 299 |
288 std::vector<std::string> persistent_ids; | 300 std::vector<std::string> persistent_ids; |
289 for (int i = 0; i < kNumPersistentIds; ++i) { | 301 for (int i = 0; i < kNumPersistentIds; ++i) { |
290 persistent_ids.push_back(GetNextPersistentId()); | 302 persistent_ids.push_back(GetNextPersistentId()); |
291 gcm_store->AddIncomingMessage( | 303 gcm_store->AddIncomingMessage( |
292 persistent_ids.back(), | 304 persistent_ids.back(), |
293 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 305 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
294 PumpLoop(); | 306 PumpLoop(); |
295 } | 307 } |
296 | 308 |
297 gcm_store = BuildGCMStore().Pass(); | 309 gcm_store = BuildGCMStore().Pass(); |
298 gcm_store->Load(base::Bind( | 310 LoadGCMStore(gcm_store.get(), &load_result); |
299 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
300 PumpLoop(); | |
301 | 311 |
302 ASSERT_EQ(persistent_ids, load_result->incoming_messages); | 312 ASSERT_EQ(persistent_ids, load_result->incoming_messages); |
303 ASSERT_TRUE(load_result->outgoing_messages.empty()); | 313 ASSERT_TRUE(load_result->outgoing_messages.empty()); |
304 | 314 |
305 gcm_store->RemoveIncomingMessages( | 315 gcm_store->RemoveIncomingMessages( |
306 persistent_ids, | 316 persistent_ids, |
307 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 317 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
308 PumpLoop(); | 318 PumpLoop(); |
309 | 319 |
310 gcm_store = BuildGCMStore().Pass(); | 320 gcm_store = BuildGCMStore().Pass(); |
311 load_result->incoming_messages.clear(); | 321 load_result->incoming_messages.clear(); |
312 gcm_store->Load(base::Bind( | 322 LoadGCMStore(gcm_store.get(), &load_result); |
313 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
314 PumpLoop(); | |
315 | 323 |
316 ASSERT_TRUE(load_result->incoming_messages.empty()); | 324 ASSERT_TRUE(load_result->incoming_messages.empty()); |
317 ASSERT_TRUE(load_result->outgoing_messages.empty()); | 325 ASSERT_TRUE(load_result->outgoing_messages.empty()); |
318 } | 326 } |
319 | 327 |
320 // Verify saving some outgoing messages, reopening the directory, and then | 328 // Verify saving some outgoing messages, reopening the directory, and then |
321 // removing those outgoing messages. | 329 // removing those outgoing messages. |
322 TEST_F(GCMStoreImplTest, OutgoingMessages) { | 330 TEST_F(GCMStoreImplTest, OutgoingMessages) { |
323 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 331 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
324 scoped_ptr<GCMStore::LoadResult> load_result; | 332 scoped_ptr<GCMStore::LoadResult> load_result; |
325 gcm_store->Load(base::Bind( | 333 LoadGCMStore(gcm_store.get(), &load_result); |
326 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
327 PumpLoop(); | |
328 | 334 |
329 std::vector<std::string> persistent_ids; | 335 std::vector<std::string> persistent_ids; |
330 const int kNumPersistentIds = 10; | 336 const int kNumPersistentIds = 10; |
331 for (int i = 0; i < kNumPersistentIds; ++i) { | 337 for (int i = 0; i < kNumPersistentIds; ++i) { |
332 persistent_ids.push_back(GetNextPersistentId()); | 338 persistent_ids.push_back(GetNextPersistentId()); |
333 mcs_proto::DataMessageStanza message; | 339 mcs_proto::DataMessageStanza message; |
334 message.set_from(kAppName + persistent_ids.back()); | 340 message.set_from(kAppName + persistent_ids.back()); |
335 message.set_category(kCategoryName + persistent_ids.back()); | 341 message.set_category(kCategoryName + persistent_ids.back()); |
336 gcm_store->AddOutgoingMessage( | 342 gcm_store->AddOutgoingMessage( |
337 persistent_ids.back(), | 343 persistent_ids.back(), |
338 MCSMessage(message), | 344 MCSMessage(message), |
339 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 345 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
340 PumpLoop(); | 346 PumpLoop(); |
341 } | 347 } |
342 | 348 |
343 gcm_store = BuildGCMStore().Pass(); | 349 gcm_store = BuildGCMStore().Pass(); |
344 gcm_store->Load(base::Bind( | 350 LoadGCMStore(gcm_store.get(), &load_result); |
345 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
346 PumpLoop(); | |
347 | 351 |
348 ASSERT_TRUE(load_result->incoming_messages.empty()); | 352 ASSERT_TRUE(load_result->incoming_messages.empty()); |
349 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size()); | 353 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size()); |
350 for (int i = 0; i < kNumPersistentIds; ++i) { | 354 for (int i = 0; i < kNumPersistentIds; ++i) { |
351 std::string id = persistent_ids[i]; | 355 std::string id = persistent_ids[i]; |
352 ASSERT_TRUE(load_result->outgoing_messages[id].get()); | 356 ASSERT_TRUE(load_result->outgoing_messages[id].get()); |
353 const mcs_proto::DataMessageStanza* message = | 357 const mcs_proto::DataMessageStanza* message = |
354 reinterpret_cast<mcs_proto::DataMessageStanza*>( | 358 reinterpret_cast<mcs_proto::DataMessageStanza*>( |
355 load_result->outgoing_messages[id].get()); | 359 load_result->outgoing_messages[id].get()); |
356 ASSERT_EQ(message->from(), kAppName + id); | 360 ASSERT_EQ(message->from(), kAppName + id); |
357 ASSERT_EQ(message->category(), kCategoryName + id); | 361 ASSERT_EQ(message->category(), kCategoryName + id); |
358 } | 362 } |
359 | 363 |
360 gcm_store->RemoveOutgoingMessages( | 364 gcm_store->RemoveOutgoingMessages( |
361 persistent_ids, | 365 persistent_ids, |
362 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 366 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
363 PumpLoop(); | 367 PumpLoop(); |
364 | 368 |
365 gcm_store = BuildGCMStore().Pass(); | 369 gcm_store = BuildGCMStore().Pass(); |
366 load_result->outgoing_messages.clear(); | 370 load_result->outgoing_messages.clear(); |
367 gcm_store->Load(base::Bind( | 371 LoadGCMStore(gcm_store.get(), &load_result); |
368 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
369 PumpLoop(); | |
370 | 372 |
371 ASSERT_TRUE(load_result->incoming_messages.empty()); | 373 ASSERT_TRUE(load_result->incoming_messages.empty()); |
372 ASSERT_TRUE(load_result->outgoing_messages.empty()); | 374 ASSERT_TRUE(load_result->outgoing_messages.empty()); |
373 } | 375 } |
374 | 376 |
375 // Verify incoming and outgoing messages don't conflict. | 377 // Verify incoming and outgoing messages don't conflict. |
376 TEST_F(GCMStoreImplTest, IncomingAndOutgoingMessages) { | 378 TEST_F(GCMStoreImplTest, IncomingAndOutgoingMessages) { |
377 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 379 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
378 scoped_ptr<GCMStore::LoadResult> load_result; | 380 scoped_ptr<GCMStore::LoadResult> load_result; |
379 gcm_store->Load(base::Bind( | 381 LoadGCMStore(gcm_store.get(), &load_result); |
380 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
381 PumpLoop(); | |
382 | 382 |
383 std::vector<std::string> persistent_ids; | 383 std::vector<std::string> persistent_ids; |
384 const int kNumPersistentIds = 10; | 384 const int kNumPersistentIds = 10; |
385 for (int i = 0; i < kNumPersistentIds; ++i) { | 385 for (int i = 0; i < kNumPersistentIds; ++i) { |
386 persistent_ids.push_back(GetNextPersistentId()); | 386 persistent_ids.push_back(GetNextPersistentId()); |
387 gcm_store->AddIncomingMessage( | 387 gcm_store->AddIncomingMessage( |
388 persistent_ids.back(), | 388 persistent_ids.back(), |
389 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 389 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
390 PumpLoop(); | 390 PumpLoop(); |
391 | 391 |
392 mcs_proto::DataMessageStanza message; | 392 mcs_proto::DataMessageStanza message; |
393 message.set_from(kAppName + persistent_ids.back()); | 393 message.set_from(kAppName + persistent_ids.back()); |
394 message.set_category(kCategoryName + persistent_ids.back()); | 394 message.set_category(kCategoryName + persistent_ids.back()); |
395 gcm_store->AddOutgoingMessage( | 395 gcm_store->AddOutgoingMessage( |
396 persistent_ids.back(), | 396 persistent_ids.back(), |
397 MCSMessage(message), | 397 MCSMessage(message), |
398 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 398 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
399 PumpLoop(); | 399 PumpLoop(); |
400 } | 400 } |
401 | 401 |
402 gcm_store = BuildGCMStore().Pass(); | 402 gcm_store = BuildGCMStore().Pass(); |
403 gcm_store->Load(base::Bind( | 403 LoadGCMStore(gcm_store.get(), &load_result); |
404 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
405 PumpLoop(); | |
406 | 404 |
407 ASSERT_EQ(persistent_ids, load_result->incoming_messages); | 405 ASSERT_EQ(persistent_ids, load_result->incoming_messages); |
408 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size()); | 406 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size()); |
409 for (int i = 0; i < kNumPersistentIds; ++i) { | 407 for (int i = 0; i < kNumPersistentIds; ++i) { |
410 std::string id = persistent_ids[i]; | 408 std::string id = persistent_ids[i]; |
411 ASSERT_TRUE(load_result->outgoing_messages[id].get()); | 409 ASSERT_TRUE(load_result->outgoing_messages[id].get()); |
412 const mcs_proto::DataMessageStanza* message = | 410 const mcs_proto::DataMessageStanza* message = |
413 reinterpret_cast<mcs_proto::DataMessageStanza*>( | 411 reinterpret_cast<mcs_proto::DataMessageStanza*>( |
414 load_result->outgoing_messages[id].get()); | 412 load_result->outgoing_messages[id].get()); |
415 ASSERT_EQ(message->from(), kAppName + id); | 413 ASSERT_EQ(message->from(), kAppName + id); |
416 ASSERT_EQ(message->category(), kCategoryName + id); | 414 ASSERT_EQ(message->category(), kCategoryName + id); |
417 } | 415 } |
418 | 416 |
419 gcm_store->RemoveIncomingMessages( | 417 gcm_store->RemoveIncomingMessages( |
420 persistent_ids, | 418 persistent_ids, |
421 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 419 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
422 PumpLoop(); | 420 PumpLoop(); |
423 gcm_store->RemoveOutgoingMessages( | 421 gcm_store->RemoveOutgoingMessages( |
424 persistent_ids, | 422 persistent_ids, |
425 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 423 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
426 PumpLoop(); | 424 PumpLoop(); |
427 | 425 |
428 gcm_store = BuildGCMStore().Pass(); | 426 gcm_store = BuildGCMStore().Pass(); |
429 load_result->incoming_messages.clear(); | 427 load_result->incoming_messages.clear(); |
430 load_result->outgoing_messages.clear(); | 428 load_result->outgoing_messages.clear(); |
431 gcm_store->Load(base::Bind( | 429 LoadGCMStore(gcm_store.get(), &load_result); |
432 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
433 PumpLoop(); | |
434 | 430 |
435 ASSERT_TRUE(load_result->incoming_messages.empty()); | 431 ASSERT_TRUE(load_result->incoming_messages.empty()); |
436 ASSERT_TRUE(load_result->outgoing_messages.empty()); | 432 ASSERT_TRUE(load_result->outgoing_messages.empty()); |
437 } | 433 } |
438 | 434 |
439 // Test that per-app message limits are enforced, persisted across restarts, | 435 // Test that per-app message limits are enforced, persisted across restarts, |
440 // and updated as messages are removed. | 436 // and updated as messages are removed. |
441 TEST_F(GCMStoreImplTest, PerAppMessageLimits) { | 437 TEST_F(GCMStoreImplTest, PerAppMessageLimits) { |
442 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 438 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
443 scoped_ptr<GCMStore::LoadResult> load_result; | 439 scoped_ptr<GCMStore::LoadResult> load_result; |
444 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 440 LoadGCMStore(gcm_store.get(), &load_result); |
445 base::Unretained(this), | |
446 &load_result)); | |
447 | 441 |
448 // Add the initial (below app limit) messages. | 442 // Add the initial (below app limit) messages. |
449 for (int i = 0; i < kNumMessagesPerApp; ++i) { | 443 for (int i = 0; i < kNumMessagesPerApp; ++i) { |
450 mcs_proto::DataMessageStanza message; | 444 mcs_proto::DataMessageStanza message; |
451 message.set_from(kAppName); | 445 message.set_from(kAppName); |
452 message.set_category(kCategoryName); | 446 message.set_category(kCategoryName); |
453 EXPECT_TRUE(gcm_store->AddOutgoingMessage( | 447 EXPECT_TRUE(gcm_store->AddOutgoingMessage( |
454 base::IntToString(i), | 448 base::IntToString(i), |
455 MCSMessage(message), | 449 MCSMessage(message), |
456 base::Bind(&GCMStoreImplTest::UpdateCallback, | 450 base::Bind(&GCMStoreImplTest::UpdateCallback, |
457 base::Unretained(this)))); | 451 base::Unretained(this)))); |
458 PumpLoop(); | 452 PumpLoop(); |
459 } | 453 } |
460 | 454 |
461 // Attempting to add some more should fail. | 455 // Attempting to add some more should fail. |
462 for (int i = 0; i < kNumMessagesPerApp; ++i) { | 456 for (int i = 0; i < kNumMessagesPerApp; ++i) { |
463 mcs_proto::DataMessageStanza message; | 457 mcs_proto::DataMessageStanza message; |
464 message.set_from(kAppName); | 458 message.set_from(kAppName); |
465 message.set_category(kCategoryName); | 459 message.set_category(kCategoryName); |
466 EXPECT_FALSE(gcm_store->AddOutgoingMessage( | 460 EXPECT_FALSE(gcm_store->AddOutgoingMessage( |
467 base::IntToString(i + kNumMessagesPerApp), | 461 base::IntToString(i + kNumMessagesPerApp), |
468 MCSMessage(message), | 462 MCSMessage(message), |
469 base::Bind(&GCMStoreImplTest::UpdateCallback, | 463 base::Bind(&GCMStoreImplTest::UpdateCallback, |
470 base::Unretained(this)))); | 464 base::Unretained(this)))); |
471 PumpLoop(); | 465 PumpLoop(); |
472 } | 466 } |
473 | 467 |
474 // Tear down and restore the database. | 468 // Tear down and restore the database. |
475 gcm_store = BuildGCMStore().Pass(); | 469 gcm_store = BuildGCMStore().Pass(); |
476 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 470 LoadGCMStore(gcm_store.get(), &load_result); |
477 base::Unretained(this), | |
478 &load_result)); | |
479 PumpLoop(); | |
480 | 471 |
481 // Adding more messages should still fail. | 472 // Adding more messages should still fail. |
482 for (int i = 0; i < kNumMessagesPerApp; ++i) { | 473 for (int i = 0; i < kNumMessagesPerApp; ++i) { |
483 mcs_proto::DataMessageStanza message; | 474 mcs_proto::DataMessageStanza message; |
484 message.set_from(kAppName); | 475 message.set_from(kAppName); |
485 message.set_category(kCategoryName); | 476 message.set_category(kCategoryName); |
486 EXPECT_FALSE(gcm_store->AddOutgoingMessage( | 477 EXPECT_FALSE(gcm_store->AddOutgoingMessage( |
487 base::IntToString(i + kNumMessagesPerApp), | 478 base::IntToString(i + kNumMessagesPerApp), |
488 MCSMessage(message), | 479 MCSMessage(message), |
489 base::Bind(&GCMStoreImplTest::UpdateCallback, | 480 base::Bind(&GCMStoreImplTest::UpdateCallback, |
(...skipping 18 matching lines...) Expand all Loading... |
508 EXPECT_TRUE(gcm_store->AddOutgoingMessage( | 499 EXPECT_TRUE(gcm_store->AddOutgoingMessage( |
509 base::IntToString(i + kNumMessagesPerApp), | 500 base::IntToString(i + kNumMessagesPerApp), |
510 MCSMessage(message), | 501 MCSMessage(message), |
511 base::Bind(&GCMStoreImplTest::UpdateCallback, | 502 base::Bind(&GCMStoreImplTest::UpdateCallback, |
512 base::Unretained(this)))); | 503 base::Unretained(this)))); |
513 PumpLoop(); | 504 PumpLoop(); |
514 } | 505 } |
515 } | 506 } |
516 | 507 |
517 TEST_F(GCMStoreImplTest, AccountMapping) { | 508 TEST_F(GCMStoreImplTest, AccountMapping) { |
518 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 509 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
519 scoped_ptr<GCMStore::LoadResult> load_result; | 510 scoped_ptr<GCMStore::LoadResult> load_result; |
520 gcm_store->Load(base::Bind( | 511 LoadGCMStore(gcm_store.get(), &load_result); |
521 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
522 | 512 |
523 // Add account mappings. | 513 // Add account mappings. |
524 AccountMapping account_mapping1; | 514 AccountMapping account_mapping1; |
525 account_mapping1.account_id = "account_id_1"; | 515 account_mapping1.account_id = "account_id_1"; |
526 account_mapping1.email = "account_id_1@gmail.com"; | 516 account_mapping1.email = "account_id_1@gmail.com"; |
527 account_mapping1.access_token = "account_token1"; | 517 account_mapping1.access_token = "account_token1"; |
528 account_mapping1.status = AccountMapping::ADDING; | 518 account_mapping1.status = AccountMapping::ADDING; |
529 account_mapping1.status_change_timestamp = base::Time(); | 519 account_mapping1.status_change_timestamp = base::Time(); |
530 account_mapping1.last_message_id = "message_1"; | 520 account_mapping1.last_message_id = "message_1"; |
531 | 521 |
532 AccountMapping account_mapping2; | 522 AccountMapping account_mapping2; |
533 account_mapping2.account_id = "account_id_2"; | 523 account_mapping2.account_id = "account_id_2"; |
534 account_mapping2.email = "account_id_2@gmail.com"; | 524 account_mapping2.email = "account_id_2@gmail.com"; |
535 account_mapping2.access_token = "account_token1"; | 525 account_mapping2.access_token = "account_token1"; |
536 account_mapping2.status = AccountMapping::REMOVING; | 526 account_mapping2.status = AccountMapping::REMOVING; |
537 account_mapping2.status_change_timestamp = | 527 account_mapping2.status_change_timestamp = |
538 base::Time::FromInternalValue(1305734521259935LL); | 528 base::Time::FromInternalValue(1305734521259935LL); |
539 account_mapping2.last_message_id = "message_2"; | 529 account_mapping2.last_message_id = "message_2"; |
540 | 530 |
541 gcm_store->AddAccountMapping( | 531 gcm_store->AddAccountMapping( |
542 account_mapping1, | 532 account_mapping1, |
543 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 533 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
544 PumpLoop(); | 534 PumpLoop(); |
545 gcm_store->AddAccountMapping( | 535 gcm_store->AddAccountMapping( |
546 account_mapping2, | 536 account_mapping2, |
547 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 537 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
548 PumpLoop(); | 538 PumpLoop(); |
549 | 539 |
550 gcm_store = BuildGCMStore().Pass(); | 540 gcm_store = BuildGCMStore().Pass(); |
551 gcm_store->Load(base::Bind( | 541 LoadGCMStore(gcm_store.get(), &load_result); |
552 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
553 PumpLoop(); | |
554 | 542 |
555 EXPECT_EQ(2UL, load_result->account_mappings.size()); | 543 EXPECT_EQ(2UL, load_result->account_mappings.size()); |
556 GCMStore::AccountMappings::iterator iter = | 544 GCMStore::AccountMappings::iterator iter = |
557 load_result->account_mappings.begin(); | 545 load_result->account_mappings.begin(); |
558 EXPECT_EQ(account_mapping1.account_id, iter->account_id); | 546 EXPECT_EQ(account_mapping1.account_id, iter->account_id); |
559 EXPECT_EQ(account_mapping1.email, iter->email); | 547 EXPECT_EQ(account_mapping1.email, iter->email); |
560 EXPECT_TRUE(iter->access_token.empty()); | 548 EXPECT_TRUE(iter->access_token.empty()); |
561 EXPECT_EQ(AccountMapping::ADDING, iter->status); | 549 EXPECT_EQ(AccountMapping::ADDING, iter->status); |
562 EXPECT_EQ(account_mapping1.status_change_timestamp, | 550 EXPECT_EQ(account_mapping1.status_change_timestamp, |
563 iter->status_change_timestamp); | 551 iter->status_change_timestamp); |
564 EXPECT_EQ(account_mapping1.last_message_id, iter->last_message_id); | 552 EXPECT_EQ(account_mapping1.last_message_id, iter->last_message_id); |
565 ++iter; | 553 ++iter; |
566 EXPECT_EQ(account_mapping2.account_id, iter->account_id); | 554 EXPECT_EQ(account_mapping2.account_id, iter->account_id); |
567 EXPECT_EQ(account_mapping2.email, iter->email); | 555 EXPECT_EQ(account_mapping2.email, iter->email); |
568 EXPECT_TRUE(iter->access_token.empty()); | 556 EXPECT_TRUE(iter->access_token.empty()); |
569 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | 557 EXPECT_EQ(AccountMapping::REMOVING, iter->status); |
570 EXPECT_EQ(account_mapping2.status_change_timestamp, | 558 EXPECT_EQ(account_mapping2.status_change_timestamp, |
571 iter->status_change_timestamp); | 559 iter->status_change_timestamp); |
572 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); | 560 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); |
573 | 561 |
574 gcm_store->RemoveAccountMapping( | 562 gcm_store->RemoveAccountMapping( |
575 account_mapping1.account_id, | 563 account_mapping1.account_id, |
576 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 564 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
577 PumpLoop(); | 565 PumpLoop(); |
578 | 566 |
579 gcm_store = BuildGCMStore().Pass(); | 567 gcm_store = BuildGCMStore().Pass(); |
580 gcm_store->Load(base::Bind( | 568 LoadGCMStore(gcm_store.get(), &load_result); |
581 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
582 PumpLoop(); | |
583 | 569 |
584 EXPECT_EQ(1UL, load_result->account_mappings.size()); | 570 EXPECT_EQ(1UL, load_result->account_mappings.size()); |
585 iter = load_result->account_mappings.begin(); | 571 iter = load_result->account_mappings.begin(); |
586 EXPECT_EQ(account_mapping2.account_id, iter->account_id); | 572 EXPECT_EQ(account_mapping2.account_id, iter->account_id); |
587 EXPECT_EQ(account_mapping2.email, iter->email); | 573 EXPECT_EQ(account_mapping2.email, iter->email); |
588 EXPECT_TRUE(iter->access_token.empty()); | 574 EXPECT_TRUE(iter->access_token.empty()); |
589 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | 575 EXPECT_EQ(AccountMapping::REMOVING, iter->status); |
590 EXPECT_EQ(account_mapping2.status_change_timestamp, | 576 EXPECT_EQ(account_mapping2.status_change_timestamp, |
591 iter->status_change_timestamp); | 577 iter->status_change_timestamp); |
592 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); | 578 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); |
593 } | 579 } |
594 | 580 |
595 TEST_F(GCMStoreImplTest, HeartbeatInterval) { | 581 TEST_F(GCMStoreImplTest, HeartbeatInterval) { |
596 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 582 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
597 scoped_ptr<GCMStore::LoadResult> load_result; | 583 scoped_ptr<GCMStore::LoadResult> load_result; |
598 gcm_store->Load(base::Bind( | 584 LoadGCMStore(gcm_store.get(), &load_result); |
599 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
600 | 585 |
601 std::string scope1 = "scope1"; | 586 std::string scope1 = "scope1"; |
602 std::string scope2 = "scope2"; | 587 std::string scope2 = "scope2"; |
603 int heartbeat1 = 120 * 1000; | 588 int heartbeat1 = 120 * 1000; |
604 int heartbeat2 = 360 * 1000; | 589 int heartbeat2 = 360 * 1000; |
605 | 590 |
606 gcm_store->AddHeartbeatInterval( | 591 gcm_store->AddHeartbeatInterval( |
607 scope1, | 592 scope1, |
608 heartbeat1, | 593 heartbeat1, |
609 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 594 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
610 PumpLoop(); | 595 PumpLoop(); |
611 gcm_store->AddHeartbeatInterval( | 596 gcm_store->AddHeartbeatInterval( |
612 scope2, | 597 scope2, |
613 heartbeat2, | 598 heartbeat2, |
614 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 599 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
615 PumpLoop(); | 600 PumpLoop(); |
616 | 601 |
617 gcm_store = BuildGCMStore().Pass(); | 602 gcm_store = BuildGCMStore().Pass(); |
618 gcm_store->Load(base::Bind( | 603 LoadGCMStore(gcm_store.get(), &load_result); |
619 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
620 PumpLoop(); | |
621 | 604 |
622 EXPECT_EQ(2UL, load_result->heartbeat_intervals.size()); | 605 EXPECT_EQ(2UL, load_result->heartbeat_intervals.size()); |
623 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope1) != | 606 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope1) != |
624 load_result->heartbeat_intervals.end()); | 607 load_result->heartbeat_intervals.end()); |
625 EXPECT_EQ(heartbeat1, load_result->heartbeat_intervals[scope1]); | 608 EXPECT_EQ(heartbeat1, load_result->heartbeat_intervals[scope1]); |
626 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope2) != | 609 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope2) != |
627 load_result->heartbeat_intervals.end()); | 610 load_result->heartbeat_intervals.end()); |
628 EXPECT_EQ(heartbeat2, load_result->heartbeat_intervals[scope2]); | 611 EXPECT_EQ(heartbeat2, load_result->heartbeat_intervals[scope2]); |
629 | 612 |
630 gcm_store->RemoveHeartbeatInterval( | 613 gcm_store->RemoveHeartbeatInterval( |
631 scope2, | 614 scope2, |
632 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 615 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
633 PumpLoop(); | 616 PumpLoop(); |
634 | 617 |
635 gcm_store = BuildGCMStore().Pass(); | 618 gcm_store = BuildGCMStore().Pass(); |
636 gcm_store->Load(base::Bind( | 619 LoadGCMStore(gcm_store.get(), &load_result); |
637 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
638 PumpLoop(); | |
639 | 620 |
640 EXPECT_EQ(1UL, load_result->heartbeat_intervals.size()); | 621 EXPECT_EQ(1UL, load_result->heartbeat_intervals.size()); |
641 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope1) != | 622 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope1) != |
642 load_result->heartbeat_intervals.end()); | 623 load_result->heartbeat_intervals.end()); |
643 EXPECT_EQ(heartbeat1, load_result->heartbeat_intervals[scope1]); | 624 EXPECT_EQ(heartbeat1, load_result->heartbeat_intervals[scope1]); |
644 } | 625 } |
645 | 626 |
646 // When the database is destroyed, all database updates should fail. At the | 627 // When the database is destroyed, all database updates should fail. At the |
647 // same time, they per-app message counts should not go up, as failures should | 628 // same time, they per-app message counts should not go up, as failures should |
648 // result in decrementing the counts. | 629 // result in decrementing the counts. |
649 TEST_F(GCMStoreImplTest, AddMessageAfterDestroy) { | 630 TEST_F(GCMStoreImplTest, AddMessageAfterDestroy) { |
650 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 631 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
651 scoped_ptr<GCMStore::LoadResult> load_result; | 632 scoped_ptr<GCMStore::LoadResult> load_result; |
652 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 633 LoadGCMStore(gcm_store.get(), &load_result); |
653 base::Unretained(this), | |
654 &load_result)); | |
655 PumpLoop(); | |
656 gcm_store->Destroy(base::Bind(&GCMStoreImplTest::UpdateCallback, | 634 gcm_store->Destroy(base::Bind(&GCMStoreImplTest::UpdateCallback, |
657 base::Unretained(this))); | 635 base::Unretained(this))); |
658 PumpLoop(); | 636 PumpLoop(); |
659 | 637 |
660 expected_success_ = false; | 638 expected_success_ = false; |
661 for (int i = 0; i < kNumMessagesPerApp * 2; ++i) { | 639 for (int i = 0; i < kNumMessagesPerApp * 2; ++i) { |
662 mcs_proto::DataMessageStanza message; | 640 mcs_proto::DataMessageStanza message; |
663 message.set_from(kAppName); | 641 message.set_from(kAppName); |
664 message.set_category(kCategoryName); | 642 message.set_category(kCategoryName); |
665 // Because all adds are failing, none should hit the per-app message limits. | 643 // Because all adds are failing, none should hit the per-app message limits. |
666 EXPECT_TRUE(gcm_store->AddOutgoingMessage( | 644 EXPECT_TRUE(gcm_store->AddOutgoingMessage( |
667 base::IntToString(i), | 645 base::IntToString(i), |
668 MCSMessage(message), | 646 MCSMessage(message), |
669 base::Bind(&GCMStoreImplTest::UpdateCallback, | 647 base::Bind(&GCMStoreImplTest::UpdateCallback, |
670 base::Unretained(this)))); | 648 base::Unretained(this)))); |
671 PumpLoop(); | 649 PumpLoop(); |
672 } | 650 } |
673 } | 651 } |
674 | 652 |
675 TEST_F(GCMStoreImplTest, ReloadAfterClose) { | 653 TEST_F(GCMStoreImplTest, ReloadAfterClose) { |
676 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 654 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
677 scoped_ptr<GCMStore::LoadResult> load_result; | 655 scoped_ptr<GCMStore::LoadResult> load_result; |
678 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 656 LoadGCMStore(gcm_store.get(), &load_result); |
679 base::Unretained(this), | |
680 &load_result)); | |
681 PumpLoop(); | |
682 | 657 |
683 gcm_store->Close(); | 658 gcm_store->Close(); |
684 PumpLoop(); | 659 PumpLoop(); |
685 | 660 |
686 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 661 LoadGCMStore(gcm_store.get(), &load_result); |
687 base::Unretained(this), | |
688 &load_result)); | |
689 PumpLoop(); | |
690 } | 662 } |
691 | 663 |
692 TEST_F(GCMStoreImplTest, LastTokenFetchTime) { | 664 TEST_F(GCMStoreImplTest, LastTokenFetchTime) { |
693 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); | 665 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
694 scoped_ptr<GCMStore::LoadResult> load_result; | 666 scoped_ptr<GCMStore::LoadResult> load_result; |
695 gcm_store->Load(base::Bind( | 667 LoadGCMStore(gcm_store.get(), &load_result); |
696 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
697 PumpLoop(); | |
698 EXPECT_EQ(base::Time(), load_result->last_token_fetch_time); | 668 EXPECT_EQ(base::Time(), load_result->last_token_fetch_time); |
699 | 669 |
700 base::Time last_token_fetch_time = base::Time::Now(); | 670 base::Time last_token_fetch_time = base::Time::Now(); |
701 gcm_store->SetLastTokenFetchTime( | 671 gcm_store->SetLastTokenFetchTime( |
702 last_token_fetch_time, | 672 last_token_fetch_time, |
703 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 673 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
704 PumpLoop(); | 674 PumpLoop(); |
705 | 675 |
706 gcm_store = BuildGCMStore().Pass(); | 676 gcm_store = BuildGCMStore().Pass(); |
707 gcm_store->Load(base::Bind( | 677 LoadGCMStore(gcm_store.get(), &load_result); |
708 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
709 PumpLoop(); | |
710 EXPECT_EQ(last_token_fetch_time, load_result->last_token_fetch_time); | 678 EXPECT_EQ(last_token_fetch_time, load_result->last_token_fetch_time); |
711 | 679 |
712 // Negative cases, where the value read is gibberish. | 680 // Negative cases, where the value read is gibberish. |
713 gcm_store->SetValueForTesting( | 681 gcm_store->SetValueForTesting( |
714 "last_token_fetch_time", | 682 "last_token_fetch_time", |
715 "gibberish", | 683 "gibberish", |
716 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 684 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
717 PumpLoop(); | 685 PumpLoop(); |
718 | 686 |
719 gcm_store = BuildGCMStore().Pass(); | 687 gcm_store = BuildGCMStore().Pass(); |
720 gcm_store->Load(base::Bind( | 688 LoadGCMStore(gcm_store.get(), &load_result); |
721 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
722 PumpLoop(); | |
723 EXPECT_EQ(base::Time(), load_result->last_token_fetch_time); | 689 EXPECT_EQ(base::Time(), load_result->last_token_fetch_time); |
724 } | 690 } |
725 | 691 |
726 TEST_F(GCMStoreImplTest, InstanceIDData) { | 692 TEST_F(GCMStoreImplTest, InstanceIDData) { |
727 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 693 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
728 scoped_ptr<GCMStore::LoadResult> load_result; | 694 scoped_ptr<GCMStore::LoadResult> load_result; |
729 gcm_store->Load(base::Bind( | 695 LoadGCMStore(gcm_store.get(), &load_result); |
730 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
731 PumpLoop(); | |
732 | 696 |
733 std::string instance_id_data("Foo"); | 697 std::string instance_id_data("Foo"); |
734 gcm_store->AddInstanceIDData( | 698 gcm_store->AddInstanceIDData( |
735 kAppName, | 699 kAppName, |
736 instance_id_data, | 700 instance_id_data, |
737 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 701 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
738 PumpLoop(); | 702 PumpLoop(); |
739 | 703 |
740 std::string instance_id_data2("Hello Instance ID"); | 704 std::string instance_id_data2("Hello Instance ID"); |
741 gcm_store->AddInstanceIDData( | 705 gcm_store->AddInstanceIDData( |
742 kAppName2, | 706 kAppName2, |
743 instance_id_data2, | 707 instance_id_data2, |
744 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 708 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
745 PumpLoop(); | 709 PumpLoop(); |
746 | 710 |
747 gcm_store = BuildGCMStore().Pass(); | 711 gcm_store = BuildGCMStore().Pass(); |
748 gcm_store->Load(base::Bind( | 712 LoadGCMStore(gcm_store.get(), &load_result); |
749 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
750 PumpLoop(); | |
751 | 713 |
752 ASSERT_EQ(2u, load_result->instance_id_data.size()); | 714 ASSERT_EQ(2u, load_result->instance_id_data.size()); |
753 ASSERT_TRUE(load_result->instance_id_data.find(kAppName) != | 715 ASSERT_TRUE(load_result->instance_id_data.find(kAppName) != |
754 load_result->instance_id_data.end()); | 716 load_result->instance_id_data.end()); |
755 ASSERT_TRUE(load_result->instance_id_data.find(kAppName2) != | 717 ASSERT_TRUE(load_result->instance_id_data.find(kAppName2) != |
756 load_result->instance_id_data.end()); | 718 load_result->instance_id_data.end()); |
757 EXPECT_EQ(instance_id_data, load_result->instance_id_data[kAppName]); | 719 EXPECT_EQ(instance_id_data, load_result->instance_id_data[kAppName]); |
758 EXPECT_EQ(instance_id_data2, load_result->instance_id_data[kAppName2]); | 720 EXPECT_EQ(instance_id_data2, load_result->instance_id_data[kAppName2]); |
759 | 721 |
760 gcm_store->RemoveInstanceIDData( | 722 gcm_store->RemoveInstanceIDData( |
761 kAppName, | 723 kAppName, |
762 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 724 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
763 PumpLoop(); | 725 PumpLoop(); |
764 | 726 |
765 gcm_store = BuildGCMStore().Pass(); | 727 gcm_store = BuildGCMStore().Pass(); |
766 gcm_store->Load(base::Bind( | 728 LoadGCMStore(gcm_store.get(), &load_result); |
767 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
768 PumpLoop(); | |
769 | 729 |
770 ASSERT_EQ(1u, load_result->instance_id_data.size()); | 730 ASSERT_EQ(1u, load_result->instance_id_data.size()); |
771 ASSERT_TRUE(load_result->instance_id_data.find(kAppName2) != | 731 ASSERT_TRUE(load_result->instance_id_data.find(kAppName2) != |
772 load_result->instance_id_data.end()); | 732 load_result->instance_id_data.end()); |
773 EXPECT_EQ(instance_id_data2, load_result->instance_id_data[kAppName2]); | 733 EXPECT_EQ(instance_id_data2, load_result->instance_id_data[kAppName2]); |
774 } | 734 } |
775 | 735 |
776 } // namespace | 736 } // namespace |
777 | 737 |
778 } // namespace gcm | 738 } // namespace gcm |
OLD | NEW |