phonebookengines_old/contactsmodel/tsrc/T_ERROR.CPP
changeset 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/T_ERROR.CPP	Fri Jun 11 13:29:23 2010 +0300
@@ -0,0 +1,2428 @@
+// Copyright (c) 1997-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:
+//
+
+// This harness reqires a writeable drive other than C: or Z:, e.g. an MMC drive
+
+#include <e32test.h>
+#include "T_UTILS.H"
+#include "CContactDbEventQueue.h"
+#include <coreappstest/testserver.h>
+
+// Type definitions 
+LOCAL_D RTest test(_L("T_ERROR"));
+LOCAL_D RFs TheFs;
+LOCAL_D CContactIdArray* IdList;
+
+enum TOomFailureModes
+	{	
+	KOomFailNormal,
+	KOomFailFileServerGeneral,
+	KOomFailFileServerOom,
+	KOomFailContactServer,
+	KOomFailDbs,
+	KOomNumFailModes,
+	};	
+
+const TPtrC KDatabaseFileName = _L("C:T_ERROR");
+const TPtrC KDatabaseCreateFileName = _L("C:T_ERRORC");
+const TPtrC KFakeFDrive=_L("C:FAKEFDRIVE");
+
+typedef TBuf<0x40> TOomTestName;
+
+class COomTest;
+
+class COomFailBase : public CBase
+	{
+public:
+	~COomFailBase();
+	COomFailBase(COomTest* aOomTest);
+	virtual void ConstructL();
+	virtual void PreFailL();
+	virtual void ClearUpL();
+	virtual void FailL() = 0;
+	virtual TBool ErrorOk(TOomFailureModes aMode, TInt aIteration, TInt aError);
+	virtual TOomTestName TestName() = 0;
+	virtual TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+protected:
+	void RecoverL(TBool waitForEvent = EFalse); 
+	void WaitForEvent(TContactDbObserverEventType anEventType);
+
+protected:
+	COomTest* iOomTest;
+	CContactDatabase* iDb;
+	CContactDbEventQueue* iDbEventQueue;
+	TInt iCounter;
+	};
+
+class COomOpen : public COomFailBase
+	{
+public:
+	inline COomOpen(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	void FailL();
+	void ClearUpL();
+	inline TOomTestName TestName() {return(_L("Open"));};
+private:
+	CContactDatabase* iDb2;
+	CContactDatabase* iDb;
+	};
+
+class COomCreate : public COomFailBase
+	{
+public:
+	inline COomCreate(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Create"));};
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+private:
+	CContactDatabase* iDb2;
+	};
+
+class COomSetDatabaseDrive : public COomFailBase
+	{
+public:
+	inline COomSetDatabaseDrive(COomTest* aOomTest, TDriveUnit aMmcDrive) : COomFailBase(aOomTest), iMmcDrive(aMmcDrive) {};
+	inline TOomTestName TestName() {return(_L("SetDatabaseDrive"));};
+	void PreFailL();
+	void ConstructL();
+	void FailL();
+	void ClearUpL();
+	TBool ErrorOk(TOomFailureModes aMode, TInt aIteration, TInt aError);
+private:
+	// writeable drive found for testing with
+	TDriveUnit iMmcDrive;
+	};
+
+class COomGetDefaultName : public COomFailBase
+	{
+public:
+	inline COomGetDefaultName(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("GetDefaultName"));};
+	void FailL();
+	};
+
+class COomViewDefinition : public COomFailBase
+	{
+public:
+	inline COomViewDefinition(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ViewDefinition"));};
+	void FailL();
+	};
+
+class COomTextDefinition : public COomFailBase
+	{
+public:
+	inline COomTextDefinition(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("TextDefinition"));};
+	void FailL();
+	};
+
+class COomReadContact : public COomFailBase
+	{
+public:
+	inline COomReadContact(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ReadContact"));};
+	void FailL();
+	};
+
+class COomAddNewContact : public COomFailBase
+	{
+public:
+	inline COomAddNewContact(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("AddNewContact"));};
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+protected:
+	TContactItemId iNewContactId;
+	};
+
+class COomReadContactTextDef : public COomFailBase
+	{
+public:
+	inline COomReadContactTextDef(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ReadContactTextDef"));};
+	void FailL();
+	};
+
+class COomOpenAndCloseContact : public COomFailBase
+	{
+public:
+	inline COomOpenAndCloseContact(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("OpenAndCloseContact"));};
+	void FailL();
+	};
+
+class COomOpenAndCloseContactX : public COomFailBase
+	{
+public:
+	inline COomOpenAndCloseContactX(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("OpenAndCloseContactX"));};
+	void FailL();
+	};
+
+class COomOpenModifyAndCommitContact : public COomFailBase
+	{
+public:
+	inline COomOpenModifyAndCommitContact(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("OpenModifyAndCommitContact"));};
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+private:
+	CContactItem* iCard;
+	};
+
+class COomDeleteContact : public COomFailBase
+	{
+public:
+	inline COomDeleteContact(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("DeleteContact"));};
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+private:
+	TContactItemId iNewContactId;
+	TInt iStartCount;
+	};
+
+class COomDeleteContacts : public COomFailBase
+	{
+public:
+	inline COomDeleteContacts(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("DeleteContacts"));};
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+private:
+	CContactIdArray* iNewContactIds;
+	TInt iStartCount;
+	};
+
+class COomCompact : public COomFailBase
+	{
+public:
+	inline COomCompact(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Compact"));};
+	void FailL();
+	void ClearUpL();
+	};
+
+class COomImportContacts : public COomFailBase
+	{
+public:
+	~COomImportContacts();
+	void ConstructL();
+	inline COomImportContacts(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ImportContacts"));};
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+private:
+	CFileStore* iStore;
+	RStoreReadStream iInStream;
+	TStreamId iStreamId;
+	CArrayPtr<CContactItem>* iImportedContacts;
+	TInt iOldRecordCount;
+	TContactItemId iDeleteMeId;
+	};
+
+class COomExportSelectedContacts : public COomFailBase
+	{
+public:
+	~COomExportSelectedContacts();
+	void ConstructL();
+	inline COomExportSelectedContacts(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ExportSelectedContacts"));};
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+	TBool ErrorOk(TOomFailureModes aMode, TInt aIteration, TInt aError);
+private:
+	CContactIdArray* iIdList;
+	CFileStore* iStore;
+	RStoreWriteStream iOutStream;
+	TStreamId iStreamId;
+	};
+
+class COomFind : public COomFailBase
+	{
+public:
+	inline COomFind(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Find"));};
+	void FailL();
+	};
+
+class COomFindInTextDef : public COomFailBase
+	{
+public:
+	inline COomFindInTextDef(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	~COomFindInTextDef();
+	void ConstructL();
+	inline TOomTestName TestName() {return(_L("Find In TextDef"));};
+	void FailL();
+private:
+	CDesCArrayFlat* iFindWords;
+	CContactTextDef* iTextDef;
+	};
+
+class COomFindAsyncInTextDef : public COomFailBase
+	{
+public:
+	inline COomFindAsyncInTextDef(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	~COomFindAsyncInTextDef();
+	void ConstructL();
+	inline TOomTestName TestName() {return(_L("Find In TextDef ASync"));};
+	void FailL();
+private:
+	CDesCArrayFlat* iFindWords;
+	CContactTextDef* iTextDef;
+	};
+
+class COomFindAsync : public COomFailBase
+	{
+public:
+	inline COomFindAsync(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("FindAsync"));};
+	void FailL();
+	};
+
+class COomSort : public COomFailBase
+	{
+public:
+	inline COomSort(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Sort"));};
+	void FailL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+private:
+	TInt iPrevCount;
+	};
+
+class COomSortArray : public COomFailBase
+	{
+public:
+	~COomSortArray();
+	inline COomSortArray(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Sort Array"));};
+	void ConstructL();
+	void FailL();
+private:
+	CContactIdArray* iIdArray;
+	TInt iPrevCount;
+	CArrayFix<CContactDatabase::TSortPref>* iSortOrder;
+	};
+
+class COomCompress : public COomFailBase, public MContactUiCompactObserver
+	{
+public:
+	inline COomCompress(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Compress"));};
+	void PreFailL();
+	void FailL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+	void ClearUpL();
+// from MContactUiCompactObserver
+	void Step(TInt aStep);
+	void HandleError(TInt aError);
+private:
+	TInt iRecievedError;
+	};
+
+class COomRecover : public COomFailBase, public MContactUiCompactObserver
+	{
+public:
+	inline COomRecover(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Recover"));};
+	void PreFailL();
+	void FailL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+private:
+	void doRecoverL();
+// from MContactUiCompactObserver
+	void Step(TInt aStep);
+	void HandleError(TInt aError);
+private:
+	TInt iRecievedError;
+	};
+
+class COomCloseOpenTables : public COomFailBase
+	{
+public:
+	inline COomCloseOpenTables(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("CloseOpenTables"));};
+	void FailL();
+	};
+
+class COomViewDefInternalize : public COomFailBase
+	{
+public:
+	~COomViewDefInternalize();
+	inline COomViewDefInternalize(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ViewDefInternalize"));};
+	void ConstructL();
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+protected:
+	CBufStore *iBufStore;
+	RStoreReadStream iReadStream;
+	TStreamId iStreamId;
+	};
+
+class COomViewDefExternalize : public COomFailBase
+	{
+public:
+	~COomViewDefExternalize();
+	inline COomViewDefExternalize(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ViewDefExternalize"));};
+	void ConstructL();
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+protected:
+	CBufStore* iBufStore;
+	RStoreWriteStream iWriteStream;
+	TStreamId iStreamId;
+	TBool iFailed;
+	};
+
+class COomContactChangeNotifier : public COomFailBase
+	{
+public:
+	class COomNotificationRec : public CBase, public MContactDbObserver
+		{
+	public:
+		static COomNotificationRec* NewL();
+		~COomNotificationRec();
+		void Wait(TBool aUnknownErrAllowed);
+		static TInt TimerCallBackL(TAny* aSelf);
+		inline TBool UnknownChange() const {return(iUnknownChange);};
+	public: // from MContactDbObserver
+		void HandleDatabaseEventL(TContactDbObserverEvent aEvent);
+	private:
+		void ConstructL();
+	private:
+		CPeriodic* iTimer;
+		TBool iWaiting;
+		TBool iGotMessage;
+		TBool iUnknownErrAllowed;
+		TBool iUnknownChange;
+		};
+public:
+	~COomContactChangeNotifier();
+	inline COomContactChangeNotifier(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ContactChangeNotifier"));};
+	void ConstructL();
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+protected:
+	COomNotificationRec* iRec;
+	CContactItem* iItem1;
+	CContactItem* iItem2;
+	CContactItem* iItem3;
+	};
+
+class COomFieldSetStore : public COomFailBase
+	{
+public:
+	~COomFieldSetStore();
+	inline COomFieldSetStore(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("FieldSetStore"));};
+	void ConstructL();
+	void FailL();
+	void ClearUpL();
+protected:
+	CBufStore* iBufStore;
+	CBufStore* iBlobStore;
+	CBufStore* iTextStore;
+	CContactItemFieldSet* iItemFieldSet;
+	TStreamId iStreamId;
+	};
+
+class COomFieldSetRestore : public COomFailBase
+	{
+public:
+	~COomFieldSetRestore();
+	inline COomFieldSetRestore(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("FieldSetRestore"));};
+	void ConstructL();
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+protected:
+	CBufStore* iBufStore;
+	CBufStore* iTextStore;
+	CBufStore* iBlobStore;
+	TStreamId iStreamId;
+	TStreamId iTextStreamId;
+	CContactViewDef* iViewDef;
+	};
+
+class COomContactCardClone : public COomFailBase
+	{
+public:
+	~COomContactCardClone();
+	inline COomContactCardClone(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ContactCardClone"));};
+	void ConstructL();
+	void FailL();
+private:
+	CContactCard* iSourceCard;
+	};
+
+class COomPhoneNumberLookup : public COomFailBase
+	{
+public:
+	~COomPhoneNumberLookup();
+	inline COomPhoneNumberLookup(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Phone Number Lookup"));};
+	void ConstructL();
+	void PreFailL();
+	void FailL();
+	void ClearUpL();
+private:
+	TInt FileSizeL();
+private:
+	TContactItemId iAddId;
+	CContactCard* iAddCard;
+	};
+
+class COomContactsChangedSince : public COomFailBase
+	{
+public:
+	~COomContactsChangedSince();
+	inline COomContactsChangedSince(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("ContactsChangedSince"));};
+	void ConstructL();
+	void FailL();
+private:
+	TContactItemId iNewContactId1;
+	TContactItemId iNewContactId2;
+	TTime iBeforeTime;
+	};
+
+class COomGroups : public COomFailBase
+	{
+public:
+	~COomGroups();
+	inline COomGroups(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Groups"));};
+	void ConstructL();
+	void FailL();
+	void ClearUpL();
+	TBool Skip(TInt aCount, TOomFailureModes aMode) const;
+private:
+	TContactItemId iGroupId;
+	CContactCard* iItem1;
+	};
+
+class COomGroups2 : public COomFailBase
+	{
+public:
+	~COomGroups2();
+	inline COomGroups2(COomTest* aOomTest) : COomFailBase(aOomTest) {};
+	inline TOomTestName TestName() {return(_L("Groups 2"));};
+	void ConstructL();
+	void FailL();
+	void ClearUpL();
+private:
+	TContactItemId iGroupId1;
+	TContactItemId iGroupId2;
+	};
+
+//
+
+class COomTest : public CBase
+	{
+public:
+	COomTest(TDriveUnit aMmcDrive);
+	void ConstructL();
+	~COomTest();
+	TBool DoTestL();
+	void DoOomTestL(COomFailBase *aOomTest, TOomFailureModes aMode);
+	void Test(TBool aMustBeTrue);
+	TBool TestsL();
+private:
+	TInt GetRecordCountL();
+private:
+	RDbs iDbs;
+	TDriveUnit iMmcDrive;
+	};
+
+
+LOCAL_C void AddNewContactsL()
+//
+// Add 2 new contacts with varying numbers of text fields
+//
+	{
+	CContactDatabase* db=CContactDatabase::OpenL(KDatabaseFileName);
+	CleanupStack::PushL(db);
+	CContactCard* card=CContactCard::NewL();
+	CleanupStack::PushL(card);
+	TContactItemId id=KNullContactId;
+	TContactItemId newId=KNullContactId;
+	for (TInt ii=0;ii<5;ii++)
+		{
+		TBuf<16> name;
+		name.Format(_L("NAME #%d"),ii);
+		SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,name,EFalse);
+		name.Format(_L("GivenName #%d"),ii);
+		SetNameL(*card,KUidContactFieldGivenName,KUidContactFieldVCardMapUnusedN,name,EFalse);
+		CContactItemField* field=CContactItemField::NewLC(KStorageTypeText);
+		card->AddFieldL(*field);
+		CleanupStack::Pop(); // field
+		newId=db->AddNewContactL(*card);
+		id=newId;
+		IdList->AddL(id);
+		}
+	CleanupStack::PopAndDestroy(2); // card, db
+	}
+
+LOCAL_C void CreateDatabaseL()
+//
+// Create a database in a store
+//
+	{
+	CContactDatabase* db=CContactDatabase::ReplaceL(KDatabaseFileName);
+	delete db;
+	}
+
+//	
+//
+// COomFailBase
+//
+
+COomFailBase::COomFailBase(COomTest* aOomTest) : iOomTest(aOomTest), iCounter(0)
+	{}
+
+COomFailBase::~COomFailBase()
+	{
+	delete iDbEventQueue;
+	delete iDb;
+	}
+
+void COomFailBase::ConstructL()
+	{
+	iDb=CContactDatabase::OpenL(KDatabaseFileName);
+	iDbEventQueue = CContactDbEventQueue::NewL(iDb);
+	}
+
+void COomFailBase::WaitForEvent(TContactDbObserverEventType anEventType)
+	{
+	TContactDbObserverEvent event;
+	++iCounter;
+	FOREVER
+		{
+		event.iType = EContactDbObserverEventNull;
+		iDbEventQueue->ListenForEvent(1,event);  //1 second timeout
+		//RDebug::Print(_L("%d Message: %d"), iCounter, event.iType);
+		
+		if (event.iType == anEventType || event.iType == EContactDbObserverEventNull)
+			break;
+		}
+	}
+
+void COomFailBase::PreFailL()
+	{}
+
+void COomFailBase::ClearUpL()
+	{}
+
+TBool COomFailBase::ErrorOk(TOomFailureModes aMode, TInt aIteration, TInt aError)
+	{
+	if(aMode == KOomFailFileServerGeneral)
+		{
+		if (aError != KErrGeneral)
+			{
+			test.Printf(_L("ErrorOk test failed - Mode %i, iteration %i, error %i"), aMode, aIteration, aError);
+			return EFalse;
+			}
+		return ETrue;
+		}
+	else
+		{
+		if (aError != KErrNoMemory)
+			{
+			test.Printf(_L("ErrorOk test failed - Mode %i, iteration %i, error %i"), aMode, aIteration, aError);
+			return EFalse;
+			}
+		return ETrue;
+		}
+	}
+
+void COomFailBase::RecoverL(TBool waitForEvent)
+	{
+	iDb->RecoverL();
+	if (waitForEvent)
+		{
+		WaitForEvent(EContactDbObserverEventRecover);
+		}
+	else
+		{
+		iDbEventQueue->Clear();
+		}
+		
+	}
+
+TBool COomFailBase::Skip(TInt , TOomFailureModes ) const
+	{
+	// When trying to figure out why we need this, please see DEF037382 and DEF037234
+	// Basically, certain conditions cause the DBMS system to corrupt the database
+	// and we hop over those particular cases.
+	//
+	// Generally, one particular case, perhaps when count==71 or whatever, will be
+	// the only problem. However, new builds and commenting out other test cases
+	// can both change this number, so in a lot of cases every test is skipped instead.
+	return(EFalse);
+	}
+
+//
+// COomOpen
+//
+
+void COomOpen::FailL()
+	{
+	iDb2=CContactDatabase::OpenL(KDatabaseFileName);
+	iDb2->CountL();
+	}
+
+void COomOpen::ClearUpL()
+	{
+	RecoverL();
+	delete iDb2;
+	iDb2=NULL;
+	}
+
+//
+// COomCreate
+//
+
+void COomCreate::PreFailL()
+	{
+	if(CContactDatabase::ContactDatabaseExistsL(KDatabaseCreateFileName))
+    	CContactDatabase::DeleteDatabaseL(KDatabaseCreateFileName);
+	}
+
+void COomCreate::FailL()
+	{
+	iDb2=CContactDatabase::CreateL(KDatabaseCreateFileName);
+	}
+
+void COomCreate::ClearUpL()
+	{
+	RecoverL();
+	delete iDb2;
+	iDb2=NULL;
+    TRAPD(err,CContactDatabase::DeleteDatabaseL(KDatabaseCreateFileName));
+	if (err != KErrNotFound)
+		{
+		User::LeaveIfError(err);
+		}
+	}
+
+//
+// COomSetDatabaseDrive
+//
+
+void COomSetDatabaseDrive::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC),EFalse);
+	}
+
+void COomSetDatabaseDrive::PreFailL()
+	{
+	// select test drive
+	CContactDatabase::SetDatabaseDriveL(iMmcDrive,EFalse);
+	// delete default database, if present
+	TRAP_IGNORE(CContactDatabase::DeleteDefaultFileL());
+	// switch back to C: drive
+	CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC),EFalse);
+	// ensure a default database file exists on C:
+	if (!CContactDatabase::DefaultContactDatabaseExistsL())
+		{
+		CContactDatabase* newDb = CContactDatabase::ReplaceL();
+		delete newDb;
+		}
+	}
+
+void COomSetDatabaseDrive::FailL()
+	{
+	CContactDatabase::SetDatabaseDriveL(iMmcDrive);
+	}
+
+void COomSetDatabaseDrive::ClearUpL()
+	{
+// Below needed because of problem with CDictionaryStore reporting error when it has successfully
+// committed changes to the DatabaseDrive ini variable
+	RecoverL();
+	
+	TRAPD(error,CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC),ETrue));
+	if (error==KErrNotFound || error==KErrAlreadyExists)
+		{
+		CContactDatabase::SetDatabaseDriveL(TDriveUnit(EDriveC),EFalse);
+		}
+	else 
+		{
+		User::LeaveIfError(error);
+		}
+	}
+
+TBool COomSetDatabaseDrive::ErrorOk(TOomFailureModes aMode, TInt aIteration, TInt aError)
+	{
+	if(aMode != KOomFailFileServerGeneral)
+		{
+		if (aError != KErrNoMemory)
+			{
+			TPtrC drvPtr(iMmcDrive.Name());
+
+			test.Printf(_L("ErrorOk test failed for SetDatabaseDrive(%S) - Mode %i, iteration %i, error %i"), 
+				&drvPtr, aMode, aIteration, aError);
+
+#ifdef __WINS__
+			if (aError == KErrNotReady)
+				{
+				test.Printf(_L("Writeable directory must map to an extra drive (e.g. F: or D:). In epoc.ini file add _EPOC_DRIVE_F \\epoc32\\winscw\\f"));
+				}
+			else if (aError == KErrPathNotFound)
+				{
+				test.Printf(_L("Drive %S mapped in epoc.ini file, but probably the mapped directory does not exist."), &drvPtr);
+				}
+#else
+			// hardware build
+			if (aError == KErrNotReady)
+				{
+				test.Printf(_L("Drive %s not ready."), &drvPtr);
+				}
+#endif
+			return EFalse;
+			}
+		return ETrue;
+		}
+	else
+		{
+		return(COomFailBase::ErrorOk(aMode, aIteration, aError));
+		}
+	}
+
+//
+// COomGetDefaultName
+//
+
+void COomGetDefaultName::FailL()
+	{
+	TFileName fileName;
+	CContactDatabase::GetDefaultNameL(fileName);
+	}
+
+//
+// COomViewDefinition
+//
+
+void COomViewDefinition::FailL()
+	{
+	CContactItemViewDef* itemViewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
+	itemViewDef->AddL(KUidContactFieldCompanyName);
+	CContactViewDef* viewDef=CContactViewDef::NewL(itemViewDef);
+	CleanupStack::Pop();	// itemViewDef
+	delete viewDef;
+	}
+
+//
+// COomTextDefinition
+//
+
+void COomTextDefinition::FailL()
+	{
+	CContactTextDef *textDef=CContactTextDef::NewLC();
+	textDef->AppendL(TContactTextDefItem(KUidContactFieldPhoneNumber));
+	CleanupStack::PopAndDestroy();	// textDef
+	}
+
+//
+// COomReadContact
+//
+
+void COomReadContact::FailL()
+	{
+	iDb->ReadContactLC((*IdList)[0]);
+	CContactItem* card2=iDb->ReadContactL((*IdList)[1]);
+	CleanupStack::PopAndDestroy();	// card1
+	delete card2;
+	}
+
+//
+// COomAddNewContact
+//
+void COomAddNewContact::PreFailL()
+	{
+	iDbEventQueue->Flush();
+	iNewContactId=KNullContactId;
+	}
+
+void COomAddNewContact::FailL()
+	{
+	CContactCard* card=CContactCard::NewL();
+	CleanupStack::PushL(card);
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("OOM"),EFalse);
+	iNewContactId=iDb->AddNewContactL(*card);
+	CleanupStack::PopAndDestroy(); // card
+	}
+
+void COomAddNewContact::ClearUpL()
+	{
+	RecoverL(ETrue); //Wait for recover complete
+
+	if (iNewContactId!=KNullContactId)
+		iDb->DeleteContactL(iNewContactId);
+	}
+
+TBool COomAddNewContact::Skip(TInt aCount, TOomFailureModes aMode) const
+	{
+	// Skipped because KErrCorrupt when recovering.
+	if (aMode==KOomFailFileServerGeneral) return aCount==10;
+	if (aMode==KOomFailFileServerOom) return aCount==10;
+	return EFalse;
+	}
+
+//
+// COomReadContactTextDef
+//
+
+void COomReadContactTextDef::FailL()
+	{
+	CContactTextDef *textDef=CContactTextDef::NewLC();
+	textDef->AppendL(TContactTextDefItem(KUidContactFieldGivenName,_L("==")));
+	textDef->AppendL(TContactTextDefItem(KUidContactFieldFamilyName,_L(", ")));
+	TBuf<0x100> buf;
+	iDb->ReadContactTextDefL((*IdList)[1],buf,textDef);
+	iDb->ReadContactTextDefL((*IdList)[3],buf,textDef);
+	CleanupStack::PopAndDestroy();	// textDef
+	}
+
+//
+// COomOpenAndCloseContact
+//
+
+void COomOpenAndCloseContact::FailL()
+	{
+	CContactItem* card=iDb->OpenContactL((*IdList)[0]);
+	delete card;
+	iDb->CloseContactL((*IdList)[0]);
+	}
+
+//
+// COomOpenAndCloseContactX
+//
+
+void COomOpenAndCloseContactX::FailL()
+	{
+	CContactItem* card=iDb->OpenContactLX((*IdList)[0]);
+	CleanupStack::PushL(card);
+	CleanupStack::PushL(HBufC::NewL(10));	// any old alloc to trigger a fail between the open and close
+	iDb->CloseContactL((*IdList)[0]);
+	CleanupStack::PopAndDestroy(2); // HBufC & card
+	CleanupStack::Pop(); // card close
+	}
+
+//
+// COomOpenModifyAndCommitContact
+//
+
+void COomOpenModifyAndCommitContact::PreFailL()
+	{
+	iCard=iDb->OpenContactL((*IdList)[1]);
+	iDbEventQueue->Flush();
+	}
+
+void COomOpenModifyAndCommitContact::FailL()
+	{
+	SetNameL(*iCard,KUidContactFieldGivenName,KUidContactFieldVCardMapUnusedN,_L("Hacked name"),EFalse);
+	iDb->CommitContactL(*iCard);
+	}
+
+void COomOpenModifyAndCommitContact::ClearUpL()
+	{
+	iDb->CloseContactL((*IdList)[1]);
+	delete iCard;
+	RecoverL(ETrue); //wait for event
+	}
+
+TBool COomOpenModifyAndCommitContact::Skip(TInt aCount, TOomFailureModes aMode) const
+	{
+	// KErrCorrupt when recovering
+	if (aMode==KOomFailFileServerGeneral) return aCount==11;
+	if (aMode==KOomFailFileServerOom) return aCount==11;
+	return(EFalse);
+	}
+
+//
+// COomDeleteContact
+//
+
+void COomDeleteContact::PreFailL()
+	{
+	iStartCount=iDb->CountL();
+	CContactCard* card=CContactCard::NewL();
+	CleanupStack::PushL(card);
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("DeleteMe"),EFalse);
+	iNewContactId=iDb->AddNewContactL(*card);
+	CleanupStack::PopAndDestroy(); // card
+	}
+
+void COomDeleteContact::FailL()
+	{
+	iDb->DeleteContactL(iNewContactId);
+	}
+
+void COomDeleteContact::ClearUpL()
+	{
+	RecoverL();
+	TRAP_IGNORE(iDb->DeleteContactL(iNewContactId));
+	test(iStartCount==iDb->CountL());
+	}
+
+TBool COomDeleteContact::Skip(TInt aCount, TOomFailureModes aMode) const
+	{
+	// KErrCorrupt when recovering.
+	if (aMode==KOomFailFileServerGeneral) return aCount==11;
+	if (aMode==KOomFailFileServerOom) return aCount==11;
+	return(EFalse);
+	}
+
+//
+// COomDeleteContacts
+//
+
+void COomDeleteContacts::PreFailL()
+	{
+	iStartCount=iDb->CountL();
+	CContactCard* card=CContactCard::NewL();
+	CleanupStack::PushL(card);
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("DeleteMe"),EFalse);
+	iNewContactIds=CContactIdArray::NewL();
+	iNewContactIds->AddL(iDb->AddNewContactL(*card));
+	iNewContactIds->AddL(iDb->AddNewContactL(*card));
+	iNewContactIds->AddL(iDb->AddNewContactL(*card));
+	CleanupStack::PopAndDestroy(); // card
+	}
+
+void COomDeleteContacts::FailL()
+	{
+	iDb->DeleteContactsL(*iNewContactIds);
+	}
+
+void COomDeleteContacts::ClearUpL()
+	{
+	RecoverL();
+	for(TInt loop=0;loop<iNewContactIds->Count();loop++)
+		{
+		TRAP_IGNORE(iDb->DeleteContactL((*iNewContactIds)[loop]));
+		}
+	delete iNewContactIds;
+	test(iStartCount==iDb->CountL());
+	}
+
+TBool COomDeleteContacts::Skip(TInt /*aCount*/, TOomFailureModes aMode) const
+	{
+	// KErrCorrupt when recovering.
+	// This fails on one test case (usually around 60 - 70) but which
+	// one changes between builds.
+	if (aMode==KOomFailFileServerGeneral) return ETrue;
+	if (aMode==KOomFailFileServerOom) return ETrue;
+	return EFalse;
+	}
+
+//
+// COomCompact
+//
+
+void COomCompact::FailL()
+	{
+	iDb->CompactL();
+	}
+
+void COomCompact::ClearUpL()
+	{
+	RecoverL();
+	}
+
+//
+// COomExportSelectedContacts
+//
+
+COomExportSelectedContacts::~COomExportSelectedContacts()
+	{
+	delete iIdList;
+	}
+
+void COomExportSelectedContacts::ConstructL()
+	{
+	COomFailBase::ConstructL();
+//
+	CArrayFix<CContactDatabase::TSortPref>* sortOrder=new(ELeave) CArrayFixFlat<CContactDatabase::TSortPref>(3);
+	CleanupStack::PushL(sortOrder);
+	sortOrder->AppendL(CContactDatabase::TSortPref(KUidContactFieldFamilyName));
+	iDb->SortL(sortOrder);
+	CleanupStack::Pop(); // sortOrder
+//
+	iIdList=CContactIdArray::NewL(iDb->SortedItemsL());
+	while(iIdList->Count()>2)
+		iIdList->Remove(0);	// only leave 2 in the array
+	}
+
+void COomExportSelectedContacts::PreFailL()
+	{
+	iStore=CDirectFileStore::ReplaceL(TheFs,_L("c:\\TErrorExport"),EFileWrite);
+   	iStore->SetTypeL(KDirectFileStoreLayoutUid);
+	iStreamId=iOutStream.CreateL(*iStore);
+	}
+
+void COomExportSelectedContacts::FailL()
+	{
+   	iDb->ExportSelectedContactsL(TUid::Uid(KUidVCardConvDefaultImpl),*iIdList,iOutStream,CContactDatabase::ETTFormat);
+	}
+
+void COomExportSelectedContacts::ClearUpL()
+	{
+	RecoverL();
+	iOutStream.CommitL();
+	iStore->SetRootL(iStreamId);
+	iStore->CommitL();  	
+	iOutStream.Close();
+	delete iStore;
+	}
+
+TBool COomExportSelectedContacts::ErrorOk(TOomFailureModes aMode, TInt aIteration, TInt aError)
+	{
+	// LoadPluginL interprets all file server errors as KErrNotFound, except KErrNoMemory.
+	if(aMode == KOomFailFileServerGeneral)
+		{
+		if (aError == KErrGeneral || aError == KErrNotFound)
+			return ETrue;
+		
+		test.Printf(_L("ErrorOk test - Mode %i, iteration %i, error %i"), aMode, aIteration, aError);
+		return EFalse;
+		}
+	else if(aMode == KOomFailFileServerOom)
+		{
+		if (aError == KErrNoMemory || aError == KErrNotFound)
+			return ETrue;
+
+		test.Printf(_L("ErrorOk test - Mode %i, iteration %i, error %i"), aMode, aIteration, aError);
+		return EFalse;
+		}
+	else
+		{
+		return(COomFailBase::ErrorOk(aMode, aIteration, aError));
+		}
+	}
+
+//
+// COoomImportContacts
+//
+
+COomImportContacts::~COomImportContacts()
+	{
+	TRAP_IGNORE(iDb->DeleteContactL(iDeleteMeId));
+	delete iStore;
+	}
+
+void COomImportContacts::ConstructL()
+	{
+//zzz Need a ttformat version of this
+	COomFailBase::ConstructL();
+//
+	CArrayFix<CContactDatabase::TSortPref>* sortOrder=new(ELeave) CArrayFixFlat<CContactDatabase::TSortPref>(3);
+	CleanupStack::PushL(sortOrder);
+	sortOrder->AppendL(CContactDatabase::TSortPref(KUidContactFieldFamilyName));
+	iDb->SortL(sortOrder);
+	CleanupStack::Pop(); // sortOrder
+//
+	iStore=CDirectFileStore::ReplaceL(TheFs,_L("c:\\TErrorExport"),EFileWrite);
+  	iStore->SetTypeL(KDirectFileStoreLayoutUid);
+	RStoreWriteStream outStream;
+	iStreamId=outStream.CreateLC(*iStore);
+//
+	CContactIdArray *idList=CContactIdArray::NewLC();
+	CContactCard *card=CContactCard::NewLC();
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("ABCDE"),EFalse);
+	SetNameL(*card,KUidContactFieldGivenName,KUidContactFieldVCardMapUnusedN,_L("123"),EFalse);
+	idList->AddL(iDb->AddNewContactL(*card));
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("ZYX"),EFalse);
+	SetNameL(*card,KUidContactFieldGivenName,KUidContactFieldVCardMapUnusedN,_L("987"),EFalse);
+	idList->AddL(iDb->AddNewContactL(*card));
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("QQQQ"),EFalse);
+	SetNameL(*card,KUidContactFieldGivenName,KUidContactFieldVCardMapUnusedN,_L("666"),EFalse);
+	idList->AddL(iDb->AddNewContactL(*card));
+	CleanupStack::PopAndDestroy();	// card
+   	iDb->ExportSelectedContactsL(TUid::Uid(KUidVCardConvDefaultImpl),*idList,outStream,CContactDatabase::EExcludeUid);
+	iDb->DeleteContactL((*idList)[0]);
+	iDb->DeleteContactL((*idList)[1]);
+	iDeleteMeId=(*idList)[2];	// Leave this one in the DB so it is imported as an updated entry
+//
+	outStream.CommitL();
+	iStore->SetRootL(iStreamId);
+	iStore->CommitL();  	
+	CleanupStack::PopAndDestroy(2);	// outStream,idList
+	iOldRecordCount=iDb->CountL();
+	}
+
+void COomImportContacts::PreFailL()
+	{
+	iInStream.OpenL(*iStore,iStreamId);
+	}
+
+void COomImportContacts::FailL()
+	{
+	TBool success=EFalse;
+	iImportedContacts=iDb->ImportContactsL(TUid::Uid(KUidVCardConvDefaultImpl),iInStream,success,0);
+	test(iImportedContacts->Count()==3);
+	test(success);
+	}
+
+void COomImportContacts::ClearUpL()
+	{
+	RecoverL();
+	if (iImportedContacts)
+		{
+		while(iImportedContacts->Count()>0)
+			{
+			iDb->DeleteContactL((*iImportedContacts)[0]->Id());
+			delete (*iImportedContacts)[0];
+			iImportedContacts->Delete(0);
+			}
+		delete iImportedContacts;
+		iImportedContacts=NULL;
+		}
+	test(iDb->CountL()==iOldRecordCount);
+	iInStream.Close();
+	}
+
+TBool COomImportContacts::Skip(TInt, TOomFailureModes aMode) const
+	{
+	// KErrCorrupt when recovering
+	// This test only fails on one or two counts in each loop through the harness,
+	// but the particular counts on which it fails seem to vary with each execution.
+	if (aMode==KOomFailFileServerGeneral) return ETrue;
+	if (aMode==KOomFailFileServerOom) return ETrue;
+	return(EFalse);
+	}
+
+//
+// COomFind
+//
+
+void COomFind::FailL()
+	{
+	CContactItemFieldDef *fieldDef=new(ELeave) CContactItemFieldDef;
+	CleanupStack::PushL(fieldDef);
+	fieldDef->AppendL(KUidContactFieldFamilyName);
+	CContactIdArray* ids=iDb->FindLC(_L("NAME"),fieldDef);
+	test(ids->Count()==5);
+	CleanupStack::PopAndDestroy(2);	// ids & fieldDef
+	}
+
+//
+// COomFindInTextDef
+//
+
+LOCAL_C TInt findWordSplitterL(TAny *aParams)
+	{
+	SFindInTextDefWordParser *parser=(SFindInTextDefWordParser *)aParams;
+	const TText *ptr=parser->iSearchString->Ptr();
+	const TText *end=ptr+parser->iSearchString->Length();
+	const TText *startOfWord=NULL;
+	FOREVER
+		{
+		if (ptr==end || !TChar(*ptr).IsAlphaDigit())
+			{
+			if (startOfWord)
+				{
+				TPtrC addWord(startOfWord,ptr-startOfWord);
+				parser->iWordArray->AppendL(addWord);
+				startOfWord=NULL;
+				}
+			if (ptr==end)
+				break;
+			}
+		else if (!startOfWord)
+			startOfWord=ptr;
+		ptr++;
+		}
+	return(KErrNone);
+	}
+
+COomFindInTextDef::~COomFindInTextDef()
+	{
+	delete iTextDef;
+	delete iFindWords;
+	}
+
+void COomFindInTextDef::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iTextDef=CContactTextDef::NewL();
+	iTextDef->AppendL(KUidContactFieldFamilyName);
+	iTextDef->AppendL(KUidContactFieldGivenName);
+	iFindWords=new(ELeave) CDesCArrayFlat(2);
+	iFindWords->AppendL(_L("NAME"));
+	iFindWords->AppendL(_L("GivenName"));
+	}
+
+void COomFindInTextDef::FailL()
+	{
+	TCallBack callBack(findWordSplitterL);
+	CContactIdArray* ids=iDb->FindInTextDefLC(*iFindWords,iTextDef,callBack);
+	test(ids->Count()==5);
+	CleanupStack::PopAndDestroy();	// ids
+	}
+
+//
+// COomFindAsync
+//
+
+class CAsyncFinder : public CBase, public MIdleFindObserver
+	{
+public:
+	~CAsyncFinder();
+	void ConstructL(CContactDatabase *aContactDatabase, const TDesC& aText,const CContactItemFieldDef *aFieldDef);
+	void ConstructL(CContactDatabase *aContactDatabase, const CDesCArrayFlat &iFindWords,CContactTextDef* iTextDef, const TCallBack &aCallBack);
+	inline CContactIdArray *TakeContactIds() {return(iFinder->TakeContactIds());};
+	inline TInt Error() const {return(iFinder->Error());};
+protected:
+// from MIdleFindObserver
+	void IdleFindCallback();
+private:
+	CIdleFinder *iFinder;
+	};
+
+CAsyncFinder::~CAsyncFinder()
+	{
+	delete iFinder;
+	}
+
+void CAsyncFinder::ConstructL(CContactDatabase *aContactDatabase, const TDesC& aText,const CContactItemFieldDef *aFieldDef)
+	{
+	iFinder=aContactDatabase->FindAsyncL(aText, aFieldDef, this);
+	}
+
+void CAsyncFinder::ConstructL(CContactDatabase *aContactDatabase, const CDesCArrayFlat &aFindWords,CContactTextDef* iTextDef, const TCallBack &aCallBack)
+	{
+	iFinder=aContactDatabase->FindInTextDefAsyncL(aFindWords, iTextDef, this, aCallBack);
+	}
+
+void CAsyncFinder::IdleFindCallback()
+	{
+	if (iFinder->IsComplete())
+		CActiveScheduler::Stop();
+	}
+
+void COomFindAsync::FailL()
+	{
+	CAsyncFinder *finder=new(ELeave) CAsyncFinder;
+	CleanupStack::PushL(finder);
+	finder->ConstructL(iDb,_L("NAME"),NULL);
+	CActiveScheduler::Start();
+	User::LeaveIfError(finder->Error());
+	CContactIdArray *ids=finder->TakeContactIds();
+	CleanupStack::PushL(ids);
+	test(ids->Count()==5);
+	CleanupStack::PopAndDestroy(2);	// ids,finder
+	}
+
+//
+// COomFindAsyncInTextDef
+//
+
+COomFindAsyncInTextDef::~COomFindAsyncInTextDef()
+	{
+	delete iTextDef;
+	delete iFindWords;
+	}
+
+void COomFindAsyncInTextDef::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iTextDef=CContactTextDef::NewL();
+	iTextDef->AppendL(KUidContactFieldFamilyName);
+	iTextDef->AppendL(KUidContactFieldGivenName);
+	iFindWords=new(ELeave) CDesCArrayFlat(2);
+	iFindWords->AppendL(_L("NAME"));
+	iFindWords->AppendL(_L("GivenName"));
+	}
+
+void COomFindAsyncInTextDef::FailL()
+	{
+	TCallBack callBack(findWordSplitterL);
+	CAsyncFinder *finder=new(ELeave) CAsyncFinder;
+	CleanupStack::PushL(finder);
+	finder->ConstructL(iDb,*iFindWords,NULL,callBack);
+	CActiveScheduler::Start();
+	User::LeaveIfError(finder->Error());
+	CContactIdArray *ids=finder->TakeContactIds();
+	CleanupStack::PushL(ids);
+//	test(ids->Count()==5);
+	CleanupStack::PopAndDestroy(2);	// ids,finder
+	}
+
+//
+// COomSort
+//
+
+TBool COomSort::Skip(TInt /*aCount*/, TOomFailureModes aMode) const
+	{
+	if(aMode == KOomFailFileServerGeneral)
+		return ETrue;
+	return ETrue;
+	}
+void COomSort::FailL()
+	{
+	CArrayFix<CContactDatabase::TSortPref>* sortOrder=new(ELeave) CArrayFixFlat<CContactDatabase::TSortPref>(3);
+	CleanupStack::PushL(sortOrder);
+	sortOrder->AppendL(CContactDatabase::TSortPref(KUidContactFieldFamilyName));
+	sortOrder->AppendL(CContactDatabase::TSortPref(KUidContactFieldGivenName));
+	iDb->SortL(sortOrder);
+	CleanupStack::Pop(); // sortOrder
+	const CContactIdArray *ids=iDb->SortedItemsL();
+	test(ids->Count()>0);
+	if (iPrevCount>0)
+		test(ids->Count()==iPrevCount);
+	else
+		iPrevCount=ids->Count();
+	}
+
+//
+// COomSortArray
+//
+
+COomSortArray::~COomSortArray()
+	{
+	delete iSortOrder;
+	delete iIdArray;
+	}
+
+void COomSortArray::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iSortOrder=new(ELeave) CArrayFixFlat<CContactDatabase::TSortPref>(3);
+	iSortOrder->AppendL(CContactDatabase::TSortPref(KUidContactFieldFamilyName));
+	iSortOrder->AppendL(CContactDatabase::TSortPref(KUidContactFieldGivenName));
+	iIdArray=CContactIdArray::NewL(iDb->SortedItemsL());
+	}
+
+void COomSortArray::FailL()
+	{
+	CContactIdArray *sortedIds=iDb->SortArrayL(iIdArray,iSortOrder);
+	test(sortedIds->Count()==iIdArray->Count());
+	delete sortedIds;
+	}
+
+//
+// COomCompress
+//
+
+void COomCompress::Step(TInt )
+	{
+	}
+
+void COomCompress::HandleError(TInt aError)
+	{
+	iRecievedError=aError;
+	}
+
+void COomCompress::PreFailL()
+	{
+	CContactCard* card=CContactCard::NewL();
+	CleanupStack::PushL(card);
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("DeleteMe"),EFalse);
+	iDb->DeleteContactL(iDb->AddNewContactL(*card));	// Make sure a compress is required
+	iDb->DeleteContactL(iDb->AddNewContactL(*card));
+	iDb->DeleteContactL(iDb->AddNewContactL(*card));
+	iDb->DeleteContactL(iDb->AddNewContactL(*card));
+	CleanupStack::PopAndDestroy(); // card
+	iRecievedError=KErrNone;
+	}
+
+void COomCompress::FailL()
+	{
+	CContactActiveCompress* compressor=iDb->CreateCompressorLC();
+	compressor->SetObserver(this);
+	while(compressor->Step()) {};
+	test(iRecievedError==compressor->Error());
+	User::LeaveIfError(compressor->Error());
+	CleanupStack::PopAndDestroy();	// compressor
+	}
+
+void COomCompress::ClearUpL()
+	{
+	RecoverL();
+	}
+
+TBool COomCompress::Skip(TInt /*aCount*/, TOomFailureModes aMode) const
+	{
+	// KErrCorrupt.
+	// This fails on 3 or 4 tests in each run, but which ones varies between executions.
+	if (aMode==KOomFailFileServerGeneral || aMode==KOomFailFileServerOom) return ETrue;
+	return(EFalse);
+	}
+
+//
+// COomRecover
+//
+
+void COomRecover::Step(TInt )
+	{
+	}
+
+void COomRecover::HandleError(TInt aError)
+	{
+	iRecievedError=aError;
+	}
+
+void COomRecover::PreFailL()
+	{
+	iRecievedError = KErrNone;
+	if (iDb->IsDamaged())
+		{
+		doRecoverL();
+		}
+	iDb->DamageDatabaseL(0x666);
+	}
+
+void COomRecover::doRecoverL()
+	{
+	CContactActiveRecover* recover=iDb->CreateRecoverLC();
+	recover->SetObserver(this);
+	while(recover->Step()) {};
+	test(iRecievedError==recover->Error());
+	User::LeaveIfError(recover->Error());
+	CleanupStack::PopAndDestroy();	// recover
+	}
+
+void COomRecover::FailL()
+	{
+	test(DbShouldBeInDamagedState(iDb) );
+	doRecoverL();
+	}
+
+TBool COomRecover::Skip(TInt, TOomFailureModes aMode) const
+	{
+	// KErrCorrupt
+	// This test usually only fails on one value of count, but exactly which
+	// one it will be varies between executions of the harness. Not good.
+	if (aMode==KOomFailFileServerGeneral) return ETrue;
+	if (aMode==KOomFailFileServerOom) return ETrue;
+	if (aMode==KOomFailDbs) return ETrue; //fixes INC052869 - remove for DEF054579
+	return(EFalse);
+	}
+
+//
+// COomCloseOpenTables
+//
+
+void COomCloseOpenTables::FailL()
+	{
+	iDb->CloseTables();
+	iDbEventQueue->Clear();
+	}
+
+//
+// COomViewDefInternalize
+//
+
+COomViewDefInternalize::~COomViewDefInternalize()
+	{
+	delete iBufStore;
+	}
+
+void COomViewDefInternalize::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	CContactItemViewDef* itemViewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
+	itemViewDef->AddL(KUidContactFieldCompanyName);
+	itemViewDef->AddL(KUidContactFieldGivenName);
+	CContactViewDef* viewDef=CContactViewDef::NewL(itemViewDef);
+	CleanupStack::Pop();	// itemViewDef
+	CleanupStack::PushL(viewDef);	// viewDef
+//
+	iBufStore=CBufStore::NewL(0x400);
+	RStoreWriteStream writeStream;
+	iStreamId=writeStream.CreateLC(*iBufStore);
+	viewDef->ExternalizeL(writeStream);
+	CleanupStack::PopAndDestroy(2);	// writeStream,viewDef
+	}
+
+void COomViewDefInternalize::PreFailL()
+	{
+	iReadStream.OpenL(*iBufStore,iStreamId);
+	}
+
+void COomViewDefInternalize::FailL()
+	{
+	CContactViewDef* viewDef=CContactViewDef::NewLC();
+	viewDef->InternalizeL(iReadStream);
+	CleanupStack::PopAndDestroy();	// viewDef
+	}
+
+void COomViewDefInternalize::ClearUpL()
+	{
+	RecoverL();
+	iReadStream.Close();
+	}
+
+//
+// COomViewDefExternalize
+//
+
+COomViewDefExternalize::~COomViewDefExternalize()
+	{
+	delete iBufStore;
+	}
+
+void COomViewDefExternalize::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iBufStore=CBufStore::NewL(0x400);
+	}
+
+void COomViewDefExternalize::PreFailL()
+	{
+	iStreamId=iWriteStream.CreateL(*iBufStore);
+	iFailed=ETrue;
+	}
+
+void COomViewDefExternalize::FailL()
+	{
+	CContactItemViewDef* itemViewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
+	itemViewDef->AddL(KUidContactFieldCompanyName);
+	itemViewDef->AddL(KUidContactFieldGivenName);
+	CContactViewDef* viewDef=CContactViewDef::NewL(itemViewDef);
+	CleanupStack::Pop();	// itemViewDef
+	CleanupStack::PushL(viewDef);	// viewDef
+	viewDef->ExternalizeL(iWriteStream);
+	CleanupStack::PopAndDestroy();	// viewDef
+	iFailed=EFalse;
+	}
+
+void COomViewDefExternalize::ClearUpL()
+	{
+	RecoverL();
+	iWriteStream.Close();
+	if (!iFailed)
+		{
+		RStoreReadStream readStream;
+		readStream.OpenL(*iBufStore,iStreamId);
+		CContactViewDef* viewDef=CContactViewDef::NewLC();
+		viewDef->InternalizeL(readStream);
+		CleanupStack::PopAndDestroy();	// viewDef
+		readStream.Close();
+		}
+	iBufStore->Delete(iStreamId);
+	}
+
+//
+// COomFieldSetStore
+//
+
+COomFieldSetStore::~COomFieldSetStore()
+	{
+	delete iItemFieldSet;
+	delete iBufStore;
+	delete iBlobStore;
+	delete iTextStore;
+	}
+
+void COomFieldSetStore::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iBufStore=CBufStore::NewL(0x400);
+	iBlobStore=CBufStore::NewL(0x400);
+	iTextStore=CBufStore::NewL(0x400);
+	CContactItemField* itemField=CContactItemField::NewLC(KStorageTypeText, KUidContactFieldAddress);
+	iItemFieldSet=CContactItemFieldSet::NewL();
+	iItemFieldSet->AddL(*itemField);
+	CleanupStack::Pop();	// itemField
+	}
+
+void COomFieldSetStore::FailL()
+	{
+	iStreamId=KNullStreamId;
+	RStoreWriteStream stream;
+	stream.CreateLC(*iTextStore);
+	iStreamId=iItemFieldSet->StoreL(*iBufStore,stream,*iBlobStore);
+	CleanupStack::PopAndDestroy();
+	}
+
+void COomFieldSetStore::ClearUpL()
+	{
+	RecoverL();
+	iBufStore->Delete(iStreamId);
+	}
+
+//
+// COomFieldSetRestore
+//
+
+COomFieldSetRestore::~COomFieldSetRestore()
+	{
+	delete iBufStore;
+	delete iTextStore;
+	delete iBlobStore;
+	delete iViewDef;
+	}
+
+void COomFieldSetRestore::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iBufStore=CBufStore::NewL(0x400);
+	iTextStore=CBufStore::NewL(0x400);
+	iBlobStore=CBufStore::NewL(0x400);
+	CContactItemViewDef* itemViewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
+	itemViewDef->AddL(KUidContactFieldAddress);
+	iViewDef=CContactViewDef::NewL(itemViewDef);
+	CleanupStack::Pop();	// itemViewDef
+	}
+
+void COomFieldSetRestore::PreFailL()
+	{
+	CContactItemFieldSet *itemFieldSet=CContactItemFieldSet::NewLC();
+	CContactItemField* itemField=CContactItemField::NewLC(KStorageTypeText, KUidContactFieldAddress);
+	itemFieldSet->AddL(*itemField);
+	RStoreWriteStream stream;
+	iTextStreamId=stream.CreateLC(*iTextStore);
+	iStreamId=itemFieldSet->StoreL(*iBufStore,stream,*iBlobStore);
+	CleanupStack::PopAndDestroy();	// stream
+	CleanupStack::Pop();	// itemField
+	CleanupStack::PopAndDestroy();	// itemFieldSet
+	}
+
+void COomFieldSetRestore::FailL()
+	{
+	CContactItemFieldSet *itemFieldSet=CContactItemFieldSet::NewLC();
+	RStoreReadStream stream;
+	stream.OpenLC(*iTextStore,iTextStreamId);
+	itemFieldSet->RestoreL(*iBufStore,iStreamId,iBlobStore,iViewDef->ItemDef(),stream);
+	CleanupStack::PopAndDestroy(2);	// itemFieldSet
+	}
+
+void COomFieldSetRestore::ClearUpL()
+	{
+	RecoverL();
+	iBufStore->Delete(iStreamId);
+	}
+
+//
+// COomContactCardClone
+//
+
+COomContactCardClone::~COomContactCardClone()
+	{
+	delete iSourceCard;
+	}
+
+void COomContactCardClone::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iSourceCard=CContactCard::NewL();
+	CContactItemField *field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldAddress);
+	iSourceCard->AddFieldL(*field);
+	CleanupStack::Pop();	// field
+	field=CContactItemField::NewLC(KStorageTypeDateTime,TUid::Uid(0x123));
+	iSourceCard->AddFieldL(*field);
+	CleanupStack::Pop();	// field
+	}
+
+void COomContactCardClone::FailL()
+	{
+	CContactCard::NewLC(iSourceCard);
+	CleanupStack::PopAndDestroy();	// card
+	}
+
+//
+// COomContactChangeNotifier
+//
+
+COomContactChangeNotifier::COomNotificationRec* COomContactChangeNotifier::COomNotificationRec::NewL()
+	{ // static
+	COomContactChangeNotifier::COomNotificationRec* self=new(ELeave) COomContactChangeNotifier::COomNotificationRec;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();	// self
+	return self;
+	}
+
+COomContactChangeNotifier::COomNotificationRec::~COomNotificationRec()
+	{
+	delete iTimer;
+	}
+
+void COomContactChangeNotifier::COomNotificationRec::ConstructL()
+	{
+	iTimer=CPeriodic::NewL(0);
+	}
+
+void COomContactChangeNotifier::COomNotificationRec::Wait(TBool aUnknownErrAllowed)
+	{
+	iWaiting=ETrue;
+	iGotMessage=EFalse;
+	iUnknownErrAllowed=aUnknownErrAllowed;
+	iUnknownChange=EFalse;
+	iTimer->Cancel();
+	iTimer->Start(500000,500000,TCallBack(TimerCallBackL,this)); // wait for 0.5 second for notification
+	CActiveScheduler::Start();
+	}
+
+TInt COomContactChangeNotifier::COomNotificationRec::TimerCallBackL(TAny* aSelf)
+	{ // static
+	// if this gets called, notification hasn't happened
+	if (((COomNotificationRec *)aSelf)->iGotMessage)
+		CActiveScheduler::Stop();
+	else
+		User::Leave(KErrGeneral);
+	return 0;
+	}
+
+void COomContactChangeNotifier::COomNotificationRec::HandleDatabaseEventL(TContactDbObserverEvent aEvent)
+	{
+	if (aEvent.iType==EContactDbObserverEventContactChanged || (iUnknownErrAllowed && aEvent.iType==EContactDbObserverEventUnknownChanges))
+		{
+		iGotMessage=ETrue;
+		iTimer->Cancel();
+		if (!iWaiting)
+			return;
+		if (aEvent.iType==EContactDbObserverEventUnknownChanges)
+			iUnknownChange=ETrue;
+		CActiveScheduler::Stop();
+		delete HBufC::NewL(10);	// Dummy alloc so we can fail inside here
+		}
+	}
+
+COomContactChangeNotifier::~COomContactChangeNotifier()
+	{
+	delete iRec;
+	}
+
+void COomContactChangeNotifier::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iRec=COomContactChangeNotifier::COomNotificationRec::NewL();
+	}
+
+void COomContactChangeNotifier::PreFailL()
+	{
+	iItem1=iDb->OpenContactL((*IdList)[0]);
+	iItem2=iDb->OpenContactL((*IdList)[1]);
+	iItem3=iDb->OpenContactL((*IdList)[2]);
+	}
+
+void COomContactChangeNotifier::FailL()
+	{
+	CContactChangeNotifier *notify1=CContactChangeNotifier::NewL(*iDb,iRec);
+	CleanupStack::PushL(notify1);
+	iDb->CommitContactL(*iItem1);
+	iDb->CommitContactL(*iItem2);
+	iDb->CommitContactL(*iItem3);
+	for(TInt loop=0;loop<3;loop++)
+		{
+		iRec->Wait(ETrue);
+		if (iRec->UnknownChange())
+			User::Leave(KErrNoMemory);
+		}
+	CleanupStack::PopAndDestroy(); // notify1
+	}
+
+void COomContactChangeNotifier::ClearUpL()
+	{
+	RecoverL();
+	iDb->CloseContactL(iItem1->Id());
+	iDb->CloseContactL(iItem2->Id());
+	iDb->CloseContactL(iItem3->Id());
+	delete iItem1;
+	delete iItem2;
+	delete iItem3;
+//
+	CContactChangeNotifier *notify=CContactChangeNotifier::NewL(*iDb,iRec);
+	CleanupStack::PushL(notify);
+	CContactItem *item=iDb->OpenContactLX((*IdList)[0]);
+	CleanupStack::PushL(item);
+	iDb->CommitContactL(*item);
+	iRec->Wait(EFalse);	// Check q working again
+	CleanupStack::PopAndDestroy(3);	// item, close record, notify
+	}
+
+TBool COomContactChangeNotifier::Skip(TInt aCount, TOomFailureModes aMode) const
+	{
+	// KErrCorrupt:
+	if (aMode==KOomFailFileServerGeneral) return aCount == 5 || aCount == 11 || aCount == 17;
+	if (aMode==KOomFailFileServerOom) return aCount == 5 || aCount == 11 || aCount == 17;
+	return EFalse;
+	}
+
+//
+// COomPhoneNumberLookup
+//
+
+COomPhoneNumberLookup::~COomPhoneNumberLookup()
+	{
+	delete iAddCard;
+	}
+
+void COomPhoneNumberLookup::ConstructL()
+	{
+	iAddId=KNullContactId;
+	iDb=CContactDatabase::ReplaceL(KDatabaseCreateFileName);
+	iDbEventQueue = CContactDbEventQueue::NewL(iDb);
+	iAddCard=CContactCard::NewL();
+	SetNameL(*iAddCard,KUidContactFieldPhoneNumber,KUidContactFieldVCardMapTEL,_L("11223344"),ETrue);
+	SetNameL(*iAddCard,KUidContactFieldPhoneNumber,KUidContactFieldVCardMapTEL,_L("22334455"),ETrue);
+	}
+
+void COomPhoneNumberLookup::PreFailL()
+	{
+	iAddId=KNullContactId;
+	iAddId=iDb->AddNewContactL(*iAddCard);
+	}
+
+void COomPhoneNumberLookup::FailL()
+	{
+/*	CContactIdArray *matchArray=iDb->PhoneMatchListL(_L("11223344"));
+	CleanupStack::PushL(matchArray);
+	test(matchArray->Count()==1);
+	test((*matchArray)[0]==iAddId);
+	CleanupStack::PopAndDestroy();	// matchArray
+	matchArray=iDb->PhoneMatchListL(_L("22334455"));
+	CleanupStack::PushL(matchArray);
+	test(matchArray->Count()==1);
+	test((*matchArray)[0]==iAddId);
+	CleanupStack::PopAndDestroy();	// matchArray*/
+	}
+
+void COomPhoneNumberLookup::ClearUpL()
+	{
+	RecoverL();
+	if (iAddId!=KNullContactId)
+		iDb->DeleteContactL(iAddId);
+	iAddId = KNullContactId;
+	iDb->CompactL();
+	}
+
+// 
+// COomContactsChangedSince
+//
+
+COomContactsChangedSince::~COomContactsChangedSince()
+	{
+	TRAP_IGNORE(iDb->DeleteContactL(iNewContactId1));
+	TRAP_IGNORE(iDb->DeleteContactL(iNewContactId2));
+	}
+
+void COomContactsChangedSince::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iBeforeTime.UniversalTime();
+	CContactCard* card=CContactCard::NewL();
+	CleanupStack::PushL(card);
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("add1"),EFalse);
+	iNewContactId1=iDb->AddNewContactL(*card);
+	SetNameL(*card,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("add2"),EFalse);
+	iNewContactId2=iDb->AddNewContactL(*card);
+	CleanupStack::PopAndDestroy(); // card
+	}
+
+void COomContactsChangedSince::FailL()
+	{
+	CContactIdArray* ids=iDb->ContactsChangedSinceL(iBeforeTime);
+	test(ids->Count()==2);
+	delete ids;
+	}
+
+// 
+// COomGroups
+//
+
+COomGroups::~COomGroups()
+	{
+	delete iItem1;
+	}
+
+void COomGroups::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	iItem1=(CContactCard *)iDb->ReadContactL((*IdList)[0]);
+	}
+
+void COomGroups::FailL()
+	{
+	iGroupId=KNullContactId;
+	CContactGroup* oomGroup=(CContactGroup*)iDb->CreateContactGroupLC(_L("Oom Group"));
+	iGroupId=oomGroup->Id();
+//
+	iDb->AddContactToGroupL((*IdList)[1],iGroupId);
+	iDb->AddContactToGroupL(*iItem1,*oomGroup);
+//
+	iDb->RemoveContactFromGroupL((*IdList)[0],iGroupId);
+	iDb->RemoveContactFromGroupL((*IdList)[1],iGroupId);
+//
+	CleanupStack::PopAndDestroy(oomGroup);
+	}
+
+void COomGroups::ClearUpL()
+	{
+	RecoverL();
+	if (iGroupId!=KNullContactId)
+		{
+		TRAP_IGNORE(iDb->DeleteContactL(iGroupId));
+		}
+//	test(TestGroupStateL(iDb,-1,-1));
+	CContactIdArray* grpList=iDb->GetGroupIdListL(); // This is introduced from 9.3 onwards as deletion of GroupIds was not happening properly.
+	TInt count = grpList->Count();					 // during a leave (in COomGroups::FailL() at CContactGroup* oomGroup=(CContactGroup*)iDb->CreateContactGroupLC(_L("Oom Group")); 
+													 // a  group is created in db but the ccontactdatabase doesnt append to its list and so it is not cleaned by COomGroups::ClearUpL properly
+	if( count > 0 )
+	{
+		TContactItemId id = (*grpList)[0];
+		TRAP_IGNORE(iDb->DeleteContactL(id)); 
+	}
+	delete grpList;
+	}
+
+TBool COomGroups::Skip(TInt, TOomFailureModes aMode) const
+	{
+	// KErrCorrupt
+	// Another one of those moving targets. The value of count at which failure occurs
+	// varies between executions.
+	if (aMode==KOomFailFileServerGeneral) return ETrue;
+	if (aMode==KOomFailFileServerOom) return ETrue;
+	return(EFalse);
+	}
+
+// 
+// COomGroups
+//
+
+COomGroups2::~COomGroups2()
+	{
+	TRAP_IGNORE(iDb->DeleteContactL(iGroupId1));
+	TRAP_IGNORE(iDb->DeleteContactL(iGroupId2));
+	}
+
+void COomGroups2::ConstructL()
+	{
+	COomFailBase::ConstructL();
+	CContactGroup* oomGroup=(CContactGroup*)iDb->CreateContactGroupLC(_L("Oom Group"));
+	iGroupId1=oomGroup->Id();
+	CleanupStack::PopAndDestroy(oomGroup);
+	iDb->AddContactToGroupL((*IdList)[0],iGroupId1);
+	oomGroup=(CContactGroup*)iDb->CreateContactGroupLC(_L("Oom Group"));
+	iGroupId2=oomGroup->Id();
+	CleanupStack::PopAndDestroy(oomGroup);
+	iDb->AddContactToGroupL((*IdList)[0],iGroupId2);
+	iDb->AddContactToGroupL((*IdList)[1],iGroupId2);
+	}
+
+void COomGroups2::FailL()
+	{
+	CContactCard *card=(CContactCard *)iDb->ReadContactLC((*IdList)[0]);
+//
+	CContactIdArray* idArray=card->GroupsJoinedLC();
+	test(idArray->Count()==2);
+	test((*idArray)[0]==iGroupId1);
+	test((*idArray)[1]==iGroupId2);
+	CleanupStack::PopAndDestroy(idArray);
+	CleanupStack::PopAndDestroy(card);
+//
+	CContactGroup *group=(CContactGroup *)iDb->ReadContactLC(iGroupId2);
+	const CContactIdArray* itemsContained=group->ItemsContained();
+	test(itemsContained->Count()==2);
+	test((*itemsContained)[0]==(*IdList)[0]);
+	test((*itemsContained)[1]==(*IdList)[1]);
+	CleanupStack::PopAndDestroy(group);
+//
+	CContactIdArray* groupIdList=iDb->GetGroupIdListL();
+	test(groupIdList->Count()==2);
+	test((*groupIdList)[0]==iGroupId1);
+	test((*groupIdList)[1]==iGroupId2);
+	delete groupIdList;
+	}
+
+void COomGroups2::ClearUpL()
+	{
+	RecoverL();
+	test(TestGroupStateL(iDb,-1,-1));
+	}
+
+//
+// COomTest
+//
+
+COomTest::COomTest(TDriveUnit aMmcDrive) : iMmcDrive(aMmcDrive)
+	{}
+
+void COomTest::Test(TBool aMustBeTrue)
+	{
+	test(aMustBeTrue);
+	}
+
+TInt COomTest::GetRecordCountL()
+	{
+	CContactDatabase *db=CContactDatabase::OpenL(KDatabaseFileName);
+	CleanupStack::PushL(db);
+	TInt recordCount=db->CountL();
+	CleanupStack::PopAndDestroy();	// db
+	return(recordCount);
+	}
+
+
+void COomTest::DoOomTestL(COomFailBase *aOomTest, TOomFailureModes aMode)
+	{
+	test(aOomTest!=NULL);
+	test.Next(_L(" "));
+
+	__UHEAP_MARK;
+	TInt oldDbCount=iDbs.ResourceCount();
+	TInt oldFsCount=TheFs.ResourceCount();
+//
+	CleanupStack::PushL(aOomTest);
+	TRAPD(ret1,aOomTest->ConstructL());
+	test(ret1==KErrNone);
+	CContactDatabase *lockDb=NULL;
+	if (aMode==KOomFailContactServer)	// contact server failure tests
+		{
+		lockDb=CContactDatabase::OpenL(KDatabaseFileName);
+		CleanupStack::PushL(lockDb);
+		}
+	TInt successCount=0;
+	TInt skipCount=0;
+	for(TInt count=0;;count++)
+		{
+		TInt ret=KErrNone;
+		if (aOomTest->Skip(count,aMode))
+			{
+			skipCount++;
+			}
+		else
+			{		
+			// PREFAILL - Prepare for the test:
+			TRAPD(preFailErr,aOomTest->PreFailL());
+			test(preFailErr==KErrNone);
+			// Set failure condition:
+			switch(aMode)
+				{
+				case KOomFailNormal:
+					__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+					break;
+				case KOomFailDbs:
+					iDbs.SetHeapFailure(RHeap::EDeterministic,count);
+					break;
+				case KOomFailContactServer:
+					lockDb->SetCntServerHeapFailure(RHeap::EDeterministic,count);
+					break;
+				case KOomFailFileServerOom:
+					TheFs.SetErrorCondition(KErrNoMemory,count);
+					break;
+				case KOomFailFileServerGeneral:
+					TheFs.SetErrorCondition(KErrGeneral,count);
+					break;
+				default:;
+				}	
+				
+			// FAILL - Perform test:
+			TRAP(ret,aOomTest->FailL());
+
+			// Remove failure condition:
+			switch(aMode)
+				{
+				case KOomFailNormal:
+					__UHEAP_RESET;
+					break;
+				case KOomFailDbs:
+					iDbs.SetHeapFailure(RHeap::ENone,0);
+					break;
+				case KOomFailContactServer:
+					lockDb->SetCntServerHeapFailure(RHeap::ENone,0);
+					break;
+				case KOomFailFileServerOom:
+				case KOomFailFileServerGeneral:
+					TheFs.SetErrorCondition(KErrNone);
+					break;
+				default:;
+				}
+
+			// CLEARUPL - tidy up after the test:
+			TRAPD(ClearUpErr,aOomTest->ClearUpL());
+			test(ClearUpErr==KErrNone);
+			}
+
+		// Verify results of test:
+		if (ret==KErrNone)
+			{
+			if (successCount==8)
+				{
+				test.Printf(_L("Count=%d"),count);
+				if (skipCount>0)
+					test.Printf(_L(", skipped=%d"),skipCount);
+				test.Printf(_L("\n"));
+				break;
+				}
+			successCount++;
+			}
+		else
+			{
+			successCount=0;
+			test(aOomTest->ErrorOk(aMode, count, ret));
+			}
+		}
+	if (aMode==KOomFailContactServer)
+		CleanupStack::PopAndDestroy();	// lockDb
+	CleanupStack::PopAndDestroy();	// aOomTest
+	test(oldFsCount==TheFs.ResourceCount());
+	test(oldDbCount==iDbs.ResourceCount());
+	__UHEAP_MARKEND;
+	}
+
+COomTest::~COomTest()
+	{
+	iDbs.Close();
+	}
+
+/**
+
+@SYMTestCaseID     PIM-T-ERROR-0001
+
+*/
+
+TBool COomTest::TestsL()
+	{
+	iDbs.Connect();
+    __UHEAP_MARK;
+	TInt oldDbCount=iDbs.ResourceCount();
+	for(TInt loop=0;loop<KOomNumFailModes;loop++)
+		{
+		if (loop > 0)
+			{ // increment the RTest number XXX
+			test.Next(_L("--- Next Error case ---"));
+
+			}
+
+		TOomFailureModes mode=(TOomFailureModes)loop;
+		switch(mode)
+			{
+			case KOomFailNormal: // RTest 001.01
+				test.Start(_L("@SYMTESTCaseID:PIM-T-ERROR-0001 ===Test Out Of Memory==="));
+
+				break;
+			case KOomFailFileServerGeneral: // RTest 002.01
+				test.Start(_L("===Test File server general failure==="));
+
+				break;
+			case KOomFailFileServerOom: // RTest 003.01
+				test.Start(_L("===Test File server Oom failure==="));
+
+				break;
+			case KOomFailContactServer: // RTest 004.01
+				test.Start(_L("===Test Contact Server Oom failure==="));
+
+				break;
+			case KOomFailDbs: // RTest 005.01
+				test.Start(_L("===Test DBS Oom failure==="));
+
+				break;
+			default:;
+			}
+		// RTest X.01
+		test.Next(_L("Create Database for OOM test"));
+
+		TRAPD(ret,CreateDatabaseL());
+		test(ret==KErrNone);
+		IdList=CContactIdArray::NewLC();
+		test.Next(_L("Create Contacts for OOM test"));
+
+		TRAP(ret,AddNewContactsL());
+		test(ret==KErrNone);
+
+		DoOomTestL(new(ELeave) COomOpen(this),mode);
+		DoOomTestL(new(ELeave) COomCreate(this),mode);	
+		DoOomTestL(new(ELeave) COomFind(this),mode);
+		DoOomTestL(new(ELeave) COomFindAsync(this),mode);
+		DoOomTestL(new(ELeave) COomFindInTextDef(this),mode);
+		DoOomTestL(new(ELeave) COomFindAsyncInTextDef(this),mode);
+		DoOomTestL(new(ELeave) COomSort(this),mode);
+		DoOomTestL(new(ELeave) COomSortArray(this),mode);  
+		DoOomTestL(new(ELeave) COomSetDatabaseDrive(this, iMmcDrive),mode);	
+		DoOomTestL(new(ELeave) COomGetDefaultName(this),mode);
+		DoOomTestL(new(ELeave) COomViewDefinition(this),mode);
+		DoOomTestL(new(ELeave) COomTextDefinition(this),mode);
+		DoOomTestL(new(ELeave) COomReadContact(this),mode);
+		DoOomTestL(new(ELeave) COomAddNewContact(this),mode);
+		DoOomTestL(new(ELeave) COomReadContactTextDef(this),mode);
+		DoOomTestL(new(ELeave) COomOpenAndCloseContactX(this),mode);
+		DoOomTestL(new(ELeave) COomOpenAndCloseContact(this),mode);
+		DoOomTestL(new(ELeave) COomOpenModifyAndCommitContact(this),mode);
+		DoOomTestL(new(ELeave) COomDeleteContact(this),mode);
+		DoOomTestL(new(ELeave) COomDeleteContacts(this),mode);
+		DoOomTestL(new(ELeave) COomCompact(this),mode);
+		DoOomTestL(new(ELeave) COomImportContacts(this),mode);
+		DoOomTestL(new(ELeave) COomExportSelectedContacts(this),mode);
+		DoOomTestL(new(ELeave) COomCompress(this),mode);
+		// This test damages the database and attempts to recover it which
+		// is not possible in the UREL build.		
+#ifdef _DEBUG
+		DoOomTestL(new(ELeave) COomRecover(this),mode);
+#endif
+		DoOomTestL(new(ELeave) COomCloseOpenTables(this),mode);
+		DoOomTestL(new(ELeave) COomViewDefInternalize(this),mode);
+		DoOomTestL(new(ELeave) COomViewDefExternalize(this),mode);
+		DoOomTestL(new(ELeave) COomFieldSetStore(this),mode);
+		DoOomTestL(new(ELeave) COomFieldSetRestore(this),mode);
+		DoOomTestL(new(ELeave) COomContactCardClone(this),mode);
+		DoOomTestL(new(ELeave) COomContactChangeNotifier(this),mode);  
+		DoOomTestL(new(ELeave) COomPhoneNumberLookup(this),mode);
+		User::After(1000000);	//	fixes defect DEF039417
+		DoOomTestL(new(ELeave) COomContactsChangedSince(this),mode);
+		DoOomTestL(new(ELeave) COomGroups2(this),mode);
+		DoOomTestL(new(ELeave) COomGroups(this),mode);
+		CleanupStack::PopAndDestroy(); // IdList
+		test.End();
+		}
+
+	test(oldDbCount==iDbs.ResourceCount());
+    __UHEAP_MARKEND;
+	return(ETrue);
+	}
+
+//
+
+// Code for DrivesOfMediaTypeL() and MMCDriveL() adapted from T_Sec_CntDbase
+
+LOCAL_C TBool FirstDriveOfMediaTypeL(TMediaType aMedia, TInt& aDriveNumber)
+	{
+	TDriveInfo info;
+	TInt error(KErrNone);
+	TBool result(EFalse);
+
+	TDriveList driveList;
+	error = TheFs.DriveList(driveList);
+	User::LeaveIfError(error);
+
+	for(TInt drive=EDriveA; drive<=EDriveZ; drive++)
+		{
+		if( driveList[drive] )
+			{
+			error = TheFs.Drive(info, drive);
+			if	(error != KErrNone)
+				{
+				continue;
+				}
+				
+			if	(info.iType == aMedia)
+				{
+				aDriveNumber = drive;
+				result = ETrue;
+				
+				// return if only the first drive of the required type.
+				break;
+				}
+			}
+		}
+
+	return result;
+	}
+
+/**
+	MMCDriveL
+	
+	Determines a list of drives of type EMediaHardDisk.
+	The first drive in this list is returned and used
+	by the rest of the test.
+
+        NOTE: if this test is running on ARMv5, an MMC card
+        must be present otherwise the test fails.
+
+*/
+LOCAL_C TDriveUnit MMCDriveL()
+	{
+	TInt driveNumber = 0;
+	
+	if( !FirstDriveOfMediaTypeL(EMediaHardDisk, driveNumber) )
+		{
+		test.Printf( _L("No drives found of type EMediaHardDisk\n"));
+		User::LeaveIfError(KErrHardwareNotAvailable);
+		}
+
+	TDriveUnit mmcDrive(driveNumber);
+	TPtrC drvPtr(mmcDrive.Name());
+	test.Printf(_L("Selected drive of type EMediaHardDisk for test use is %S\n"), &drvPtr);
+
+	// drive selected fortest to use
+	return mmcDrive;
+	}
+
+
+LOCAL_C void OomTestsL()
+	{
+	// usable drive for SetDatabaseDriveL test
+	TDriveUnit mmcDrive = MMCDriveL();
+
+	COomTest *oomTest=new(ELeave) COomTest(mmcDrive);
+	CleanupStack::PushL(oomTest);
+//
+	oomTest->TestsL();
+//
+	CleanupStack::PopAndDestroy(oomTest);
+	}
+
+
+void DoTests()
+    {
+	test.Start(_L("Error tests"));
+
+	User::LeaveIfError(TheFs.Connect());
+
+	TRAPD(ret,OomTestsL());
+	test(ret==KErrNone);
+	test.End();
+	
+	// cleanup disk space
+   	TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KDatabaseFileName));
+    TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KDatabaseCreateFileName));
+	TRAP_IGNORE(CContactDatabase::DeleteDefaultFileL());
+
+	test(TheFs.ResourceCount()==0);
+	TheFs.Close();
+
+	// propagate error
+	User::LeaveIfError(ret);
+    }
+
+GLDEF_C TInt E32Main()
+	{
+    __UHEAP_MARK;
+	CActiveScheduler::Install(new(ELeave) CActiveScheduler);
+    CTrapCleanup* cleanup=CTrapCleanup::New();
+	test.Title();
+    DoTests();
+    test.Close();
+    delete cleanup;
+	delete CActiveScheduler::Current();
+    __UHEAP_MARKEND;
+	return KErrNone;
+    }