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

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

Issue 147193003: [GCM] Fix memory leaks (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix windows Created 6 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « google_apis/gcm/engine/gcm_store_impl.cc ('k') | google_apis/gcm/engine/mcs_client.h » ('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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 public: 42 public:
43 GCMStoreImplTest(); 43 GCMStoreImplTest();
44 virtual ~GCMStoreImplTest(); 44 virtual ~GCMStoreImplTest();
45 45
46 scoped_ptr<GCMStore> BuildGCMStore(); 46 scoped_ptr<GCMStore> BuildGCMStore();
47 47
48 std::string GetNextPersistentId(); 48 std::string GetNextPersistentId();
49 49
50 void PumpLoop(); 50 void PumpLoop();
51 51
52 void LoadCallback(GCMStore::LoadResult* result_dst, 52 void LoadCallback(scoped_ptr<GCMStore::LoadResult>* result_dst,
53 const GCMStore::LoadResult& result); 53 scoped_ptr<GCMStore::LoadResult> result);
54 void UpdateCallback(bool success); 54 void UpdateCallback(bool success);
55 55
56 protected: 56 protected:
57 base::MessageLoop message_loop_; 57 base::MessageLoop message_loop_;
58 base::ScopedTempDir temp_directory_; 58 base::ScopedTempDir temp_directory_;
59 bool expected_success_; 59 bool expected_success_;
60 scoped_ptr<base::RunLoop> run_loop_; 60 scoped_ptr<base::RunLoop> run_loop_;
61 }; 61 };
62 62
63 GCMStoreImplTest::GCMStoreImplTest() 63 GCMStoreImplTest::GCMStoreImplTest()
(...skipping 10 matching lines...) Expand all
74 temp_directory_.path(), 74 temp_directory_.path(),
75 message_loop_.message_loop_proxy())); 75 message_loop_.message_loop_proxy()));
76 } 76 }
77 77
78 std::string GCMStoreImplTest::GetNextPersistentId() { 78 std::string GCMStoreImplTest::GetNextPersistentId() {
79 return base::Uint64ToString(base::Time::Now().ToInternalValue()); 79 return base::Uint64ToString(base::Time::Now().ToInternalValue());
80 } 80 }
81 81
82 void GCMStoreImplTest::PumpLoop() { message_loop_.RunUntilIdle(); } 82 void GCMStoreImplTest::PumpLoop() { message_loop_.RunUntilIdle(); }
83 83
84 void GCMStoreImplTest::LoadCallback(GCMStore::LoadResult* result_dst, 84 void GCMStoreImplTest::LoadCallback(
85 const GCMStore::LoadResult& result) { 85 scoped_ptr<GCMStore::LoadResult>* result_dst,
86 ASSERT_TRUE(result.success); 86 scoped_ptr<GCMStore::LoadResult> result) {
87 *result_dst = result; 87 ASSERT_TRUE(result->success);
88 *result_dst = result.Pass();
88 run_loop_->Quit(); 89 run_loop_->Quit();
89 run_loop_.reset(new base::RunLoop()); 90 run_loop_.reset(new base::RunLoop());
90 } 91 }
91 92
92 void GCMStoreImplTest::UpdateCallback(bool success) { 93 void GCMStoreImplTest::UpdateCallback(bool success) {
93 ASSERT_EQ(expected_success_, success); 94 ASSERT_EQ(expected_success_, success);
94 } 95 }
95 96
96 // Verify creating a new database and loading it. 97 // Verify creating a new database and loading it.
97 TEST_F(GCMStoreImplTest, LoadNew) { 98 TEST_F(GCMStoreImplTest, LoadNew) {
98 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 99 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
99 GCMStore::LoadResult load_result; 100 scoped_ptr<GCMStore::LoadResult> load_result;
100 gcm_store->Load(base::Bind( 101 gcm_store->Load(base::Bind(
101 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 102 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
102 PumpLoop(); 103 PumpLoop();
103 104
104 EXPECT_EQ(0U, load_result.device_android_id); 105 EXPECT_EQ(0U, load_result->device_android_id);
105 EXPECT_EQ(0U, load_result.device_security_token); 106 EXPECT_EQ(0U, load_result->device_security_token);
106 EXPECT_TRUE(load_result.incoming_messages.empty()); 107 EXPECT_TRUE(load_result->incoming_messages.empty());
107 EXPECT_TRUE(load_result.outgoing_messages.empty()); 108 EXPECT_TRUE(load_result->outgoing_messages.empty());
108 EXPECT_EQ(1LL, load_result.serial_number_mappings.next_serial_number); 109 EXPECT_EQ(1LL, load_result->serial_number_mappings.next_serial_number);
109 EXPECT_TRUE(load_result.serial_number_mappings.user_serial_numbers.empty()); 110 EXPECT_TRUE(load_result->serial_number_mappings.user_serial_numbers.empty());
110 } 111 }
111 112
112 TEST_F(GCMStoreImplTest, DeviceCredentials) { 113 TEST_F(GCMStoreImplTest, DeviceCredentials) {
113 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 114 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
114 GCMStore::LoadResult load_result; 115 scoped_ptr<GCMStore::LoadResult> load_result;
115 gcm_store->Load(base::Bind( 116 gcm_store->Load(base::Bind(
116 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 117 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
117 PumpLoop(); 118 PumpLoop();
118 119
119 gcm_store->SetDeviceCredentials( 120 gcm_store->SetDeviceCredentials(
120 kDeviceId, 121 kDeviceId,
121 kDeviceToken, 122 kDeviceToken,
122 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 123 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
123 PumpLoop(); 124 PumpLoop();
124 125
125 gcm_store = BuildGCMStore().Pass(); 126 gcm_store = BuildGCMStore().Pass();
126 gcm_store->Load(base::Bind( 127 gcm_store->Load(base::Bind(
127 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 128 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
128 PumpLoop(); 129 PumpLoop();
129 130
130 ASSERT_EQ(kDeviceId, load_result.device_android_id); 131 ASSERT_EQ(kDeviceId, load_result->device_android_id);
131 ASSERT_EQ(kDeviceToken, load_result.device_security_token); 132 ASSERT_EQ(kDeviceToken, load_result->device_security_token);
132 } 133 }
133 134
134 // Verify saving some incoming messages, reopening the directory, and then 135 // Verify saving some incoming messages, reopening the directory, and then
135 // removing those incoming messages. 136 // removing those incoming messages.
136 TEST_F(GCMStoreImplTest, IncomingMessages) { 137 TEST_F(GCMStoreImplTest, IncomingMessages) {
137 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 138 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
138 GCMStore::LoadResult load_result; 139 scoped_ptr<GCMStore::LoadResult> load_result;
139 gcm_store->Load(base::Bind( 140 gcm_store->Load(base::Bind(
140 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 141 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
141 PumpLoop(); 142 PumpLoop();
142 143
143 std::vector<std::string> persistent_ids; 144 std::vector<std::string> persistent_ids;
144 for (int i = 0; i < kNumPersistentIds; ++i) { 145 for (int i = 0; i < kNumPersistentIds; ++i) {
145 persistent_ids.push_back(GetNextPersistentId()); 146 persistent_ids.push_back(GetNextPersistentId());
146 gcm_store->AddIncomingMessage( 147 gcm_store->AddIncomingMessage(
147 persistent_ids.back(), 148 persistent_ids.back(),
148 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 149 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
149 PumpLoop(); 150 PumpLoop();
150 } 151 }
151 152
152 gcm_store = BuildGCMStore().Pass(); 153 gcm_store = BuildGCMStore().Pass();
153 gcm_store->Load(base::Bind( 154 gcm_store->Load(base::Bind(
154 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 155 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
155 PumpLoop(); 156 PumpLoop();
156 157
157 ASSERT_EQ(persistent_ids, load_result.incoming_messages); 158 ASSERT_EQ(persistent_ids, load_result->incoming_messages);
158 ASSERT_TRUE(load_result.outgoing_messages.empty()); 159 ASSERT_TRUE(load_result->outgoing_messages.empty());
159 160
160 gcm_store->RemoveIncomingMessages( 161 gcm_store->RemoveIncomingMessages(
161 persistent_ids, 162 persistent_ids,
162 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 163 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
163 PumpLoop(); 164 PumpLoop();
164 165
165 gcm_store = BuildGCMStore().Pass(); 166 gcm_store = BuildGCMStore().Pass();
166 load_result.incoming_messages.clear(); 167 load_result->incoming_messages.clear();
167 gcm_store->Load(base::Bind( 168 gcm_store->Load(base::Bind(
168 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 169 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
169 PumpLoop(); 170 PumpLoop();
170 171
171 ASSERT_TRUE(load_result.incoming_messages.empty()); 172 ASSERT_TRUE(load_result->incoming_messages.empty());
172 ASSERT_TRUE(load_result.outgoing_messages.empty()); 173 ASSERT_TRUE(load_result->outgoing_messages.empty());
173 } 174 }
174 175
175 // Verify saving some outgoing messages, reopening the directory, and then 176 // Verify saving some outgoing messages, reopening the directory, and then
176 // removing those outgoing messages. 177 // removing those outgoing messages.
177 // Fails on linux_asan crbug.com/337560 178 TEST_F(GCMStoreImplTest, OutgoingMessages) {
178 #if !defined(OS_POSIX)
179 #define MAYBE_OutgoingMessages OutgoingMessages
180 #else
181 #define MAYBE_OutgoingMessages DISABLED_OutgoingMessages
182 #endif
183 TEST_F(GCMStoreImplTest, MAYBE_OutgoingMessages) {
184 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 179 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
185 GCMStore::LoadResult load_result; 180 scoped_ptr<GCMStore::LoadResult> load_result;
186 gcm_store->Load(base::Bind( 181 gcm_store->Load(base::Bind(
187 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 182 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
188 PumpLoop(); 183 PumpLoop();
189 184
190 std::vector<std::string> persistent_ids; 185 std::vector<std::string> persistent_ids;
191 const int kNumPersistentIds = 10; 186 const int kNumPersistentIds = 10;
192 for (int i = 0; i < kNumPersistentIds; ++i) { 187 for (int i = 0; i < kNumPersistentIds; ++i) {
193 persistent_ids.push_back(GetNextPersistentId()); 188 persistent_ids.push_back(GetNextPersistentId());
194 mcs_proto::DataMessageStanza message; 189 mcs_proto::DataMessageStanza message;
195 message.set_from(kAppName + persistent_ids.back()); 190 message.set_from(kAppName + persistent_ids.back());
196 message.set_category(kCategoryName + persistent_ids.back()); 191 message.set_category(kCategoryName + persistent_ids.back());
197 gcm_store->AddOutgoingMessage( 192 gcm_store->AddOutgoingMessage(
198 persistent_ids.back(), 193 persistent_ids.back(),
199 MCSMessage(message), 194 MCSMessage(message),
200 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 195 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
201 PumpLoop(); 196 PumpLoop();
202 } 197 }
203 198
204 gcm_store = BuildGCMStore().Pass(); 199 gcm_store = BuildGCMStore().Pass();
205 gcm_store->Load(base::Bind( 200 gcm_store->Load(base::Bind(
206 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 201 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
207 PumpLoop(); 202 PumpLoop();
208 203
209 ASSERT_TRUE(load_result.incoming_messages.empty()); 204 ASSERT_TRUE(load_result->incoming_messages.empty());
210 ASSERT_EQ(load_result.outgoing_messages.size(), persistent_ids.size()); 205 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size());
211 for (int i = 0; i < kNumPersistentIds; ++i) { 206 for (int i = 0; i < kNumPersistentIds; ++i) {
212 std::string id = persistent_ids[i]; 207 std::string id = persistent_ids[i];
213 ASSERT_TRUE(load_result.outgoing_messages[id]); 208 ASSERT_TRUE(load_result->outgoing_messages[id].get());
214 const mcs_proto::DataMessageStanza* message = 209 const mcs_proto::DataMessageStanza* message =
215 reinterpret_cast<mcs_proto::DataMessageStanza*>( 210 reinterpret_cast<mcs_proto::DataMessageStanza*>(
216 load_result.outgoing_messages[id]); 211 load_result->outgoing_messages[id].get());
217 ASSERT_EQ(message->from(), kAppName + id); 212 ASSERT_EQ(message->from(), kAppName + id);
218 ASSERT_EQ(message->category(), kCategoryName + id); 213 ASSERT_EQ(message->category(), kCategoryName + id);
219 } 214 }
220 215
221 gcm_store->RemoveOutgoingMessages( 216 gcm_store->RemoveOutgoingMessages(
222 persistent_ids, 217 persistent_ids,
223 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 218 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
224 PumpLoop(); 219 PumpLoop();
225 220
226 gcm_store = BuildGCMStore().Pass(); 221 gcm_store = BuildGCMStore().Pass();
227 load_result.outgoing_messages.clear(); 222 load_result->outgoing_messages.clear();
228 gcm_store->Load(base::Bind( 223 gcm_store->Load(base::Bind(
229 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 224 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
230 PumpLoop(); 225 PumpLoop();
231 226
232 ASSERT_TRUE(load_result.incoming_messages.empty()); 227 ASSERT_TRUE(load_result->incoming_messages.empty());
233 ASSERT_TRUE(load_result.outgoing_messages.empty()); 228 ASSERT_TRUE(load_result->outgoing_messages.empty());
234 } 229 }
235 230
236 // Verify incoming and outgoing messages don't conflict. 231 // Verify incoming and outgoing messages don't conflict.
237 // Fails on linux_asan crbug.com/337560 232 TEST_F(GCMStoreImplTest, IncomingAndOutgoingMessages) {
238 #if !defined(OS_POSIX)
239 #define MAYBE_IncomingAndOutgoingMessages IncomingAndOutgoingMessages
240 #else
241 #define MAYBE_IncomingAndOutgoingMessages DISABLED_IncomingAndOutgoingMessages
242 #endif
243 TEST_F(GCMStoreImplTest, MAYBE_IncomingAndOutgoingMessages) {
244 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 233 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
245 GCMStore::LoadResult load_result; 234 scoped_ptr<GCMStore::LoadResult> load_result;
246 gcm_store->Load(base::Bind( 235 gcm_store->Load(base::Bind(
247 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 236 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
248 PumpLoop(); 237 PumpLoop();
249 238
250 std::vector<std::string> persistent_ids; 239 std::vector<std::string> persistent_ids;
251 const int kNumPersistentIds = 10; 240 const int kNumPersistentIds = 10;
252 for (int i = 0; i < kNumPersistentIds; ++i) { 241 for (int i = 0; i < kNumPersistentIds; ++i) {
253 persistent_ids.push_back(GetNextPersistentId()); 242 persistent_ids.push_back(GetNextPersistentId());
254 gcm_store->AddIncomingMessage( 243 gcm_store->AddIncomingMessage(
255 persistent_ids.back(), 244 persistent_ids.back(),
256 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 245 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
257 PumpLoop(); 246 PumpLoop();
258 247
259 mcs_proto::DataMessageStanza message; 248 mcs_proto::DataMessageStanza message;
260 message.set_from(kAppName + persistent_ids.back()); 249 message.set_from(kAppName + persistent_ids.back());
261 message.set_category(kCategoryName + persistent_ids.back()); 250 message.set_category(kCategoryName + persistent_ids.back());
262 gcm_store->AddOutgoingMessage( 251 gcm_store->AddOutgoingMessage(
263 persistent_ids.back(), 252 persistent_ids.back(),
264 MCSMessage(message), 253 MCSMessage(message),
265 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 254 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
266 PumpLoop(); 255 PumpLoop();
267 } 256 }
268 257
269 gcm_store = BuildGCMStore().Pass(); 258 gcm_store = BuildGCMStore().Pass();
270 gcm_store->Load(base::Bind( 259 gcm_store->Load(base::Bind(
271 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 260 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
272 PumpLoop(); 261 PumpLoop();
273 262
274 ASSERT_EQ(persistent_ids, load_result.incoming_messages); 263 ASSERT_EQ(persistent_ids, load_result->incoming_messages);
275 ASSERT_EQ(load_result.outgoing_messages.size(), persistent_ids.size()); 264 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size());
276 for (int i = 0; i < kNumPersistentIds; ++i) { 265 for (int i = 0; i < kNumPersistentIds; ++i) {
277 std::string id = persistent_ids[i]; 266 std::string id = persistent_ids[i];
278 ASSERT_TRUE(load_result.outgoing_messages[id]); 267 ASSERT_TRUE(load_result->outgoing_messages[id].get());
279 const mcs_proto::DataMessageStanza* message = 268 const mcs_proto::DataMessageStanza* message =
280 reinterpret_cast<mcs_proto::DataMessageStanza*>( 269 reinterpret_cast<mcs_proto::DataMessageStanza*>(
281 load_result.outgoing_messages[id]); 270 load_result->outgoing_messages[id].get());
282 ASSERT_EQ(message->from(), kAppName + id); 271 ASSERT_EQ(message->from(), kAppName + id);
283 ASSERT_EQ(message->category(), kCategoryName + id); 272 ASSERT_EQ(message->category(), kCategoryName + id);
284 } 273 }
285 274
286 gcm_store->RemoveIncomingMessages( 275 gcm_store->RemoveIncomingMessages(
287 persistent_ids, 276 persistent_ids,
288 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 277 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
289 PumpLoop(); 278 PumpLoop();
290 gcm_store->RemoveOutgoingMessages( 279 gcm_store->RemoveOutgoingMessages(
291 persistent_ids, 280 persistent_ids,
292 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 281 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
293 PumpLoop(); 282 PumpLoop();
294 283
295 gcm_store = BuildGCMStore().Pass(); 284 gcm_store = BuildGCMStore().Pass();
296 load_result.incoming_messages.clear(); 285 load_result->incoming_messages.clear();
297 load_result.outgoing_messages.clear(); 286 load_result->outgoing_messages.clear();
298 gcm_store->Load(base::Bind( 287 gcm_store->Load(base::Bind(
299 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 288 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
300 PumpLoop(); 289 PumpLoop();
301 290
302 ASSERT_TRUE(load_result.incoming_messages.empty()); 291 ASSERT_TRUE(load_result->incoming_messages.empty());
303 ASSERT_TRUE(load_result.outgoing_messages.empty()); 292 ASSERT_TRUE(load_result->outgoing_messages.empty());
304 } 293 }
305 294
306 // Verify that the next serial number of persisted properly. 295 // Verify that the next serial number of persisted properly.
307 TEST_F(GCMStoreImplTest, NextSerialNumber) { 296 TEST_F(GCMStoreImplTest, NextSerialNumber) {
308 const int64 kNextSerialNumber = 77LL; 297 const int64 kNextSerialNumber = 77LL;
309 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 298 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
310 GCMStore::LoadResult load_result; 299 scoped_ptr<GCMStore::LoadResult> load_result;
311 gcm_store->Load(base::Bind( 300 gcm_store->Load(base::Bind(
312 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 301 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
313 PumpLoop(); 302 PumpLoop();
314 303
315 gcm_store->SetNextSerialNumber( 304 gcm_store->SetNextSerialNumber(
316 kNextSerialNumber, 305 kNextSerialNumber,
317 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 306 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
318 PumpLoop(); 307 PumpLoop();
319 308
320 gcm_store = BuildGCMStore().Pass(); 309 gcm_store = BuildGCMStore().Pass();
321 gcm_store->Load(base::Bind( 310 gcm_store->Load(base::Bind(
322 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 311 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
323 PumpLoop(); 312 PumpLoop();
324 313
325 EXPECT_EQ(kNextSerialNumber, 314 EXPECT_EQ(kNextSerialNumber,
326 load_result.serial_number_mappings.next_serial_number); 315 load_result->serial_number_mappings.next_serial_number);
327 } 316 }
328 317
329 // Verify that user serial number mappings are persisted properly. 318 // Verify that user serial number mappings are persisted properly.
330 TEST_F(GCMStoreImplTest, UserSerialNumberMappings) { 319 TEST_F(GCMStoreImplTest, UserSerialNumberMappings) {
331 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 320 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
332 GCMStore::LoadResult load_result; 321 scoped_ptr<GCMStore::LoadResult> load_result;
333 gcm_store->Load(base::Bind( 322 gcm_store->Load(base::Bind(
334 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 323 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
335 PumpLoop(); 324 PumpLoop();
336 325
337 std::string username1 = "username1"; 326 std::string username1 = "username1";
338 int64 serial_number1 = 34LL; 327 int64 serial_number1 = 34LL;
339 gcm_store->AddUserSerialNumber( 328 gcm_store->AddUserSerialNumber(
340 username1, 329 username1,
341 serial_number1, 330 serial_number1,
342 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 331 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
343 332
344 std::string username2 = "username2"; 333 std::string username2 = "username2";
345 int64 serial_number2 = 56LL; 334 int64 serial_number2 = 56LL;
346 gcm_store->AddUserSerialNumber( 335 gcm_store->AddUserSerialNumber(
347 username2, 336 username2,
348 serial_number2, 337 serial_number2,
349 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); 338 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
350 PumpLoop(); 339 PumpLoop();
351 340
352 gcm_store = BuildGCMStore().Pass(); 341 gcm_store = BuildGCMStore().Pass();
353 gcm_store->Load(base::Bind( 342 gcm_store->Load(base::Bind(
354 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); 343 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
355 PumpLoop(); 344 PumpLoop();
356 345
357 ASSERT_EQ(2u, load_result.serial_number_mappings.user_serial_numbers.size()); 346 ASSERT_EQ(2u, load_result->serial_number_mappings.user_serial_numbers.size());
358 ASSERT_NE( 347 ASSERT_NE(
359 load_result.serial_number_mappings.user_serial_numbers.end(), 348 load_result->serial_number_mappings.user_serial_numbers.end(),
360 load_result.serial_number_mappings.user_serial_numbers.find(username1)); 349 load_result->serial_number_mappings.user_serial_numbers.find(username1));
361 EXPECT_EQ(serial_number1, 350 EXPECT_EQ(serial_number1,
362 load_result.serial_number_mappings.user_serial_numbers[username1]); 351 load_result->serial_number_mappings.user_serial_numbers[username1]);
363 ASSERT_NE( 352 ASSERT_NE(
364 load_result.serial_number_mappings.user_serial_numbers.end(), 353 load_result->serial_number_mappings.user_serial_numbers.end(),
365 load_result.serial_number_mappings.user_serial_numbers.find(username2)); 354 load_result->serial_number_mappings.user_serial_numbers.find(username2));
366 EXPECT_EQ(serial_number2, 355 EXPECT_EQ(serial_number2,
367 load_result.serial_number_mappings.user_serial_numbers[username2]); 356 load_result->serial_number_mappings.user_serial_numbers[username2]);
368 } 357 }
369 358
370 // Test that per-app message limits are enforced, persisted across restarts, 359 // Test that per-app message limits are enforced, persisted across restarts,
371 // and updated as messages are removed. 360 // and updated as messages are removed.
372 // Fails on linux_asan crbug.com/337560 361 TEST_F(GCMStoreImplTest, PerAppMessageLimits) {
373 #if !defined(OS_POSIX)
374 #define MAYBE_PerAppMessageLimits PerAppMessageLimits
375 #else
376 #define MAYBE_PerAppMessageLimits DISABLED_PerAppMessageLimits
377 #endif
378 TEST_F(GCMStoreImplTest, MAYBE_PerAppMessageLimits) {
379 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 362 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
380 GCMStore::LoadResult load_result; 363 scoped_ptr<GCMStore::LoadResult> load_result;
381 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, 364 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback,
382 base::Unretained(this), 365 base::Unretained(this),
383 &load_result)); 366 &load_result));
384 367
385 // Add the initial (below app limit) messages. 368 // Add the initial (below app limit) messages.
386 for (int i = 0; i < kNumMessagesPerApp; ++i) { 369 for (int i = 0; i < kNumMessagesPerApp; ++i) {
387 mcs_proto::DataMessageStanza message; 370 mcs_proto::DataMessageStanza message;
388 message.set_from(kAppName); 371 message.set_from(kAppName);
389 message.set_category(kCategoryName); 372 message.set_category(kCategoryName);
390 EXPECT_TRUE(gcm_store->AddOutgoingMessage( 373 EXPECT_TRUE(gcm_store->AddOutgoingMessage(
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 base::Unretained(this)))); 432 base::Unretained(this))));
450 PumpLoop(); 433 PumpLoop();
451 } 434 }
452 } 435 }
453 436
454 // When the database is destroyed, all database updates should fail. At the 437 // When the database is destroyed, all database updates should fail. At the
455 // same time, they per-app message counts should not go up, as failures should 438 // same time, they per-app message counts should not go up, as failures should
456 // result in decrementing the counts. 439 // result in decrementing the counts.
457 TEST_F(GCMStoreImplTest, AddMessageAfterDestroy) { 440 TEST_F(GCMStoreImplTest, AddMessageAfterDestroy) {
458 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); 441 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
459 GCMStore::LoadResult load_result; 442 scoped_ptr<GCMStore::LoadResult> load_result;
460 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, 443 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback,
461 base::Unretained(this), 444 base::Unretained(this),
462 &load_result)); 445 &load_result));
463 PumpLoop(); 446 PumpLoop();
464 gcm_store->Destroy(base::Bind(&GCMStoreImplTest::UpdateCallback, 447 gcm_store->Destroy(base::Bind(&GCMStoreImplTest::UpdateCallback,
465 base::Unretained(this))); 448 base::Unretained(this)));
466 PumpLoop(); 449 PumpLoop();
467 450
468 expected_success_ = false; 451 expected_success_ = false;
469 for (int i = 0; i < kNumMessagesPerApp * 2; ++i) { 452 for (int i = 0; i < kNumMessagesPerApp * 2; ++i) {
470 mcs_proto::DataMessageStanza message; 453 mcs_proto::DataMessageStanza message;
471 message.set_from(kAppName); 454 message.set_from(kAppName);
472 message.set_category(kCategoryName); 455 message.set_category(kCategoryName);
473 // Because all adds are failing, none should hit the per-app message limits. 456 // Because all adds are failing, none should hit the per-app message limits.
474 EXPECT_TRUE(gcm_store->AddOutgoingMessage( 457 EXPECT_TRUE(gcm_store->AddOutgoingMessage(
475 base::IntToString(i), 458 base::IntToString(i),
476 MCSMessage(message), 459 MCSMessage(message),
477 base::Bind(&GCMStoreImplTest::UpdateCallback, 460 base::Bind(&GCMStoreImplTest::UpdateCallback,
478 base::Unretained(this)))); 461 base::Unretained(this))));
479 PumpLoop(); 462 PumpLoop();
480 } 463 }
481 } 464 }
482 465
483 } // namespace 466 } // namespace
484 467
485 } // namespace gcm 468 } // namespace gcm
OLDNEW
« no previous file with comments | « google_apis/gcm/engine/gcm_store_impl.cc ('k') | google_apis/gcm/engine/mcs_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698