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