diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/AccessCountTests.cpp --- /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 +#include +#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* 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; + } + +