/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at
* src/com/vodafone360/people/VODAFONE.LICENSE.txt or
* http://github.com/360/360-Engine-for-Android
* See the License for the specific language governing permissions and
* limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each file and
* include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the fields
* enclosed by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved.
* Use is subject to license terms.
*/
package com.vodafone360.people.tests.database;
import java.util.Hashtable;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.test.ApplicationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils;
import android.util.Log;
import com.vodafone360.people.MainApplication;
import com.vodafone360.people.database.tables.ContactDetailsTable;
import com.vodafone360.people.database.tables.ContactSummaryTable;
import com.vodafone360.people.datatypes.Contact;
import com.vodafone360.people.datatypes.ContactDetail;
import com.vodafone360.people.datatypes.ContactSummary;
import com.vodafone360.people.datatypes.VCardHelper;
import com.vodafone360.people.datatypes.ContactSummary.OnlineStatus;
import com.vodafone360.people.engine.meprofile.SyncMeDbUtils;
import com.vodafone360.people.engine.presence.User;
import com.vodafone360.people.service.ServiceStatus;
import com.vodafone360.people.tests.TestModule;
/**
* This class performs ContactSummaryTable tests.
*/
public class NowPlusContactSummaryTest extends ApplicationTestCase<MainApplication> {
private static String LOG_TAG = "NowPlusContactSummaryTest";
/**
* Helper module to generate test content.
*/
final TestModule mTestModule = new TestModule();
/**
* A simple test database.
*/
private TestDatabase mTestDatabase;
/**
* Constructor.
*/
public NowPlusContactSummaryTest() {
super(MainApplication.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
createApplication();
mTestDatabase = new TestDatabase(getContext());
}
@Override
protected void tearDown() throws Exception {
mTestDatabase.close();
getContext().deleteDatabase(TestDatabase.DATA_BASE_NAME);
// make sure to call it at the end of the method!
super.tearDown();
}
/**
* Tests the ContactSummaryTable creation.
*/
@SmallTest
public void testContactSummaryTableCreation() {
Log.i(LOG_TAG, "***** EXECUTING testContactSummaryTableCreation *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
}
/**
* Tests adding a contact to the contact summary table.
*/
@SmallTest
public void testAddingContactSummary() {
Log.i(LOG_TAG, "***** EXECUTING testAddingContactSummary *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
final Contact contact = mTestModule.createDummyContactData();
contact.localContactID = new Long(10);
ContactSummaryTable.addContact(contact, mTestDatabase.getWritableDatabase());
}
/**
* Tests fetching a contact summary.
*/
@SmallTest
public void testFetchingContactSummary() {
Log.i(LOG_TAG, "***** EXECUTING testFetchingContactSummary *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = mTestModule.createDummyContactData();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ContactSummaryTable.addContact(contact, mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Fetching a ContactSummary from ContactSummaryTable");
final ContactSummary contactSummary = new ContactSummary();
final ServiceStatus serviceStatus = ContactSummaryTable.fetchSummaryItem(
contact.localContactID, contactSummary, mTestDatabase.getReadableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
compareContactWithContactSummary(contact, contactSummary);
}
public void testSetAllUsersOffline() {
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = mTestModule.createDummyContactData();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ContactSummaryTable.addContact(contact, mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Fetching a ContactSummary from ContactSummaryTable");
final ContactSummary contactSummary = new ContactSummary();
final ServiceStatus serviceStatus = ContactSummaryTable.fetchSummaryItem(
contact.localContactID, contactSummary, mTestDatabase.getReadableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
compareContactWithContactSummary(contact, contactSummary);
// create a new user
Hashtable<String, String> status = new Hashtable<String, String>();
status.put("google", "online");
status.put("microsoft", "online");
status.put("mobile", "online");
status.put("pc", "online");
User user = new User("any", status);
user.setLocalContactId(contactSummary.localContactID);
// set him online
assertEquals(ServiceStatus.SUCCESS, ContactSummaryTable.updateOnlineStatus(user));
// fetch again
final ContactSummary contactSummary2 = new ContactSummary();
assertEquals(ServiceStatus.SUCCESS, ContactSummaryTable.fetchSummaryItem(user
.getLocalContactId(), contactSummary2, mTestDatabase.getReadableDatabase()));
// check if he's online
assertEquals(OnlineStatus.ONLINE, contactSummary2.onlineStatus);
// set offline
assertEquals(ServiceStatus.SUCCESS, ContactSummaryTable.setOfflineStatus());
// fetch again
final ContactSummary contactSummary3 = new ContactSummary();
assertEquals(ServiceStatus.SUCCESS, ContactSummaryTable.fetchSummaryItem(user
.getLocalContactId(), contactSummary3, mTestDatabase.getReadableDatabase()));
// check if it's offline
assertEquals(OnlineStatus.OFFLINE, contactSummary3.onlineStatus);
}
public void testUpdateOnlineStatus() {
Log.i(LOG_TAG, "***** EXECUTING testUpdateOnlineStatus() *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = mTestModule.createDummyContactData();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ContactSummaryTable.addContact(contact, mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Fetching a ContactSummary from ContactSummaryTable");
final ContactSummary contactSummary = new ContactSummary();
final ServiceStatus serviceStatus = ContactSummaryTable.fetchSummaryItem(
contact.localContactID, contactSummary, mTestDatabase.getReadableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
compareContactWithContactSummary(contact, contactSummary);
// create a new user
Hashtable<String, String> status = new Hashtable<String, String>();
status.put("google", "online");
status.put("microsoft", "online");
status.put("mobile", "online");
status.put("pc", "online");
User user = new User("any", status);
user.setLocalContactId(contactSummary.localContactID);
// set him online
assertEquals(ServiceStatus.SUCCESS, ContactSummaryTable.updateOnlineStatus(user));
// fetch again
final ContactSummary contactSummary2 = new ContactSummary();
assertEquals(ServiceStatus.SUCCESS, ContactSummaryTable.fetchSummaryItem(user
.getLocalContactId(), contactSummary2, mTestDatabase.getReadableDatabase()));
// check if he's online
assertEquals(OnlineStatus.ONLINE, contactSummary2.onlineStatus);
}
/**
* Tests removing a contact summary.
*/
@SmallTest
public void testRemovingContactSummary() {
Log.i(LOG_TAG, "***** EXECUTING testRemovingContactSummary *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = mTestModule.createDummyContactData();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ContactSummaryTable.addContact(contact, mTestDatabase.getWritableDatabase());
Log
.i(LOG_TAG,
"Fetching a ContactSummary from ContactSummaryTable to check that it exists");
ContactSummary contactSummary = new ContactSummary();
ServiceStatus serviceStatus = ContactSummaryTable.fetchSummaryItem(contact.localContactID,
contactSummary, mTestDatabase.getReadableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
Log.i(LOG_TAG, "Delete the contact from ContactSummaryTable");
serviceStatus = ContactSummaryTable.deleteContact(contact.localContactID, mTestDatabase
.getWritableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
Log
.i(
LOG_TAG,
"Try to fetching a ContactSummary from ContactSummaryTable to check that it is not possible anymore");
contactSummary = new ContactSummary();
serviceStatus = ContactSummaryTable.fetchSummaryItem(contact.localContactID,
contactSummary, mTestDatabase.getReadableDatabase());
assertTrue(ServiceStatus.SUCCESS != serviceStatus);
}
/**
* Tests modifying a contact summary.
*/
@SmallTest
public void testModifyingingContactSummary() {
Log.i(LOG_TAG, "***** EXECUTING testModifyingingContactSummary *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = mTestModule.createDummyContactData();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ContactSummaryTable.addContact(contact, mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Fetching a ContactSummary from ContactSummaryTable");
ContactSummary contactSummary = new ContactSummary();
ServiceStatus serviceStatus = ContactSummaryTable.fetchSummaryItem(contact.localContactID,
contactSummary, mTestDatabase.getReadableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
compareContactWithContactSummary(contact, contactSummary);
Log.i(LOG_TAG, "Modify a contact");
final Contact contact2 = copyContact(contact);
contact2.synctophone = !contact.synctophone;
serviceStatus = ContactSummaryTable.modifyContact(contact2, mTestDatabase
.getWritableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
Log.i(LOG_TAG, "Fetching a ContactSummary from ContactSummaryTable");
contactSummary = new ContactSummary();
serviceStatus = ContactSummaryTable.fetchSummaryItem(contact.localContactID,
contactSummary, mTestDatabase.getReadableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
// by doing so, we should get back to the original if it was correctly
// modified
contactSummary.synctophone = !contactSummary.synctophone;
compareContactWithContactSummary(contact, contactSummary);
}
/**
* Tests adding a contact detail to an existing contact.
*/
@SmallTest
public void testAddingContactDetails() {
Log.i(LOG_TAG, "***** EXECUTING testAddingContactDetails *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Create also a ContactDetailsTable");
ContactDetailsTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = mTestModule.createDummyContactData();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ContactSummaryTable.addContact(contact, mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact detail to the previous contact");
final ContactDetail contactDetail = new ContactDetail();
contactDetail.localContactID = contact.localContactID;
boolean isMe = false;
contactDetail.setEmail("test@example.com", ContactDetail.DetailKeyTypes.HOME);
assertEquals(getDisplayName(contact, isMe),
ContactSummaryTable.updateContactDisplayName(contact, mTestDatabase
.getWritableDatabase(), isMe));
}
/**
* Tests modifying a contact detail of an existing contact.
*/
@SmallTest
public void testModifyingContactDetails() {
Log.i(LOG_TAG, "***** EXECUTING testModifyingContactDetails *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Create also a ContactDetailsTable");
ContactDetailsTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = new Contact();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ServiceStatus serviceStatus = ContactSummaryTable.addContact(contact, mTestDatabase
.getWritableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
Log.i(LOG_TAG, "Add a contact detail to the previous contact");
ContactDetail contactDetail = new ContactDetail();
contactDetail.localContactID = contact.localContactID;
contactDetail.setEmail("toto@mail.co.uk", ContactDetail.DetailKeyTypes.HOME);
boolean isMe = false;
assertEquals(getDisplayName(contact, isMe),
ContactSummaryTable.updateContactDisplayName(contact, mTestDatabase
.getWritableDatabase(), isMe));
Log.i(LOG_TAG, "Modify a contact detail to the previous contact");
contactDetail = new ContactDetail();
contactDetail.localContactID = contact.localContactID;
final String eMail2 = "toto2@mail.co.uk";
contactDetail.setEmail(eMail2, ContactDetail.DetailKeyTypes.HOME);
assertEquals(getDisplayName(contact, isMe),
ContactSummaryTable.updateContactDisplayName(contact, mTestDatabase
.getWritableDatabase(), isMe));
}
/**
* Tests deleting a contact detail of an existing contact.
*/
@SmallTest
public void testDeletingContactDetails() {
Log.i(LOG_TAG, "***** EXECUTING testDeletingContactDetails *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Create also a ContactDetailsTable");
ContactDetailsTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = new Contact();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ServiceStatus serviceStatus = ContactSummaryTable.addContact(contact, mTestDatabase
.getWritableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
Log.i(LOG_TAG, "Add a contact detail to the previous contact");
ContactDetail contactDetail = new ContactDetail();
contactDetail.localContactID = contact.localContactID;
final String eMail = "toto@mail.co.uk";
contactDetail.setEmail(eMail, ContactDetail.DetailKeyTypes.HOME);
boolean isMe = false;
assertEquals(getDisplayName(contact, isMe),
ContactSummaryTable.updateContactDisplayName(contact, mTestDatabase
.getWritableDatabase(), isMe));
Log.i(LOG_TAG, "Delete a contact detail from the previous contact");
assertEquals(getDisplayName(contact, isMe),
ContactSummaryTable.updateContactDisplayName(contact, mTestDatabase
.getWritableDatabase(), isMe));
}
/**
* Tests updating a contact's display name.
*/
@SmallTest
public void testUpdateDisplayName() {
Log.i(LOG_TAG, "***** EXECUTING testtestUpdateDisplayName *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Create also a ContactDetailsTable");
ContactDetailsTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contact to ContactSummaryTable");
final Contact contact = new Contact();
contact.localContactID = new Long(10);
contact.nativeContactId = new Integer(11);
ServiceStatus serviceStatus = ContactSummaryTable.addContact(contact, mTestDatabase
.getWritableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
// Name
ContactDetail nameDetail = new ContactDetail();
nameDetail.localContactID = contact.localContactID;
VCardHelper.Name name = new VCardHelper.Name();
name.firstname = "John";
name.surname = "Doe";
nameDetail.setName(name);
// ORG
ContactDetail orgDetail = new ContactDetail();
nameDetail.localContactID = contact.localContactID;
VCardHelper.Organisation org = new VCardHelper.Organisation();
org.name = "VF";
org.unitNames.add("Dev");
orgDetail.setOrg(org, ContactDetail.DetailKeyTypes.WORK);
ContactDetail emailDetail = new ContactDetail();
emailDetail.localContactID = contact.localContactID;
emailDetail.setEmail("dev@vf.com", ContactDetail.DetailKeyTypes.WORK);
ContactDetail phoneDetail = new ContactDetail();
phoneDetail.localContactID = contact.localContactID;
phoneDetail.setTel("+123456789", ContactDetail.DetailKeyTypes.HOME);
contact.details.add(nameDetail);
contact.details.add(orgDetail);
contact.details.add(emailDetail);
contact.details.add(phoneDetail);
// Loop for number of details + 1
final int numLoopCycles = contact.details.size() + 1;
int loopCycles = numLoopCycles;
boolean isMe = false;
while(loopCycles-- > 0) {
assertEquals(getDisplayName(contact, isMe),
ContactSummaryTable.updateContactDisplayName(contact, mTestDatabase
.getWritableDatabase(), isMe));
if(contact.details.size() > 0) {
contact.details.remove(0);
}
}
final Contact meContact = new Contact();
meContact.localContactID = new Long(11);
meContact.nativeContactId = new Integer(12);
isMe = true;
Log.i(LOG_TAG, "Add me Contact to ContactSummaryTable");
serviceStatus = ContactSummaryTable.addContact(meContact, mTestDatabase
.getWritableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
meContact.details.add(nameDetail);
meContact.details.add(orgDetail);
meContact.details.add(emailDetail);
meContact.details.add(phoneDetail);
loopCycles = numLoopCycles;
while(loopCycles-- > 0) {
assertEquals(getDisplayName(contact, isMe),
ContactSummaryTable.updateContactDisplayName(contact, mTestDatabase
.getWritableDatabase(), isMe));
if(contact.details.size() > 0) {
contact.details.remove(0);
}
}
}
/**
* Tests fetching native contact IDs.
*/
@SmallTest
public void testFetchingNativeContactIDs() {
Log.i(LOG_TAG, "***** EXECUTING testFetchingNativeContactIDs *****");
Log.i(LOG_TAG, "Create ContactSummaryTable");
ContactSummaryTable.create(mTestDatabase.getWritableDatabase());
Log.i(LOG_TAG, "Add a contacts to ContactSummaryTable");
ServiceStatus serviceStatus;
for (int i = 0; i < 100; i++) {
final Contact contact = mTestModule.createDummyContactData();
contact.localContactID = new Long(i);
contact.nativeContactId = new Integer(i + 5);
serviceStatus = ContactSummaryTable.addContact(contact, mTestDatabase
.getWritableDatabase());
assertEquals(ServiceStatus.SUCCESS, serviceStatus);
}
Log.i(LOG_TAG, "Fetching native IDs");
final java.util.ArrayList<Integer> nativeIDsList = new java.util.ArrayList<Integer>();
ContactSummaryTable.fetchNativeContactIdList(nativeIDsList, mTestDatabase
.getReadableDatabase());
Log.i(LOG_TAG, "Check the native IDs");
int currentNativeID = 5;
for (Integer id : nativeIDsList) {
assertEquals(currentNativeID++, id.intValue());
}
}
// //////////////////////////////
// HELPER CLASSES AND METHODS //
// //////////////////////////////
/**
* A simple test database.
*/
private static class TestDatabase extends SQLiteOpenHelper {
public final static String DATA_BASE_NAME = "TEST_DB";
public TestDatabase(Context context) {
super(context, DATA_BASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
/**
* Compares a Contact summary with its original contact.
*
* @param contact the original contact
* @param contactSummary the contact summary
*/
private void compareContactWithContactSummary(Contact contact, ContactSummary contactSummary) {
assertNotNull(contact);
assertNotNull(contactSummary);
assertEquals(contact.friendOfMine.booleanValue(), contactSummary.friendOfMine);
assertEquals(contact.synctophone.booleanValue(), contactSummary.synctophone);
assertEquals(contact.localContactID, contactSummary.localContactID);
assertEquals(contact.nativeContactId, contactSummary.nativeContactId);
}
/**
* Creates a "light" copy of a Contact.
*
* @param contact the contact to copy
* @return the copy of the provided contact
*/
private Contact copyContact(Contact contact) {
final Contact newContact = new Contact();
// using Copy() but seems deprecated, may need to be changed later
// newContact.Copy(contact);
newContact.friendOfMine = contact.friendOfMine;
newContact.synctophone = contact.synctophone;
newContact.localContactID = contact.localContactID;
newContact.nativeContactId = contact.nativeContactId;
return newContact;
}
/**
* Simplified logic in comparison to the real code in ContactSummaryTable.getDisplayNameDetail
* and updateDisplayName which should behave the same way.
* @param contact The contact to search
* @param isMe Is the contact the me contact
* @return The retrieved displayName
*/
private static String getDisplayName(Contact contact, boolean isMe) {
ContactDetail name = null;
name = contact.getContactDetail(ContactDetail.DetailKeys.VCARD_NAME);
if(name != null && name.getName() != null) {
return name.getName().toString();
}
if(isMe) {
return SyncMeDbUtils.ME_PROFILE_DEFAULT_NAME;
}
name = contact.getContactDetail(ContactDetail.DetailKeys.VCARD_ORG);
if(name != null && !TextUtils.isEmpty(name.getValue())) {
return name.getValue();
}
name = contact.getContactDetail(ContactDetail.DetailKeys.VCARD_EMAIL);
if(name != null && !TextUtils.isEmpty(name.getValue())) {
return name.getValue();
}
name = contact.getContactDetail(ContactDetail.DetailKeys.VCARD_PHONE);
if(name != null && !TextUtils.isEmpty(name.getValue())) {
return name.getValue();
}
return ContactDetail.UNKNOWN_NAME;
}
}