| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/chromeos/contacts/contact_database.h" | 5 #include "chrome/browser/chromeos/contacts/contact_database.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 70 |
| 71 void DestroyDatabase() { | 71 void DestroyDatabase() { |
| 72 if (db_) { | 72 if (db_) { |
| 73 db_->DestroyOnUIThread(); | 73 db_->DestroyOnUIThread(); |
| 74 db_ = NULL; | 74 db_ = NULL; |
| 75 } | 75 } |
| 76 } | 76 } |
| 77 | 77 |
| 78 // Calls ContactDatabase::SaveContacts() and blocks until the operation is | 78 // Calls ContactDatabase::SaveContacts() and blocks until the operation is |
| 79 // complete. | 79 // complete. |
| 80 void SaveContacts(scoped_ptr<ContactPointers> contacts, | 80 void SaveContacts(scoped_ptr<ContactPointers> contacts_to_save, |
| 81 scoped_ptr<ContactDatabaseInterface::ContactIds> |
| 82 contact_ids_to_delete, |
| 81 scoped_ptr<UpdateMetadata> metadata, | 83 scoped_ptr<UpdateMetadata> metadata, |
| 82 bool is_full_update) { | 84 bool is_full_update) { |
| 83 CHECK(db_); | 85 CHECK(db_); |
| 84 db_->SaveContacts(contacts.Pass(), metadata.Pass(), is_full_update, | 86 db_->SaveContacts(contacts_to_save.Pass(), |
| 87 contact_ids_to_delete.Pass(), |
| 88 metadata.Pass(), |
| 89 is_full_update, |
| 85 base::Bind(&ContactDatabaseTest::OnContactsSaved, | 90 base::Bind(&ContactDatabaseTest::OnContactsSaved, |
| 86 base::Unretained(this))); | 91 base::Unretained(this))); |
| 87 message_loop_.Run(); | 92 message_loop_.Run(); |
| 88 } | 93 } |
| 89 | 94 |
| 90 // Calls ContactDatabase::LoadContacts() and blocks until the operation is | 95 // Calls ContactDatabase::LoadContacts() and blocks until the operation is |
| 91 // complete. | 96 // complete. |
| 92 void LoadContacts(scoped_ptr<ScopedVector<Contact> >* contacts_out, | 97 void LoadContacts(scoped_ptr<ScopedVector<Contact> >* contacts_out, |
| 93 scoped_ptr<UpdateMetadata>* metadata_out) { | 98 scoped_ptr<UpdateMetadata>* metadata_out) { |
| 94 CHECK(db_); | 99 CHECK(db_); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 "postal_label_1", true, contact.get()); | 163 "postal_label_1", true, contact.get()); |
| 159 AddPostalAddress("postal_2", Contact_AddressType_Relation_OTHER, | 164 AddPostalAddress("postal_2", Contact_AddressType_Relation_OTHER, |
| 160 "postal_label_2", false, contact.get()); | 165 "postal_label_2", false, contact.get()); |
| 161 AddInstantMessagingAddress("im_1", | 166 AddInstantMessagingAddress("im_1", |
| 162 Contact_InstantMessagingAddress_Protocol_AIM, | 167 Contact_InstantMessagingAddress_Protocol_AIM, |
| 163 Contact_AddressType_Relation_HOME, | 168 Contact_AddressType_Relation_HOME, |
| 164 "im_label_1", true, contact.get()); | 169 "im_label_1", true, contact.get()); |
| 165 SetPhoto(gfx::Size(20, 20), contact.get()); | 170 SetPhoto(gfx::Size(20, 20), contact.get()); |
| 166 scoped_ptr<ContactPointers> contacts_to_save(new ContactPointers); | 171 scoped_ptr<ContactPointers> contacts_to_save(new ContactPointers); |
| 167 contacts_to_save->push_back(contact.get()); | 172 contacts_to_save->push_back(contact.get()); |
| 173 scoped_ptr<ContactDatabaseInterface::ContactIds> contact_ids_to_delete( |
| 174 new ContactDatabaseInterface::ContactIds); |
| 168 | 175 |
| 169 const int64 kLastUpdateTime = 1234; | 176 const int64 kLastUpdateTime = 1234; |
| 170 scoped_ptr<UpdateMetadata> metadata_to_save(new UpdateMetadata); | 177 scoped_ptr<UpdateMetadata> metadata_to_save(new UpdateMetadata); |
| 171 metadata_to_save->set_last_update_start_time(kLastUpdateTime); | 178 metadata_to_save->set_last_update_start_time(kLastUpdateTime); |
| 172 | 179 |
| 173 SaveContacts(contacts_to_save.Pass(), metadata_to_save.Pass(), true); | 180 SaveContacts(contacts_to_save.Pass(), |
| 181 contact_ids_to_delete.Pass(), |
| 182 metadata_to_save.Pass(), |
| 183 true); |
| 174 scoped_ptr<ScopedVector<Contact> > loaded_contacts; | 184 scoped_ptr<ScopedVector<Contact> > loaded_contacts; |
| 175 scoped_ptr<UpdateMetadata> loaded_metadata; | 185 scoped_ptr<UpdateMetadata> loaded_metadata; |
| 176 LoadContacts(&loaded_contacts, &loaded_metadata); | 186 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 177 EXPECT_EQ(VarContactsToString(1, contact.get()), | 187 EXPECT_EQ(VarContactsToString(1, contact.get()), |
| 178 ContactsToString(*loaded_contacts)); | 188 ContactsToString(*loaded_contacts)); |
| 179 EXPECT_EQ(kLastUpdateTime, loaded_metadata->last_update_start_time()); | 189 EXPECT_EQ(kLastUpdateTime, loaded_metadata->last_update_start_time()); |
| 180 | 190 |
| 181 // Modify the contact, save it, and check that the loaded contact is also | 191 // Modify the contact, save it, and check that the loaded contact is also |
| 182 // updated. | 192 // updated. |
| 183 InitContact(kContactId, "2", false, contact.get()); | 193 InitContact(kContactId, "2", false, contact.get()); |
| 184 AddEmailAddress("email_3", Contact_AddressType_Relation_OTHER, | 194 AddEmailAddress("email_3", Contact_AddressType_Relation_OTHER, |
| 185 "email_label_2", true, contact.get()); | 195 "email_label_2", true, contact.get()); |
| 186 AddPhoneNumber("phone_2", Contact_AddressType_Relation_OTHER, | 196 AddPhoneNumber("phone_2", Contact_AddressType_Relation_OTHER, |
| 187 "phone_label_2", false, contact.get()); | 197 "phone_label_2", false, contact.get()); |
| 188 AddPostalAddress("postal_3", Contact_AddressType_Relation_HOME, | 198 AddPostalAddress("postal_3", Contact_AddressType_Relation_HOME, |
| 189 "postal_label_3", true, contact.get()); | 199 "postal_label_3", true, contact.get()); |
| 190 SetPhoto(gfx::Size(64, 64), contact.get()); | 200 SetPhoto(gfx::Size(64, 64), contact.get()); |
| 191 contacts_to_save.reset(new ContactPointers); | 201 contacts_to_save.reset(new ContactPointers); |
| 192 contacts_to_save->push_back(contact.get()); | 202 contacts_to_save->push_back(contact.get()); |
| 203 contact_ids_to_delete.reset(new ContactDatabaseInterface::ContactIds); |
| 193 metadata_to_save.reset(new UpdateMetadata); | 204 metadata_to_save.reset(new UpdateMetadata); |
| 194 const int64 kNewLastUpdateTime = 5678; | 205 const int64 kNewLastUpdateTime = 5678; |
| 195 metadata_to_save->set_last_update_start_time(kNewLastUpdateTime); | 206 metadata_to_save->set_last_update_start_time(kNewLastUpdateTime); |
| 196 SaveContacts(contacts_to_save.Pass(), metadata_to_save.Pass(), true); | 207 SaveContacts(contacts_to_save.Pass(), |
| 208 contact_ids_to_delete.Pass(), |
| 209 metadata_to_save.Pass(), |
| 210 true); |
| 197 | 211 |
| 198 LoadContacts(&loaded_contacts, &loaded_metadata); | 212 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 199 EXPECT_EQ(VarContactsToString(1, contact.get()), | 213 EXPECT_EQ(VarContactsToString(1, contact.get()), |
| 200 ContactsToString(*loaded_contacts)); | 214 ContactsToString(*loaded_contacts)); |
| 201 EXPECT_EQ(kNewLastUpdateTime, loaded_metadata->last_update_start_time()); | 215 EXPECT_EQ(kNewLastUpdateTime, loaded_metadata->last_update_start_time()); |
| 202 } | 216 } |
| 203 | 217 |
| 204 TEST_F(ContactDatabaseTest, FullAndIncrementalUpdates) { | 218 TEST_F(ContactDatabaseTest, FullAndIncrementalUpdates) { |
| 205 // Do a full update that inserts two contacts into the database. | 219 // Do a full update that inserts two contacts into the database. |
| 206 const std::string kContactId1 = "contact_id_1"; | 220 const std::string kContactId1 = "contact_id_1"; |
| 207 const std::string kSharedEmail = "foo@example.org"; | 221 const std::string kSharedEmail = "foo@example.org"; |
| 208 scoped_ptr<Contact> contact1(new Contact); | 222 scoped_ptr<Contact> contact1(new Contact); |
| 209 InitContact(kContactId1, "1", false, contact1.get()); | 223 InitContact(kContactId1, "1", false, contact1.get()); |
| 210 AddEmailAddress(kSharedEmail, Contact_AddressType_Relation_HOME, | 224 AddEmailAddress(kSharedEmail, Contact_AddressType_Relation_HOME, |
| 211 "", true, contact1.get()); | 225 "", true, contact1.get()); |
| 212 | 226 |
| 213 const std::string kContactId2 = "contact_id_2"; | 227 const std::string kContactId2 = "contact_id_2"; |
| 214 scoped_ptr<Contact> contact2(new Contact); | 228 scoped_ptr<Contact> contact2(new Contact); |
| 215 InitContact(kContactId2, "2", false, contact2.get()); | 229 InitContact(kContactId2, "2", false, contact2.get()); |
| 216 AddEmailAddress(kSharedEmail, Contact_AddressType_Relation_WORK, | 230 AddEmailAddress(kSharedEmail, Contact_AddressType_Relation_WORK, |
| 217 "", true, contact2.get()); | 231 "", true, contact2.get()); |
| 218 | 232 |
| 219 scoped_ptr<ContactPointers> contacts_to_save(new ContactPointers); | 233 scoped_ptr<ContactPointers> contacts_to_save(new ContactPointers); |
| 220 contacts_to_save->push_back(contact1.get()); | 234 contacts_to_save->push_back(contact1.get()); |
| 221 contacts_to_save->push_back(contact2.get()); | 235 contacts_to_save->push_back(contact2.get()); |
| 236 scoped_ptr<ContactDatabaseInterface::ContactIds> contact_ids_to_delete( |
| 237 new ContactDatabaseInterface::ContactIds); |
| 222 scoped_ptr<UpdateMetadata> metadata_to_save(new UpdateMetadata); | 238 scoped_ptr<UpdateMetadata> metadata_to_save(new UpdateMetadata); |
| 223 SaveContacts(contacts_to_save.Pass(), metadata_to_save.Pass(), true); | 239 SaveContacts(contacts_to_save.Pass(), |
| 240 contact_ids_to_delete.Pass(), |
| 241 metadata_to_save.Pass(), |
| 242 true); |
| 224 | 243 |
| 225 scoped_ptr<ScopedVector<Contact> > loaded_contacts; | 244 scoped_ptr<ScopedVector<Contact> > loaded_contacts; |
| 226 scoped_ptr<UpdateMetadata> loaded_metadata; | 245 scoped_ptr<UpdateMetadata> loaded_metadata; |
| 227 LoadContacts(&loaded_contacts, &loaded_metadata); | 246 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 228 EXPECT_EQ(VarContactsToString(2, contact1.get(), contact2.get()), | 247 EXPECT_EQ(VarContactsToString(2, contact1.get(), contact2.get()), |
| 229 ContactsToString(*loaded_contacts)); | 248 ContactsToString(*loaded_contacts)); |
| 230 | 249 |
| 231 // Do an incremental update including just the second contact. | 250 // Do an incremental update including just the second contact. |
| 232 InitContact(kContactId2, "2b", false, contact2.get()); | 251 InitContact(kContactId2, "2b", false, contact2.get()); |
| 233 AddPostalAddress("postal_1", Contact_AddressType_Relation_HOME, | 252 AddPostalAddress("postal_1", Contact_AddressType_Relation_HOME, |
| 234 "", true, contact2.get()); | 253 "", true, contact2.get()); |
| 235 contacts_to_save.reset(new ContactPointers); | 254 contacts_to_save.reset(new ContactPointers); |
| 236 contacts_to_save->push_back(contact2.get()); | 255 contacts_to_save->push_back(contact2.get()); |
| 256 contact_ids_to_delete.reset(new ContactDatabaseInterface::ContactIds); |
| 237 metadata_to_save.reset(new UpdateMetadata); | 257 metadata_to_save.reset(new UpdateMetadata); |
| 238 SaveContacts(contacts_to_save.Pass(), metadata_to_save.Pass(), false); | 258 SaveContacts(contacts_to_save.Pass(), |
| 259 contact_ids_to_delete.Pass(), |
| 260 metadata_to_save.Pass(), |
| 261 false); |
| 239 LoadContacts(&loaded_contacts, &loaded_metadata); | 262 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 240 EXPECT_EQ(VarContactsToString(2, contact1.get(), contact2.get()), | 263 EXPECT_EQ(VarContactsToString(2, contact1.get(), contact2.get()), |
| 241 ContactsToString(*loaded_contacts)); | 264 ContactsToString(*loaded_contacts)); |
| 242 | 265 |
| 243 // Do an empty incremental update and check that the metadata is still | 266 // Do an empty incremental update and check that the metadata is still |
| 244 // updated. | 267 // updated. |
| 245 contacts_to_save.reset(new ContactPointers); | 268 contacts_to_save.reset(new ContactPointers); |
| 269 contact_ids_to_delete.reset(new ContactDatabaseInterface::ContactIds); |
| 246 metadata_to_save.reset(new UpdateMetadata); | 270 metadata_to_save.reset(new UpdateMetadata); |
| 247 const int64 kLastUpdateTime = 1234; | 271 const int64 kLastUpdateTime = 1234; |
| 248 metadata_to_save->set_last_update_start_time(kLastUpdateTime); | 272 metadata_to_save->set_last_update_start_time(kLastUpdateTime); |
| 249 SaveContacts(contacts_to_save.Pass(), metadata_to_save.Pass(), false); | 273 SaveContacts(contacts_to_save.Pass(), |
| 274 contact_ids_to_delete.Pass(), |
| 275 metadata_to_save.Pass(), |
| 276 false); |
| 250 LoadContacts(&loaded_contacts, &loaded_metadata); | 277 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 251 EXPECT_EQ(VarContactsToString(2, contact1.get(), contact2.get()), | 278 EXPECT_EQ(VarContactsToString(2, contact1.get(), contact2.get()), |
| 252 ContactsToString(*loaded_contacts)); | 279 ContactsToString(*loaded_contacts)); |
| 253 EXPECT_EQ(kLastUpdateTime, loaded_metadata->last_update_start_time()); | 280 EXPECT_EQ(kLastUpdateTime, loaded_metadata->last_update_start_time()); |
| 254 | 281 |
| 255 // Do a full update including just the first contact. The second contact | 282 // Do a full update including just the first contact. The second contact |
| 256 // should be removed from the database. | 283 // should be removed from the database. |
| 257 InitContact(kContactId1, "1b", false, contact1.get()); | 284 InitContact(kContactId1, "1b", false, contact1.get()); |
| 258 AddPostalAddress("postal_2", Contact_AddressType_Relation_WORK, | 285 AddPostalAddress("postal_2", Contact_AddressType_Relation_WORK, |
| 259 "", true, contact1.get()); | 286 "", true, contact1.get()); |
| 260 AddPhoneNumber("phone", Contact_AddressType_Relation_HOME, | 287 AddPhoneNumber("phone", Contact_AddressType_Relation_HOME, |
| 261 "", true, contact1.get()); | 288 "", true, contact1.get()); |
| 262 contacts_to_save.reset(new ContactPointers); | 289 contacts_to_save.reset(new ContactPointers); |
| 263 contacts_to_save->push_back(contact1.get()); | 290 contacts_to_save->push_back(contact1.get()); |
| 291 contact_ids_to_delete.reset(new ContactDatabaseInterface::ContactIds); |
| 264 metadata_to_save.reset(new UpdateMetadata); | 292 metadata_to_save.reset(new UpdateMetadata); |
| 265 SaveContacts(contacts_to_save.Pass(), metadata_to_save.Pass(), true); | 293 SaveContacts(contacts_to_save.Pass(), |
| 294 contact_ids_to_delete.Pass(), |
| 295 metadata_to_save.Pass(), |
| 296 true); |
| 266 LoadContacts(&loaded_contacts, &loaded_metadata); | 297 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 267 EXPECT_EQ(VarContactsToString(1, contact1.get()), | 298 EXPECT_EQ(VarContactsToString(1, contact1.get()), |
| 268 ContactsToString(*loaded_contacts)); | 299 ContactsToString(*loaded_contacts)); |
| 269 | 300 |
| 270 // Do a full update including no contacts. The database should be cleared. | 301 // Do a full update including no contacts. The database should be cleared. |
| 271 contacts_to_save.reset(new ContactPointers); | 302 contacts_to_save.reset(new ContactPointers); |
| 303 contact_ids_to_delete.reset(new ContactDatabaseInterface::ContactIds); |
| 272 metadata_to_save.reset(new UpdateMetadata); | 304 metadata_to_save.reset(new UpdateMetadata); |
| 273 SaveContacts(contacts_to_save.Pass(), metadata_to_save.Pass(), true); | 305 SaveContacts(contacts_to_save.Pass(), |
| 306 contact_ids_to_delete.Pass(), |
| 307 metadata_to_save.Pass(), |
| 308 true); |
| 274 LoadContacts(&loaded_contacts, &loaded_metadata); | 309 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 275 EXPECT_TRUE(loaded_contacts->empty()); | 310 EXPECT_TRUE(loaded_contacts->empty()); |
| 276 } | 311 } |
| 277 | 312 |
| 278 // Test that we create a new database when we encounter a corrupted one. | 313 // Test that we create a new database when we encounter a corrupted one. |
| 279 TEST_F(ContactDatabaseTest, DeleteWhenCorrupt) { | 314 TEST_F(ContactDatabaseTest, DeleteWhenCorrupt) { |
| 280 DestroyDatabase(); | 315 DestroyDatabase(); |
| 281 // Overwrite all of the files in the database with a space character. | 316 // Overwrite all of the files in the database with a space character. |
| 282 file_util::FileEnumerator enumerator( | 317 file_util::FileEnumerator enumerator( |
| 283 database_path(), false, file_util::FileEnumerator::FILES); | 318 database_path(), false, file_util::FileEnumerator::FILES); |
| 284 for (FilePath path = enumerator.Next(); !path.empty(); | 319 for (FilePath path = enumerator.Next(); !path.empty(); |
| 285 path = enumerator.Next()) { | 320 path = enumerator.Next()) { |
| 286 file_util::WriteFile(path, " ", 1); | 321 file_util::WriteFile(path, " ", 1); |
| 287 } | 322 } |
| 288 CreateDatabase(); | 323 CreateDatabase(); |
| 289 | 324 |
| 290 // Make sure that the resulting database is usable. | 325 // Make sure that the resulting database is usable. |
| 291 scoped_ptr<Contact> contact(new Contact); | 326 scoped_ptr<Contact> contact(new Contact); |
| 292 InitContact("1", "1", false, contact.get()); | 327 InitContact("1", "1", false, contact.get()); |
| 293 scoped_ptr<ContactPointers> contacts_to_save(new ContactPointers); | 328 scoped_ptr<ContactPointers> contacts_to_save(new ContactPointers); |
| 294 contacts_to_save->push_back(contact.get()); | 329 contacts_to_save->push_back(contact.get()); |
| 330 scoped_ptr<ContactDatabaseInterface::ContactIds> contact_ids_to_delete( |
| 331 new ContactDatabaseInterface::ContactIds); |
| 295 scoped_ptr<UpdateMetadata> metadata_to_save(new UpdateMetadata); | 332 scoped_ptr<UpdateMetadata> metadata_to_save(new UpdateMetadata); |
| 296 SaveContacts(contacts_to_save.Pass(), metadata_to_save.Pass(), true); | 333 SaveContacts(contacts_to_save.Pass(), |
| 334 contact_ids_to_delete.Pass(), |
| 335 metadata_to_save.Pass(), |
| 336 true); |
| 297 | 337 |
| 298 scoped_ptr<ScopedVector<Contact> > loaded_contacts; | 338 scoped_ptr<ScopedVector<Contact> > loaded_contacts; |
| 299 scoped_ptr<UpdateMetadata> loaded_metadata; | 339 scoped_ptr<UpdateMetadata> loaded_metadata; |
| 300 LoadContacts(&loaded_contacts, &loaded_metadata); | 340 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 301 EXPECT_EQ(VarContactsToString(1, contact.get()), | 341 EXPECT_EQ(VarContactsToString(1, contact.get()), |
| 302 ContactsToString(*loaded_contacts)); | 342 ContactsToString(*loaded_contacts)); |
| 303 } | 343 } |
| 304 | 344 |
| 345 TEST_F(ContactDatabaseTest, DeleteRequestedContacts) { |
| 346 // Insert two contacts into the database with a full update. |
| 347 const std::string kContactId1 = "contact_id_1"; |
| 348 scoped_ptr<Contact> contact1(new Contact); |
| 349 InitContact(kContactId1, "1", false, contact1.get()); |
| 350 const std::string kContactId2 = "contact_id_2"; |
| 351 scoped_ptr<Contact> contact2(new Contact); |
| 352 InitContact(kContactId2, "2", false, contact2.get()); |
| 353 |
| 354 scoped_ptr<ContactPointers> contacts_to_save(new ContactPointers); |
| 355 contacts_to_save->push_back(contact1.get()); |
| 356 contacts_to_save->push_back(contact2.get()); |
| 357 scoped_ptr<ContactDatabaseInterface::ContactIds> contact_ids_to_delete( |
| 358 new ContactDatabaseInterface::ContactIds); |
| 359 scoped_ptr<UpdateMetadata> metadata_to_save(new UpdateMetadata); |
| 360 SaveContacts(contacts_to_save.Pass(), |
| 361 contact_ids_to_delete.Pass(), |
| 362 metadata_to_save.Pass(), |
| 363 true); |
| 364 |
| 365 // Do an incremental update that inserts a third contact and deletes the first |
| 366 // contact. |
| 367 const std::string kContactId3 = "contact_id_3"; |
| 368 scoped_ptr<Contact> contact3(new Contact); |
| 369 InitContact(kContactId3, "3", false, contact3.get()); |
| 370 |
| 371 contacts_to_save.reset(new ContactPointers); |
| 372 contacts_to_save->push_back(contact3.get()); |
| 373 contact_ids_to_delete.reset(new ContactDatabaseInterface::ContactIds); |
| 374 contact_ids_to_delete->push_back(kContactId1); |
| 375 metadata_to_save.reset(new UpdateMetadata); |
| 376 SaveContacts(contacts_to_save.Pass(), |
| 377 contact_ids_to_delete.Pass(), |
| 378 metadata_to_save.Pass(), |
| 379 false); |
| 380 |
| 381 // LoadContacts() should return only the second and third contacts. |
| 382 scoped_ptr<ScopedVector<Contact> > loaded_contacts; |
| 383 scoped_ptr<UpdateMetadata> loaded_metadata; |
| 384 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 385 EXPECT_EQ(VarContactsToString(2, contact2.get(), contact3.get()), |
| 386 ContactsToString(*loaded_contacts)); |
| 387 |
| 388 // Do another incremental update that deletes the second contact. |
| 389 contacts_to_save.reset(new ContactPointers); |
| 390 contact_ids_to_delete.reset(new ContactDatabaseInterface::ContactIds); |
| 391 contact_ids_to_delete->push_back(kContactId2); |
| 392 metadata_to_save.reset(new UpdateMetadata); |
| 393 SaveContacts(contacts_to_save.Pass(), |
| 394 contact_ids_to_delete.Pass(), |
| 395 metadata_to_save.Pass(), |
| 396 false); |
| 397 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 398 EXPECT_EQ(VarContactsToString(1, contact3.get()), |
| 399 ContactsToString(*loaded_contacts)); |
| 400 |
| 401 // Deleting a contact that isn't present should be a no-op. |
| 402 contacts_to_save.reset(new ContactPointers); |
| 403 contact_ids_to_delete.reset(new ContactDatabaseInterface::ContactIds); |
| 404 contact_ids_to_delete->push_back("bogus_id"); |
| 405 metadata_to_save.reset(new UpdateMetadata); |
| 406 SaveContacts(contacts_to_save.Pass(), |
| 407 contact_ids_to_delete.Pass(), |
| 408 metadata_to_save.Pass(), |
| 409 false); |
| 410 LoadContacts(&loaded_contacts, &loaded_metadata); |
| 411 EXPECT_EQ(VarContactsToString(1, contact3.get()), |
| 412 ContactsToString(*loaded_contacts)); |
| 413 } |
| 414 |
| 305 } // namespace test | 415 } // namespace test |
| 306 } // namespace contacts | 416 } // namespace contacts |
| OLD | NEW |