phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/CRUDOOMStep.cpp
changeset 0 e686773b3f54
--- /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
+	}
+