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

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

Issue 56353002: [GCM] Add RMQ storage and MCS message passing support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Self review Created 7 years, 1 month 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
OLDNEW
(Empty)
1 // Copyright (c) 2013 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/rmq_store.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 "google_apis/gcm/base/mcs_message.h"
18 #include "google_apis/gcm/base/mcs_util.h"
19 #include "google_apis/gcm/protocol/mcs.pb.h"
20 #include "testing/gtest/include/gtest/gtest.h"
21
22 namespace gcm {
23
24 namespace {
25
26 // Number of persistent ids to use in tests.
27 const int kNumPersistentIds = 10;
28
29 const uint64 kDeviceId = 22;
30 const uint64 kDeviceToken = 55;
31
32 class RMQStoreTest : public testing::Test {
33 public:
34 RMQStoreTest();
35 virtual ~RMQStoreTest();
36
37 scoped_ptr<RMQStore> BuildRMQStore();
38
39 std::string GetNextPersistentId();
40
41 void PumpLoop();
42
43 void LoadCallback(RMQStore::LoadResult* result_dst,
44 const RMQStore::LoadResult& result);
45 void UpdateCallback(bool success);
46
47 private:
48 base::MessageLoop message_loop_;
49 base::ScopedTempDir temp_directory_;
50 scoped_ptr<base::RunLoop> run_loop_;
51 };
52
53 RMQStoreTest::RMQStoreTest() {
54 ASSERT_TRUE(temp_directory_.CreateUniqueTempDir());
55 run_loop_.reset(new base::RunLoop());
56 }
57
58 RMQStoreTest::~RMQStoreTest() {
59 }
60
61 scoped_ptr<RMQStore> RMQStoreTest::BuildRMQStore() {
62 return scoped_ptr<RMQStore>(new RMQStore(temp_directory_.path(),
63 message_loop_.message_loop_proxy()));
64 }
65
66 std::string RMQStoreTest::GetNextPersistentId() {
67 return base::Uint64ToString(base::Time::Now().ToInternalValue());
68 }
69
70 void RMQStoreTest::PumpLoop() {
71 message_loop_.RunUntilIdle();
72 }
73
74 void RMQStoreTest::LoadCallback(RMQStore::LoadResult* result_dst,
75 const RMQStore::LoadResult& result) {
76 ASSERT_TRUE(result.success);
77 *result_dst = result;
78 run_loop_->Quit();
79 run_loop_.reset(new base::RunLoop());
80 }
81
82 void RMQStoreTest::UpdateCallback(bool success) {
83 ASSERT_TRUE(success);
84 }
85
86 // Verify creating a new database and loading it.
87 TEST_F(RMQStoreTest, LoadNew) {
88 scoped_ptr<RMQStore> rmq_store(BuildRMQStore());
89 RMQStore::LoadResult load_result;
90 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
91 base::Unretained(this),
92 &load_result));
93 PumpLoop();
94
95 ASSERT_EQ(0U, load_result.device_android_id);
96 ASSERT_EQ(0U, load_result.device_security_token);
97 ASSERT_TRUE(load_result.incoming_messages.empty());
98 ASSERT_TRUE(load_result.outgoing_messages.empty());
99 }
100
101 TEST_F(RMQStoreTest, DeviceCredentials) {
102 scoped_ptr<RMQStore> rmq_store(BuildRMQStore());
103 RMQStore::LoadResult load_result;
104 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
105 base::Unretained(this),
106 &load_result));
107 PumpLoop();
108
109 rmq_store->SetDeviceCredentials(kDeviceId,
110 kDeviceToken,
111 base::Bind(&RMQStoreTest::UpdateCallback,
112 base::Unretained(this)));
113 PumpLoop();
114
115 rmq_store = BuildRMQStore().Pass();
116 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
117 base::Unretained(this),
118 &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(RMQStoreTest, IncomingMessages) {
128 scoped_ptr<RMQStore> rmq_store(BuildRMQStore());
129 RMQStore::LoadResult load_result;
130 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
131 base::Unretained(this),
132 &load_result));
133 PumpLoop();
134
135 std::vector<std::string> persistent_ids;
136 for (int i = 0; i < kNumPersistentIds; ++i) {
137 persistent_ids.push_back(GetNextPersistentId());
138 rmq_store->AddIncomingMessage(persistent_ids.back(),
139 base::Bind(&RMQStoreTest::UpdateCallback,
140 base::Unretained(this)));
141 PumpLoop();
142 }
143
144 rmq_store = BuildRMQStore().Pass();
145 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
146 base::Unretained(this),
147 &load_result));
148 PumpLoop();
149
150 ASSERT_EQ(persistent_ids, load_result.incoming_messages);
151 ASSERT_TRUE(load_result.outgoing_messages.empty());
152
153 rmq_store->RemoveIncomingMessages(persistent_ids,
154 base::Bind(&RMQStoreTest::UpdateCallback,
155 base::Unretained(this)));
156 PumpLoop();
157
158 rmq_store = BuildRMQStore().Pass();
159 load_result.incoming_messages.clear();
160 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
161 base::Unretained(this),
162 &load_result));
163 PumpLoop();
164
165 ASSERT_TRUE(load_result.incoming_messages.empty());
166 ASSERT_TRUE(load_result.outgoing_messages.empty());
167 }
168
169 // Verify saving some outgoing messages, reopening the directory, and then
170 // removing those outgoing messages.
171 TEST_F(RMQStoreTest, OutgoingMessages) {
172 scoped_ptr<RMQStore> rmq_store(BuildRMQStore());
173 RMQStore::LoadResult load_result;
174 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
175 base::Unretained(this),
176 &load_result));
177 PumpLoop();
178
179 std::vector<std::string> persistent_ids;
180 const int kNumPersistentIds = 10;
181 for (int i = 0; i < kNumPersistentIds; ++i) {
182 persistent_ids.push_back(GetNextPersistentId());
183 mcs_proto::DataMessageStanza message;
184 message.set_from(persistent_ids.back());
185 message.set_category(persistent_ids.back());
186 rmq_store->AddOutgoingMessage(persistent_ids.back(),
187 MCSMessage(message),
188 base::Bind(&RMQStoreTest::UpdateCallback,
189 base::Unretained(this)));
190 PumpLoop();
191 }
192
193 rmq_store = BuildRMQStore().Pass();
194 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
195 base::Unretained(this),
196 &load_result));
197 PumpLoop();
198
199 ASSERT_TRUE(load_result.incoming_messages.empty());
200 ASSERT_EQ(load_result.outgoing_messages.size(), persistent_ids.size());
201 for (int i =0 ; i < kNumPersistentIds; ++i) {
202 std::string id = persistent_ids[i];
203 ASSERT_TRUE(load_result.outgoing_messages[id]);
204 const mcs_proto::DataMessageStanza* message =
205 reinterpret_cast<mcs_proto::DataMessageStanza *>(
206 load_result.outgoing_messages[id]);
207 ASSERT_EQ(message->from(), id);
208 ASSERT_EQ(message->category(), id);
209 }
210
211 rmq_store->RemoveOutgoingMessages(persistent_ids,
212 base::Bind(&RMQStoreTest::UpdateCallback,
213 base::Unretained(this)));
214 PumpLoop();
215
216 rmq_store = BuildRMQStore().Pass();
217 load_result.outgoing_messages.clear();
218 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
219 base::Unretained(this),
220 &load_result));
221 PumpLoop();
222
223 ASSERT_TRUE(load_result.incoming_messages.empty());
224 ASSERT_TRUE(load_result.outgoing_messages.empty());
225 }
226
227 // Verify incoming and outgoing messages don't conflict.
228 TEST_F(RMQStoreTest, IncomingAndOutgoingMessages) {
229 scoped_ptr<RMQStore> rmq_store(BuildRMQStore());
230 RMQStore::LoadResult load_result;
231 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
232 base::Unretained(this),
233 &load_result));
234 PumpLoop();
235
236 std::vector<std::string> persistent_ids;
237 const int kNumPersistentIds = 10;
238 for (int i = 0; i < kNumPersistentIds; ++i) {
239 persistent_ids.push_back(GetNextPersistentId());
240 rmq_store->AddIncomingMessage(persistent_ids.back(),
241 base::Bind(&RMQStoreTest::UpdateCallback,
242 base::Unretained(this)));
243 PumpLoop();
244
245 mcs_proto::DataMessageStanza message;
246 message.set_from(persistent_ids.back());
247 message.set_category(persistent_ids.back());
248 rmq_store->AddOutgoingMessage(persistent_ids.back(),
249 MCSMessage(message),
250 base::Bind(&RMQStoreTest::UpdateCallback,
251 base::Unretained(this)));
252 PumpLoop();
253 }
254
255
256 rmq_store = BuildRMQStore().Pass();
257 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
258 base::Unretained(this),
259 &load_result));
260 PumpLoop();
261
262 ASSERT_EQ(persistent_ids, load_result.incoming_messages);
263 ASSERT_EQ(load_result.outgoing_messages.size(), persistent_ids.size());
264 for (int i =0 ; i < kNumPersistentIds; ++i) {
265 std::string id = persistent_ids[i];
266 ASSERT_TRUE(load_result.outgoing_messages[id]);
267 const mcs_proto::DataMessageStanza* message =
268 reinterpret_cast<mcs_proto::DataMessageStanza *>(
269 load_result.outgoing_messages[id]);
270 ASSERT_EQ(message->from(), id);
271 ASSERT_EQ(message->category(), id);
272 }
273
274 rmq_store->RemoveIncomingMessages(persistent_ids,
275 base::Bind(&RMQStoreTest::UpdateCallback,
276 base::Unretained(this)));
277 PumpLoop();
278 rmq_store->RemoveOutgoingMessages(persistent_ids,
279 base::Bind(&RMQStoreTest::UpdateCallback,
280 base::Unretained(this)));
281 PumpLoop();
282
283 rmq_store = BuildRMQStore().Pass();
284 load_result.incoming_messages.clear();
285 load_result.outgoing_messages.clear();
286 rmq_store->Load(base::Bind(&RMQStoreTest::LoadCallback,
287 base::Unretained(this),
288 &load_result));
289 PumpLoop();
290
291 ASSERT_TRUE(load_result.incoming_messages.empty());
292 ASSERT_TRUE(load_result.outgoing_messages.empty());
293 }
294
295 } // namespace
296
297 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698