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

Side by Side Diff: chrome/browser/chromeos/contacts/contact_database_unittest.cc

Issue 10933127: contacts: Don't save deleted contacts to disk. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge Created 8 years, 2 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 | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698