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

Side by Side Diff: google_apis/gcm/engine/gcm_store_impl_unittest.cc

Issue 1183843002: Do not create GCM store if it is not needed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address feedback + fix test Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « google_apis/gcm/engine/gcm_store_impl.cc ('k') | google_apis/gcm/engine/mcs_client_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "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
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
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
OLDNEW
« no previous file with comments | « google_apis/gcm/engine/gcm_store_impl.cc ('k') | google_apis/gcm/engine/mcs_client_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698