OLD | NEW |
(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 class UserListTest : public testing::Test { |
| 23 public: |
| 24 UserListTest(); |
| 25 virtual ~UserListTest(); |
| 26 |
| 27 static unsigned long GetListSize(const UserList* user_list); |
| 28 |
| 29 scoped_ptr<UserList> BuildUserList(); |
| 30 |
| 31 void PumpLoop(); |
| 32 |
| 33 void UpdateCallback(bool success); |
| 34 |
| 35 scoped_ptr<GCMStore> gcm_store_; |
| 36 base::ScopedTempDir temp_directory_; |
| 37 base::MessageLoop message_loop_; |
| 38 }; |
| 39 |
| 40 class GCMClientDelegate : public GCMClient::Delegate { |
| 41 public: |
| 42 explicit GCMClientDelegate(const std::string& username); |
| 43 virtual ~GCMClientDelegate(); |
| 44 |
| 45 const std::string& GetUsername() const { |
| 46 return username_; |
| 47 } |
| 48 |
| 49 // Overrides of GCMClientDelegate: |
| 50 virtual void OnCheckInFinished(const GCMClient::CheckinInfo& checkin_info, |
| 51 GCMClient::Result result) OVERRIDE {} |
| 52 virtual void OnRegisterFinished(const std::string& app_id, |
| 53 const std::string& registration_id, |
| 54 GCMClient::Result result) OVERRIDE {} |
| 55 virtual void OnSendFinished(const std::string& app_id, |
| 56 const std::string& message_id, |
| 57 GCMClient::Result result) OVERRIDE {} |
| 58 virtual void OnMessageReceived( |
| 59 const std::string& app_id, |
| 60 const GCMClient::IncomingMessage& message) OVERRIDE {} |
| 61 virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE {} |
| 62 virtual void OnMessageSendError(const std::string& app_id, |
| 63 const std::string& message_id, |
| 64 GCMClient::Result result) OVERRIDE {} |
| 65 virtual GCMClient::CheckinInfo GetCheckinInfo() const OVERRIDE { |
| 66 return checkin_info_; |
| 67 } |
| 68 virtual void OnLoadingCompleted() OVERRIDE {} |
| 69 virtual base::TaskRunner* GetFileTaskRunner() OVERRIDE { |
| 70 return NULL; |
| 71 } |
| 72 |
| 73 private: |
| 74 GCMClient::CheckinInfo checkin_info_; |
| 75 std::string username_; |
| 76 }; |
| 77 |
| 78 UserListTest::UserListTest() { |
| 79 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir()); |
| 80 } |
| 81 |
| 82 UserListTest::~UserListTest() { |
| 83 } |
| 84 |
| 85 //static |
| 86 unsigned long UserListTest::GetListSize(const UserList* user_list) { |
| 87 return user_list->delegates_.size(); |
| 88 } |
| 89 |
| 90 scoped_ptr<UserList> UserListTest::BuildUserList() { |
| 91 gcm_store_.reset(new GCMStoreImpl( |
| 92 temp_directory_.path(), |
| 93 message_loop_.message_loop_proxy())); |
| 94 return scoped_ptr<UserList>(new UserList(gcm_store_.get())); |
| 95 } |
| 96 |
| 97 void UserListTest::PumpLoop() { |
| 98 message_loop_.RunUntilIdle(); |
| 99 } |
| 100 |
| 101 void UserListTest::UpdateCallback(bool success) { |
| 102 ASSERT_TRUE(success); |
| 103 } |
| 104 |
| 105 GCMClientDelegate::GCMClientDelegate(const std::string& username) |
| 106 : username_(username) { |
| 107 } |
| 108 |
| 109 GCMClientDelegate::~GCMClientDelegate() { } |
| 110 |
| 111 TEST_F(UserListTest, AddDelegateAddSerialNumber) { |
| 112 scoped_ptr<UserList> user_list(BuildUserList()); |
| 113 gcm_store_->Load(base::Bind(&UserList::Initialize, |
| 114 base::Unretained(user_list.get()))); |
| 115 PumpLoop(); |
| 116 |
| 117 // First adding a delegate. |
| 118 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1")); |
| 119 user_list->AddDelegate(delegate->GetUsername(), delegate.get()); |
| 120 |
| 121 // Verify the record was created. |
| 122 EXPECT_EQ(1u, GetListSize(user_list.get())); |
| 123 int64 read_serial_number; |
| 124 EXPECT_FALSE(user_list->GetSerialNumberForUsername(delegate->GetUsername(), |
| 125 &read_serial_number)); |
| 126 EXPECT_EQ(delegate.get(), |
| 127 user_list->GetDelegateByUsername(delegate->GetUsername())); |
| 128 |
| 129 // Add then a serial number. |
| 130 int64 serial_number = user_list->GetNextSerialNumber(); |
| 131 user_list->AddSerialNumber(delegate->GetUsername(), |
| 132 serial_number, |
| 133 base::Bind(&UserListTest::UpdateCallback, |
| 134 base::Unretained(this))); |
| 135 PumpLoop(); |
| 136 |
| 137 // Ensuring that the record was updated in place. |
| 138 EXPECT_EQ(1u, GetListSize(user_list.get())); |
| 139 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(), |
| 140 &read_serial_number)); |
| 141 EXPECT_EQ(serial_number, read_serial_number); |
| 142 EXPECT_EQ(delegate.get(), |
| 143 user_list->GetDelegateByUsername(delegate->GetUsername())); |
| 144 EXPECT_EQ(delegate.get(), |
| 145 user_list->GetDelegateBySerialNumber(serial_number)); |
| 146 } |
| 147 |
| 148 TEST_F(UserListTest, LoadUserEntryAddDelegate) { |
| 149 scoped_ptr<UserList> user_list(BuildUserList()); |
| 150 gcm_store_->Load(base::Bind(&UserList::Initialize, |
| 151 base::Unretained(user_list.get()))); |
| 152 PumpLoop(); |
| 153 |
| 154 // Start by adding a delegate and a serial number. |
| 155 int64 serial_number = user_list->GetNextSerialNumber(); |
| 156 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1")); |
| 157 user_list->AddDelegate(delegate->GetUsername(), delegate.get()); |
| 158 user_list->AddSerialNumber(delegate->GetUsername(), |
| 159 serial_number, |
| 160 base::Bind(&UserListTest::UpdateCallback, |
| 161 base::Unretained(this))); |
| 162 PumpLoop(); |
| 163 |
| 164 // Reload the GCM User List. |
| 165 user_list = BuildUserList().Pass(); |
| 166 gcm_store_->Load(base::Bind(&UserList::Initialize, |
| 167 base::Unretained(user_list.get()))); |
| 168 PumpLoop(); |
| 169 |
| 170 // Verify a single record was loaded, with matching username, but no delegate. |
| 171 EXPECT_EQ(1u, GetListSize(user_list.get())); |
| 172 int64 read_serial_number; |
| 173 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(), |
| 174 &read_serial_number)); |
| 175 EXPECT_EQ(serial_number, read_serial_number); |
| 176 EXPECT_EQ(NULL, |
| 177 user_list->GetDelegateByUsername(delegate->GetUsername())); |
| 178 EXPECT_EQ(NULL, |
| 179 user_list->GetDelegateBySerialNumber(serial_number)); |
| 180 |
| 181 // After loading is complete, Delegates will start adding itself looking for |
| 182 // their serial numbers. Check that correct matches are found and new records |
| 183 // not created. |
| 184 user_list->AddDelegate(delegate->GetUsername(), delegate.get()); |
| 185 EXPECT_EQ(1u, GetListSize(user_list.get())); |
| 186 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(), |
| 187 &read_serial_number)); |
| 188 EXPECT_EQ(serial_number, read_serial_number); |
| 189 EXPECT_EQ(delegate.get(), |
| 190 user_list->GetDelegateByUsername(delegate->GetUsername())); |
| 191 EXPECT_EQ(delegate.get(), |
| 192 user_list->GetDelegateBySerialNumber(serial_number)); |
| 193 } |
| 194 |
| 195 TEST_F(UserListTest, GetDelegate) { |
| 196 scoped_ptr<UserList> user_list(BuildUserList()); |
| 197 gcm_store_->Load(base::Bind(&UserList::Initialize, |
| 198 base::Unretained(user_list.get()))); |
| 199 PumpLoop(); |
| 200 |
| 201 // Start by adding a delegate and a serial number. |
| 202 int64 serial_number = user_list->GetNextSerialNumber(); |
| 203 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1")); |
| 204 user_list->AddDelegate(delegate->GetUsername(), delegate.get()); |
| 205 user_list->AddSerialNumber(delegate->GetUsername(), |
| 206 serial_number, |
| 207 base::Bind(&UserListTest::UpdateCallback, |
| 208 base::Unretained(this))); |
| 209 PumpLoop(); |
| 210 |
| 211 EXPECT_EQ(delegate.get(), |
| 212 user_list->GetDelegateBySerialNumber(serial_number)); |
| 213 EXPECT_EQ(delegate.get(), |
| 214 user_list->GetDelegateByUsername(delegate->GetUsername())); |
| 215 } |
| 216 |
| 217 TEST_F(UserListTest, GetSerialNumberForUsername) { |
| 218 scoped_ptr<UserList> user_list(BuildUserList()); |
| 219 gcm_store_->Load(base::Bind(&UserList::Initialize, |
| 220 base::Unretained(user_list.get()))); |
| 221 PumpLoop(); |
| 222 |
| 223 // Start by adding a delegate and a serial number. |
| 224 int64 serial_number = user_list->GetNextSerialNumber(); |
| 225 scoped_ptr<GCMClientDelegate> delegate(new GCMClientDelegate("test_user_1")); |
| 226 user_list->AddDelegate(delegate->GetUsername(), delegate.get()); |
| 227 user_list->AddSerialNumber(delegate->GetUsername(), |
| 228 serial_number, |
| 229 base::Bind(&UserListTest::UpdateCallback, |
| 230 base::Unretained(this))); |
| 231 PumpLoop(); |
| 232 |
| 233 int64 read_serial_number; |
| 234 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate->GetUsername(), |
| 235 &read_serial_number)); |
| 236 EXPECT_EQ(serial_number, read_serial_number); |
| 237 } |
| 238 |
| 239 TEST_F(UserListTest, AddMultipleDelegates) { |
| 240 scoped_ptr<UserList> user_list(BuildUserList()); |
| 241 gcm_store_->Load(base::Bind(&UserList::Initialize, |
| 242 base::Unretained(user_list.get()))); |
| 243 PumpLoop(); |
| 244 |
| 245 // Start by adding a delegate and a serial number. |
| 246 scoped_ptr<GCMClientDelegate> delegate1(new GCMClientDelegate("test_user_1")); |
| 247 user_list->AddDelegate(delegate1->GetUsername(), delegate1.get()); |
| 248 int64 serial_number1 = user_list->GetNextSerialNumber(); |
| 249 user_list->AddSerialNumber(delegate1->GetUsername(), |
| 250 serial_number1, |
| 251 base::Bind(&UserListTest::UpdateCallback, |
| 252 base::Unretained(this))); |
| 253 scoped_ptr<GCMClientDelegate> delegate2(new GCMClientDelegate("test_user_2")); |
| 254 user_list->AddDelegate(delegate2->GetUsername(), delegate2.get()); |
| 255 int64 serial_number2 = user_list->GetNextSerialNumber(); |
| 256 user_list->AddSerialNumber(delegate2->GetUsername(), |
| 257 serial_number2, |
| 258 base::Bind(&UserListTest::UpdateCallback, |
| 259 base::Unretained(this))); |
| 260 PumpLoop(); |
| 261 |
| 262 // Ensuring that serial numbers are different. |
| 263 EXPECT_NE(serial_number1, serial_number2); |
| 264 |
| 265 // Verifying that each entry has it's own serial numbers and delegates. |
| 266 EXPECT_EQ(2u, GetListSize(user_list.get())); |
| 267 EXPECT_EQ(delegate1.get(), |
| 268 user_list->GetDelegateByUsername(delegate1->GetUsername())); |
| 269 EXPECT_EQ(delegate1.get(), |
| 270 user_list->GetDelegateBySerialNumber(serial_number1)); |
| 271 int64 read_serial_number; |
| 272 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate1->GetUsername(), |
| 273 &read_serial_number)); |
| 274 EXPECT_EQ(serial_number1, read_serial_number); |
| 275 EXPECT_EQ(delegate2.get(), |
| 276 user_list->GetDelegateByUsername(delegate2->GetUsername())); |
| 277 EXPECT_EQ(delegate2.get(), |
| 278 user_list->GetDelegateBySerialNumber(serial_number2)); |
| 279 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate2->GetUsername(), |
| 280 &read_serial_number)); |
| 281 EXPECT_EQ(serial_number2, read_serial_number); |
| 282 |
| 283 // Reading the user entries. |
| 284 user_list = BuildUserList().Pass(); |
| 285 gcm_store_->Load(base::Bind(&UserList::Initialize, |
| 286 base::Unretained(user_list.get()))); |
| 287 PumpLoop(); |
| 288 |
| 289 // Serial numbers stay the same, but there are no delegates assigned. |
| 290 EXPECT_EQ(2u, GetListSize(user_list.get())); |
| 291 EXPECT_EQ(NULL, |
| 292 user_list->GetDelegateByUsername(delegate1->GetUsername())); |
| 293 EXPECT_EQ(NULL, |
| 294 user_list->GetDelegateBySerialNumber(serial_number1)); |
| 295 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate1->GetUsername(), |
| 296 &read_serial_number)); |
| 297 EXPECT_EQ(serial_number1, read_serial_number); |
| 298 EXPECT_EQ(NULL, |
| 299 user_list->GetDelegateByUsername(delegate2->GetUsername())); |
| 300 EXPECT_EQ(NULL, |
| 301 user_list->GetDelegateBySerialNumber(serial_number2)); |
| 302 EXPECT_TRUE(user_list->GetSerialNumberForUsername(delegate2->GetUsername(), |
| 303 &read_serial_number)); |
| 304 EXPECT_EQ(serial_number2, read_serial_number); |
| 305 |
| 306 // Setting and checking a delegate on the second user. |
| 307 user_list->AddDelegate(delegate2->GetUsername(), delegate2.get()); |
| 308 EXPECT_EQ(delegate2.get(), |
| 309 user_list->GetDelegateByUsername(delegate2->GetUsername())); |
| 310 EXPECT_EQ(delegate2.get(), |
| 311 user_list->GetDelegateBySerialNumber(serial_number2)); |
| 312 // First user still does not have a delegate. |
| 313 EXPECT_EQ(NULL, |
| 314 user_list->GetDelegateByUsername(delegate1->GetUsername())); |
| 315 EXPECT_EQ(NULL, |
| 316 user_list->GetDelegateBySerialNumber(serial_number1)); |
| 317 } |
| 318 |
| 319 } // namespace gcm |
OLD | NEW |