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

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

Issue 121743002: Renaming RMQStore to GCMStore and breaking out its interface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Adding a GCM_EXPORT directive to GCMStoreImpl 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
« 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "google_apis/gcm/engine/gcm_store_impl.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/bind.h"
11 #include "base/files/file_path.h"
12 #include "base/files/scoped_temp_dir.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h"
16 #include "base/strings/string_number_conversions.h"
17 #include "components/webdata/encryptor/encryptor.h"
18 #include "google_apis/gcm/base/mcs_message.h"
19 #include "google_apis/gcm/base/mcs_util.h"
20 #include "google_apis/gcm/protocol/mcs.pb.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22
23 namespace gcm {
24
25 namespace {
26
27 // Number of persistent ids to use in tests.
28 const int kNumPersistentIds = 10;
29
30 const uint64 kDeviceId = 22;
31 const uint64 kDeviceToken = 55;
32
33 class GCMStoreImplTest : public testing::Test {
34 public:
35 GCMStoreImplTest();
36 virtual ~GCMStoreImplTest();
37
38 scoped_ptr<GCMStore> BuildGCMStore();
39
40 std::string GetNextPersistentId();
41
42 void PumpLoop();
43
44 void LoadCallback(GCMStore::LoadResult* result_dst,
45 const GCMStore::LoadResult& result);
46 void UpdateCallback(bool success);
47
48 private:
49 base::MessageLoop message_loop_;
50 base::ScopedTempDir temp_directory_;
51 scoped_ptr<base::RunLoop> run_loop_;
52 };
53
54 GCMStoreImplTest::GCMStoreImplTest() {
55 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir());
56 run_loop_.reset(new base::RunLoop());
57
58 // On OSX, prevent the Keychain permissions popup during unit tests.
59 #if defined(OS_MACOSX)
60 Encryptor::UseMockKeychain(true);
61 #endif
62 }
63
64 GCMStoreImplTest::~GCMStoreImplTest() {}
65
66 scoped_ptr<GCMStore> GCMStoreImplTest::BuildGCMStore() {
67 return scoped_ptr<GCMStore>(new GCMStoreImpl(
68 temp_directory_.path(), message_loop_.message_loop_proxy()));
69 }
70
71 std::string GCMStoreImplTest::GetNextPersistentId() {
72 return base::Uint64ToString(base::Time::Now().ToInternalValue());
73 }
74
75 void GCMStoreImplTest::PumpLoop() { message_loop_.RunUntilIdle(); }
76
77 void GCMStoreImplTest::LoadCallback(GCMStore::LoadResult* result_dst,
78 const GCMStore::LoadResult& result) {
79 ASSERT_TRUE(result.success);
80 *result_dst = result;
81 run_loop_->Quit();
82 run_loop_.reset(new base::RunLoop());
83 }
84
85 void GCMStoreImplTest::UpdateCallback(bool success) { ASSERT_TRUE(success); }
86
87 // Verify creating a new database and loading it.
88 TEST_F(GCMStoreImplTest, LoadNew) {
89 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
90 GCMStore::LoadResult load_result;
91 gcm_store->Load(base::Bind(
92 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
93 PumpLoop();
94
95 EXPECT_EQ(0U, load_result.device_android_id);
96 EXPECT_EQ(0U, load_result.device_security_token);
97 EXPECT_TRUE(load_result.incoming_messages.empty());
98 EXPECT_TRUE(load_result.outgoing_messages.empty());
99 EXPECT_EQ(1LL, load_result.next_serial_number);
100 EXPECT_TRUE(load_result.user_serial_numbers.empty());
101 }
102
103 TEST_F(GCMStoreImplTest, DeviceCredentials) {
104 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
105 GCMStore::LoadResult load_result;
106 gcm_store->Load(base::Bind(
107 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
108 PumpLoop();
109
110 gcm_store->SetDeviceCredentials(
111 kDeviceId,
112 kDeviceToken,
113 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
114 PumpLoop();
115
116 gcm_store = BuildGCMStore().Pass();
117 gcm_store->Load(base::Bind(
118 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
119 PumpLoop();
120
121 ASSERT_EQ(kDeviceId, load_result.device_android_id);
122 ASSERT_EQ(kDeviceToken, load_result.device_security_token);
123 }
124
125 // Verify saving some incoming messages, reopening the directory, and then
126 // removing those incoming messages.
127 TEST_F(GCMStoreImplTest, IncomingMessages) {
128 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
129 GCMStore::LoadResult load_result;
130 gcm_store->Load(base::Bind(
131 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
132 PumpLoop();
133
134 std::vector<std::string> persistent_ids;
135 for (int i = 0; i < kNumPersistentIds; ++i) {
136 persistent_ids.push_back(GetNextPersistentId());
137 gcm_store->AddIncomingMessage(
138 persistent_ids.back(),
139 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
140 PumpLoop();
141 }
142
143 gcm_store = BuildGCMStore().Pass();
144 gcm_store->Load(base::Bind(
145 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
146 PumpLoop();
147
148 ASSERT_EQ(persistent_ids, load_result.incoming_messages);
149 ASSERT_TRUE(load_result.outgoing_messages.empty());
150
151 gcm_store->RemoveIncomingMessages(
152 persistent_ids,
153 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
154 PumpLoop();
155
156 gcm_store = BuildGCMStore().Pass();
157 load_result.incoming_messages.clear();
158 gcm_store->Load(base::Bind(
159 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
160 PumpLoop();
161
162 ASSERT_TRUE(load_result.incoming_messages.empty());
163 ASSERT_TRUE(load_result.outgoing_messages.empty());
164 }
165
166 // Verify saving some outgoing messages, reopening the directory, and then
167 // removing those outgoing messages.
168 TEST_F(GCMStoreImplTest, OutgoingMessages) {
169 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
170 GCMStore::LoadResult load_result;
171 gcm_store->Load(base::Bind(
172 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
173 PumpLoop();
174
175 std::vector<std::string> persistent_ids;
176 const int kNumPersistentIds = 10;
177 for (int i = 0; i < kNumPersistentIds; ++i) {
178 persistent_ids.push_back(GetNextPersistentId());
179 mcs_proto::DataMessageStanza message;
180 message.set_from(persistent_ids.back());
181 message.set_category(persistent_ids.back());
182 gcm_store->AddOutgoingMessage(
183 persistent_ids.back(),
184 MCSMessage(message),
185 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
186 PumpLoop();
187 }
188
189 gcm_store = BuildGCMStore().Pass();
190 gcm_store->Load(base::Bind(
191 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
192 PumpLoop();
193
194 ASSERT_TRUE(load_result.incoming_messages.empty());
195 ASSERT_EQ(load_result.outgoing_messages.size(), persistent_ids.size());
196 for (int i = 0; i < kNumPersistentIds; ++i) {
197 std::string id = persistent_ids[i];
198 ASSERT_TRUE(load_result.outgoing_messages[id]);
199 const mcs_proto::DataMessageStanza* message =
200 reinterpret_cast<mcs_proto::DataMessageStanza*>(
201 load_result.outgoing_messages[id]);
202 ASSERT_EQ(message->from(), id);
203 ASSERT_EQ(message->category(), id);
204 }
205
206 gcm_store->RemoveOutgoingMessages(
207 persistent_ids,
208 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
209 PumpLoop();
210
211 gcm_store = BuildGCMStore().Pass();
212 load_result.outgoing_messages.clear();
213 gcm_store->Load(base::Bind(
214 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
215 PumpLoop();
216
217 ASSERT_TRUE(load_result.incoming_messages.empty());
218 ASSERT_TRUE(load_result.outgoing_messages.empty());
219 }
220
221 // Verify incoming and outgoing messages don't conflict.
222 TEST_F(GCMStoreImplTest, IncomingAndOutgoingMessages) {
223 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
224 GCMStore::LoadResult load_result;
225 gcm_store->Load(base::Bind(
226 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
227 PumpLoop();
228
229 std::vector<std::string> persistent_ids;
230 const int kNumPersistentIds = 10;
231 for (int i = 0; i < kNumPersistentIds; ++i) {
232 persistent_ids.push_back(GetNextPersistentId());
233 gcm_store->AddIncomingMessage(
234 persistent_ids.back(),
235 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
236 PumpLoop();
237
238 mcs_proto::DataMessageStanza message;
239 message.set_from(persistent_ids.back());
240 message.set_category(persistent_ids.back());
241 gcm_store->AddOutgoingMessage(
242 persistent_ids.back(),
243 MCSMessage(message),
244 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
245 PumpLoop();
246 }
247
248 gcm_store = BuildGCMStore().Pass();
249 gcm_store->Load(base::Bind(
250 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
251 PumpLoop();
252
253 ASSERT_EQ(persistent_ids, load_result.incoming_messages);
254 ASSERT_EQ(load_result.outgoing_messages.size(), persistent_ids.size());
255 for (int i = 0; i < kNumPersistentIds; ++i) {
256 std::string id = persistent_ids[i];
257 ASSERT_TRUE(load_result.outgoing_messages[id]);
258 const mcs_proto::DataMessageStanza* message =
259 reinterpret_cast<mcs_proto::DataMessageStanza*>(
260 load_result.outgoing_messages[id]);
261 ASSERT_EQ(message->from(), id);
262 ASSERT_EQ(message->category(), id);
263 }
264
265 gcm_store->RemoveIncomingMessages(
266 persistent_ids,
267 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
268 PumpLoop();
269 gcm_store->RemoveOutgoingMessages(
270 persistent_ids,
271 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
272 PumpLoop();
273
274 gcm_store = BuildGCMStore().Pass();
275 load_result.incoming_messages.clear();
276 load_result.outgoing_messages.clear();
277 gcm_store->Load(base::Bind(
278 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
279 PumpLoop();
280
281 ASSERT_TRUE(load_result.incoming_messages.empty());
282 ASSERT_TRUE(load_result.outgoing_messages.empty());
283 }
284
285 TEST_F(GCMStoreImplTest, NextSerialNumber) {
286 const int64 kNextSerialNumber = 77LL;
287 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
288 GCMStore::LoadResult load_result;
289 gcm_store->Load(base::Bind(
290 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
291 PumpLoop();
292
293 gcm_store->SetNextSerialNumber(
294 kNextSerialNumber,
295 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
296 PumpLoop();
297
298 gcm_store = BuildGCMStore().Pass();
299 gcm_store->Load(base::Bind(
300 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
301 PumpLoop();
302
303 EXPECT_EQ(kNextSerialNumber, load_result.next_serial_number);
304 }
305
306 TEST_F(GCMStoreImplTest, UserSerialNumberMappings) {
307 scoped_ptr<GCMStore> gcm_store(BuildGCMStore());
308 GCMStore::LoadResult load_result;
309 gcm_store->Load(base::Bind(
310 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
311 PumpLoop();
312
313 std::string username1 = "username1";
314 int64 serial_number1 = 34LL;
315 gcm_store->AddUserSerialNumber(
316 username1,
317 serial_number1,
318 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
319
320 std::string username2 = "username2";
321 int64 serial_number2 = 56LL;
322 gcm_store->AddUserSerialNumber(
323 username2,
324 serial_number2,
325 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this)));
326 PumpLoop();
327
328 gcm_store = BuildGCMStore().Pass();
329 gcm_store->Load(base::Bind(
330 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result));
331 PumpLoop();
332
333 ASSERT_EQ(2u, load_result.user_serial_numbers.size());
334 ASSERT_NE(load_result.user_serial_numbers.end(),
335 load_result.user_serial_numbers.find(username1));
336 EXPECT_EQ(serial_number1, load_result.user_serial_numbers[username1]);
337 ASSERT_NE(load_result.user_serial_numbers.end(),
338 load_result.user_serial_numbers.find(username2));
339 EXPECT_EQ(serial_number2, load_result.user_serial_numbers[username2]);
340 }
341
342 } // namespace
343
344 } // 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