diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/CRUDOOMStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/CRUDOOMStep.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,963 @@ +// 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: +// These are all out of memory tests. +// Call api first in order that all lazy initializations take place +// check heap balance is maintained for client side tests +// make sure all failures result only in KErrNoMemory only. +// +// + +/** + @file + @publishedAll + @released +*/ + +#include "CRUDOOMStep.h" +#include "PerformanceFunctionalityDefs.h" + +_LIT(KRun1,"Read"); +_LIT(KRun2,"Open"); +_LIT(KRun3,"Delete"); +_LIT(KRun4,"Add"); +_LIT(KRun5,"Close"); +_LIT(KRun6,"Commit"); +_LIT(KRun7,"Update"); +_LIT(KRun8,"ViewsRemote"); +_LIT(KRun9,"ViewsLocal"); +_LIT(KRun10,"ViewsLocalFS"); + +_LIT(KTest1, "Read test"); +_LIT(KTest2, "Open test"); +_LIT(KTest3, "Delete test"); +_LIT(KTest4, "Add contact test"); +_LIT(KTest5, "Close contact test"); +_LIT(KTest6, "Commit contact test"); +_LIT(KTest7, "Update contact test"); +_LIT(KTest8, "Remote View test"); +_LIT(KTest9, "Local View test"); + +_LIT(KView, "Views"); + +_LIT(KStars,"***************************"); + +const static TInt KNumberOfContacts = 10; + +const static TInt32 KExistingUidsArray[] = + { + KUidContactFieldAddressValue, + KUidContactFieldPostOfficeValue, + KUidContactFieldExtendedAddressValue, + KUidContactFieldLocalityValue, + KUidContactFieldRegionValue, + KUidContactFieldPostCodeValue, + KUidContactFieldCountryValue, + KUidContactFieldCompanyNameValue, + KUidContactFieldCompanyNamePronunciationValue, + KUidContactFieldPhoneNumberValue, + KUidContactFieldGivenNameValue, + KUidContactFieldFamilyNameValue, + KUidContactFieldGivenNamePronunciationValue, + KUidContactFieldFamilyNamePronunciationValue, + KUidContactFieldAdditionalNameValue, + KUidContactFieldSuffixNameValue, + KUidContactFieldPrefixNameValue, + KUidContactFieldHiddenValue, + KUidContactFieldEMailValue, + KUidContactFieldMsgValue, + KUidContactFieldSmsValue, + KUidContactFieldFaxValue, + KUidContactFieldDefinedTextValue, + KUidContactFieldNoteValue, + KUidContactFieldBirthdayValue, + KUidContactFieldUrlValue, + KUidContactFieldStorageInlineValue, + KUidContactFieldTemplateLabelValue, + KUidContactFieldPictureValue, + KUidContactFieldRingToneValue, + KUidContactFieldDTMFValue, + KUidContactsVoiceDialFieldValue, + KUidContactFieldNoneValue, + KUidContactFieldJobTitleValue, + KUidContactFieldICCSlotValue, + KUidContactFieldICCPhonebookValue, + KUidContactFieldICCGroupValue, + KUidContactFieldIMAddressValue, + KUidContactFieldSecondNameValue, + KUidContactFieldSIPIDValue, + KIntContactFieldVCardMapWORK, + KIntContactFieldVCardMapHOME, + KIntContactFieldVCardMapMSG, + KIntContactFieldVCardMapVOICE, + KIntContactFieldVCardMapFAX, + KIntContactFieldVCardMapPREF, + KIntContactFieldVCardMapCELL, + KIntContactFieldVCardMapPAGER, + KIntContactFieldVCardMapBBS, + KIntContactFieldVCardMapMODEM, + KIntContactFieldVCardMapCAR, + KIntContactFieldVCardMapISDN, + KIntContactFieldVCardMapVIDEO, + KIntContactFieldVCardMapDOM, + KIntContactFieldVCardMapADR, + KIntContactFieldVCardMapPOSTOFFICE, + KIntContactFieldVCardMapEXTENDEDADR, + KIntContactFieldVCardMapLOCALITY, + KIntContactFieldVCardMapREGION, + KIntContactFieldVCardMapPOSTCODE, + KIntContactFieldVCardMapCOUNTRY, + KIntContactFieldVCardMapAGENT, + KIntContactFieldVCardMapBDAY, + KIntContactFieldVCardMapEMAILINTERNET, + KIntContactFieldVCardMapGEO, + KIntContactFieldVCardMapLABEL, + KIntContactFieldVCardMapLOGO, + KIntContactFieldVCardMapMAILER, + KIntContactFieldVCardMapNOTE, + KIntContactFieldVCardMapORG, + KIntContactFieldVCardMapORGPronunciation, + KIntContactFieldVCardMapPHOTO, + KIntContactFieldVCardMapROLE, + KIntContactFieldVCardMapSOUND, + KIntContactFieldVCardMapTEL, + KIntContactFieldVCardMapTELFAX, + KIntContactFieldVCardMapTITLE, + KIntContactFieldVCardMapURL, + KIntContactFieldVCardMapUnusedN, + KIntContactFieldVCardMapUnusedFN, + KIntContactFieldVCardMapNotRequired, + KIntContactFieldVCardMapUnknownXDash, + KIntContactFieldVCardMapUnknown, + KIntContactFieldVCardMapUID, + KIntContactFieldVCardMapINTL, + KIntContactFieldVCardMapPOSTAL, + KIntContactFieldVCardMapPARCEL, + KIntContactFieldVCardMapGIF, + KIntContactFieldVCardMapCGM, + KIntContactFieldVCardMapWMF, + KIntContactFieldVCardMapBMP, + KIntContactFieldVCardMapMET, + KIntContactFieldVCardMapPMB, + KIntContactFieldVCardMapDIB, + KIntContactFieldVCardMapPICT, + KIntContactFieldVCardMapTIFF, + KIntContactFieldVCardMapPDF, + KIntContactFieldVCardMapPS, + KIntContactFieldVCardMapJPEG, + KIntContactFieldVCardMapMPEG, + KIntContactFieldVCardMapMPEG2, + KIntContactFieldVCardMapAVI, + KIntContactFieldVCardMapQTIME, + KIntContactFieldVCardMapTZ, + KIntContactFieldVCardMapKEY, + KIntContactFieldVCardMapX509, + KIntContactFieldVCardMapPGP, + KIntContactFieldVCardMapSMIME, + KIntContactFieldVCardMapWV, + KIntContactFieldVCardMapSECONDNAME, + KIntContactFieldVCardMapSIPID, + KIntContactFieldVCardMapPOC, + KIntContactFieldVCardMapSWIS, + KIntContactFieldVCardMapVOIP + }; + + +CCRUDOOMStep::CCRUDOOMStep() + : CPerformanceFunctionalityBase(KNumberOfContacts) + { + SetTestStepName(KCRUDOOMStep); + } + +void CCRUDOOMStep::PreTestL() + { + const TDesC &run = ConfigSection();//for views tests only use one contact, otherwise tests too slow + if( run.Find(KView) == 0 ) + { + iContacts = 1; + } + } + +void CCRUDOOMStep::InitializeL() + { + CPerformanceFunctionalityBase::InitializeL(); + iDestroyView = new (ELeave) CDestroyView( this ); + CActiveScheduler::Add(iDestroyView); + } + +void CCRUDOOMStep::Cleanup() + { + CLEAR( iDestroyView ); + CPerformanceFunctionalityBase::Cleanup(); + } + +TVerdict CCRUDOOMStep::doTestStepL() +/** + * @return - TVerdict code + * Override of base class pure virtual + * Our implementation only gets called if the base class doTestStepPreambleL() did + * not leave. That being the case, the current test result value will be EPass. + */ + { + __UHEAP_MARK; + InitializeL(); + _LIT(KDostepPrint,"CCRUDOOMStep::doTestStepL()"); + INFO_PRINTF1(KDostepPrint); + iIterate->Reset(); + + const TDesC &run = ConfigSection(); + _LIT(KFullContactOOMTest,"Full contacts OOM testing"); + _LIT(KEmptyOOMTest,"Empty contacts OOM testing"); + + //perform clientside and serverside testing when contacts are empty + if( run != KRun10 ) + { + INFO_PRINTF1(KNullDesC); + INFO_PRINTF1(KStars); + INFO_PRINTF1(KEmptyOOMTest); + INFO_PRINTF1(KStars); + INFO_PRINTF1(KNullDesC); + RunAllTestsL(ETrue); + RunAllTestsL(EFalse); + } + + //perform clientside and serverside testing when contacts are full + INFO_PRINTF1(KNullDesC); + INFO_PRINTF1(KStars); + INFO_PRINTF1(KFullContactOOMTest); + INFO_PRINTF1(KStars); + INFO_PRINTF1(KNullDesC); + iIterate->Reset(); + + TInt j = 0; + for(; j < iContacts; ++j) + { + OpenL(iIterate->NextL()); + SetAllFieldsL( GetFieldL(KStringFields, KField, 2) ); + CommitL(EFalse); + } + iIterate->Reset(); + if( run != KRun10 ) + { + RunAllTestsL(ETrue); + } + if( run != KRun9 ) //with full contacts, localview serverside oom test is too slow, run as sperate step + { + RunAllTestsL(EFalse); + } + Cleanup(); + __UHEAP_MARKEND; + + return TestStepResult(); + } +/** +If aClient is true perform client side OOM testing +Otherwise perform Serverside Heap testing +*/ +void CCRUDOOMStep::RunAllTestsL(const TBool aClient) + { + if(aClient) + { + _LIT(KClientOOM,"Clientside OOM testing"); + INFO_PRINTF1(KClientOOM); + INFO_PRINTF1(KNullDesC); + } + else + { + INFO_PRINTF1(KNullDesC); + _LIT(KServerOOM,"Serverside OOM testing"); + INFO_PRINTF1(KServerOOM); + INFO_PRINTF1(KNullDesC); + } + + const TDesC &run = ConfigSection(); + + if( run == KRun1 ) + { + ReadOOML(aClient); + } + else if( run == KRun2 ) + { + OpenOOML(aClient); + } + else if( run == KRun3 ) + { + DeleteOOML(aClient); + } + else if( run == KRun4 ) + { + AddContactOOML(aClient); + } + else if( run == KRun5 ) + { + CloseContactOOML(aClient); + } + else if( run == KRun6 ) + { + CommitContactOOML(aClient); + } + else if( run == KRun7 ) + { + UpdateContactOOML(aClient); + } + else if( run == KRun8 ) + { + INFO_PRINTF1(KTest8); + ViewOOMTestL(ETrue, aClient); + } + else if( run == KRun9 || run == KRun10 ) + { + INFO_PRINTF1(KTest9); + ViewOOMTestL(EFalse, aClient); + } + else + { + MissingTestPanic(); + } + } +/** +set heapmark and set heap failure to aFailAt +performs testing on client or serverside +*/ +void CCRUDOOMStep::StartHeapCheck(const TInt aFailAt, const TBool aClient) + { + if( aClient) + { + __UHEAP_SETFAIL(RHeap::EDeterministic, aFailAt); // leavescan thinks this macro is a leaver but it isn't + __UHEAP_MARK; + } + else + { + iContactsDatabase->SetCntServerHeapFailure(RHeap::EDeterministic, aFailAt); //__UHEAP_SETFAIL + } + } + + +/** +reset heapmark and reset heap failure +check that error receved from api failiure equals KErrNoMemory or there was no failiure +performs checking on client or serverside +*/ +TBool CCRUDOOMStep::EndHeapCheckL(const TInt aErr, const TBool aClient) + { + TBool ret = EFalse; + if( aClient) + { + __UHEAP_RESET; + RecoverL(aErr); + __UHEAP_MARKEND; + } + else + { + iContactsDatabase->SetCntServerHeapFailure(RHeap::ENone, 1);//__UHEAP_RESET + RecoverL(aErr); + } + TESTPRINT( ret = ( (KErrNoMemory == aErr) || (KErrNone == aErr) ) ); + return ret; + } + +/** +check value of received error and print relevant error message as necessary +*/ +void CCRUDOOMStep::ErrorProcess(const TInt aFailAt, const TInt aErr, + const TBool aClient, const TBool aCleanup) + { + _LIT(KNonMemoryError,"iteration %d failed - non-memory error in OOM test: %d"); + _LIT(KCleanupError,"iteration %d failed - cleanup error in OOM test"); + if( aClient ) + { + if( (KErrNoMemory != aErr) && (KErrNone != aErr) ) + { + ERR_PRINTF3(KNonMemoryError, aFailAt, aErr); + } + else + { + ERR_PRINTF2(KCleanupError, aFailAt); + } + } + else + { + if( (KErrNoMemory == aErr) || (KErrNone == aErr) ) + { + if( aCleanup ) + { + ERR_PRINTF2(KCleanupError, aFailAt); + } + else + { + _LIT(KHeapError,"iteration %d failed - server-heap imbalance error in OOM test"); + ERR_PRINTF2(KHeapError, aFailAt); + } + } + else + { + ERR_PRINTF3(KNonMemoryError, aFailAt, aErr); + } + } + } + +/** +recover database if it is damaged +*/ +void CCRUDOOMStep::RecoverL(const TInt aErr) + { + if( aErr != KErrNone ) + { + if( iContactsDatabase->IsDamaged() ) + { + iContactsDatabase->RecoverL(); + } + } + } + +/** +perform oom testing for read contact +*/ +void CCRUDOOMStep::ReadOOML(const TBool aClient) + { + INFO_PRINTF1(KTest1); + TBool ErrorCheckTest = EFalse; + TContactItemId cid = iIterate->NextL(); + CContactItem *contactItem = NULL; + + //any lazy initialization should be performed here, so that it doesnt interfere with oom testing + ReadL( cid ); + CloseL( EFalse ); + iContactsDatabase->CompactL(); + + TInt err = KErrNone; + TInt failAt = 0; + do + { + ++failAt; + //set heap failure on client/server + StartHeapCheck(failAt, aClient); + + //perform read + TRAP(err, contactItem = iContactsDatabase->ReadContactL( cid, *iViewAll ); ); + + if (err == KErrNone) + { + CLEAR(contactItem); + } + + //reset heap failure on client/server, check that there is no memory leak on client + TESTPRINTI( ErrorCheckTest = EndHeapCheckL(err, aClient), failAt); + + if(!ErrorCheckTest) + { + //if test failed print appropriate message + ErrorProcess(failAt, err, aClient, EFalse); + break; + } + } + while(err != KErrNone); + } + + +/** +perform oom testing for open contact +*/ +void CCRUDOOMStep::OpenOOML(const TBool aClient) + { + INFO_PRINTF1(KTest2); + TBool ErrorCheckTest = EFalse; + TContactItemId cid = iIterate->NextL(); + CContactItem *contactItem = NULL; + + //any lazy initialization should be performed here, so that it doesnt interfere with oom testing + OpenL( cid ); + CloseL( ETrue ); + iContactsDatabase->CompactL(); + + TInt err = KErrNone; + TInt failAt = 0; + do + { + ++failAt; + //set heap failure on client/server + StartHeapCheck(failAt, aClient); + + //perform open contact + TRAP(err, contactItem = iContactsDatabase->OpenContactL( cid, *iViewAll ); ); + + if (err == KErrNone) + { + CLEAR(contactItem); + } + + + //reset heap failure on client/server, check that there is no memory leak on client + TESTPRINTI( ErrorCheckTest = EndHeapCheckL(err, aClient), failAt ); + + if(!ErrorCheckTest) + { + //if test failed print appropriate message + ErrorProcess(failAt, err, aClient, EFalse); + iIterate->RemoveL(cid); + break; + } + } + while(err != KErrNone); + + iContactsDatabase->CloseContactL( cid ); + } + + +/** +perform oom testing for delete contact +*/ +void CCRUDOOMStep::DeleteOOML(const TBool aClient) + { + INFO_PRINTF1(KTest3); + TBool ErrorCheckAllTests = EFalse; + TBool ErrorCheckSingleTest = EFalse; + TBool cleanupError = EFalse; + TContactItemId cid = iIterate->NextL(); + + //any lazy initialization should be performed here, so that it doesnt interfere with oom testing + DeleteContactL( cid, EFalse ); + iContactsDatabase->CompactL(); + + cid = iIterate->NextL(); + + TInt err = KErrNone; + TInt failAt = 0; + + const TInt KInitialCount = iContactsDatabase->CountL(); + + do + { + ++failAt; + //set heap failure on client/server + StartHeapCheck(failAt, aClient); + + //perform delete contact + TRAP(err, iContactsDatabase->DeleteContactL( cid ); ); + + //reset heap failure on client/server, check that there is no memory leak on client + TESTPRINTI( ErrorCheckSingleTest = EndHeapCheckL(err, aClient), failAt); + ErrorCheckAllTests = ErrorCheckSingleTest; + + if (err == KErrNone) + { + //if no error, check that contact was deleted + iIterate->RemoveL(cid); + //if initial count -1 doesn't equal number of contact, there is a cleanup error + cleanupError = ( (KInitialCount - 1) != iContactsDatabase->CountL() ); + TESTPRINTI( ErrorCheckSingleTest = !cleanupError, failAt ); + ErrorCheckAllTests = ErrorCheckAllTests && ErrorCheckSingleTest; + } + else + { + //if error, check that contact wasn't deleted + cleanupError = ( KInitialCount != iContactsDatabase->CountL() ); + TESTPRINTI( ErrorCheckSingleTest = !cleanupError , failAt ); + ErrorCheckAllTests = ErrorCheckAllTests && ErrorCheckSingleTest; + } + if(!ErrorCheckAllTests) + { + //if checking error, print message, end test + ErrorProcess(failAt, err, aClient, cleanupError); + break; + } + } + while(err != KErrNone); + } + + +/** +perform oom testing for add contact +*/ +void CCRUDOOMStep::AddContactOOML(const TBool aClient) + { + INFO_PRINTF1(KTest4); + TBool ErrorCheckAllTests = EFalse; + TBool ErrorCheckSingleTest = EFalse; + TBool cleanupError = EFalse; + TContactItemId cid = 0; + + TInt err = KErrNone; + TInt failAt = 0; + //any lazy initialization should be performed here, so that it doesnt interfere with oom testing + CContactCard* contact = CContactCard::NewLC(iTemplate); + iContactsDatabase->AddNewContactL(*contact); + iContactsDatabase->CompactL(); + + const TInt KInitialCount = iContactsDatabase->CountL(); + + do + { + ++failAt; + //set heap failure on client/server + StartHeapCheck(failAt, aClient); + + //perform add contact + TRAP(err, cid = iContactsDatabase->AddNewContactL(*contact); ); + + //reset heap failure on client/server, check that there is no memory leak on client + TESTPRINTI( ErrorCheckSingleTest = EndHeapCheckL(err, aClient), failAt ); + ErrorCheckAllTests = ErrorCheckSingleTest; + + if (err == KErrNone) + { + //if no error, check that contact was added + iIterate->AddL(cid); + //if initial count + 1 doesn't equal number of contact, there is a cleanup error + cleanupError = ( ( KInitialCount + 1 ) != iContactsDatabase->CountL() ); + TESTPRINTI( ErrorCheckSingleTest = !cleanupError, failAt ); + ErrorCheckAllTests = ErrorCheckAllTests && ErrorCheckSingleTest; + } + else + { + //if error, check that contact wasn't added + cleanupError = ( KInitialCount != iContactsDatabase->CountL() ); + TESTPRINTI( ErrorCheckSingleTest = !cleanupError , failAt ); + ErrorCheckAllTests = ErrorCheckAllTests && ErrorCheckSingleTest; + } + if(!ErrorCheckAllTests) + { + //if checking error, print message, end test + ErrorProcess(failAt, err, aClient, cleanupError); + break; + } + } + while(err != KErrNone); + + CleanupStack::PopAndDestroy(contact); + } + + +/** +perform oom testing for close contact +*/ +void CCRUDOOMStep::CloseContactOOML(const TBool aClient) + { + INFO_PRINTF1(KTest5); + TBool ErrorCheckAllTests = EFalse; + TBool ErrorCheckSingleTest = EFalse; + TContactItemId cid = iIterate->NextL(); + CContactItem *contactItem = NULL; + + //any lazy initialization should be performed here, so that it doesnt interfere with oom testing + OpenL( cid ); + CloseL( ETrue ); + iContactsDatabase->CompactL(); + + contactItem = iContactsDatabase->OpenContactL( cid, *iViewAll ); + CleanupStack::PushL(contactItem); + TInt err = KErrNone; + TInt failAt = 0; + do + { + ++failAt; + //set heap failure on client/server + StartHeapCheck(failAt, aClient); + + //perform close contact + TRAP(err, iContactsDatabase->CloseContactL( cid ) ); + + //reset heap failure on client/server, check that there is no memory leak on client + TESTPRINTI( ErrorCheckSingleTest = EndHeapCheckL(err, aClient), failAt ); + ErrorCheckAllTests = ErrorCheckSingleTest; + + if ( KErrNone != err ) + { + //if close successful and contact still locked there is a cleanup error + TRAP(err, CContactItem *contact = iContactsDatabase->OpenContactL( cid, *iViewAll ); + CLEAR(contact); + ); + TESTPRINTI( ErrorCheckSingleTest = (KErrInUse == err), failAt ); + ErrorCheckAllTests = ErrorCheckAllTests && ErrorCheckSingleTest; + } + + if( !ErrorCheckAllTests ) + { + //if checking error, print message, end test + ErrorProcess(failAt, err, aClient, EFalse); + iIterate->RemoveL(cid); + break; + } + } + while(err != KErrNone); + + iContactsDatabase->CloseContactL( cid ); + CleanupStack::PopAndDestroy(contactItem); + contactItem = NULL; + } + + +/** +perform oom testing for commit contact +*/ +void CCRUDOOMStep::CommitContactOOML(const TBool aClient) + { + INFO_PRINTF1(KTest6); + TBool ErrorCheckAllTests = EFalse; + TBool ErrorCheckSingleTest = EFalse; + TContactItemId cid = iIterate->NextL(); + CContactItem *contactItem = NULL; + + //any lazy initialization should be performed here, so that it doesnt interfere with oom testing + OpenL( cid ); + CommitL(EFalse); + iContactsDatabase->CompactL();//lazy initialization + + TInt err = KErrNone; + TInt failAt = 0; + do + { + ++failAt; + + // test set-up (pre-condition) + // need to open the Contact in case Commit succeeds up to a check that the Contact is locked + contactItem = iContactsDatabase->OpenContactL( cid, *iViewAll ); + + iContactItem = contactItem; + iFields = &(iContactItem->CardFields()); + SetFieldL(1, GetFieldL(KStringFields, KField, 1) ); + iContactItem = NULL; + iFields = NULL; + CleanupStack::PushL(contactItem); + + //set heap failure on client/server + StartHeapCheck(failAt, aClient); + + //perform commit contact + TRAP(err, iContactsDatabase->CommitContactL( *contactItem ) ); + + //reset heap failure on client/server, check that there is no memory leak on client + TESTPRINTI( ErrorCheckSingleTest = EndHeapCheckL(err, aClient), failAt ); + ErrorCheckAllTests = ErrorCheckSingleTest; + + if( KErrNone != err ) + { + //if commit successful and contact not fully updated there is a cleanup error + ReadL( cid ); + TESTPRINTI( ErrorCheckSingleTest = !CompareFieldL(1, GetFieldL(KStringFields, KField, 1) ), failAt ); + ErrorCheckAllTests = ErrorCheckAllTests && ErrorCheckSingleTest; + CloseL( EFalse ); + } + if(!ErrorCheckAllTests) + { + //if checking error, print message, end test + ErrorProcess(failAt, err, aClient, EFalse); + iIterate->RemoveL(cid); + break; + } + + + // test set-up (post-condition) + // Close the Contact so it can be re-Opened in the loop above + TRAP_IGNORE(iContactsDatabase->CloseContactL(cid)); + CleanupStack::PopAndDestroy(contactItem); + } + while(err != KErrNone); + } + + +/** +perform oom testing for update contact +*/ +void CCRUDOOMStep::UpdateContactOOML(const TBool aClient) + { + INFO_PRINTF1(KTest7); + TBool ErrorCheckAllTests = EFalse; + TBool ErrorCheckSingleTest = EFalse; + TContactItemId cid = iIterate->NextL(); + TContactItemId cid2 = iIterate->NextL(); + CContactItem *contactItem = NULL; + + //do initial update so that any lazy initialization is performed, so that it doesnt interfere with oom testing + contactItem = iContactsDatabase->ReadContactL( cid, *iViewAll ); + CleanupStack::PushL(contactItem); + iContactsDatabase->UpdateContactLC( cid2, contactItem ); + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(contactItem); + contactItem = NULL; + //end initial update + iContactsDatabase->CompactL();//lazy initialization + + ReadL( cid ); + + SetFieldL(1, GetFieldL(KStringFields, KField, 1) ); + + TInt err = KErrNone; + TInt failAt = 0; + do + { + ++failAt; + //set heap failure on client/server + StartHeapCheck(failAt, aClient); + + //perform update contact + TRAP(err, + iContactsDatabase->UpdateContactLC( cid2, iContactItem ); + CleanupStack::PopAndDestroy(); + ); + + //reset heap failure on client/server, check that there is no memory leak on client + TESTPRINTI( ErrorCheckSingleTest = EndHeapCheckL(err, aClient), failAt ); + ErrorCheckAllTests = ErrorCheckSingleTest; + + if( KErrNone != err ) + { + CloseL( EFalse );//close read contact + //if update successful and contact not fully updated there is a cleanup error + ReadL( cid2 ); + TESTPRINTI( ErrorCheckSingleTest = !CompareFieldL(1, GetFieldL(KStringFields, KField, 1) ), failAt ); + ErrorCheckAllTests = ErrorCheckAllTests && ErrorCheckSingleTest; + CloseL( EFalse ); + ReadL( cid ); + } + if( !ErrorCheckAllTests ) + { + //if checking error, print message, end test + ErrorProcess(failAt, err, aClient, EFalse); + break; + } + } + while(err != KErrNone); + + CloseL( EFalse ); + } + +void CCRUDOOMStep::HandleContactViewEvent(const CContactViewBase& /*aView*/,const TContactViewEvent& aEvent) + { + iEvent = TContactViewEvent( aEvent.iEventType, aEvent.iInt, aEvent.iContactId ); + + switch( aEvent.iEventType ) + { + case TContactViewEvent::EUnavailable: + case TContactViewEvent::ESortError: + case TContactViewEvent::EServerError: + case TContactViewEvent::EIndexingError: + { + iError = aEvent.iInt; + if( iError != KErrNoMemory ) + { + _LIT(KEventPrint,"EventType: %d, Error: %d, ContactId: %d"); + INFO_PRINTF4(KEventPrint, aEvent.iEventType, aEvent.iInt, aEvent.iContactId ); + } + break; + } + default: + { + iError = KErrNone; + break; + } + } + iDestroyView->Activate(); + } + +void CCRUDOOMStep::PopulateFullViewL(const TBool aRemote, RContactViewSortOrder& aSortOrder) + { + CContactDatabase *cntdb = CContactDatabase::OpenL(); + CleanupStack::PushL(cntdb); + if(aRemote) + { + iView = CContactRemoteView::NewL( *this, *cntdb, aSortOrder, EContactsOnly); + } + else + { + iView = CContactLocalView::NewL( *this, *cntdb, aSortOrder, EContactsOnly); + } + CActiveScheduler::Start(); + CleanupStack::PopAndDestroy( cntdb ); + } + +/** +perform oom testing for remote/local views +*/ +void CCRUDOOMStep::ViewOOMTestL(const TBool aRemote, const TBool aClient) + { + TBool ErrorCheckAllTests = EFalse; + const TInt length = ( sizeof KExistingUidsArray ) / ( sizeof KExistingUidsArray[0] ); + TInt i = 0; + RContactViewSortOrder sortOrder = RContactViewSortOrder(); + CleanupClosePushL( sortOrder ); + for(i = 0 ; i < length ; ++i) + { + sortOrder.AppendL( TUid::Uid( KExistingUidsArray[i] ) ); + } + + //any lazy initialization should be performed here, so that it doesnt interfere with oom testing + PopulateFullViewL(aRemote, sortOrder); + + TInt err = KErrNone; + TInt failAt = 0; + do + { + ++failAt; + //set heap failure on client/server + StartHeapCheck(failAt, aClient); + //reset view population error + iError = KErrNone; + + //create view and wait to populate + TRAP(err, + PopulateFullViewL(aRemote, sortOrder); + ); + + //reset heap failure on client/server, check that there is no memory leak on client + TESTPRINTI( ErrorCheckAllTests = EndHeapCheckL( ( err != KErrNone ) ? err : (err = iError), aClient), i); + + if(!ErrorCheckAllTests) + { + //if checking error, print message, end test + ErrorProcess(failAt, err, aClient, EFalse); + break; + } + } + while(err != KErrNone); + + CleanupStack::PopAndDestroy();//sortorder + + CLEAR( iContactsDatabase ); + WaitForServerToExitL(); + iContactsDatabase = CContactDatabase::OpenL(); + } + +/** +Active object that destroys view on first run +then stop active scheduler on second run. +this allows any view cleanup operation to take place in the +active scheduler after the view is closed +*/ +void CCRUDOOMStep::CDestroyView::RunL() + { + iInitial = !iInitial; + if( iInitial ) + { + iTest->iView->Close( *iTest ); + iTest->iView = NULL; + Activate(); + } + else + { + CActiveScheduler::Stop(); + } + } + +void CCRUDOOMStep::CDestroyView::Activate() + { + TRequestStatus *pS=&iStatus; + User::RequestComplete(pS,KErrNone); + SetActive(); + } + +void CCRUDOOMStep::CDestroyView::DoCancel() + { + //nothing to clean up + } +