15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/contacts/contact_map.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/contacts/contact.pb.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/contacts/contact_test_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace contacts { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContactMapTest, Merge) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContactMap map; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(map.empty()); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, map.size()); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a contact. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kContactId1 = "contact_id_1"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Contact> contact1(new Contact); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitContact(kContactId1, "1", false, contact1.get()); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Merge it into the map and check that it's stored. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScopedVector<Contact> > contacts_to_merge( 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ScopedVector<Contact>); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge->push_back(new Contact(*contact1)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.Merge(contacts_to_merge.Pass(), ContactMap::KEEP_DELETED_CONTACTS); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(map.empty()); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, map.size()); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(map.Find(kContactId1)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ContactMapToString(map), VarContactsToString(1, contact1.get())); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a second, deleted contact. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kContactId2 = "contact_id_2"; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Contact> contact2(new Contact); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitContact(kContactId2, "2", true, contact2.get()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Merge it into the map. Since we request keeping deleted contacts, the 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contact should be saved. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge.reset(new ScopedVector<Contact>); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge->push_back(new Contact(*contact2)); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.Merge(contacts_to_merge.Pass(), ContactMap::KEEP_DELETED_CONTACTS); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, map.size()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(map.Find(kContactId2)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ContactMapToString(map), 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VarContactsToString(2, contact1.get(), contact2.get())); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the first contact's update time and merge it into the map. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contact1->set_update_time(contact1->update_time() + 20); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge.reset(new ScopedVector<Contact>); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge->push_back(new Contact(*contact1)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.Merge(contacts_to_merge.Pass(), ContactMap::KEEP_DELETED_CONTACTS); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ContactMapToString(map), 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VarContactsToString(2, contact1.get(), contact2.get())); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another deleted contact. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kContactId3 = "contact_id_3"; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Contact> contact3(new Contact); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitContact(kContactId3, "3", true, contact3.get()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Merge it into the map with DROP_DELETED_CONTACTS. The contact shouldn't be 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // saved. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge.reset(new ScopedVector<Contact>); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge->push_back(new Contact(*contact3)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.Merge(contacts_to_merge.Pass(), ContactMap::DROP_DELETED_CONTACTS); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ContactMapToString(map), 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VarContactsToString(2, contact1.get(), contact2.get())); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark the first contact as being deleted and merge it with 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DROP_DELETED_CONTACTS. The previous version of the contact should also be 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removed. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contact1->set_deleted(true); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge.reset(new ScopedVector<Contact>); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge->push_back(new Contact(*contact1)); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.Merge(contacts_to_merge.Pass(), ContactMap::DROP_DELETED_CONTACTS); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ContactMapToString(map), VarContactsToString(1, contact2.get())); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.Clear(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(map.empty()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, map.size()); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContactMapTest, Erase) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContactMap map; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kContactId = "contact_id"; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Contact> contact(new Contact); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitContact(kContactId, "1", false, contact.get()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScopedVector<Contact> > contacts_to_merge( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ScopedVector<Contact>); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contacts_to_merge->push_back(new Contact(*contact)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.Merge(contacts_to_merge.Pass(), ContactMap::KEEP_DELETED_CONTACTS); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(map.Find(kContactId)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map.Erase(kContactId); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(map.Find(kContactId)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(map.empty()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace contacts 106