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

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

Powered by Google App Engine
This is Rietveld 408576698