phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/AccessCountTests.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/AccessCountTests.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,539 @@
+// 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 <test/testexecutelog.h>
+#include <cntfldst.h>
+#include "ClientServer.h"
+#include "AccessCountTests.h"
+
+_LIT(KRun1,"DeleteAccessed");
+_LIT(KRun2,"ForwardDeletion");
+_LIT(KRun3,"ReverseDeletion");
+_LIT(KRun4,"AgentGetSet");
+_LIT(KRun5,"AgentAccess");
+_LIT(KRun6,"AgentImportExport");
+
+_LIT(KTest1,"Testing deletion of contacts with access count > 0...");
+_LIT(KTest2,"Testing agent fields and forward deletion of items with those fields...");
+_LIT(KTest3,"Testing agent fields and reverse deletion of items with those fields...");
+_LIT(KTest4,"Agent retrieve and set test...");
+_LIT(KTest5,"Agent access count test...");
+_LIT(KTest6,"Agent import/export access count test...");
+
+_LIT(KVcardFile,"c:\\ExportedContacts.vcf");
+_LIT(KAgentValue,"Agent value: %d");
+
+//Number of contacts
+CAccessCountTests::CAccessCountTests(CCntPerfServer &aParent):CCntBaseStep(30, aParent)
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(SharedConstants::KAccessCountTests);
+	}
+
+void CAccessCountTests::PreTestL()
+	{
+	User::LeaveIfError( iParent->Fs().Connect() );
+	}
+
+TVerdict CAccessCountTests::doTestStepL()
+	{
+	
+	__UHEAP_MARK;
+
+	InitializeL();
+	iIterate->Reset();
+	
+	const TDesC &run = ConfigSection();
+	
+	if( run == KRun1 )
+		{
+		INFO_PRINTF1(KTest1);
+		AccessCountTestL( iIterate->NextL() );
+		}
+	else if( run == KRun2 )
+		{
+		INFO_PRINTF1(KTest2);
+		ForwardAgentDeletionTestL( 10 );
+		}
+	else if( run == KRun3 )
+		{
+		INFO_PRINTF1(KTest3);
+		ReverseAgentDeletionTestL( 10 );
+		}
+	else if( run == KRun4 )
+		{
+		INFO_PRINTF1(KTest4);
+		AddGetAgentTestL(iIterate->NextL());
+		}
+	else if( run == KRun5 )
+		{
+		INFO_PRINTF1(KTest5);
+		AgentAccessCountTestL();
+		}
+	else if( run == KRun6 )
+		{
+		INFO_PRINTF1(KTest6);
+		AgentExportImportAccessTestL();
+		}
+	else
+		{
+		MissngTestPanic();
+		}
+	Cleanup();
+	__UHEAP_MARKEND;
+
+	
+	return TestStepResult();
+	}
+
+/**
+open acid, increase access count to 1, attempt to delete contact, check that it has
+not been deleted, set access count to 0, delete, and check that it has been deleted.
+*/
+void CAccessCountTests::AccessCountTestL(const TContactItemId aCid)
+	{
+	TInt err = KErrNone;
+	static const TInt KAccessCount = 1;//increase access count of contact by 1, 
+										
+	TInt i = 0;
+	
+	OpenL(aCid,*iViewAll);
+	SetContactFieldsL(*iContactItem);
+	for(i = 0; i < KAccessCount; ++i )
+		{
+		iContactItem->IncAccessCount();
+		}
+	CommitL();
+	
+	ReadL(aCid, *iViewAll);
+	const TInt KInitialAccessCount = iContactItem->AccessCount();//facount
+	const TInt KInitialFieldCount = iFields->Count(); //fcount
+	const TInt KInitialEmptyFields = CountEmpty(*iFields);//fhcount
+	Close();
+	
+	INTCOMPARE(  KInitialEmptyFields , ==,  0 , 0, 0 );
+	INTCOMPARE(  KInitialFieldCount , >,  0 , 0, 0 );
+	
+	for(i = 0; i < KAccessCount; ++i )
+		{
+		iContactsDatabase->DeleteContactL(aCid);
+		}
+		
+	ReadL(aCid,*iViewAll);
+	const TInt KModifiedAccessCount = iContactItem->AccessCount();//dacount
+	const TInt KModifiedFieldCount 	= iFields->Count();//dcount
+	const TInt KModifiedEmptyFields = CountEmpty(*iFields);//dHcount
+	Close();
+	
+	/*
+	check that deleting a contact doesnt modify its access count
+	check that deleting a contact with access count > 1, 
+	deletes all fields associated with contact but not the contact item itself
+	*/
+	INTCOMPARE(  KModifiedAccessCount , ==,  KInitialAccessCount , 0, 0 ); 
+	INTCOMPARE(  KInitialFieldCount , ==,  KModifiedFieldCount , 0, 0 );
+	INTCOMPARE(  KModifiedEmptyFields , ==,  KInitialFieldCount , 0, 0 ); 
+	INTCOMPARE(  KModifiedFieldCount , ==,  KModifiedEmptyFields , 0, 0 );
+	
+	OpenL(aCid,*iViewAll);
+	for(i = 0; i < KAccessCount; ++i )
+		{
+		iContactItem->DecAccessCount();
+		}
+	const TInt lAcount = iContactItem->AccessCount();
+	CommitL();
+	
+	INTCOMPARE( lAcount , ==,  0, 0, 0 );
+	
+	TRAP( err, ReadL(aCid, *iViewAll) );
+	Close();
+	
+	INTCOMPARE(  err , ==,  KErrNotFound , 0, 0 );
+	}
+
+/*
+test that contactitems can be delete successfull irregardless of the contents of their agent value
+*/
+void CAccessCountTests::ReverseAgentDeletionTestL(const TInt aNumContacts)
+	{
+	TContactItemId PreviousContactId = -1;
+	TContactItemId CurrentContactId = iIterate->NextL();
+	TInt i = 0;
+	TInt err = KErrNone;
+	
+	for(; i < aNumContacts; ++i)
+		{
+		PreviousContactId = CurrentContactId;
+		CurrentContactId = iIterate->NextL();
+		//open contact item
+		OpenL(CurrentContactId, *iViewAll);
+		//add agent field and set to previous contact id
+		AddAgentFieldL(PreviousContactId);
+		CommitL();
+		//print agent values useful for debugging
+		INFO_PRINTF2(KAgentValue, GetAgentFieldL(CurrentContactId) );
+		}
+
+	//attempt to delete contacts starting from last contact to frist contact
+	TBool DeleteSuccess = EFalse;
+	for(i = aNumContacts ; i > 0 ; --i)
+		{
+		//attempt to delete contact
+		iContactsDatabase->DeleteContactL(CurrentContactId);
+		//remove contact id from iterator
+		iIterate->RemoveL(CurrentContactId);
+		//attempt to read deleted contact
+		TRAP( err, ReadL(CurrentContactId, *iViewAll) );
+		Close();
+		//fail test if contact is still present
+		DeleteSuccess = INTCOMPARE( err, ==, KErrNotFound, i, 0 );
+		CurrentContactId = iIterate->PreviousL();
+		if( ! DeleteSuccess )
+			{
+			break;
+			}
+		}
+	//if test fails
+	if( ! DeleteSuccess )
+		{
+		//remove rest of contacts from iterator
+		for(; i > 0 ; --i)
+			{
+			iIterate->RemoveL(CurrentContactId);
+			CurrentContactId = iIterate->PreviousL();
+			}
+		}
+	}
+
+/*
+test that contactitems can be deleted successfully irregardless of the contents of their agent value
+*/
+void CAccessCountTests::ForwardAgentDeletionTestL(const TInt aNumContacts)
+	{
+	TBool DeleteSuccess = EFalse;
+	TContactItemId PreviousContactId = -1;
+	TContactItemId CurrentContactId = iIterate->NextL();
+	TInt err = KErrNone;
+	TInt i = 0;
+	
+	for(; i < aNumContacts; ++i)
+		{
+		PreviousContactId = CurrentContactId;
+		CurrentContactId = iIterate->NextL();
+		//open contact item
+		OpenL(CurrentContactId, *iViewAll);
+		//add agent field and set to previous contact id
+		AddAgentFieldL(PreviousContactId);
+		CommitL();
+		//print agent values useful for debugging
+		INFO_PRINTF2(KAgentValue, GetAgentFieldL(CurrentContactId) );
+		}
+	
+	//move iterator to start first contact in list
+	for( i = 0 ; i < aNumContacts; ++i )
+		{
+		CurrentContactId = iIterate->PreviousL();
+		}
+	
+	//attempt to delete contacts starting from first contact to last contact
+	for( i = 0 ; i < aNumContacts ; ++i )
+		{
+		//attempt to delete contact
+		iContactsDatabase->DeleteContactL(CurrentContactId);
+		//attempt to read deleted contact
+		TRAP( err, ReadL(CurrentContactId, *iViewAll) );
+		Close();
+		//fail test if contact is still present
+		DeleteSuccess = INTCOMPARE( err, ==, KErrNotFound , i, 0 );
+		CurrentContactId = iIterate->NextL();
+		if( ! DeleteSuccess )
+			{
+			break;
+			}
+		}
+	//if test fails
+	if(!DeleteSuccess)
+		{
+		//remove rest of contacts from iterator
+		const TInt end = i + 1;
+		for(i = 0 ; i < end ; ++i)
+			{
+			iIterate->RemoveL(CurrentContactId);
+			CurrentContactId = iIterate->PreviousL();
+			}
+		CurrentContactId = iIterate->NextL();
+		for(i = end ; i < aNumContacts ; ++i)
+			{
+			iIterate->RemoveL(CurrentContactId);
+			CurrentContactId = iIterate->CurrentL();
+			}
+		}
+	}
+
+/**
+* Open aCid, add agent field, set value of agent field, and get value of agent.
+* Check this is correct, repeat this for minint, 0, 1, Maxint. Setting the 
+* agent id should only accept values > 0, all other values are ignored.
+*/
+void CAccessCountTests::AddGetAgentTestL(const TContactItemId aCid)
+	{
+	TContactItemId retrievedAgentId = -1;
+	const TInt KInitialAgentId = 5;
+	
+	OpenL(aCid,*iViewAll);
+	AddAgentFieldL( KInitialAgentId );
+	CommitL();
+	
+	TRAPD( error, SetAgentFieldL( aCid, KMinTInt ) );
+	INTCOMPARE(  error , ==,  KErrNone , 0, 0 );
+	retrievedAgentId = GetAgentFieldL( aCid );
+	INTCOMPARE(  retrievedAgentId , ==,  KInitialAgentId , 0, 0 );
+	
+	TRAP( error, SetAgentFieldL( aCid, -1 ) );
+	INTCOMPARE(  error , ==,  KErrNone , 0, 0 );
+	retrievedAgentId = GetAgentFieldL( aCid );
+	INTCOMPARE(  retrievedAgentId , ==,  KInitialAgentId , 0, 0 );
+	
+	TRAP( error, SetAgentFieldL( aCid, 0 ) );
+	INTCOMPARE(  error , ==,  KErrNone , 0, 0 );
+	retrievedAgentId = GetAgentFieldL( aCid );
+	INTCOMPARE(  retrievedAgentId , ==,  KInitialAgentId , 0, 0 );
+
+	TRAP( error, SetAgentFieldL( aCid, 1 ) );
+	INTCOMPARE(  error , ==,  KErrNone , 0, 0 );
+	retrievedAgentId = GetAgentFieldL( aCid );
+	INTCOMPARE(  retrievedAgentId , ==,  1 , 0, 0 );
+	
+	TRAP( error, SetAgentFieldL( aCid, KMaxTInt ) );
+	INTCOMPARE(  error , ==,  KErrNone , 0, 0 );
+	retrievedAgentId = GetAgentFieldL( aCid );
+	INTCOMPARE(  retrievedAgentId , ==,  KMaxTInt , 0, 0 );
+	}
+
+/**
+add agent field to contact b, set value of agent in b to id of contact a.
+check that agent field is retrieved/stored correctly, check that access count is
+not modified for either contact
+*/	
+void CAccessCountTests::AgentAccessCountTestL()
+	{
+	TContactItemId RetrievedAgentId = -1;
+	TContactItemId PreviousContactId = iIterate->NextL();//contact a
+	TContactItemId CurrentContactId = iIterate->NextL();//contact b
+	
+	//open current contact
+	OpenL(CurrentContactId,*iViewAll);
+	//add new agent field, set to previous contact id
+	AddAgentFieldL(PreviousContactId);
+	CommitL();
+	
+	//get agent id store for current contact
+	RetrievedAgentId = GetAgentFieldL(CurrentContactId);
+	
+	//get access count of current contact
+	ReadL(CurrentContactId, *iViewAll);
+	const TInt KCurrentContactAccessCount = iContactItem->AccessCount();
+	Close();
+	
+	//get access count of previous contact
+	ReadL(PreviousContactId, *iViewAll);
+	const TInt KPreviousContactAccessCount = iContactItem->AccessCount();
+	Close();
+	
+	//check that retrieved agent id equals previous contact id
+	INTCOMPARE( RetrievedAgentId , ==,  PreviousContactId, 0, 0 );
+	//check that changing the agent field values doesnt not affect the access count
+	//of involved contacts
+	INTCOMPARE( KCurrentContactAccessCount , ==,  0, 0, 0 ); 
+	INTCOMPARE( KPreviousContactAccessCount , ==,  0, 0, 0 );
+	}
+
+/**
+add agent field to contact b. set value of agent to contact a.
+export contacts a & b. check access count for a & b(should be 0), 
+check value of agent(should equal b) open contact b, delete all fields.
+commit. import contacts a and b. check that agent field is not imported.
+*/
+void CAccessCountTests::AgentExportImportAccessTestL()
+	{
+	const TContactItemId KFirstContactId = iIterate->NextL();//contact a
+	const TContactItemId KSecondContactId = iIterate->NextL();//contact b
+	
+	//open contact a and populate all fields
+	OpenL(KFirstContactId, *iViewAll);
+	SetContactFieldsL(*iContactItem);
+	CommitL();
+	
+	//open contact b
+	OpenL(KSecondContactId,*iViewAll);
+	//populate all fields
+	SetContactFieldsL(*iContactItem);
+	//add contact a id as an agent field value
+	AddAgentFieldL(KFirstContactId);
+	CommitL();
+	
+	CContactIdArray *ArrayOfExportedContactIds = CContactIdArray::NewLC();
+	//set contact a and b to be export
+	ArrayOfExportedContactIds->AddL(KFirstContactId);
+	ArrayOfExportedContactIds->AddL(KSecondContactId);
+	
+	//export contact a & b
+	ExportVcardL(*ArrayOfExportedContactIds);
+	
+	const TInt KFirstContactAccessCountAfterExport = GetAccessCountL(KFirstContactId);
+	const TInt KSecondContactAccessCountAfterExport = GetAccessCountL(KSecondContactId);
+	const TInt KSecondContactAgentFieldAfterExport = GetAgentFieldL(KSecondContactId);
+	CleanupStack::PopAndDestroy(ArrayOfExportedContactIds);
+	
+	//delete all fields from contact b
+	OpenL(KSecondContactId,*iViewAll);
+	iFields->Reset();
+	CommitL();
+	
+	//import exported contacts
+	ImportVcardL();
+	
+	const TInt KFirstContactAccessCountAfterImport = GetAccessCountL(KFirstContactId);
+	const TInt KSecondContactAccessCountAfterImport = GetAccessCountL(KSecondContactId);
+	const TContactItemId KSecondContactAgentFieldAfterImport = GetAgentFieldL(KSecondContactId);
+	
+	//importing & exporting contacts should not affect the access count
+	INTCOMPARE( KFirstContactAccessCountAfterExport , ==,  0, 0, 0 ); 
+	INTCOMPARE( KSecondContactAccessCountAfterExport , ==,  0, 0, 0 ); 
+	INTCOMPARE( KFirstContactAccessCountAfterExport , ==,  KFirstContactAccessCountAfterImport, 0, 0 );
+	INTCOMPARE( KSecondContactAccessCountAfterExport , ==,  KSecondContactAccessCountAfterImport, 0, 0 );
+	
+	//agent field values should not be exported/imported
+	INTCOMPARE( KFirstContactId , ==,  KSecondContactAgentFieldAfterImport, 0, 0 ); 
+	//exporting contacts should not affect the internal state of the contacts agent field
+	INTCOMPARE( KSecondContactAgentFieldAfterExport , ==,  KFirstContactId, 0, 0 );
+	
+	iParent->Fs().Delete(KVcardFile);//cleanup of exported vcard file
+	}
+	
+void CAccessCountTests::AddAgentFieldL(const TContactItemId aCid)
+	{
+	_LIT(KAgentName, "ImAnAgent");
+	CContactItemField * field = CContactItemField::NewLC(KStorageTypeContactItemId, KUidContactFieldVCardMapAGENT );
+	field->SetMapping(KUidContactFieldVCardMapAGENT);
+	field->SetLabelL(KAgentName);
+	field->AgentStorage()->SetAgentId(aCid);
+	iFields->AddL(*field);
+	CleanupStack::Pop(field);
+	field = NULL;
+	}
+
+TContactItemId CAccessCountTests::GetAgentFieldL(const TContactItemId aCid)
+	{
+	ReadL(aCid, *iViewAll);
+	const TInt count = iFields->Count();
+	TContactItemId ret = KErrNotFound;
+	TInt i = 0;
+	for(; i < count; ++i)
+		{
+		if( (*iFields)[i].StorageType() == KStorageTypeContactItemId )
+			{
+			ret = (*iFields)[i].AgentStorage()->Value();
+			break;
+			}
+		}
+	Close();
+	return ret;
+	}
+
+void CAccessCountTests::SetAgentFieldL(const TContactItemId aCid, const TContactItemId aVal)
+	{
+	
+	TBool FoundAgentField = EFalse;
+	OpenL(aCid, *iViewAll);
+	const TInt count = iFields->Count();
+	TInt i = 0;
+	
+	for(; i < count; ++i)
+		{
+		if( (*iFields)[i].StorageType() == KStorageTypeContactItemId )
+			{
+			(*iFields)[i].AgentStorage()->SetAgentId(aVal);
+			FoundAgentField = ETrue;
+			break;
+			}
+		}
+		
+	if( !FoundAgentField )
+		{
+		AddAgentFieldL(aVal);
+		}
+		
+	CommitL();
+	}
+
+void CAccessCountTests::ExportVcardL(const CContactIdArray &aConids)
+	{	
+	RFileWriteStream rfws;
+	CleanupClosePushL(rfws);
+	User::LeaveIfError( rfws.Replace( iParent->Fs(), KVcardFile, EFileWrite | EFileShareAny ) );
+	
+	iContactsDatabase->ExportSelectedContactsL(	TUid::Uid(KUidVCardConvDefaultImpl), aConids, rfws,
+										CContactDatabase::EIncludeX | CContactDatabase::ETTFormat );
+	
+	CleanupStack::PopAndDestroy(&rfws);		
+	}	
+	
+void CAccessCountTests::ImportVcardL()
+	{
+	TBool sucess = EFalse;
+	RFileReadStream rfrs;
+	CleanupClosePushL( rfrs );
+	User::LeaveIfError( rfrs.Open( iParent->Fs(), KVcardFile, EFileRead | EFileShareAny ) );
+	
+	FOREVER
+		{
+		CArrayPtr<CContactItem>* imported= 	iContactsDatabase->ImportContactsL( 
+											TUid::Uid( KUidVCardConvDefaultImpl ), rfrs, sucess, 
+											CContactDatabase::EIncludeX | CContactDatabase::ETTFormat |
+											CContactDatabase::EImportSingleContact
+											);	
+		if(sucess)
+			{
+			imported->ResetAndDestroy();
+			CLEAR(imported);	
+			}
+		else
+			{
+			imported->ResetAndDestroy();
+			CLEAR(imported);
+			break;	
+			}
+		sucess = EFalse;
+		}
+
+	CleanupStack::PopAndDestroy(&rfrs);
+	}
+
+TInt CAccessCountTests::GetAccessCountL(const TContactItemId aCid)
+	{
+	ReadL( aCid, *iViewAll );
+	TInt ret = iContactItem->AccessCount();
+	Close();
+	return ret;
+	}
+
+