phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/CustomLabelUid.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/CustomLabelUid.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,489 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @publishedAll
+ @released
+*/
+
+#include <e32panic.h>
+#include <test/testexecutelog.h>
+#include <cntfldst.h>
+#include "CustomLabelUid.h"
+#include "ClientServer.h"
+
+_LIT(KRun1,"Uids");
+_LIT(KRun2,"Labels");
+_LIT(KRun3,"LabelsUids");
+_LIT(KRun4,"LabelsUidsPlus");
+_LIT(KRun5,"DuplicateUids");
+_LIT(KRun6,"DuplicateExistingUids");
+_LIT(KRun7,"UniqueExistingUids");
+
+_LIT(KTest1,"Testing custom uids...");
+_LIT(KTest2,"Testing custom labels...");
+_LIT(KTest3,"Testing custom labels and uids...");
+_LIT(KTest4,"Testing custom labels and uids plus new fields...");
+_LIT(KTest5,"Testing Duplicate custom and exisiting Uids");
+_LIT(KTest6,"Testing Duplicate  exisiting Uids");
+_LIT(KTest7,"Testing Unique  exisiting Uids");
+
+_LIT(KEnter,"In Test Step");
+
+
+CCustomLabelUid::CCustomLabelUid() : 
+			CCntBaseStep( 1 )//Number of contacts to be used by this step
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(SharedConstants::KCustomLabelUid);
+	}
+
+TVerdict CCustomLabelUid::doTestStepL()
+	{
+	
+	__UHEAP_MARK;
+
+	INFO_PRINTF1(KEnter);
+	InitializeL();
+	iIterate->Reset();
+	
+	const TDesC &run = ConfigSection();
+	
+	if( run == KRun1 )
+		{
+		INFO_PRINTF1(KTest1);
+		TestCustomUidsL(iIterate->NextL() );
+		}
+	else if( run == KRun2 )
+		{
+		INFO_PRINTF1(KTest2);
+		TestCustomLabelsL( iIterate->NextL() );
+		}
+	else if( run == KRun3 )
+		{
+		INFO_PRINTF1(KTest3);
+		TestCustomUidLabelsL(iIterate->NextL(), EFalse);
+		}
+	else if( run == KRun4 )
+		{
+		INFO_PRINTF1(KTest4);
+		TestCustomUidLabelsL(iIterate->NextL(), ETrue);
+		}
+	else if( run == KRun5 )
+		{
+		INFO_PRINTF1(KTest5);
+		DuplicateUidsTestL( iIterate->NextL() );
+		}
+	else if( run == KRun6 )
+		{
+		INFO_PRINTF1(KTest6);
+		ExistingUidsTestL( EDuplicateUids );
+		}
+	else if( run == KRun7 )
+		{
+		INFO_PRINTF1(KTest7);
+		ExistingUidsTestL( EUniqueUids );
+		}
+	else
+		{
+		MissngTestPanic();
+		}
+	Cleanup();
+	__UHEAP_MARKEND;
+	
+	return TestStepResult();
+	}
+	
+/**
+Test: opens contact item, and adds a custom uid to each field, 
+then checks if uid was stored correctly
+*/
+void CCustomLabelUid::TestCustomUidsL( const TContactItemId aCid )
+	{
+	//open contact	
+	CContactItem *contactItem = NULL;
+	contactItem = iContactsDatabase->OpenContactLX(aCid,*iViewAll);
+	CleanupStack::PushL(contactItem);
+	CContactItemFieldSet *ContactFields = &(contactItem->CardFields());
+	
+	//add an extra (custom) uid to each fieldtype of this contact
+	AddUIDsL(*ContactFields,TestConstants::KInitialUID);
+
+	//populate contact fields
+	SetContactFieldsL(*contactItem);
+	//update contact
+	iContactsDatabase->CommitContactL(*contactItem);
+	
+	CleanupStack::PopAndDestroy(contactItem);
+	CleanupStack::Pop();//lock
+	contactItem = NULL;
+	
+	//read contact item
+	contactItem = iContactsDatabase->ReadContactLC(aCid,*iViewAll);
+	ContactFields = &(contactItem->CardFields());
+	//check that contact field uids updated correctly
+	SINGLECOMPARE( CheckUIDsL(*ContactFields,TestConstants::KInitialUID), 0 ,0 );
+	//check that contact fields updated correctly
+	SINGLECOMPARE( CheckContactFieldsL(*contactItem), 0, 0 );
+	
+	CleanupStack::PopAndDestroy(contactItem);
+	}
+
+
+/**
+Test: opens contact item, add two identical uids to each field, 
+alternating between custom and existing uids, 
+then checks if uids were stored correctly
+*/
+void CCustomLabelUid::DuplicateUidsTestL( const TContactItemId aCid )
+	{	
+	//open contact	
+	CContactItem *contactItem = NULL;
+	contactItem = iContactsDatabase->OpenContactLX(aCid,*iViewAll);
+	CleanupStack::PushL(contactItem);
+	CContactItemFieldSet *contactFields = &(contactItem->CardFields());
+	
+	//add two identical uids to each field, alternating between custom and existing uids
+	const TInt KFieldsCount = contactFields->Count();
+	TInt error = KErrNone;
+
+
+	//add duplicate custom uids
+	CContactItemField *contactField1 = CContactItemField::NewL(KStorageTypeText);
+	CleanupStack::PushL(contactField1);
+	contactField1->SetTemplateField(EFalse);
+	TRAP( error, contactField1->AddFieldTypeL( TFieldType::Uid(TestConstants::KInitialUID) ));
+	INTCOMPARE( KErrNone, ==, error, 0, 0 );
+	TRAP( error, contactField1->AddFieldTypeL( TFieldType::Uid(TestConstants::KInitialUID) ));
+	INTCOMPARE( KErrNone, ==, error, 0, 0 );
+	contactItem->AddFieldL(*contactField1);
+	CleanupStack::Pop(contactField1);
+	
+	//add duplicate existing uids
+	CContactItemField *contactField2 = CContactItemField::NewL(KStorageTypeText);
+	CleanupStack::PushL(contactField2);
+	contactField2->SetTemplateField(EFalse);
+	TRAP( error, contactField2->AddFieldTypeL(KUidContactFieldAdditionalName));
+	INTCOMPARE( KErrNone, ==, error, 1, 0 );
+	TRAP( error, contactField2->AddFieldTypeL(KUidContactFieldAdditionalName));
+	INTCOMPARE( KErrNone, ==, error, 1, 0 );
+	contactItem->AddFieldL(*contactField2);
+	CleanupStack::Pop(contactField2);
+
+
+	//populate contact fields
+	SetContactFieldsL(*contactItem);
+	//update contact
+	iContactsDatabase->CommitContactL(*contactItem);
+	
+	
+	CleanupStack::PopAndDestroy(contactItem);
+	CleanupStack::Pop();//lock
+	contactItem = NULL;
+	
+	//read contact item
+	contactItem = iContactsDatabase->ReadContactLC(aCid,*iViewAll);
+	contactFields = &(contactItem->CardFields());
+	//check that contact field uids updated correctly
+	
+	const TInt KReadFieldsCount = contactFields->Count();
+	const CContentType *KContentType = NULL;
+	INTCOMPARE( KReadFieldsCount, >, 0, 0, 0 );
+
+	KContentType = &(*contactFields)[KFieldsCount].ContentType();
+	SINGLECOMPARE( KContentType->ContainsFieldType( TFieldType::Uid(TestConstants::KInitialUID) ), KFieldsCount,0 );
+	
+	KContentType = &(*contactFields)[KFieldsCount+1].ContentType();
+	SINGLECOMPARE( KContentType->ContainsFieldType(KUidContactFieldAdditionalName), KFieldsCount+1,0 );
+
+	//check that contact fields updated correctly
+	SINGLECOMPARE( CheckContactFieldsL(*contactItem), 0, 0 );
+
+	CleanupStack::PopAndDestroy(contactItem);
+	}
+
+/**
+Add new contact
+Add new uid to each field that doesnt already contain that uid (EUniqueUids)
+Add new uid to each field that already contains that uid (EDuplicateUids)
+populate contact
+set custom labels
+check that all fields contain the additional uid (EUniqueUids)
+check that contact was populated correctly
+check that field lables were updated correctly
+*/
+void CCustomLabelUid::ExistingUidsTestL( const TUidTypeTest aTestType )
+	{	
+	/* Limitations (exceptions) to Test
+	It is not possible to add Uids to all fields and expect to store and re-read them.
+	This is because:
+	i) Template matching (CContactItemFieldSet::MatchTemplateField) means that if a field matches a 
+	template field, the additional Uids are lost
+	ii) Fast access fields must be text fields
+	iii) Other curious combinations of Uids seem to never have been supported (e.g. Unused Name and Additional Name)
+	*/
+	const TUid KFastAccessFieldUids[] = 
+		{
+		KUidContactFieldGivenNameValue, 
+		KUidContactFieldFamilyNameValue,
+		KUidContactFieldCompanyNameValue,
+		KUidContactFieldGivenNamePronunciationValue,
+		KUidContactFieldFamilyNamePronunciationValue,
+		KUidContactFieldCompanyNamePronunciationValue
+		};
+	
+	const TInt KUidsCount = iExistingUidsArray->Count();
+	CContactCard* contact = CContactCard::NewLC(iTemplate);
+	
+	for(TInt i = 0; i < KUidsCount; ++i ) 
+		{
+		const TFieldType KFieldType = TFieldType::Uid( (*iExistingUidsArray)[i] );
+				
+		TBool found = EFalse;
+		for (TInt nameFieldNum = 0; nameFieldNum < sizeof(KFastAccessFieldUids) / sizeof(TInt); ++nameFieldNum)
+			{
+			if (KFieldType == (KFastAccessFieldUids[nameFieldNum]))
+				{
+				found = ETrue;
+				}	
+			}
+			
+		found = found || KFieldType == KUidContactFieldVCardMapSIPID;
+		found = found || KFieldType == KUidContactFieldTemplateLabel;
+		found = found || KFieldType == KUidContactFieldVCardMapUnusedN;
+		found = found || KFieldType == KUidContactFieldVCardMapTEL;
+		
+		if (found)
+			{
+			continue;	
+			}
+		
+		TContactItemId contactId = KNullContactId;
+		contactId = iContactsDatabase->AddNewContactL( *contact );
+		
+		//open contact	
+		CContactItem *contactItem = NULL;
+		contactItem = iContactsDatabase->OpenContactLX(contactId,*iViewAll);
+		CleanupStack::PushL(contactItem);
+		CContactItemFieldSet &contactFields = contactItem->CardFields();
+		
+		const TInt KFieldsCount = contactFields.Count();
+		
+		for( TInt j = 0; j < KFieldsCount; ++j )
+			{		
+			const CContentType &KContentType = contactFields[j].ContentType();
+			
+			// don't add phone/email/SIP UIDs to non-text fields
+			if ((KFieldType == KUidContactFieldEMail ||
+				KFieldType == KUidContactFieldPhoneNumber ||
+				KFieldType == KUidContactFieldFax ||
+				KFieldType == KUidContactFieldSms) && contactFields[j].StorageType() != KStorageTypeText)
+				{
+				continue;	
+				}		
+			
+			//if testing duplicate uids and uid is present in contact field add uid
+			// if testing unique uids and uid is not presnt in contact field add uid
+			if( (aTestType == EDuplicateUids) && KContentType.ContainsFieldType( KFieldType ) )
+				{
+				contactFields[j].AddFieldTypeL( KFieldType );
+				}
+			else if( (aTestType == EUniqueUids) && !KContentType.ContainsFieldType( KFieldType ) )	
+				{
+				contactFields[j].AddFieldTypeL( KFieldType );
+				}
+				
+			}
+		
+		//populate contact fields
+		SetContactFieldsL(*contactItem);
+		//setlabels of contact field to custom values
+		SetContactLabelsL(*contactItem);
+		
+		iContactsDatabase->CommitContactL(*contactItem);
+		CleanupStack::PopAndDestroy(contactItem);
+		CleanupStack::Pop();//lock		
+		
+		//read contact item
+		contactItem = iContactsDatabase->ReadContactLC(contactId,*iViewAll);
+		CContactItemFieldSet &readContactFields = contactItem->CardFields();	
+		
+		//check that contact field uids updated correctly
+		const TInt KReadFieldsCount = readContactFields.Count();
+		INTCOMPARE( KReadFieldsCount, >, 0, i, 0 );
+		
+		if( (aTestType == EUniqueUids) )
+			{
+			//check that each fields contains at least one instance of the existing uid
+			// (except the fast access fields)
+			for( TInt k = 0; k < KReadFieldsCount; ++k )
+				{
+				TBool found = EFalse;
+				const CContentType &KContentType = readContactFields[k].ContentType();
+			
+				for (TInt nameFieldNum = 0; nameFieldNum < sizeof(KFastAccessFieldUids) / sizeof(TInt); ++nameFieldNum)
+				{
+				if (KContentType.ContainsFieldType(KFastAccessFieldUids[nameFieldNum]))
+				    {
+					found = ETrue;
+					}
+				}
+	
+				if (found)
+					{
+					continue;	
+					}
+				
+				// The behaviour of CContactItemFieldSet::MatchTemplateField has changed
+				// add an extra UID in this case to avoid a template match (and loss of the added UID)
+				if (KContentType.ContainsFieldType(KUidContactFieldVCardMapSIPID))
+					{
+					continue;
+					}
+
+				if (KContentType.ContainsFieldType(KUidContactFieldVCardMapTEL))
+					{
+					continue;
+					}
+		
+				// some combinations of UID to Field Type are not supported		
+				if (KContentType.ContainsFieldType(KUidContactFieldVCardMapUnusedN) 
+				    && (KFieldType == KUidContactFieldAdditionalName || 
+				        KFieldType == KUidContactFieldSuffixName ||  
+				        KFieldType == KUidContactFieldPrefixName))		
+					{
+					continue;
+					}	
+								
+				// don't check phone/email/SIP UIDs to non-text fields
+				if ((KFieldType == KUidContactFieldEMail ||
+					KFieldType == KUidContactFieldPhoneNumber ||
+					KFieldType == KUidContactFieldFax ||
+					KFieldType == KUidContactFieldSms) && contactFields[k].StorageType() != KStorageTypeText)
+					{
+					continue;	
+					}						
+				SINGLECOMPARE( KContentType.ContainsFieldType( KFieldType ), i, k );
+				}
+			}
+			
+		//check that contact fields updated correctly
+		SINGLECOMPARE( CheckContactFieldsL(*contactItem),i,0 );
+		
+		//check that contact field labels were updated correctly
+		SINGLECOMPARE( CheckContactLabelsL(*contactItem),i,0 );
+		
+		CleanupStack::PopAndDestroy(contactItem);	
+		iContactsDatabase->DeleteContactL( contactId );
+		}
+	CleanupStack::PopAndDestroy( contact );
+	}
+
+	
+/**
+opens contact item, and changes the label of each field to a custom label, then checks 
+if label was stored correctly
+*/
+void CCustomLabelUid::TestCustomLabelsL( const TContactItemId aCid )
+	{
+	//open contact item
+	CContactItem *contactItem = NULL;
+	contactItem = iContactsDatabase->OpenContactLX(aCid,*iViewAll);
+	CleanupStack::PushL(contactItem);
+	
+	//setlabels of contact field to custom values
+	SetContactLabelsL(*contactItem);
+	//populate cotnact fields and update
+	SetContactFieldsL(*contactItem);
+	iContactsDatabase->CommitContactL(*contactItem);
+	
+	CleanupStack::PopAndDestroy(contactItem);
+	CleanupStack::Pop();//lock record
+	
+	//read contact
+	contactItem = NULL;
+	contactItem = iContactsDatabase->ReadContactLC(aCid,*iViewAll);
+	
+	//check that contact field labels were updated correctly
+	SINGLECOMPARE( CheckContactLabelsL(*contactItem),0,0 );
+	
+	//check that fields updated correctly
+	SINGLECOMPARE( CheckContactFieldsL(*contactItem),0,0 );
+	
+	CleanupStack::PopAndDestroy(contactItem);
+	}
+	
+/**
+this function encompasses two tests
+Test1(!aNewFields) opens contact item, and adds a custom uid to each field, changes lable to custom label
+then checks if uid and label were stored correctly
+Test2(aNewFields) opens contact item and adds ten new fields, and adds a custom uid to 
+each field(new and old), changes lable to custom label then checks if uid and 
+label were stored correctly. also checks both uids of new fields
+*/
+void CCustomLabelUid::TestCustomUidLabelsL( const TContactItemId aCid, const TBool aNewFields )
+	{
+	CContactItem *contactItem = NULL;
+	//open contact
+	contactItem = iContactsDatabase->OpenContactLX(aCid,*iViewAll);
+	CleanupStack::PushL(contactItem);
+	CContactItemFieldSet *ContactFields = &(contactItem->CardFields());
+		
+	if(aNewFields)
+		{
+		TInt length = 10;//add 10 new custom fields
+		for(TInt i = 0, uids = TestConstants::KAltUID; i < length; i++, uids++)
+			{
+			AddNewFieldL( *ContactFields, TestConstants::KShortString, TFieldType::Uid(uids) );
+			}
+		}
+	//set custom labels for contact fields	
+	SetContactLabelsL(*contactItem);
+	//set custom uids for contact fields
+	AddUIDsL(*ContactFields,TestConstants::KInitialUID);
+	//populate contact fields and update
+	SetContactFieldsL(*contactItem);
+	iContactsDatabase->CommitContactL(*contactItem);
+	
+	CleanupStack::PopAndDestroy(contactItem);
+	CleanupStack::Pop();//lock
+	
+	//read contact
+	contactItem = NULL;
+	contactItem = iContactsDatabase->ReadContactLC(aCid,*iViewAll);
+	ContactFields = &(contactItem->CardFields());
+	
+	//check uids were update correctly
+	SINGLECOMPARE( CheckUIDsL(*ContactFields,TestConstants::KInitialUID),0,0 );
+	//check labels were update correctly
+	SINGLECOMPARE( CheckContactLabelsL(*contactItem),0,0 );
+	//check fields were populated correctly
+	SINGLECOMPARE( CheckContactFieldsL(*contactItem),0,0 );
+	
+	if(aNewFields)
+		{
+		//check that new fields contain the correct uids(2), initial and updated custom values
+		TInt length = ContactFields->Count();
+		TInt i = ContactFields->Find( TFieldType::Uid(TestConstants::KAltUID) );
+		for(TInt uids = TestConstants::KAltUID; i < length; i++, uids++)
+			{
+			SINGLECOMPARE( CheckNewFieldL( *ContactFields, i, TFieldType::Uid(uids) ), i, 0);
+			}
+		}		
+	CleanupStack::PopAndDestroy(contactItem);
+	}
+
+