| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "google_apis/gcm/engine/gcm_store_impl.h" | 5 #include "google_apis/gcm/engine/gcm_store_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 | 40 |
| 41 const uint64 kDeviceId = 22; | 41 const uint64 kDeviceId = 22; |
| 42 const uint64 kDeviceToken = 55; | 42 const uint64 kDeviceToken = 55; |
| 43 | 43 |
| 44 class GCMStoreImplTest : public testing::Test { | 44 class GCMStoreImplTest : public testing::Test { |
| 45 public: | 45 public: |
| 46 GCMStoreImplTest(); | 46 GCMStoreImplTest(); |
| 47 ~GCMStoreImplTest() override; | 47 ~GCMStoreImplTest() override; |
| 48 | 48 |
| 49 scoped_ptr<GCMStoreImpl> BuildGCMStore(); | 49 scoped_ptr<GCMStoreImpl> BuildGCMStore(); |
| 50 void LoadGCMStore( |
| 51 GCMStoreImpl* gcm_store, scoped_ptr<GCMStore::LoadResult>* result_dst); |
| 50 | 52 |
| 51 std::string GetNextPersistentId(); | 53 std::string GetNextPersistentId(); |
| 52 | 54 |
| 53 void PumpLoop(); | 55 void PumpLoop(); |
| 54 | 56 |
| 55 void LoadCallback(scoped_ptr<GCMStore::LoadResult>* result_dst, | 57 void LoadCallback(scoped_ptr<GCMStore::LoadResult>* result_dst, |
| 56 scoped_ptr<GCMStore::LoadResult> result); | 58 scoped_ptr<GCMStore::LoadResult> result); |
| 59 void LoadWithoutCheckCallback(scoped_ptr<GCMStore::LoadResult>* result_dst, |
| 60 scoped_ptr<GCMStore::LoadResult> result); |
| 57 void UpdateCallback(bool success); | 61 void UpdateCallback(bool success); |
| 58 | 62 |
| 59 protected: | 63 protected: |
| 60 base::MessageLoop message_loop_; | 64 base::MessageLoop message_loop_; |
| 61 base::ScopedTempDir temp_directory_; | 65 base::ScopedTempDir temp_directory_; |
| 62 bool expected_success_; | 66 bool expected_success_; |
| 63 uint64 next_persistent_id_; | 67 uint64 next_persistent_id_; |
| 64 scoped_ptr<base::RunLoop> run_loop_; | 68 scoped_ptr<base::RunLoop> run_loop_; |
| 65 }; | 69 }; |
| 66 | 70 |
| 67 GCMStoreImplTest::GCMStoreImplTest() | 71 GCMStoreImplTest::GCMStoreImplTest() |
| 68 : expected_success_(true), | 72 : expected_success_(true), |
| 69 next_persistent_id_(base::Time::Now().ToInternalValue()) { | 73 next_persistent_id_(base::Time::Now().ToInternalValue()) { |
| 70 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir()); | 74 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir()); |
| 71 run_loop_.reset(new base::RunLoop()); | 75 run_loop_.reset(new base::RunLoop()); |
| 72 } | 76 } |
| 73 | 77 |
| 74 GCMStoreImplTest::~GCMStoreImplTest() {} | 78 GCMStoreImplTest::~GCMStoreImplTest() {} |
| 75 | 79 |
| 76 scoped_ptr<GCMStoreImpl> GCMStoreImplTest::BuildGCMStore() { | 80 scoped_ptr<GCMStoreImpl> GCMStoreImplTest::BuildGCMStore() { |
| 77 return scoped_ptr<GCMStoreImpl>(new GCMStoreImpl( | 81 return scoped_ptr<GCMStoreImpl>(new GCMStoreImpl( |
| 78 temp_directory_.path(), | 82 // Pass an non-existent directory as store path to match the exact |
| 83 // behavior in the production code. Currently GCMStoreImpl checks if |
| 84 // the directory exist or not to determine the store existence. |
| 85 temp_directory_.path().Append(FILE_PATH_LITERAL("GCM Store")), |
| 79 message_loop_.message_loop_proxy(), | 86 message_loop_.message_loop_proxy(), |
| 80 make_scoped_ptr<Encryptor>(new FakeEncryptor))); | 87 make_scoped_ptr<Encryptor>(new FakeEncryptor))); |
| 81 } | 88 } |
| 82 | 89 |
| 90 void GCMStoreImplTest::LoadGCMStore( |
| 91 GCMStoreImpl* gcm_store, scoped_ptr<GCMStore::LoadResult>* result_dst) { |
| 92 gcm_store->Load( |
| 93 GCMStore::CREATE_NEW_STORE_IF_NOT_EXISTS, |
| 94 base::Bind(&GCMStoreImplTest::LoadCallback, |
| 95 base::Unretained(this), |
| 96 result_dst)); |
| 97 PumpLoop(); |
| 98 } |
| 99 |
| 83 std::string GCMStoreImplTest::GetNextPersistentId() { | 100 std::string GCMStoreImplTest::GetNextPersistentId() { |
| 84 return base::Uint64ToString(next_persistent_id_++); | 101 return base::Uint64ToString(next_persistent_id_++); |
| 85 } | 102 } |
| 86 | 103 |
| 87 void GCMStoreImplTest::PumpLoop() { message_loop_.RunUntilIdle(); } | 104 void GCMStoreImplTest::PumpLoop() { message_loop_.RunUntilIdle(); } |
| 88 | 105 |
| 89 void GCMStoreImplTest::LoadCallback( | 106 void GCMStoreImplTest::LoadCallback( |
| 90 scoped_ptr<GCMStore::LoadResult>* result_dst, | 107 scoped_ptr<GCMStore::LoadResult>* result_dst, |
| 91 scoped_ptr<GCMStore::LoadResult> result) { | 108 scoped_ptr<GCMStore::LoadResult> result) { |
| 92 ASSERT_TRUE(result->success); | 109 ASSERT_TRUE(result->success); |
| 110 LoadWithoutCheckCallback(result_dst, result.Pass()); |
| 111 } |
| 112 |
| 113 void GCMStoreImplTest::LoadWithoutCheckCallback( |
| 114 scoped_ptr<GCMStore::LoadResult>* result_dst, |
| 115 scoped_ptr<GCMStore::LoadResult> result) { |
| 93 *result_dst = result.Pass(); | 116 *result_dst = result.Pass(); |
| 94 run_loop_->Quit(); | 117 run_loop_->Quit(); |
| 95 run_loop_.reset(new base::RunLoop()); | 118 run_loop_.reset(new base::RunLoop()); |
| 96 } | 119 } |
| 97 | 120 |
| 98 void GCMStoreImplTest::UpdateCallback(bool success) { | 121 void GCMStoreImplTest::UpdateCallback(bool success) { |
| 99 ASSERT_EQ(expected_success_, success); | 122 ASSERT_EQ(expected_success_, success); |
| 100 } | 123 } |
| 101 | 124 |
| 102 // Verify creating a new database and loading it. | 125 // Verify creating a new database and loading it. |
| 103 TEST_F(GCMStoreImplTest, LoadNew) { | 126 TEST_F(GCMStoreImplTest, LoadNew) { |
| 104 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 127 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 105 scoped_ptr<GCMStore::LoadResult> load_result; | 128 scoped_ptr<GCMStore::LoadResult> load_result; |
| 106 gcm_store->Load(base::Bind( | 129 LoadGCMStore(gcm_store.get(), &load_result); |
| 107 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 108 PumpLoop(); | |
| 109 | 130 |
| 110 EXPECT_EQ(0U, load_result->device_android_id); | 131 EXPECT_EQ(0U, load_result->device_android_id); |
| 111 EXPECT_EQ(0U, load_result->device_security_token); | 132 EXPECT_EQ(0U, load_result->device_security_token); |
| 112 EXPECT_TRUE(load_result->incoming_messages.empty()); | 133 EXPECT_TRUE(load_result->incoming_messages.empty()); |
| 113 EXPECT_TRUE(load_result->outgoing_messages.empty()); | 134 EXPECT_TRUE(load_result->outgoing_messages.empty()); |
| 114 EXPECT_TRUE(load_result->gservices_settings.empty()); | 135 EXPECT_TRUE(load_result->gservices_settings.empty()); |
| 115 EXPECT_EQ(base::Time::FromInternalValue(0LL), load_result->last_checkin_time); | 136 EXPECT_EQ(base::Time::FromInternalValue(0LL), load_result->last_checkin_time); |
| 116 } | 137 } |
| 117 | 138 |
| 139 // Verify new database is not created when DO_NOT_CREATE_NEW_STORE is passed. |
| 140 TEST_F(GCMStoreImplTest, LoadWithoutCreatingNewStore) { |
| 141 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 142 scoped_ptr<GCMStore::LoadResult> load_result; |
| 143 gcm_store->Load( |
| 144 GCMStore::DO_NOT_CREATE_NEW_STORE, |
| 145 base::Bind(&GCMStoreImplTest::LoadWithoutCheckCallback, |
| 146 base::Unretained(this), |
| 147 &load_result)); |
| 148 PumpLoop(); |
| 149 |
| 150 EXPECT_FALSE(load_result->success); |
| 151 EXPECT_TRUE(load_result->store_does_not_exist); |
| 152 } |
| 153 |
| 118 TEST_F(GCMStoreImplTest, DeviceCredentials) { | 154 TEST_F(GCMStoreImplTest, DeviceCredentials) { |
| 119 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 155 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 120 scoped_ptr<GCMStore::LoadResult> load_result; | 156 scoped_ptr<GCMStore::LoadResult> load_result; |
| 121 gcm_store->Load(base::Bind( | 157 LoadGCMStore(gcm_store.get(), &load_result); |
| 122 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 123 PumpLoop(); | |
| 124 | 158 |
| 125 gcm_store->SetDeviceCredentials( | 159 gcm_store->SetDeviceCredentials( |
| 126 kDeviceId, | 160 kDeviceId, |
| 127 kDeviceToken, | 161 kDeviceToken, |
| 128 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 162 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 129 PumpLoop(); | 163 PumpLoop(); |
| 130 | 164 |
| 131 gcm_store = BuildGCMStore().Pass(); | 165 gcm_store = BuildGCMStore().Pass(); |
| 132 gcm_store->Load(base::Bind( | 166 LoadGCMStore(gcm_store.get(), &load_result); |
| 133 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 134 PumpLoop(); | |
| 135 | 167 |
| 136 ASSERT_EQ(kDeviceId, load_result->device_android_id); | 168 ASSERT_EQ(kDeviceId, load_result->device_android_id); |
| 137 ASSERT_EQ(kDeviceToken, load_result->device_security_token); | 169 ASSERT_EQ(kDeviceToken, load_result->device_security_token); |
| 138 } | 170 } |
| 139 | 171 |
| 140 TEST_F(GCMStoreImplTest, LastCheckinInfo) { | 172 TEST_F(GCMStoreImplTest, LastCheckinInfo) { |
| 141 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); | 173 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 142 scoped_ptr<GCMStore::LoadResult> load_result; | 174 scoped_ptr<GCMStore::LoadResult> load_result; |
| 143 gcm_store->Load(base::Bind( | 175 LoadGCMStore(gcm_store.get(), &load_result); |
| 144 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 145 PumpLoop(); | |
| 146 | 176 |
| 147 base::Time last_checkin_time = base::Time::Now(); | 177 base::Time last_checkin_time = base::Time::Now(); |
| 148 std::set<std::string> accounts; | 178 std::set<std::string> accounts; |
| 149 accounts.insert("test_user1@gmail.com"); | 179 accounts.insert("test_user1@gmail.com"); |
| 150 accounts.insert("test_user2@gmail.com"); | 180 accounts.insert("test_user2@gmail.com"); |
| 151 | 181 |
| 152 gcm_store->SetLastCheckinInfo( | 182 gcm_store->SetLastCheckinInfo( |
| 153 last_checkin_time, | 183 last_checkin_time, |
| 154 accounts, | 184 accounts, |
| 155 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 185 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 156 PumpLoop(); | 186 PumpLoop(); |
| 157 | 187 |
| 158 gcm_store = BuildGCMStore().Pass(); | 188 gcm_store = BuildGCMStore().Pass(); |
| 159 gcm_store->Load(base::Bind( | 189 LoadGCMStore(gcm_store.get(), &load_result); |
| 160 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 161 PumpLoop(); | |
| 162 ASSERT_EQ(last_checkin_time, load_result->last_checkin_time); | 190 ASSERT_EQ(last_checkin_time, load_result->last_checkin_time); |
| 163 ASSERT_EQ(accounts, load_result->last_checkin_accounts); | 191 ASSERT_EQ(accounts, load_result->last_checkin_accounts); |
| 164 | 192 |
| 165 // Negative cases, where the value read is gibberish. | 193 // Negative cases, where the value read is gibberish. |
| 166 gcm_store->SetValueForTesting( | 194 gcm_store->SetValueForTesting( |
| 167 "last_checkin_time", | 195 "last_checkin_time", |
| 168 "gibberish", | 196 "gibberish", |
| 169 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 197 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 170 PumpLoop(); | 198 PumpLoop(); |
| 171 | 199 |
| 172 gcm_store = BuildGCMStore().Pass(); | 200 gcm_store = BuildGCMStore().Pass(); |
| 173 gcm_store->Load(base::Bind( | 201 LoadGCMStore(gcm_store.get(), &load_result); |
| 174 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 175 PumpLoop(); | |
| 176 EXPECT_EQ(base::Time(), load_result->last_checkin_time); | 202 EXPECT_EQ(base::Time(), load_result->last_checkin_time); |
| 177 } | 203 } |
| 178 | 204 |
| 179 TEST_F(GCMStoreImplTest, GServicesSettings_ProtocolV2) { | 205 TEST_F(GCMStoreImplTest, GServicesSettings_ProtocolV2) { |
| 180 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 206 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 181 scoped_ptr<GCMStore::LoadResult> load_result; | 207 scoped_ptr<GCMStore::LoadResult> load_result; |
| 182 gcm_store->Load(base::Bind( | 208 LoadGCMStore(gcm_store.get(), &load_result); |
| 183 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 184 PumpLoop(); | |
| 185 | 209 |
| 186 std::map<std::string, std::string> settings; | 210 std::map<std::string, std::string> settings; |
| 187 settings["checkin_interval"] = "12345"; | 211 settings["checkin_interval"] = "12345"; |
| 188 settings["mcs_port"] = "438"; | 212 settings["mcs_port"] = "438"; |
| 189 settings["checkin_url"] = "http://checkin.google.com"; | 213 settings["checkin_url"] = "http://checkin.google.com"; |
| 190 std::string digest = "digest1"; | 214 std::string digest = "digest1"; |
| 191 | 215 |
| 192 gcm_store->SetGServicesSettings( | 216 gcm_store->SetGServicesSettings( |
| 193 settings, | 217 settings, |
| 194 digest, | 218 digest, |
| 195 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 219 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 196 PumpLoop(); | 220 PumpLoop(); |
| 197 | 221 |
| 198 gcm_store = BuildGCMStore().Pass(); | 222 gcm_store = BuildGCMStore().Pass(); |
| 199 gcm_store->Load(base::Bind( | 223 LoadGCMStore(gcm_store.get(), &load_result); |
| 200 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 201 PumpLoop(); | |
| 202 | 224 |
| 203 ASSERT_EQ(settings, load_result->gservices_settings); | 225 ASSERT_EQ(settings, load_result->gservices_settings); |
| 204 ASSERT_EQ(digest, load_result->gservices_digest); | 226 ASSERT_EQ(digest, load_result->gservices_digest); |
| 205 | 227 |
| 206 // Remove some, and add some. | 228 // Remove some, and add some. |
| 207 settings.clear(); | 229 settings.clear(); |
| 208 settings["checkin_interval"] = "54321"; | 230 settings["checkin_interval"] = "54321"; |
| 209 settings["registration_url"] = "http://registration.google.com"; | 231 settings["registration_url"] = "http://registration.google.com"; |
| 210 digest = "digest2"; | 232 digest = "digest2"; |
| 211 | 233 |
| 212 gcm_store->SetGServicesSettings( | 234 gcm_store->SetGServicesSettings( |
| 213 settings, | 235 settings, |
| 214 digest, | 236 digest, |
| 215 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 237 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 216 PumpLoop(); | 238 PumpLoop(); |
| 217 | 239 |
| 218 gcm_store = BuildGCMStore().Pass(); | 240 gcm_store = BuildGCMStore().Pass(); |
| 219 gcm_store->Load(base::Bind( | 241 LoadGCMStore(gcm_store.get(), &load_result); |
| 220 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 221 PumpLoop(); | |
| 222 | 242 |
| 223 ASSERT_EQ(settings, load_result->gservices_settings); | 243 ASSERT_EQ(settings, load_result->gservices_settings); |
| 224 ASSERT_EQ(digest, load_result->gservices_digest); | 244 ASSERT_EQ(digest, load_result->gservices_digest); |
| 225 } | 245 } |
| 226 | 246 |
| 227 TEST_F(GCMStoreImplTest, Registrations) { | 247 TEST_F(GCMStoreImplTest, Registrations) { |
| 228 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 248 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 229 scoped_ptr<GCMStore::LoadResult> load_result; | 249 scoped_ptr<GCMStore::LoadResult> load_result; |
| 230 gcm_store->Load(base::Bind( | 250 LoadGCMStore(gcm_store.get(), &load_result); |
| 231 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 232 PumpLoop(); | |
| 233 | 251 |
| 234 // Add one registration with one sender. | 252 // Add one registration with one sender. |
| 235 std::string registration = "sender1=registration1"; | 253 std::string registration = "sender1=registration1"; |
| 236 gcm_store->AddRegistration( | 254 gcm_store->AddRegistration( |
| 237 kAppName, | 255 kAppName, |
| 238 registration, | 256 registration, |
| 239 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 257 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 240 PumpLoop(); | 258 PumpLoop(); |
| 241 | 259 |
| 242 // Add one registration with multiple senders. | 260 // Add one registration with multiple senders. |
| 243 std::string registration2 = "sender1,sender2=registration2"; | 261 std::string registration2 = "sender1,sender2=registration2"; |
| 244 gcm_store->AddRegistration( | 262 gcm_store->AddRegistration( |
| 245 kAppName2, | 263 kAppName2, |
| 246 registration2, | 264 registration2, |
| 247 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 265 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 248 PumpLoop(); | 266 PumpLoop(); |
| 249 | 267 |
| 250 gcm_store = BuildGCMStore().Pass(); | 268 gcm_store = BuildGCMStore().Pass(); |
| 251 gcm_store->Load(base::Bind( | 269 LoadGCMStore(gcm_store.get(), &load_result); |
| 252 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 253 PumpLoop(); | |
| 254 | 270 |
| 255 ASSERT_EQ(2u, load_result->registrations.size()); | 271 ASSERT_EQ(2u, load_result->registrations.size()); |
| 256 ASSERT_TRUE(load_result->registrations.find(kAppName) != | 272 ASSERT_TRUE(load_result->registrations.find(kAppName) != |
| 257 load_result->registrations.end()); | 273 load_result->registrations.end()); |
| 258 EXPECT_EQ(registration, load_result->registrations[kAppName]); | 274 EXPECT_EQ(registration, load_result->registrations[kAppName]); |
| 259 ASSERT_TRUE(load_result->registrations.find(kAppName2) != | 275 ASSERT_TRUE(load_result->registrations.find(kAppName2) != |
| 260 load_result->registrations.end()); | 276 load_result->registrations.end()); |
| 261 EXPECT_EQ(registration2, load_result->registrations[kAppName2]); | 277 EXPECT_EQ(registration2, load_result->registrations[kAppName2]); |
| 262 | 278 |
| 263 gcm_store->RemoveRegistration( | 279 gcm_store->RemoveRegistration( |
| 264 kAppName2, | 280 kAppName2, |
| 265 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 281 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 266 PumpLoop(); | 282 PumpLoop(); |
| 267 | 283 |
| 268 gcm_store = BuildGCMStore().Pass(); | 284 gcm_store = BuildGCMStore().Pass(); |
| 269 gcm_store->Load(base::Bind( | 285 LoadGCMStore(gcm_store.get(), &load_result); |
| 270 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 271 PumpLoop(); | |
| 272 | 286 |
| 273 ASSERT_EQ(1u, load_result->registrations.size()); | 287 ASSERT_EQ(1u, load_result->registrations.size()); |
| 274 ASSERT_TRUE(load_result->registrations.find(kAppName) != | 288 ASSERT_TRUE(load_result->registrations.find(kAppName) != |
| 275 load_result->registrations.end()); | 289 load_result->registrations.end()); |
| 276 EXPECT_EQ(registration, load_result->registrations[kAppName]); | 290 EXPECT_EQ(registration, load_result->registrations[kAppName]); |
| 277 } | 291 } |
| 278 | 292 |
| 279 // Verify saving some incoming messages, reopening the directory, and then | 293 // Verify saving some incoming messages, reopening the directory, and then |
| 280 // removing those incoming messages. | 294 // removing those incoming messages. |
| 281 TEST_F(GCMStoreImplTest, IncomingMessages) { | 295 TEST_F(GCMStoreImplTest, IncomingMessages) { |
| 282 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 296 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 283 scoped_ptr<GCMStore::LoadResult> load_result; | 297 scoped_ptr<GCMStore::LoadResult> load_result; |
| 284 gcm_store->Load(base::Bind( | 298 LoadGCMStore(gcm_store.get(), &load_result); |
| 285 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 286 PumpLoop(); | |
| 287 | 299 |
| 288 std::vector<std::string> persistent_ids; | 300 std::vector<std::string> persistent_ids; |
| 289 for (int i = 0; i < kNumPersistentIds; ++i) { | 301 for (int i = 0; i < kNumPersistentIds; ++i) { |
| 290 persistent_ids.push_back(GetNextPersistentId()); | 302 persistent_ids.push_back(GetNextPersistentId()); |
| 291 gcm_store->AddIncomingMessage( | 303 gcm_store->AddIncomingMessage( |
| 292 persistent_ids.back(), | 304 persistent_ids.back(), |
| 293 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 305 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 294 PumpLoop(); | 306 PumpLoop(); |
| 295 } | 307 } |
| 296 | 308 |
| 297 gcm_store = BuildGCMStore().Pass(); | 309 gcm_store = BuildGCMStore().Pass(); |
| 298 gcm_store->Load(base::Bind( | 310 LoadGCMStore(gcm_store.get(), &load_result); |
| 299 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 300 PumpLoop(); | |
| 301 | 311 |
| 302 ASSERT_EQ(persistent_ids, load_result->incoming_messages); | 312 ASSERT_EQ(persistent_ids, load_result->incoming_messages); |
| 303 ASSERT_TRUE(load_result->outgoing_messages.empty()); | 313 ASSERT_TRUE(load_result->outgoing_messages.empty()); |
| 304 | 314 |
| 305 gcm_store->RemoveIncomingMessages( | 315 gcm_store->RemoveIncomingMessages( |
| 306 persistent_ids, | 316 persistent_ids, |
| 307 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 317 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 308 PumpLoop(); | 318 PumpLoop(); |
| 309 | 319 |
| 310 gcm_store = BuildGCMStore().Pass(); | 320 gcm_store = BuildGCMStore().Pass(); |
| 311 load_result->incoming_messages.clear(); | 321 load_result->incoming_messages.clear(); |
| 312 gcm_store->Load(base::Bind( | 322 LoadGCMStore(gcm_store.get(), &load_result); |
| 313 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 314 PumpLoop(); | |
| 315 | 323 |
| 316 ASSERT_TRUE(load_result->incoming_messages.empty()); | 324 ASSERT_TRUE(load_result->incoming_messages.empty()); |
| 317 ASSERT_TRUE(load_result->outgoing_messages.empty()); | 325 ASSERT_TRUE(load_result->outgoing_messages.empty()); |
| 318 } | 326 } |
| 319 | 327 |
| 320 // Verify saving some outgoing messages, reopening the directory, and then | 328 // Verify saving some outgoing messages, reopening the directory, and then |
| 321 // removing those outgoing messages. | 329 // removing those outgoing messages. |
| 322 TEST_F(GCMStoreImplTest, OutgoingMessages) { | 330 TEST_F(GCMStoreImplTest, OutgoingMessages) { |
| 323 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 331 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 324 scoped_ptr<GCMStore::LoadResult> load_result; | 332 scoped_ptr<GCMStore::LoadResult> load_result; |
| 325 gcm_store->Load(base::Bind( | 333 LoadGCMStore(gcm_store.get(), &load_result); |
| 326 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 327 PumpLoop(); | |
| 328 | 334 |
| 329 std::vector<std::string> persistent_ids; | 335 std::vector<std::string> persistent_ids; |
| 330 const int kNumPersistentIds = 10; | 336 const int kNumPersistentIds = 10; |
| 331 for (int i = 0; i < kNumPersistentIds; ++i) { | 337 for (int i = 0; i < kNumPersistentIds; ++i) { |
| 332 persistent_ids.push_back(GetNextPersistentId()); | 338 persistent_ids.push_back(GetNextPersistentId()); |
| 333 mcs_proto::DataMessageStanza message; | 339 mcs_proto::DataMessageStanza message; |
| 334 message.set_from(kAppName + persistent_ids.back()); | 340 message.set_from(kAppName + persistent_ids.back()); |
| 335 message.set_category(kCategoryName + persistent_ids.back()); | 341 message.set_category(kCategoryName + persistent_ids.back()); |
| 336 gcm_store->AddOutgoingMessage( | 342 gcm_store->AddOutgoingMessage( |
| 337 persistent_ids.back(), | 343 persistent_ids.back(), |
| 338 MCSMessage(message), | 344 MCSMessage(message), |
| 339 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 345 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 340 PumpLoop(); | 346 PumpLoop(); |
| 341 } | 347 } |
| 342 | 348 |
| 343 gcm_store = BuildGCMStore().Pass(); | 349 gcm_store = BuildGCMStore().Pass(); |
| 344 gcm_store->Load(base::Bind( | 350 LoadGCMStore(gcm_store.get(), &load_result); |
| 345 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 346 PumpLoop(); | |
| 347 | 351 |
| 348 ASSERT_TRUE(load_result->incoming_messages.empty()); | 352 ASSERT_TRUE(load_result->incoming_messages.empty()); |
| 349 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size()); | 353 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size()); |
| 350 for (int i = 0; i < kNumPersistentIds; ++i) { | 354 for (int i = 0; i < kNumPersistentIds; ++i) { |
| 351 std::string id = persistent_ids[i]; | 355 std::string id = persistent_ids[i]; |
| 352 ASSERT_TRUE(load_result->outgoing_messages[id].get()); | 356 ASSERT_TRUE(load_result->outgoing_messages[id].get()); |
| 353 const mcs_proto::DataMessageStanza* message = | 357 const mcs_proto::DataMessageStanza* message = |
| 354 reinterpret_cast<mcs_proto::DataMessageStanza*>( | 358 reinterpret_cast<mcs_proto::DataMessageStanza*>( |
| 355 load_result->outgoing_messages[id].get()); | 359 load_result->outgoing_messages[id].get()); |
| 356 ASSERT_EQ(message->from(), kAppName + id); | 360 ASSERT_EQ(message->from(), kAppName + id); |
| 357 ASSERT_EQ(message->category(), kCategoryName + id); | 361 ASSERT_EQ(message->category(), kCategoryName + id); |
| 358 } | 362 } |
| 359 | 363 |
| 360 gcm_store->RemoveOutgoingMessages( | 364 gcm_store->RemoveOutgoingMessages( |
| 361 persistent_ids, | 365 persistent_ids, |
| 362 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 366 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 363 PumpLoop(); | 367 PumpLoop(); |
| 364 | 368 |
| 365 gcm_store = BuildGCMStore().Pass(); | 369 gcm_store = BuildGCMStore().Pass(); |
| 366 load_result->outgoing_messages.clear(); | 370 load_result->outgoing_messages.clear(); |
| 367 gcm_store->Load(base::Bind( | 371 LoadGCMStore(gcm_store.get(), &load_result); |
| 368 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 369 PumpLoop(); | |
| 370 | 372 |
| 371 ASSERT_TRUE(load_result->incoming_messages.empty()); | 373 ASSERT_TRUE(load_result->incoming_messages.empty()); |
| 372 ASSERT_TRUE(load_result->outgoing_messages.empty()); | 374 ASSERT_TRUE(load_result->outgoing_messages.empty()); |
| 373 } | 375 } |
| 374 | 376 |
| 375 // Verify incoming and outgoing messages don't conflict. | 377 // Verify incoming and outgoing messages don't conflict. |
| 376 TEST_F(GCMStoreImplTest, IncomingAndOutgoingMessages) { | 378 TEST_F(GCMStoreImplTest, IncomingAndOutgoingMessages) { |
| 377 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 379 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 378 scoped_ptr<GCMStore::LoadResult> load_result; | 380 scoped_ptr<GCMStore::LoadResult> load_result; |
| 379 gcm_store->Load(base::Bind( | 381 LoadGCMStore(gcm_store.get(), &load_result); |
| 380 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 381 PumpLoop(); | |
| 382 | 382 |
| 383 std::vector<std::string> persistent_ids; | 383 std::vector<std::string> persistent_ids; |
| 384 const int kNumPersistentIds = 10; | 384 const int kNumPersistentIds = 10; |
| 385 for (int i = 0; i < kNumPersistentIds; ++i) { | 385 for (int i = 0; i < kNumPersistentIds; ++i) { |
| 386 persistent_ids.push_back(GetNextPersistentId()); | 386 persistent_ids.push_back(GetNextPersistentId()); |
| 387 gcm_store->AddIncomingMessage( | 387 gcm_store->AddIncomingMessage( |
| 388 persistent_ids.back(), | 388 persistent_ids.back(), |
| 389 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 389 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 390 PumpLoop(); | 390 PumpLoop(); |
| 391 | 391 |
| 392 mcs_proto::DataMessageStanza message; | 392 mcs_proto::DataMessageStanza message; |
| 393 message.set_from(kAppName + persistent_ids.back()); | 393 message.set_from(kAppName + persistent_ids.back()); |
| 394 message.set_category(kCategoryName + persistent_ids.back()); | 394 message.set_category(kCategoryName + persistent_ids.back()); |
| 395 gcm_store->AddOutgoingMessage( | 395 gcm_store->AddOutgoingMessage( |
| 396 persistent_ids.back(), | 396 persistent_ids.back(), |
| 397 MCSMessage(message), | 397 MCSMessage(message), |
| 398 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 398 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 399 PumpLoop(); | 399 PumpLoop(); |
| 400 } | 400 } |
| 401 | 401 |
| 402 gcm_store = BuildGCMStore().Pass(); | 402 gcm_store = BuildGCMStore().Pass(); |
| 403 gcm_store->Load(base::Bind( | 403 LoadGCMStore(gcm_store.get(), &load_result); |
| 404 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 405 PumpLoop(); | |
| 406 | 404 |
| 407 ASSERT_EQ(persistent_ids, load_result->incoming_messages); | 405 ASSERT_EQ(persistent_ids, load_result->incoming_messages); |
| 408 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size()); | 406 ASSERT_EQ(load_result->outgoing_messages.size(), persistent_ids.size()); |
| 409 for (int i = 0; i < kNumPersistentIds; ++i) { | 407 for (int i = 0; i < kNumPersistentIds; ++i) { |
| 410 std::string id = persistent_ids[i]; | 408 std::string id = persistent_ids[i]; |
| 411 ASSERT_TRUE(load_result->outgoing_messages[id].get()); | 409 ASSERT_TRUE(load_result->outgoing_messages[id].get()); |
| 412 const mcs_proto::DataMessageStanza* message = | 410 const mcs_proto::DataMessageStanza* message = |
| 413 reinterpret_cast<mcs_proto::DataMessageStanza*>( | 411 reinterpret_cast<mcs_proto::DataMessageStanza*>( |
| 414 load_result->outgoing_messages[id].get()); | 412 load_result->outgoing_messages[id].get()); |
| 415 ASSERT_EQ(message->from(), kAppName + id); | 413 ASSERT_EQ(message->from(), kAppName + id); |
| 416 ASSERT_EQ(message->category(), kCategoryName + id); | 414 ASSERT_EQ(message->category(), kCategoryName + id); |
| 417 } | 415 } |
| 418 | 416 |
| 419 gcm_store->RemoveIncomingMessages( | 417 gcm_store->RemoveIncomingMessages( |
| 420 persistent_ids, | 418 persistent_ids, |
| 421 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 419 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 422 PumpLoop(); | 420 PumpLoop(); |
| 423 gcm_store->RemoveOutgoingMessages( | 421 gcm_store->RemoveOutgoingMessages( |
| 424 persistent_ids, | 422 persistent_ids, |
| 425 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 423 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 426 PumpLoop(); | 424 PumpLoop(); |
| 427 | 425 |
| 428 gcm_store = BuildGCMStore().Pass(); | 426 gcm_store = BuildGCMStore().Pass(); |
| 429 load_result->incoming_messages.clear(); | 427 load_result->incoming_messages.clear(); |
| 430 load_result->outgoing_messages.clear(); | 428 load_result->outgoing_messages.clear(); |
| 431 gcm_store->Load(base::Bind( | 429 LoadGCMStore(gcm_store.get(), &load_result); |
| 432 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 433 PumpLoop(); | |
| 434 | 430 |
| 435 ASSERT_TRUE(load_result->incoming_messages.empty()); | 431 ASSERT_TRUE(load_result->incoming_messages.empty()); |
| 436 ASSERT_TRUE(load_result->outgoing_messages.empty()); | 432 ASSERT_TRUE(load_result->outgoing_messages.empty()); |
| 437 } | 433 } |
| 438 | 434 |
| 439 // Test that per-app message limits are enforced, persisted across restarts, | 435 // Test that per-app message limits are enforced, persisted across restarts, |
| 440 // and updated as messages are removed. | 436 // and updated as messages are removed. |
| 441 TEST_F(GCMStoreImplTest, PerAppMessageLimits) { | 437 TEST_F(GCMStoreImplTest, PerAppMessageLimits) { |
| 442 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 438 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 443 scoped_ptr<GCMStore::LoadResult> load_result; | 439 scoped_ptr<GCMStore::LoadResult> load_result; |
| 444 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 440 LoadGCMStore(gcm_store.get(), &load_result); |
| 445 base::Unretained(this), | |
| 446 &load_result)); | |
| 447 | 441 |
| 448 // Add the initial (below app limit) messages. | 442 // Add the initial (below app limit) messages. |
| 449 for (int i = 0; i < kNumMessagesPerApp; ++i) { | 443 for (int i = 0; i < kNumMessagesPerApp; ++i) { |
| 450 mcs_proto::DataMessageStanza message; | 444 mcs_proto::DataMessageStanza message; |
| 451 message.set_from(kAppName); | 445 message.set_from(kAppName); |
| 452 message.set_category(kCategoryName); | 446 message.set_category(kCategoryName); |
| 453 EXPECT_TRUE(gcm_store->AddOutgoingMessage( | 447 EXPECT_TRUE(gcm_store->AddOutgoingMessage( |
| 454 base::IntToString(i), | 448 base::IntToString(i), |
| 455 MCSMessage(message), | 449 MCSMessage(message), |
| 456 base::Bind(&GCMStoreImplTest::UpdateCallback, | 450 base::Bind(&GCMStoreImplTest::UpdateCallback, |
| 457 base::Unretained(this)))); | 451 base::Unretained(this)))); |
| 458 PumpLoop(); | 452 PumpLoop(); |
| 459 } | 453 } |
| 460 | 454 |
| 461 // Attempting to add some more should fail. | 455 // Attempting to add some more should fail. |
| 462 for (int i = 0; i < kNumMessagesPerApp; ++i) { | 456 for (int i = 0; i < kNumMessagesPerApp; ++i) { |
| 463 mcs_proto::DataMessageStanza message; | 457 mcs_proto::DataMessageStanza message; |
| 464 message.set_from(kAppName); | 458 message.set_from(kAppName); |
| 465 message.set_category(kCategoryName); | 459 message.set_category(kCategoryName); |
| 466 EXPECT_FALSE(gcm_store->AddOutgoingMessage( | 460 EXPECT_FALSE(gcm_store->AddOutgoingMessage( |
| 467 base::IntToString(i + kNumMessagesPerApp), | 461 base::IntToString(i + kNumMessagesPerApp), |
| 468 MCSMessage(message), | 462 MCSMessage(message), |
| 469 base::Bind(&GCMStoreImplTest::UpdateCallback, | 463 base::Bind(&GCMStoreImplTest::UpdateCallback, |
| 470 base::Unretained(this)))); | 464 base::Unretained(this)))); |
| 471 PumpLoop(); | 465 PumpLoop(); |
| 472 } | 466 } |
| 473 | 467 |
| 474 // Tear down and restore the database. | 468 // Tear down and restore the database. |
| 475 gcm_store = BuildGCMStore().Pass(); | 469 gcm_store = BuildGCMStore().Pass(); |
| 476 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 470 LoadGCMStore(gcm_store.get(), &load_result); |
| 477 base::Unretained(this), | |
| 478 &load_result)); | |
| 479 PumpLoop(); | |
| 480 | 471 |
| 481 // Adding more messages should still fail. | 472 // Adding more messages should still fail. |
| 482 for (int i = 0; i < kNumMessagesPerApp; ++i) { | 473 for (int i = 0; i < kNumMessagesPerApp; ++i) { |
| 483 mcs_proto::DataMessageStanza message; | 474 mcs_proto::DataMessageStanza message; |
| 484 message.set_from(kAppName); | 475 message.set_from(kAppName); |
| 485 message.set_category(kCategoryName); | 476 message.set_category(kCategoryName); |
| 486 EXPECT_FALSE(gcm_store->AddOutgoingMessage( | 477 EXPECT_FALSE(gcm_store->AddOutgoingMessage( |
| 487 base::IntToString(i + kNumMessagesPerApp), | 478 base::IntToString(i + kNumMessagesPerApp), |
| 488 MCSMessage(message), | 479 MCSMessage(message), |
| 489 base::Bind(&GCMStoreImplTest::UpdateCallback, | 480 base::Bind(&GCMStoreImplTest::UpdateCallback, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 508 EXPECT_TRUE(gcm_store->AddOutgoingMessage( | 499 EXPECT_TRUE(gcm_store->AddOutgoingMessage( |
| 509 base::IntToString(i + kNumMessagesPerApp), | 500 base::IntToString(i + kNumMessagesPerApp), |
| 510 MCSMessage(message), | 501 MCSMessage(message), |
| 511 base::Bind(&GCMStoreImplTest::UpdateCallback, | 502 base::Bind(&GCMStoreImplTest::UpdateCallback, |
| 512 base::Unretained(this)))); | 503 base::Unretained(this)))); |
| 513 PumpLoop(); | 504 PumpLoop(); |
| 514 } | 505 } |
| 515 } | 506 } |
| 516 | 507 |
| 517 TEST_F(GCMStoreImplTest, AccountMapping) { | 508 TEST_F(GCMStoreImplTest, AccountMapping) { |
| 518 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 509 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 519 scoped_ptr<GCMStore::LoadResult> load_result; | 510 scoped_ptr<GCMStore::LoadResult> load_result; |
| 520 gcm_store->Load(base::Bind( | 511 LoadGCMStore(gcm_store.get(), &load_result); |
| 521 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 522 | 512 |
| 523 // Add account mappings. | 513 // Add account mappings. |
| 524 AccountMapping account_mapping1; | 514 AccountMapping account_mapping1; |
| 525 account_mapping1.account_id = "account_id_1"; | 515 account_mapping1.account_id = "account_id_1"; |
| 526 account_mapping1.email = "account_id_1@gmail.com"; | 516 account_mapping1.email = "account_id_1@gmail.com"; |
| 527 account_mapping1.access_token = "account_token1"; | 517 account_mapping1.access_token = "account_token1"; |
| 528 account_mapping1.status = AccountMapping::ADDING; | 518 account_mapping1.status = AccountMapping::ADDING; |
| 529 account_mapping1.status_change_timestamp = base::Time(); | 519 account_mapping1.status_change_timestamp = base::Time(); |
| 530 account_mapping1.last_message_id = "message_1"; | 520 account_mapping1.last_message_id = "message_1"; |
| 531 | 521 |
| 532 AccountMapping account_mapping2; | 522 AccountMapping account_mapping2; |
| 533 account_mapping2.account_id = "account_id_2"; | 523 account_mapping2.account_id = "account_id_2"; |
| 534 account_mapping2.email = "account_id_2@gmail.com"; | 524 account_mapping2.email = "account_id_2@gmail.com"; |
| 535 account_mapping2.access_token = "account_token1"; | 525 account_mapping2.access_token = "account_token1"; |
| 536 account_mapping2.status = AccountMapping::REMOVING; | 526 account_mapping2.status = AccountMapping::REMOVING; |
| 537 account_mapping2.status_change_timestamp = | 527 account_mapping2.status_change_timestamp = |
| 538 base::Time::FromInternalValue(1305734521259935LL); | 528 base::Time::FromInternalValue(1305734521259935LL); |
| 539 account_mapping2.last_message_id = "message_2"; | 529 account_mapping2.last_message_id = "message_2"; |
| 540 | 530 |
| 541 gcm_store->AddAccountMapping( | 531 gcm_store->AddAccountMapping( |
| 542 account_mapping1, | 532 account_mapping1, |
| 543 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 533 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 544 PumpLoop(); | 534 PumpLoop(); |
| 545 gcm_store->AddAccountMapping( | 535 gcm_store->AddAccountMapping( |
| 546 account_mapping2, | 536 account_mapping2, |
| 547 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 537 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 548 PumpLoop(); | 538 PumpLoop(); |
| 549 | 539 |
| 550 gcm_store = BuildGCMStore().Pass(); | 540 gcm_store = BuildGCMStore().Pass(); |
| 551 gcm_store->Load(base::Bind( | 541 LoadGCMStore(gcm_store.get(), &load_result); |
| 552 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 553 PumpLoop(); | |
| 554 | 542 |
| 555 EXPECT_EQ(2UL, load_result->account_mappings.size()); | 543 EXPECT_EQ(2UL, load_result->account_mappings.size()); |
| 556 GCMStore::AccountMappings::iterator iter = | 544 GCMStore::AccountMappings::iterator iter = |
| 557 load_result->account_mappings.begin(); | 545 load_result->account_mappings.begin(); |
| 558 EXPECT_EQ(account_mapping1.account_id, iter->account_id); | 546 EXPECT_EQ(account_mapping1.account_id, iter->account_id); |
| 559 EXPECT_EQ(account_mapping1.email, iter->email); | 547 EXPECT_EQ(account_mapping1.email, iter->email); |
| 560 EXPECT_TRUE(iter->access_token.empty()); | 548 EXPECT_TRUE(iter->access_token.empty()); |
| 561 EXPECT_EQ(AccountMapping::ADDING, iter->status); | 549 EXPECT_EQ(AccountMapping::ADDING, iter->status); |
| 562 EXPECT_EQ(account_mapping1.status_change_timestamp, | 550 EXPECT_EQ(account_mapping1.status_change_timestamp, |
| 563 iter->status_change_timestamp); | 551 iter->status_change_timestamp); |
| 564 EXPECT_EQ(account_mapping1.last_message_id, iter->last_message_id); | 552 EXPECT_EQ(account_mapping1.last_message_id, iter->last_message_id); |
| 565 ++iter; | 553 ++iter; |
| 566 EXPECT_EQ(account_mapping2.account_id, iter->account_id); | 554 EXPECT_EQ(account_mapping2.account_id, iter->account_id); |
| 567 EXPECT_EQ(account_mapping2.email, iter->email); | 555 EXPECT_EQ(account_mapping2.email, iter->email); |
| 568 EXPECT_TRUE(iter->access_token.empty()); | 556 EXPECT_TRUE(iter->access_token.empty()); |
| 569 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | 557 EXPECT_EQ(AccountMapping::REMOVING, iter->status); |
| 570 EXPECT_EQ(account_mapping2.status_change_timestamp, | 558 EXPECT_EQ(account_mapping2.status_change_timestamp, |
| 571 iter->status_change_timestamp); | 559 iter->status_change_timestamp); |
| 572 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); | 560 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); |
| 573 | 561 |
| 574 gcm_store->RemoveAccountMapping( | 562 gcm_store->RemoveAccountMapping( |
| 575 account_mapping1.account_id, | 563 account_mapping1.account_id, |
| 576 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 564 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 577 PumpLoop(); | 565 PumpLoop(); |
| 578 | 566 |
| 579 gcm_store = BuildGCMStore().Pass(); | 567 gcm_store = BuildGCMStore().Pass(); |
| 580 gcm_store->Load(base::Bind( | 568 LoadGCMStore(gcm_store.get(), &load_result); |
| 581 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 582 PumpLoop(); | |
| 583 | 569 |
| 584 EXPECT_EQ(1UL, load_result->account_mappings.size()); | 570 EXPECT_EQ(1UL, load_result->account_mappings.size()); |
| 585 iter = load_result->account_mappings.begin(); | 571 iter = load_result->account_mappings.begin(); |
| 586 EXPECT_EQ(account_mapping2.account_id, iter->account_id); | 572 EXPECT_EQ(account_mapping2.account_id, iter->account_id); |
| 587 EXPECT_EQ(account_mapping2.email, iter->email); | 573 EXPECT_EQ(account_mapping2.email, iter->email); |
| 588 EXPECT_TRUE(iter->access_token.empty()); | 574 EXPECT_TRUE(iter->access_token.empty()); |
| 589 EXPECT_EQ(AccountMapping::REMOVING, iter->status); | 575 EXPECT_EQ(AccountMapping::REMOVING, iter->status); |
| 590 EXPECT_EQ(account_mapping2.status_change_timestamp, | 576 EXPECT_EQ(account_mapping2.status_change_timestamp, |
| 591 iter->status_change_timestamp); | 577 iter->status_change_timestamp); |
| 592 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); | 578 EXPECT_EQ(account_mapping2.last_message_id, iter->last_message_id); |
| 593 } | 579 } |
| 594 | 580 |
| 595 TEST_F(GCMStoreImplTest, HeartbeatInterval) { | 581 TEST_F(GCMStoreImplTest, HeartbeatInterval) { |
| 596 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 582 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 597 scoped_ptr<GCMStore::LoadResult> load_result; | 583 scoped_ptr<GCMStore::LoadResult> load_result; |
| 598 gcm_store->Load(base::Bind( | 584 LoadGCMStore(gcm_store.get(), &load_result); |
| 599 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 600 | 585 |
| 601 std::string scope1 = "scope1"; | 586 std::string scope1 = "scope1"; |
| 602 std::string scope2 = "scope2"; | 587 std::string scope2 = "scope2"; |
| 603 int heartbeat1 = 120 * 1000; | 588 int heartbeat1 = 120 * 1000; |
| 604 int heartbeat2 = 360 * 1000; | 589 int heartbeat2 = 360 * 1000; |
| 605 | 590 |
| 606 gcm_store->AddHeartbeatInterval( | 591 gcm_store->AddHeartbeatInterval( |
| 607 scope1, | 592 scope1, |
| 608 heartbeat1, | 593 heartbeat1, |
| 609 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 594 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 610 PumpLoop(); | 595 PumpLoop(); |
| 611 gcm_store->AddHeartbeatInterval( | 596 gcm_store->AddHeartbeatInterval( |
| 612 scope2, | 597 scope2, |
| 613 heartbeat2, | 598 heartbeat2, |
| 614 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 599 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 615 PumpLoop(); | 600 PumpLoop(); |
| 616 | 601 |
| 617 gcm_store = BuildGCMStore().Pass(); | 602 gcm_store = BuildGCMStore().Pass(); |
| 618 gcm_store->Load(base::Bind( | 603 LoadGCMStore(gcm_store.get(), &load_result); |
| 619 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 620 PumpLoop(); | |
| 621 | 604 |
| 622 EXPECT_EQ(2UL, load_result->heartbeat_intervals.size()); | 605 EXPECT_EQ(2UL, load_result->heartbeat_intervals.size()); |
| 623 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope1) != | 606 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope1) != |
| 624 load_result->heartbeat_intervals.end()); | 607 load_result->heartbeat_intervals.end()); |
| 625 EXPECT_EQ(heartbeat1, load_result->heartbeat_intervals[scope1]); | 608 EXPECT_EQ(heartbeat1, load_result->heartbeat_intervals[scope1]); |
| 626 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope2) != | 609 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope2) != |
| 627 load_result->heartbeat_intervals.end()); | 610 load_result->heartbeat_intervals.end()); |
| 628 EXPECT_EQ(heartbeat2, load_result->heartbeat_intervals[scope2]); | 611 EXPECT_EQ(heartbeat2, load_result->heartbeat_intervals[scope2]); |
| 629 | 612 |
| 630 gcm_store->RemoveHeartbeatInterval( | 613 gcm_store->RemoveHeartbeatInterval( |
| 631 scope2, | 614 scope2, |
| 632 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 615 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 633 PumpLoop(); | 616 PumpLoop(); |
| 634 | 617 |
| 635 gcm_store = BuildGCMStore().Pass(); | 618 gcm_store = BuildGCMStore().Pass(); |
| 636 gcm_store->Load(base::Bind( | 619 LoadGCMStore(gcm_store.get(), &load_result); |
| 637 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 638 PumpLoop(); | |
| 639 | 620 |
| 640 EXPECT_EQ(1UL, load_result->heartbeat_intervals.size()); | 621 EXPECT_EQ(1UL, load_result->heartbeat_intervals.size()); |
| 641 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope1) != | 622 ASSERT_TRUE(load_result->heartbeat_intervals.find(scope1) != |
| 642 load_result->heartbeat_intervals.end()); | 623 load_result->heartbeat_intervals.end()); |
| 643 EXPECT_EQ(heartbeat1, load_result->heartbeat_intervals[scope1]); | 624 EXPECT_EQ(heartbeat1, load_result->heartbeat_intervals[scope1]); |
| 644 } | 625 } |
| 645 | 626 |
| 646 // When the database is destroyed, all database updates should fail. At the | 627 // When the database is destroyed, all database updates should fail. At the |
| 647 // same time, they per-app message counts should not go up, as failures should | 628 // same time, they per-app message counts should not go up, as failures should |
| 648 // result in decrementing the counts. | 629 // result in decrementing the counts. |
| 649 TEST_F(GCMStoreImplTest, AddMessageAfterDestroy) { | 630 TEST_F(GCMStoreImplTest, AddMessageAfterDestroy) { |
| 650 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 631 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 651 scoped_ptr<GCMStore::LoadResult> load_result; | 632 scoped_ptr<GCMStore::LoadResult> load_result; |
| 652 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 633 LoadGCMStore(gcm_store.get(), &load_result); |
| 653 base::Unretained(this), | |
| 654 &load_result)); | |
| 655 PumpLoop(); | |
| 656 gcm_store->Destroy(base::Bind(&GCMStoreImplTest::UpdateCallback, | 634 gcm_store->Destroy(base::Bind(&GCMStoreImplTest::UpdateCallback, |
| 657 base::Unretained(this))); | 635 base::Unretained(this))); |
| 658 PumpLoop(); | 636 PumpLoop(); |
| 659 | 637 |
| 660 expected_success_ = false; | 638 expected_success_ = false; |
| 661 for (int i = 0; i < kNumMessagesPerApp * 2; ++i) { | 639 for (int i = 0; i < kNumMessagesPerApp * 2; ++i) { |
| 662 mcs_proto::DataMessageStanza message; | 640 mcs_proto::DataMessageStanza message; |
| 663 message.set_from(kAppName); | 641 message.set_from(kAppName); |
| 664 message.set_category(kCategoryName); | 642 message.set_category(kCategoryName); |
| 665 // Because all adds are failing, none should hit the per-app message limits. | 643 // Because all adds are failing, none should hit the per-app message limits. |
| 666 EXPECT_TRUE(gcm_store->AddOutgoingMessage( | 644 EXPECT_TRUE(gcm_store->AddOutgoingMessage( |
| 667 base::IntToString(i), | 645 base::IntToString(i), |
| 668 MCSMessage(message), | 646 MCSMessage(message), |
| 669 base::Bind(&GCMStoreImplTest::UpdateCallback, | 647 base::Bind(&GCMStoreImplTest::UpdateCallback, |
| 670 base::Unretained(this)))); | 648 base::Unretained(this)))); |
| 671 PumpLoop(); | 649 PumpLoop(); |
| 672 } | 650 } |
| 673 } | 651 } |
| 674 | 652 |
| 675 TEST_F(GCMStoreImplTest, ReloadAfterClose) { | 653 TEST_F(GCMStoreImplTest, ReloadAfterClose) { |
| 676 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 654 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 677 scoped_ptr<GCMStore::LoadResult> load_result; | 655 scoped_ptr<GCMStore::LoadResult> load_result; |
| 678 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 656 LoadGCMStore(gcm_store.get(), &load_result); |
| 679 base::Unretained(this), | |
| 680 &load_result)); | |
| 681 PumpLoop(); | |
| 682 | 657 |
| 683 gcm_store->Close(); | 658 gcm_store->Close(); |
| 684 PumpLoop(); | 659 PumpLoop(); |
| 685 | 660 |
| 686 gcm_store->Load(base::Bind(&GCMStoreImplTest::LoadCallback, | 661 LoadGCMStore(gcm_store.get(), &load_result); |
| 687 base::Unretained(this), | |
| 688 &load_result)); | |
| 689 PumpLoop(); | |
| 690 } | 662 } |
| 691 | 663 |
| 692 TEST_F(GCMStoreImplTest, LastTokenFetchTime) { | 664 TEST_F(GCMStoreImplTest, LastTokenFetchTime) { |
| 693 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); | 665 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 694 scoped_ptr<GCMStore::LoadResult> load_result; | 666 scoped_ptr<GCMStore::LoadResult> load_result; |
| 695 gcm_store->Load(base::Bind( | 667 LoadGCMStore(gcm_store.get(), &load_result); |
| 696 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 697 PumpLoop(); | |
| 698 EXPECT_EQ(base::Time(), load_result->last_token_fetch_time); | 668 EXPECT_EQ(base::Time(), load_result->last_token_fetch_time); |
| 699 | 669 |
| 700 base::Time last_token_fetch_time = base::Time::Now(); | 670 base::Time last_token_fetch_time = base::Time::Now(); |
| 701 gcm_store->SetLastTokenFetchTime( | 671 gcm_store->SetLastTokenFetchTime( |
| 702 last_token_fetch_time, | 672 last_token_fetch_time, |
| 703 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 673 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 704 PumpLoop(); | 674 PumpLoop(); |
| 705 | 675 |
| 706 gcm_store = BuildGCMStore().Pass(); | 676 gcm_store = BuildGCMStore().Pass(); |
| 707 gcm_store->Load(base::Bind( | 677 LoadGCMStore(gcm_store.get(), &load_result); |
| 708 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 709 PumpLoop(); | |
| 710 EXPECT_EQ(last_token_fetch_time, load_result->last_token_fetch_time); | 678 EXPECT_EQ(last_token_fetch_time, load_result->last_token_fetch_time); |
| 711 | 679 |
| 712 // Negative cases, where the value read is gibberish. | 680 // Negative cases, where the value read is gibberish. |
| 713 gcm_store->SetValueForTesting( | 681 gcm_store->SetValueForTesting( |
| 714 "last_token_fetch_time", | 682 "last_token_fetch_time", |
| 715 "gibberish", | 683 "gibberish", |
| 716 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 684 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 717 PumpLoop(); | 685 PumpLoop(); |
| 718 | 686 |
| 719 gcm_store = BuildGCMStore().Pass(); | 687 gcm_store = BuildGCMStore().Pass(); |
| 720 gcm_store->Load(base::Bind( | 688 LoadGCMStore(gcm_store.get(), &load_result); |
| 721 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 722 PumpLoop(); | |
| 723 EXPECT_EQ(base::Time(), load_result->last_token_fetch_time); | 689 EXPECT_EQ(base::Time(), load_result->last_token_fetch_time); |
| 724 } | 690 } |
| 725 | 691 |
| 726 TEST_F(GCMStoreImplTest, InstanceIDData) { | 692 TEST_F(GCMStoreImplTest, InstanceIDData) { |
| 727 scoped_ptr<GCMStore> gcm_store(BuildGCMStore()); | 693 scoped_ptr<GCMStoreImpl> gcm_store(BuildGCMStore()); |
| 728 scoped_ptr<GCMStore::LoadResult> load_result; | 694 scoped_ptr<GCMStore::LoadResult> load_result; |
| 729 gcm_store->Load(base::Bind( | 695 LoadGCMStore(gcm_store.get(), &load_result); |
| 730 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 731 PumpLoop(); | |
| 732 | 696 |
| 733 std::string instance_id_data("Foo"); | 697 std::string instance_id_data("Foo"); |
| 734 gcm_store->AddInstanceIDData( | 698 gcm_store->AddInstanceIDData( |
| 735 kAppName, | 699 kAppName, |
| 736 instance_id_data, | 700 instance_id_data, |
| 737 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 701 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 738 PumpLoop(); | 702 PumpLoop(); |
| 739 | 703 |
| 740 std::string instance_id_data2("Hello Instance ID"); | 704 std::string instance_id_data2("Hello Instance ID"); |
| 741 gcm_store->AddInstanceIDData( | 705 gcm_store->AddInstanceIDData( |
| 742 kAppName2, | 706 kAppName2, |
| 743 instance_id_data2, | 707 instance_id_data2, |
| 744 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 708 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 745 PumpLoop(); | 709 PumpLoop(); |
| 746 | 710 |
| 747 gcm_store = BuildGCMStore().Pass(); | 711 gcm_store = BuildGCMStore().Pass(); |
| 748 gcm_store->Load(base::Bind( | 712 LoadGCMStore(gcm_store.get(), &load_result); |
| 749 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 750 PumpLoop(); | |
| 751 | 713 |
| 752 ASSERT_EQ(2u, load_result->instance_id_data.size()); | 714 ASSERT_EQ(2u, load_result->instance_id_data.size()); |
| 753 ASSERT_TRUE(load_result->instance_id_data.find(kAppName) != | 715 ASSERT_TRUE(load_result->instance_id_data.find(kAppName) != |
| 754 load_result->instance_id_data.end()); | 716 load_result->instance_id_data.end()); |
| 755 ASSERT_TRUE(load_result->instance_id_data.find(kAppName2) != | 717 ASSERT_TRUE(load_result->instance_id_data.find(kAppName2) != |
| 756 load_result->instance_id_data.end()); | 718 load_result->instance_id_data.end()); |
| 757 EXPECT_EQ(instance_id_data, load_result->instance_id_data[kAppName]); | 719 EXPECT_EQ(instance_id_data, load_result->instance_id_data[kAppName]); |
| 758 EXPECT_EQ(instance_id_data2, load_result->instance_id_data[kAppName2]); | 720 EXPECT_EQ(instance_id_data2, load_result->instance_id_data[kAppName2]); |
| 759 | 721 |
| 760 gcm_store->RemoveInstanceIDData( | 722 gcm_store->RemoveInstanceIDData( |
| 761 kAppName, | 723 kAppName, |
| 762 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); | 724 base::Bind(&GCMStoreImplTest::UpdateCallback, base::Unretained(this))); |
| 763 PumpLoop(); | 725 PumpLoop(); |
| 764 | 726 |
| 765 gcm_store = BuildGCMStore().Pass(); | 727 gcm_store = BuildGCMStore().Pass(); |
| 766 gcm_store->Load(base::Bind( | 728 LoadGCMStore(gcm_store.get(), &load_result); |
| 767 &GCMStoreImplTest::LoadCallback, base::Unretained(this), &load_result)); | |
| 768 PumpLoop(); | |
| 769 | 729 |
| 770 ASSERT_EQ(1u, load_result->instance_id_data.size()); | 730 ASSERT_EQ(1u, load_result->instance_id_data.size()); |
| 771 ASSERT_TRUE(load_result->instance_id_data.find(kAppName2) != | 731 ASSERT_TRUE(load_result->instance_id_data.find(kAppName2) != |
| 772 load_result->instance_id_data.end()); | 732 load_result->instance_id_data.end()); |
| 773 EXPECT_EQ(instance_id_data2, load_result->instance_id_data[kAppName2]); | 733 EXPECT_EQ(instance_id_data2, load_result->instance_id_data[kAppName2]); |
| 774 } | 734 } |
| 775 | 735 |
| 776 } // namespace | 736 } // namespace |
| 777 | 737 |
| 778 } // namespace gcm | 738 } // namespace gcm |
| OLD | NEW |