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

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

Issue 135303002: Adding a user list (to be consumed by GCM Client Implementation) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated the code with CR feedback, applied more asynch model. 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
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/user_list.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/bind.h"
11 #include "base/callback_forward.h"
12 #include "base/files/file_path.h"
13 #include "base/files/scoped_temp_dir.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/message_loop/message_loop.h"
16 #include "base/run_loop.h"
17 #include "google_apis/gcm/engine/gcm_store_impl.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace gcm {
21
22 namespace {
23 const int64 kSerialNumberMissing = -1;
24 } // namespace
25
26 class UserListTest : public testing::Test {
27 public:
28 UserListTest();
29 virtual ~UserListTest();
30
31 static unsigned long GetListSize(const UserList* user_list);
Nicolas Zea 2014/01/14 23:56:42 why not just make this a standalone function in an
jianli 2014/01/15 01:07:09 nit: use size_t instead
fgorski 2014/01/15 01:29:21 Because the information is private, and UserListTe
fgorski 2014/01/15 01:29:21 Done.
32 void SetDelegateCallback(const std::string& username,
33 int64 user_serial_number);
34
35 scoped_ptr<UserList> BuildUserList();
36
37 void PumpLoop();
38
39 void UpdateCallback(bool success);
40
41 void Initialize(UserList* user_list, const GCMStore::LoadResult& result) {
Nicolas Zea 2014/01/14 23:56:42 nit: prefer being consistent about whether methods
fgorski 2014/01/15 01:29:21 Done.
42 ASSERT_TRUE(result.success);
43 user_list->Initialize(result.serial_number_mappings);
44 ResetLoop();
45 }
46
47 void ResetLoop() {
48 if (run_loop_ && run_loop_->running())
49 run_loop_->Quit();
50 }
51
52 protected:
53 int64 last_assigned_serial_number_;
54 std::string last_assigned_username_;
55 scoped_ptr<GCMStore> gcm_store_;
56
57 private:
58 base::ScopedTempDir temp_directory_;
59 base::MessageLoop message_loop_;
60 scoped_ptr<base::RunLoop> run_loop_;
61 };
62
63 class GCMClientDelegate : public GCMClient::Delegate {
Nicolas Zea 2014/01/14 23:56:42 move this into an anon namespace
fgorski 2014/01/15 01:29:21 Done.
64 public:
65 explicit GCMClientDelegate(const std::string& username);
66 virtual ~GCMClientDelegate();
67
68 const std::string& GetUsername() const { return username_; }
69
70 // Overrides of GCMClientDelegate:
71 virtual void OnCheckInFinished(const GCMClient::CheckinInfo& checkin_info,
72 GCMClient::Result result) OVERRIDE {}
73 virtual void OnRegisterFinished(const std::string& app_id,
74 const std::string& registration_id,
75 GCMClient::Result result) OVERRIDE {}
76 virtual void OnSendFinished(const std::string& app_id,
77 const std::string& message_id,
78 GCMClient::Result result) OVERRIDE {}
79 virtual void OnMessageReceived(const std::string& app_id,
80 const GCMClient::IncomingMessage& message)
81 OVERRIDE {}
82 virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE {}
83 virtual void OnMessageSendError(const std::string& app_id,
84 const std::string& message_id,
85 GCMClient::Result result) OVERRIDE {}
86 virtual GCMClient::CheckinInfo GetCheckinInfo() const OVERRIDE {
87 return checkin_info_;
jianli 2014/01/15 01:07:09 nit: no need to save a copy of CheckinInfo. Return
fgorski 2014/01/15 01:29:21 Done.
88 }
89 virtual void OnLoadingCompleted() OVERRIDE {}
90 virtual base::TaskRunner* GetFileTaskRunner() OVERRIDE { return NULL; }
91
92 private:
93 GCMClient::CheckinInfo checkin_info_;
94 std::string username_;
95 };
96
97 UserListTest::UserListTest()
98 : last_assigned_serial_number_(kSerialNumberMissing) {
99 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir());
Nicolas Zea 2014/01/14 23:56:42 move this into BuildUserList()? And change to ASSE
fgorski 2014/01/15 01:29:21 Done. Moved, but compilation complains about ASSER
100 }
101
102 UserListTest::~UserListTest() {}
103
104 // static
105 unsigned long UserListTest::GetListSize(const UserList* user_list) {
106 return user_list->delegates_.size();
107 }
108
109 void UserListTest::SetDelegateCallback(const std::string& username,
110 int64 user_serial_number) {
111 last_assigned_username_ = username;
112 last_assigned_serial_number_ = user_serial_number;
113 ResetLoop();
114 }
115
116 scoped_ptr<UserList> UserListTest::BuildUserList() {
117 gcm_store_.reset(new GCMStoreImpl(temp_directory_.path(),
118 message_loop_.message_loop_proxy()));
119 return scoped_ptr<UserList>(new UserList(gcm_store_.get()));
120 }
121
122 void UserListTest::PumpLoop() {
123 run_loop_.reset(new base::RunLoop);
124 run_loop_->Run();
125 }
126
127 void UserListTest::UpdateCallback(bool success) { ASSERT_TRUE(success); }
128
129 GCMClientDelegate::GCMClientDelegate(const std::string& username)
130 : username_(username) {}
131
132 GCMClientDelegate::~GCMClientDelegate() {}
133
134 TEST_F(UserListTest, SetDelegateAndCheckSerialNumberAssignment) {
135 scoped_ptr<UserList> user_list(BuildUserList());
136 gcm_store_->Load(base::Bind(
137 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
138 PumpLoop();
139
140 // First adding a delegate.
141 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
142 user_list->SetDelegate(
143 delegate->GetUsername(),
144 delegate.get(),
145 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
146 PumpLoop();
147
148 // Verify the record was created.
149 EXPECT_EQ(1u, GetListSize(user_list.get()));
150 EXPECT_EQ(delegate->GetUsername(), last_assigned_username_);
151
152 int64 read_serial_number;
153 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(),
154 &read_serial_number));
155 EXPECT_EQ(last_assigned_serial_number_, read_serial_number);
156 }
157
158 TEST_F(UserListTest, GetDelegate) {
159 scoped_ptr<UserList> user_list(BuildUserList());
160 gcm_store_->Load(base::Bind(
161 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
162 PumpLoop();
163
164 // Start by adding a delegate and a serial number.
165 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
166 user_list->SetDelegate(
167 delegate->GetUsername(),
168 delegate.get(),
169 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
170 PumpLoop();
171
172 EXPECT_EQ(delegate.get(),
173 user_list->GetDelegateBySerialNumber(last_assigned_serial_number_));
174 EXPECT_EQ(delegate.get(),
175 user_list->GetDelegateByUsername(last_assigned_username_));
176 }
177
178 TEST_F(UserListTest, GetSerialNumberForUsername) {
179 scoped_ptr<UserList> user_list(BuildUserList());
180 gcm_store_->Load(base::Bind(
181 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
182 PumpLoop();
183
184 // Start by adding a delegate and a serial number.
185 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
186 user_list->SetDelegate(
187 delegate->GetUsername(),
188 delegate.get(),
189 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
190 PumpLoop();
191
192 int64 read_serial_number;
193 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(),
194 &read_serial_number));
195 EXPECT_EQ(last_assigned_serial_number_, read_serial_number);
196 }
197
198 TEST_F(UserListTest, LoadUserEntrySetDelegate) {
199 scoped_ptr<UserList> user_list(BuildUserList());
200 gcm_store_->Load(base::Bind(
201 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
202 PumpLoop();
203
204 // Start by adding a delegate and a serial number.
205 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
206 user_list->SetDelegate(
207 delegate->GetUsername(),
208 delegate.get(),
209 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
210 PumpLoop();
211
212 // Reload the GCM User List.
213 user_list = BuildUserList().Pass();
214 gcm_store_->Load(base::Bind(
215 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
216 PumpLoop();
217
218 // Verify a single record was loaded, with matching username, but no delegate.
219 EXPECT_EQ(1u, GetListSize(user_list.get()));
220 int64 read_serial_number;
221 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(),
222 &read_serial_number));
223 EXPECT_EQ(last_assigned_serial_number_, read_serial_number);
224 EXPECT_EQ(NULL, user_list->GetDelegateByUsername(delegate->GetUsername()));
225 EXPECT_EQ(NULL, user_list->GetDelegateBySerialNumber(read_serial_number));
226
227 // After loading is complete, Delegates will start adding itself looking for
228 // their serial numbers. Check that correct matches are found and new records
229 // not created.
230 user_list->SetDelegate(
231 delegate->GetUsername(),
232 delegate.get(),
233 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
234 PumpLoop();
235
236 EXPECT_EQ(1u, GetListSize(user_list.get()));
237 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(),
238 &read_serial_number));
239 EXPECT_EQ(last_assigned_serial_number_, read_serial_number);
240 EXPECT_EQ(delegate.get(),
241 user_list->GetDelegateByUsername(delegate->GetUsername()));
242 EXPECT_EQ(delegate.get(),
243 user_list->GetDelegateBySerialNumber(read_serial_number));
244 }
245
246 TEST_F(UserListTest, AddMultipleDelegates) {
247 scoped_ptr<UserList> user_list(BuildUserList());
248 gcm_store_->Load(base::Bind(
249 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
250 PumpLoop();
251
252 // Start by adding a delegate and a serial number.
253 scoped_ptr<GCMClientDelegate> delegate1(new GCMClientDelegate("test_user_1"));
254 user_list->SetDelegate(
255 delegate1->GetUsername(),
256 delegate1.get(),
257 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
258 PumpLoop();
259
260 int64 serial_number1 = last_assigned_serial_number_;
261
262 scoped_ptr<GCMClientDelegate> delegate2(new GCMClientDelegate("test_user_2"));
263 user_list->SetDelegate(
264 delegate2->GetUsername(),
265 delegate2.get(),
266 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
267 PumpLoop();
268
269 int64 serial_number2 = last_assigned_serial_number_;
270
271 // Ensuring that serial numbers are different.
272 EXPECT_EQ(2u, GetListSize(user_list.get()));
273
274 // Reading the user entries.
275 user_list = BuildUserList().Pass();
276 gcm_store_->Load(base::Bind(
277 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
278 PumpLoop();
279
280 // Serial numbers stay the same, but there are no delegates assigned.
281 EXPECT_EQ(2u, GetListSize(user_list.get()));
282 EXPECT_EQ(NULL, user_list->GetDelegateByUsername(delegate1->GetUsername()));
283 EXPECT_EQ(NULL, user_list->GetDelegateBySerialNumber(serial_number1));
284 EXPECT_EQ(NULL, user_list->GetDelegateByUsername(delegate2->GetUsername()));
285 EXPECT_EQ(NULL, user_list->GetDelegateBySerialNumber(serial_number2));
286
287 // Setting and checking a delegate on the second user.
288 user_list->SetDelegate(
289 delegate2->GetUsername(),
290 delegate2.get(),
291 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
292 PumpLoop();
293
294 // First user still does not have a delegate.
295 EXPECT_EQ(NULL, user_list->GetDelegateByUsername(delegate1->GetUsername()));
296 EXPECT_EQ(NULL, user_list->GetDelegateBySerialNumber(serial_number1));
297 // Second user has a delegate set.
298 EXPECT_EQ(delegate2.get(),
299 user_list->GetDelegateByUsername(delegate2->GetUsername()));
300 EXPECT_EQ(delegate2.get(),
301 user_list->GetDelegateBySerialNumber(serial_number2));
302 }
303
304 TEST_F(UserListTest, AddDelegateThenInitializeWithoutSerialNumber) {
305 scoped_ptr<UserList> user_list(BuildUserList());
306
307 // Add a delegate first.
308 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
309 user_list->SetDelegate(
310 delegate->GetUsername(),
311 delegate.get(),
312 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
313
314 EXPECT_EQ(kSerialNumberMissing, last_assigned_serial_number_);
315 EXPECT_EQ("", last_assigned_username_);
316
317 // Now run the initialization.
318 gcm_store_->Load(base::Bind(
319 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
320 // Need to pump twice, due to initialization triggering additional set of
321 // callbacks to be run.
322 PumpLoop();
323 PumpLoop();
324
325 int64 serial_number;
326 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(),
327 &serial_number));
328 EXPECT_EQ(serial_number, last_assigned_serial_number_);
329 EXPECT_EQ(delegate->GetUsername(), last_assigned_username_);
330 }
331
332 TEST_F(UserListTest, AddDelegateThenInitializeWithSerialNumber) {
333 scoped_ptr<UserList> user_list(BuildUserList());
334 gcm_store_->Load(base::Bind(
335 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
336 PumpLoop();
337
338 // First add a delegate to the list so that serial number is persisted.
339 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
340 user_list->SetDelegate(
341 delegate->GetUsername(),
342 delegate.get(),
343 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
344 PumpLoop();
345
346 last_assigned_serial_number_ = kSerialNumberMissing;
347 last_assigned_username_ = "";
348
349 // Resetting the user list to make sure it is not initialized.
350 user_list = BuildUserList().Pass();
351
352 // Add a delegate again, this time no callback is expected until the list is
353 // initialized.
354 user_list->SetDelegate(
355 delegate->GetUsername(),
356 delegate.get(),
357 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
358
359 // Now run the initialization.
360 gcm_store_->Load(base::Bind(
361 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
362 // Need to pump twice, due to initialization triggering additional set of
363 // callbacks to be run.
364 PumpLoop();
365 PumpLoop();
366
367 int64 serial_number;
368 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(),
369 &serial_number));
370 EXPECT_EQ(serial_number, last_assigned_serial_number_);
371 EXPECT_EQ(delegate->GetUsername(), last_assigned_username_);
372 }
373
374 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698