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

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: Addressing reminder of the CR feedback 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
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 static size_t GetListSize(const UserList* user_list);
65 void SetDelegateCallback(const std::string& username,
66 int64 user_serial_number);
67
68 scoped_ptr<UserList> BuildUserList();
69
70 void PumpLoop();
71
72 void UpdateCallback(bool success);
73
74 void Initialize(UserList* user_list, const GCMStore::LoadResult& result);
75
76 void ResetLoop();
77
78 protected:
79 int64 last_assigned_serial_number_;
80 std::string last_assigned_username_;
81 scoped_ptr<GCMStore> gcm_store_;
82
83 private:
84 base::ScopedTempDir temp_directory_;
85 base::MessageLoop message_loop_;
86 scoped_ptr<base::RunLoop> run_loop_;
87 };
88
89 UserListTest::UserListTest()
90 : last_assigned_serial_number_(gcm::kInvalidSerialNumber) {}
91
92 UserListTest::~UserListTest() {}
93
94 // static
95 unsigned long UserListTest::GetListSize(const UserList* user_list) {
96 return user_list->delegates_.size();
97 }
98
99 void UserListTest::SetDelegateCallback(const std::string& username,
100 int64 user_serial_number) {
101 last_assigned_username_ = username;
102 last_assigned_serial_number_ = user_serial_number;
103 ResetLoop();
104 }
105
106 scoped_ptr<UserList> UserListTest::BuildUserList() {
107 if (!temp_directory_.IsValid())
108 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir());
jianli 2014/01/15 22:43:37 Would this be better to moved to SetUp such that w
fgorski 2014/01/15 23:22:50 Done. That was happening in my earlier patch. I mo
109 gcm_store_.reset(new GCMStoreImpl(temp_directory_.path(),
110 message_loop_.message_loop_proxy()));
111 return scoped_ptr<UserList>(new UserList(gcm_store_.get()));
112 }
113
114 void UserListTest::Initialize(UserList* user_list,
115 const GCMStore::LoadResult& result) {
116 ASSERT_TRUE(result.success);
117 user_list->Initialize(result.serial_number_mappings);
118 ResetLoop();
119 }
120
121 void UserListTest::ResetLoop() {
122 if (run_loop_ && run_loop_->running())
123 run_loop_->Quit();
124 }
125
126 void UserListTest::PumpLoop() {
127 run_loop_.reset(new base::RunLoop);
128 run_loop_->Run();
129 }
130
131 void UserListTest::UpdateCallback(bool success) { ASSERT_TRUE(success); }
132
133 GCMClientDelegate::GCMClientDelegate(const std::string& username)
134 : username_(username) {}
135
136 GCMClientDelegate::~GCMClientDelegate() {}
137
138 TEST_F(UserListTest, SetDelegateAndCheckSerialNumberAssignment) {
139 scoped_ptr<UserList> user_list(BuildUserList());
140 gcm_store_->Load(base::Bind(
141 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
142 PumpLoop();
143
144 // First adding a delegate.
145 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
146 user_list->SetDelegate(
147 delegate->GetUsername(),
148 delegate.get(),
149 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
150 PumpLoop();
151
152 // Verify the record was created.
153 EXPECT_EQ(1u, GetListSize(user_list.get()));
154 // Verify username and serial number were assigned.
155 EXPECT_EQ(delegate->GetUsername(), last_assigned_username_);
156 EXPECT_NE(gcm::kInvalidSerialNumber, last_assigned_serial_number_);
157 // Check that a serial number was assigned to delegate.
158 int64 serial_number =
jianli 2014/01/15 22:43:37 nit: embed this inline
fgorski 2014/01/15 23:22:50 won't fit. I tried.
159 user_list->GetSerialNumberForUsername(delegate->GetUsername());
160 EXPECT_EQ(last_assigned_serial_number_, serial_number);
161 }
162
163 TEST_F(UserListTest, GetDelegate) {
164 scoped_ptr<UserList> user_list(BuildUserList());
165 gcm_store_->Load(base::Bind(
166 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
167 PumpLoop();
168
169 // Start by adding a delegate and a serial number.
170 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
171 user_list->SetDelegate(
172 delegate->GetUsername(),
173 delegate.get(),
174 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
175 PumpLoop();
176
177 EXPECT_EQ(delegate.get(),
178 user_list->GetDelegateBySerialNumber(last_assigned_serial_number_));
179 EXPECT_EQ(delegate.get(),
180 user_list->GetDelegateByUsername(last_assigned_username_));
181 }
182
183 TEST_F(UserListTest, LoadUserEntrySetDelegate) {
184 scoped_ptr<UserList> user_list(BuildUserList());
185 gcm_store_->Load(base::Bind(
186 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
187 PumpLoop();
188
189 // Start by adding a delegate and a serial number.
190 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
191 user_list->SetDelegate(
192 delegate->GetUsername(),
193 delegate.get(),
194 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
195 PumpLoop();
196
197 // Reload the GCM User List.
198 user_list = BuildUserList().Pass();
199 gcm_store_->Load(base::Bind(
200 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
201 PumpLoop();
202
203 // Verify a single record was loaded, with matching username, but no delegate.
204 EXPECT_EQ(1u, GetListSize(user_list.get()));
205 int64 serial_number =
206 user_list->GetSerialNumberForUsername(delegate->GetUsername());
207 EXPECT_EQ(last_assigned_serial_number_, serial_number);
208 EXPECT_EQ(NULL, user_list->GetDelegateByUsername(delegate->GetUsername()));
209 EXPECT_EQ(NULL, user_list->GetDelegateBySerialNumber(serial_number));
210
211 // After loading is complete, Delegates will start adding itself looking for
212 // their serial numbers. Check that correct matches are found and new records
213 // not created.
214 user_list->SetDelegate(
215 delegate->GetUsername(),
216 delegate.get(),
217 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
218 PumpLoop();
219
220 EXPECT_EQ(1u, GetListSize(user_list.get()));
221 serial_number =
222 user_list->GetSerialNumberForUsername(delegate->GetUsername());
223 EXPECT_EQ(last_assigned_serial_number_, serial_number);
224 EXPECT_EQ(delegate.get(),
225 user_list->GetDelegateByUsername(delegate->GetUsername()));
226 EXPECT_EQ(delegate.get(),
227 user_list->GetDelegateBySerialNumber(serial_number));
228 }
229
230 TEST_F(UserListTest, AddMultipleDelegates) {
231 scoped_ptr<UserList> user_list(BuildUserList());
232 gcm_store_->Load(base::Bind(
233 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
234 PumpLoop();
235
236 // Start by adding a delegate and a serial number.
237 scoped_ptr<GCMClientDelegate> delegate1(new GCMClientDelegate("test_user_1"));
238 user_list->SetDelegate(
239 delegate1->GetUsername(),
240 delegate1.get(),
241 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
242 PumpLoop();
243
244 int64 serial_number1 = last_assigned_serial_number_;
245
246 scoped_ptr<GCMClientDelegate> delegate2(new GCMClientDelegate("test_user_2"));
247 user_list->SetDelegate(
248 delegate2->GetUsername(),
249 delegate2.get(),
250 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
251 PumpLoop();
252
253 int64 serial_number2 = last_assigned_serial_number_;
254
255 // Ensuring that serial numbers are different.
256 EXPECT_EQ(2u, GetListSize(user_list.get()));
257
258 // Reading the user entries.
259 user_list = BuildUserList().Pass();
260 gcm_store_->Load(base::Bind(
261 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
262 PumpLoop();
263
264 // Serial numbers stay the same, but there are no delegates assigned.
265 EXPECT_EQ(2u, GetListSize(user_list.get()));
266 EXPECT_EQ(NULL, user_list->GetDelegateByUsername(delegate1->GetUsername()));
267 EXPECT_EQ(NULL, user_list->GetDelegateBySerialNumber(serial_number1));
268 EXPECT_EQ(NULL, user_list->GetDelegateByUsername(delegate2->GetUsername()));
269 EXPECT_EQ(NULL, user_list->GetDelegateBySerialNumber(serial_number2));
270
271 // Setting and checking a delegate on the second user.
272 user_list->SetDelegate(
273 delegate2->GetUsername(),
274 delegate2.get(),
275 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
276 PumpLoop();
277
278 // First user still does not have a delegate.
279 EXPECT_EQ(NULL, user_list->GetDelegateByUsername(delegate1->GetUsername()));
280 EXPECT_EQ(NULL, user_list->GetDelegateBySerialNumber(serial_number1));
281 // Second user has a delegate set.
282 EXPECT_EQ(delegate2.get(),
283 user_list->GetDelegateByUsername(delegate2->GetUsername()));
284 EXPECT_EQ(delegate2.get(),
285 user_list->GetDelegateBySerialNumber(serial_number2));
286 }
287
288 TEST_F(UserListTest, AddDelegateThenInitializeWithoutSerialNumber) {
289 scoped_ptr<UserList> user_list(BuildUserList());
290
291 // Add a delegate first.
292 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
293 user_list->SetDelegate(
294 delegate->GetUsername(),
295 delegate.get(),
296 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
297
298 EXPECT_EQ(gcm::kInvalidSerialNumber, last_assigned_serial_number_);
299 EXPECT_EQ("", last_assigned_username_);
300
301 // Now run the initialization.
302 gcm_store_->Load(base::Bind(
303 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
304 // Need to pump twice, due to initialization triggering additional set of
305 // callbacks to be run.
306 PumpLoop();
307 PumpLoop();
308
309 int64 serial_number =
jianli 2014/01/15 22:43:37 ditto
fgorski 2014/01/15 23:22:50 ditto :)
310 user_list->GetSerialNumberForUsername(delegate->GetUsername());
311 EXPECT_EQ(last_assigned_serial_number_, serial_number);
312 EXPECT_EQ(delegate->GetUsername(), last_assigned_username_);
313 }
314
315 TEST_F(UserListTest, AddDelegateThenInitializeWithSerialNumber) {
316 scoped_ptr<UserList> user_list(BuildUserList());
317 gcm_store_->Load(base::Bind(
318 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
319 PumpLoop();
320
321 // First add a delegate to the list so that serial number is persisted.
322 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1"));
323 user_list->SetDelegate(
324 delegate->GetUsername(),
325 delegate.get(),
326 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
327 PumpLoop();
328
329 last_assigned_serial_number_ = gcm::kInvalidSerialNumber;
330 last_assigned_username_ = "";
331
332 // Resetting the user list to make sure it is not initialized.
333 user_list = BuildUserList().Pass();
334
335 // Add a delegate again, this time no callback is expected until the list is
336 // initialized.
337 user_list->SetDelegate(
338 delegate->GetUsername(),
339 delegate.get(),
340 base::Bind(&UserListTest::SetDelegateCallback, base::Unretained(this)));
341
342 // Now run the initialization.
343 gcm_store_->Load(base::Bind(
344 &UserListTest::Initialize, base::Unretained(this), user_list.get()));
345 // Need to pump twice, due to initialization triggering additional set of
346 // callbacks to be run.
347 PumpLoop();
348 PumpLoop();
349
350 int64 serial_number =
jianli 2014/01/15 22:43:37 ditto
fgorski 2014/01/15 23:22:50 ditto.
351 user_list->GetSerialNumberForUsername(delegate->GetUsername());
352 EXPECT_EQ(last_assigned_serial_number_, serial_number);
353 EXPECT_EQ(delegate->GetUsername(), last_assigned_username_);
354 }
355
356 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698