email/pop3andsmtpmtm/clientmtms/test/src/T_IMCM01.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/clientmtms/test/src/T_IMCM01.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1289 @@
+// Copyright (c) 1998-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:
+// Name of test harness: T_IMCM01
+// Component: IMCM
+// Owner: KP
+// Brief description of test harness:
+// Installs SMTP, POP3, IMAP4 MTMs, creates SMTP, POP3 IMAP4 emails and tests
+// global find implementation in SMTP, POP3, IMAP4 client 
+// Detailed description of test harness:
+// As above
+// Input files required to run test harness:
+// None
+// Intermediate files produced while running test harness:
+// <DRIVE>:\msglogs\T_IMCM01\T_IMCM.log
+// Output files produced by running test harness:
+// <DRIVE>:\msglogs\T_IMCM01.<PLATFORM>.<VARIANT>.LOG.txt
+// Description of how to build test harness:
+// cd \msg\imcm\
+// bldmake bldfiles
+// abld test build
+// Description of how to run test harness:
+// The following instructions are the same for all platforms:
+// 1. Build T_DB test harness from COMMDB component:
+// cd \commdb\group
+// bldmake bldfiles
+// abld test build t_db
+// 2. Build the test utilities:
+// cd \msg\testutils\group\
+// bldmake bldfiles
+// abld build
+// WINS running instructions:
+// 1. \epoc32\release\wins\<VARIANT>\T_IMCM01.exe can be used at the command prompt
+// or executable can be run from Windows Explorer.
+// All other platform running instructions:
+// 1. Copy \epoc32\release\<PLATFORM>\<VARIANT>\T_IMCM01.exe onto the other platform
+// 2. Copy \epoc32\release\<PLATFORM>\<VARIANT>\MSVTESTUTILS.DLL into 
+// <DRIVE>:\system\libs on the other platform
+// 3. Copy \epoc32\release\<PLATFORM>\<VARIANT>\EMAILTESTUTILS.DLL into 
+// <DRIVE>:\system\libs on the other platform
+// 4. Run T_IMCM01.exe on the other platform
+// 
+//
+
+#include "emailtestutils.h"
+
+#include <msvfind.h>
+#include <miutlog.h>
+#include <msvsearchsortquery.h>
+#include <msvsearchsortoperation.h>
+
+
+#define _L8(a) (TPtrC8((const TText8 *)(a)))
+
+RTest test(_L("Find Testrig"));
+LOCAL_D CEmailTestUtils* testUtils;
+LOCAL_D CTrapCleanup* theCleanup;
+LOCAL_D CImLog* log;
+
+LOCAL_D TMsvId folderId;
+LOCAL_D TMsvId entry1Id;
+LOCAL_D TMsvId entry2Id;
+LOCAL_D TMsvId entry3Id;
+
+
+TBuf<32> ShortDescription(_L("find some text in here"));
+TBuf<32> ShortDetails(_L("find some text in here"));
+
+TBuf<32> MatchingDescription(_L("abcDEFghi Jkl mno"));
+TBuf<32> MatchingDetails(_L("abcDEFghi Jkl mno"));
+
+const TUid KUidFindTestPOP3Mtm = {0x10001029};
+const TUid KUidFindTestSMTPMtm = {0x10001028};
+const TUid KUidFindTestIMAP4Mtm = {0x1000102A};
+
+_LIT(KMiutSubject, "short mail about something interesting");
+_LIT8(KMiutMsgId, "0123456789AB.CdeFGHIj@symbian.com");
+_LIT(KMiutFrom, "ralph-greenwell@psion.com");
+_LIT(KMiutReplyTo, "ralph.greenwell@virgin.net");
+_LIT(KMiutToRecipients1, "recipient1@address.com");
+_LIT(KMiutToRecipients2, "recipient2@address.com");
+_LIT(KMiutCcRecipients1, "cc1@address.com");
+_LIT(KMiutCcRecipients2, "cc2@address.com");
+_LIT(KMiutBccRecipients, "bcc@address.com");
+_LIT8(KMiutResentMsgId, "0123456789AB.CdeFGHIj@symbian.com");
+_LIT(KMiutResentFrom, "test@psion6.demon.co.uk");
+_LIT(KMiutResentToRecipients1, "recipient1@address.com");
+_LIT(KMiutResentToRecipients2, "recipient2@address.com");
+_LIT(KMiutResentCcRecipients1, "cc1@address.com");
+_LIT(KMiutResentCcRecipients2, "cc2@address.com");
+_LIT(KMiutResentBccRecipients, "bcc@address.com");
+
+#define KMiutRemoteSize 					123456
+#define KMaxImHeaderStringLengthLong		KMaxImHeaderStringLength+1
+
+
+LOCAL_D TBuf<KMaxImHeaderStringLengthLong> longValue;
+LOCAL_D TBuf8<KMaxImHeaderStringLengthLong> longValue2;
+
+
+//
+
+//**********************************
+// TMsvFindResultDateRange
+//**********************************
+//
+// An enumeration that specifies the date comparison to perform
+//
+
+enum TMsvFindResultDateRange
+	{
+	EMsvOnDate,
+	EMsvBeforeDate,
+	EMsvAfterDate
+	};
+
+//**********************************
+// CMsvFindDateOperation
+//**********************************
+//
+// An operation that extends global find to restrict searching by date
+//
+
+class CMsvFindDateOperation : public CMsvFindOperation
+	{
+public:
+	static CMsvFindDateOperation* FindInSelectionL(CMsvSession& aMsvSession, const TDesC& aTextToFind, const CMsvEntrySelection& aSel, TMsvPartList aPartList, const TTime& aDate, TMsvFindResultDateRange aRange, TRequestStatus& aObserverRequestStatus);
+	static CMsvFindDateOperation* FindInChildrenL(CMsvSession& aMsvSession, const TDesC& aTextToFind, TMsvId aId, TMsvPartList aPartList, const TTime& aDate, TMsvFindResultDateRange aRange, TRequestStatus& aObserverRequestStatus);
+	//
+protected:
+	CMsvFindDateOperation(CMsvSession& aMsvSession, const TDesC& aTextToFind, TMsvPartList aPartList, const TTime& aDate, TMsvFindResultDateRange aRange, TRequestStatus& aObserverRequestStatus);
+	//
+private:
+	TBool IsValid(const TMsvEntry& aEntry) const;
+	//
+private:
+	TTime iDate;
+	TMsvFindResultDateRange iRange;
+	};
+
+CMsvFindDateOperation* CMsvFindDateOperation::FindInSelectionL(CMsvSession& aMsvSession, const TDesC& aTextToFind, const CMsvEntrySelection& aSel, TMsvPartList aPartList, const TTime& aDate, TMsvFindResultDateRange aRange, TRequestStatus& aObserverRequestStatus)
+//
+//
+//
+	{
+	CMsvFindDateOperation* self = new(ELeave)CMsvFindDateOperation(aMsvSession, aTextToFind, aPartList, aDate, aRange, aObserverRequestStatus);
+	CleanupStack::PushL(self);
+	self->ConstructFindInSelectionL(aSel);
+	CleanupStack::Pop(); // self
+	return self;	
+	}
+
+CMsvFindDateOperation* CMsvFindDateOperation::FindInChildrenL(CMsvSession& aMsvSession, const TDesC& aTextToFind, TMsvId aId, TMsvPartList aPartList, const TTime& aDate, TMsvFindResultDateRange aRange, TRequestStatus& aObserverRequestStatus)
+//
+// 
+//
+	{
+	CMsvFindDateOperation* self = new(ELeave)CMsvFindDateOperation(aMsvSession, aTextToFind, aPartList, aDate, aRange, aObserverRequestStatus);
+	CleanupStack::PushL(self);
+	self->ConstructFindInChildrenL(aId);
+	CleanupStack::Pop(); // self
+	return self;	
+	}
+
+CMsvFindDateOperation::CMsvFindDateOperation(CMsvSession& aMsvSession, const TDesC& aTextToFind, TMsvPartList aPartList, const TTime& aDate, TMsvFindResultDateRange aRange, TRequestStatus& aObserverRequestStatus)
+: CMsvFindOperation(aMsvSession, aTextToFind, aPartList, aObserverRequestStatus), iDate(aDate), iRange(aRange)
+	{
+	}
+
+TBool CMsvFindDateOperation::IsValid(const TMsvEntry& aEntry) const
+//
+//
+//
+	{
+	TDateTime dt;
+		
+	dt = aEntry.iDate.DateTime();
+	TTime date1(TDateTime(dt.Year(), dt.Month(), dt.Day(), 0, 0, 0, 0));
+
+	dt = iDate.DateTime();
+	TTime date2(TDateTime(dt.Year(), dt.Month(), dt.Day(), 0, 0, 0, 0));
+
+	switch (iRange)
+		{
+		case EMsvOnDate:
+			return date1 == date2;
+		case EMsvBeforeDate:
+			return date1 < date2;
+		case EMsvAfterDate:
+			return date1 > date2;
+		}
+	return EFalse;
+	}
+
+//
+
+LOCAL_C void InitL()
+	{
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+	CActiveScheduler::Install(scheduler);
+	CleanupStack::PushL(scheduler);
+
+	testUtils = CEmailTestUtils::NewLC(test);
+	testUtils->CreateAllTestDirectories();
+	testUtils->FileSession().SetSessionPath(_L("C:\\"));
+	testUtils->CleanMessageFolderL();
+	testUtils->GoServerSideL();
+
+	log = CImLog::NewL(_L("c:\\logs\\email\\T_IMCM.log"), EAppend);
+	CleanupStack::PushL(log);
+	log->AppendComment(_L8("******* T_IMCM01 Test Client MTM Global Find *******"));
+	TBuf8<80> buf;
+
+#if defined(__WINS__)	
+	buf.Append(_L8("WINS "));
+#else
+	buf.Append(_L8("MARM "));
+#endif
+#if defined(_UNICODE)
+	buf.Append(_L8("U"));
+#endif
+#if defined(_DEBUG)
+	buf.Append(_L8("DEB"));
+#else
+	buf.Append(_L8("REL"));
+#endif
+	log->AppendComment(buf);
+	}
+
+LOCAL_C void Closedown()
+	{
+	log->AppendComment(_L8("**********    T_IMCM01 Tests Complete    **********"));
+	log->AppendComment(_L8(""));
+
+	CleanupStack::PopAndDestroy(3);  //testUtils, log, scheduler 
+	}
+
+LOCAL_C void CreateMessageHeader(CImHeader& imHeader)
+	{
+	// a bunch of data for the header object....
+	imHeader.Reset();
+	imHeader.SetSubjectL(KMiutSubject);
+
+	imHeader.SetImMsgIdL(KMiutMsgId);
+
+	imHeader.SetFromL(KMiutFrom);
+	imHeader.SetReplyToL(KMiutReplyTo);
+	imHeader.SetRemoteSize(KMiutRemoteSize);
+
+	imHeader.ToRecipients().AppendL(KMiutToRecipients1);
+	imHeader.ToRecipients().AppendL(KMiutToRecipients2);
+	imHeader.CcRecipients().AppendL(KMiutCcRecipients1);
+	imHeader.CcRecipients().AppendL(KMiutCcRecipients2);
+	imHeader.BccRecipients().AppendL(KMiutBccRecipients);
+	}
+
+LOCAL_C void CreateMessageHeader2(CImHeader& imHeader)
+	{
+	// a bunch of data for the header object....
+	imHeader.Reset();
+	imHeader.SetSubjectL(KMiutSubject);
+
+	imHeader.SetImMsgIdL(KMiutMsgId);
+
+	imHeader.SetFromL(KMiutFrom);
+	imHeader.SetReplyToL(KMiutReplyTo);
+	imHeader.SetRemoteSize(KMiutRemoteSize);
+
+	imHeader.ToRecipients().AppendL(KMiutToRecipients1);
+	imHeader.ToRecipients().AppendL(KMiutToRecipients2);
+	imHeader.CcRecipients().AppendL(KMiutCcRecipients1);
+	imHeader.CcRecipients().AppendL(KMiutCcRecipients2);
+	imHeader.BccRecipients().AppendL(KMiutBccRecipients);
+	
+	imHeader.SetResentMsgIdL(KMiutResentMsgId);
+	imHeader.SetResentFromL(KMiutResentFrom);
+	imHeader.ResentToRecipients().AppendL(KMiutResentToRecipients1);
+	imHeader.ResentToRecipients().AppendL(KMiutResentToRecipients2);
+	imHeader.ResentCcRecipients().AppendL(KMiutResentCcRecipients1);
+	imHeader.ResentCcRecipients().AppendL(KMiutResentCcRecipients2);
+	imHeader.ResentBccRecipients().AppendL(KMiutResentBccRecipients);
+	}
+
+LOCAL_C void CreateLongMessageHeader(CImHeader& imHeader)
+	{
+	// a bunch of data for the header object....
+	// all the fields are set to a length greater than 1000 i.e 1001
+
+	imHeader.Reset();
+	longValue.Fill('x',KMaxImHeaderStringLengthLong);
+	longValue2.Fill('x',KMaxImHeaderStringLengthLong);
+
+	imHeader.SetSubjectL(longValue);
+
+	imHeader.SetImMsgIdL(longValue2);
+
+	imHeader.SetFromL(longValue);
+	imHeader.SetReplyToL(longValue);
+	imHeader.SetRemoteSize(KMiutRemoteSize);
+
+	imHeader.ToRecipients().AppendL(longValue);
+	imHeader.ToRecipients().AppendL(longValue);
+	imHeader.CcRecipients().AppendL(longValue);
+	imHeader.CcRecipients().AppendL(longValue);
+	imHeader.BccRecipients().AppendL(longValue);
+
+	imHeader.SetResentMsgIdL(longValue2);
+	imHeader.SetResentFromL(longValue);
+	}
+
+LOCAL_C void CreateMessagesL(TUid aMtm)
+	{
+	CParaFormatLayer* paraLayer = CParaFormatLayer::NewL();
+	CleanupStack::PushL(paraLayer);
+	CCharFormatLayer* charLayer = CCharFormatLayer::NewL();
+	CleanupStack::PushL(charLayer);
+
+	// create entry to work under
+	TMsvEntry folder;
+	folder.iType = KUidMsvFolderEntry;
+	folder.iMtm = KUidMsvLocalServiceMtm;
+	folder.iServiceId = KMsvLocalServiceIndexEntryId;
+	testUtils->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+	testUtils->iMsvEntry->CreateL(folder);
+	testUtils->iMsvEntry->SetEntryL(folder.Id());
+	folderId=folder.Id();
+
+	TMsvEntry entry1;
+	entry1.iType = KUidMsvMessageEntry;
+	entry1.iServiceId = KMsvLocalServiceIndexEntryId;
+	entry1.iMtm = aMtm;
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+	testUtils->iMsvEntry->CreateL(entry1);
+	TRAPD(error,testUtils->iMsvEntry->SetEntryL(entry1.Id()));
+	entry1Id=entry1.Id();
+
+	CMsvStore* fileStore = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(fileStore);
+
+	CImHeader* header = CImHeader::NewLC(); // Cleaned up when exiting this menu selection
+	CreateMessageHeader(*header);
+	header->StoreL(*fileStore);
+	fileStore->CommitL();
+	CleanupStack::PopAndDestroy(2); // filestore, header
+
+	TMsvEmailEntry ementry1;
+	ementry1.iMtm = aMtm;
+	ementry1.iServiceId = testUtils->iMsvEntry->Entry().iServiceId;
+	ementry1.iType = KUidMsvEmailTextEntry;
+	testUtils->iMsvEntry->CreateL(ementry1);
+	TRAP(error,testUtils->iMsvEntry->SetEntryL(ementry1.Id()));
+
+	fileStore=NULL;
+	fileStore = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(fileStore);
+	
+	CRichText* text1=CRichText::NewL(paraLayer, charLayer);
+	CleanupStack::PushL(text1);
+	text1->InsertL(0,_L("Some Rich Text 1"));
+	fileStore->StoreBodyTextL(*text1);
+	fileStore->CommitL();
+	CleanupStack::PopAndDestroy(2); // filestore
+
+
+	fileStore=NULL;
+	TMsvEntry entry2;
+	entry2.iType = KUidMsvMessageEntry;
+	entry2.iMtm = aMtm;
+	entry2.iServiceId = KMsvLocalServiceIndexEntryId;
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+	testUtils->iMsvEntry->CreateL(entry2);
+	TRAP(error,testUtils->iMsvEntry->SetEntryL(entry2.Id()));
+	entry2Id=entry2.Id();
+
+	fileStore = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(fileStore);
+	CImHeader* header1 = CImHeader::NewLC(); 
+	CreateMessageHeader2(*header1);
+	header1->StoreL(*fileStore);
+	fileStore->CommitL();
+	CleanupStack::PopAndDestroy(2); // filestore,header
+
+
+	TMsvEmailEntry ementry2;
+	ementry2.iMtm = aMtm;
+	ementry2.iServiceId = testUtils->iMsvEntry->Entry().iServiceId;
+	ementry2.iType = KUidMsvEmailTextEntry;
+	testUtils->iMsvEntry->CreateL(ementry2);
+	TRAP(error,testUtils->iMsvEntry->SetEntryL(ementry2.Id()));
+
+	fileStore=NULL;
+	fileStore = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(fileStore);
+	CRichText* text2=CRichText::NewL(paraLayer, charLayer);
+	CleanupStack::PushL(text2);
+	text2->InsertL(0,_L("Some Rich Text 2"));
+	fileStore->StoreBodyTextL(*text2);
+	fileStore->CommitL();
+	CleanupStack::PopAndDestroy(2); // filestore,text
+
+
+	fileStore=NULL;
+	TMsvEntry entry3;
+	entry3.iType = KUidMsvMessageEntry;
+	entry3.iMtm = aMtm;
+	entry3.iServiceId = KMsvLocalServiceIndexEntryId;
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+	testUtils->iMsvEntry->CreateL(entry3);
+	TRAP(error,testUtils->iMsvEntry->SetEntryL(entry3.Id()));
+	entry3Id=entry3.Id();
+	
+	fileStore = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(fileStore);
+	CImHeader* header2 = CImHeader::NewLC(); 
+	CreateLongMessageHeader(*header2);
+	header2->StoreL(*fileStore);
+	fileStore->CommitL();
+	CleanupStack::PopAndDestroy(2); // filestore,header
+	
+	
+	TMsvEmailEntry ementry3;
+	ementry3.iMtm = aMtm;
+	ementry3.iServiceId = testUtils->iMsvEntry->Entry().iServiceId;
+	ementry3.iType = KUidMsvEmailTextEntry;
+	testUtils->iMsvEntry->CreateL(ementry3);
+	TRAP(error,testUtils->iMsvEntry->SetEntryL(ementry3.Id()));
+
+	fileStore=NULL;
+	fileStore = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(fileStore);
+	CRichText* text3=CRichText::NewL(paraLayer, charLayer);
+	CleanupStack::PushL(text3);
+	text3->InsertL(0,_L("Some Rich Text 3"));
+	fileStore->StoreBodyTextL(*text3);
+	fileStore->CommitL();
+	CleanupStack::PopAndDestroy(4); // filestore,header,text,layers
+	}
+
+
+LOCAL_C void TestFindInSelectionL()
+	{
+	CMsvOperationWait* active = CMsvOperationWait::NewLC();
+	CMsvFindOperation* find = NULL;
+	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+
+	selection->AppendL(folderId);
+	selection->AppendL(entry1Id);
+	selection->AppendL(entry2Id);
+	selection->AppendL(entry3Id);
+
+	// Test invalid arguments
+	TRAPD(error, CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("short mail"), *selection, KMsvMessagePartDescription, /*TMsvFindResultAny(),*/ active->iStatus));
+	test(error == KErrArgument);
+
+	selection->Delete(0);
+	selection->InsertL(1, folderId);
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("short mail"), *selection, KMsvMessagePartDescription, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+	
+	// Test the progress
+    TPckgBuf<TMsvFindOperationProgress> progress;
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrArgument);
+	test(progress().iCompleted == 1);
+	test(progress().iRemaining == 3);
+
+	selection->Delete(1);
+	selection->InsertL(2, folderId);
+
+	// Test results
+	test(find->GetFindResult().Count() == 1);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("short mail"), *selection, KMsvMessagePartDescription, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+	
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrArgument);
+	test(progress().iCompleted == 2);
+	test(progress().iRemaining == 2);
+
+	selection->Delete(2);
+	selection->InsertL(3, folderId);
+
+	// Test results
+	test(find->GetFindResult().Count() == 2);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("short mail"), *selection, KMsvMessagePartDescription, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+	
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrArgument);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 1);
+
+	selection->Delete(3);
+
+	// Test results
+	test(find->GetFindResult().Count() == 2);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("short mail"), *selection, KMsvMessagePartDescription, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+	
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+	test(find->GetFindResult().Count() == 2);
+
+	test(selection->At(0) == find->GetFindResult().At(0).iId);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartDescription);
+
+	CleanupStack::PopAndDestroy(3); // find, selection, active, testUtils->iMsvEntry, testUtils->iMsvSession, ob
+	}
+
+
+
+LOCAL_C void TestFindDescriptionSelectionL()
+	{
+	CMsvOperationWait* active = CMsvOperationWait::NewLC();
+
+	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+
+	CMsvFindOperation* find = NULL;
+
+	selection->AppendL(entry1Id);
+	selection->AppendL(entry2Id);
+	selection->AppendL(entry3Id);
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("short mail"), *selection, KMsvMessagePartDescription, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    TPckgBuf<TMsvFindOperationProgress> progress;
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartDescription);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartDescription);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("something"), *selection, KMsvMessagePartDescription, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartDescription);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartDescription);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("mail"), *selection, KMsvMessagePartDescription | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartDescription);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("mai"), *selection, KMsvMessagePartDescription | KMsvFindWholeWord, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("interesting"), *selection, KMsvMessagePartDescription | KMsvFindWholeWord, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartDescription);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartDescription);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word and case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("Mail"), *selection, KMsvMessagePartDescription | KMsvFindWholeWord | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word and case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("something"), *selection, KMsvMessagePartDescription | KMsvFindWholeWord | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartDescription);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartDescription);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	CleanupStack::PopAndDestroy(2); // selection, active, 
+	}
+
+LOCAL_C void TestFindOriginatorSelectionL()
+	{
+	CMsvOperationWait* active = CMsvOperationWait::NewLC();
+
+	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+
+	CMsvFindOperation* find = NULL;
+
+	selection->AppendL(entry1Id);
+	selection->AppendL(entry2Id);
+	selection->AppendL(entry3Id);
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("psion.com"), *selection, KMsvMessagePartOriginator, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    TPckgBuf<TMsvFindOperationProgress> progress;
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartOriginator);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartOriginator);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("PSION.COM"), *selection, KMsvMessagePartOriginator, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartOriginator);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartOriginator);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("psion"), *selection, KMsvMessagePartOriginator | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartOriginator);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("ps"), *selection, KMsvMessagePartOriginator | KMsvFindWholeWord, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("ralph-greenwell@psion.com"), *selection, KMsvMessagePartOriginator | KMsvFindWholeWord, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartOriginator);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartOriginator);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word and case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("ralph-greenwell@psio"), *selection, KMsvMessagePartOriginator | KMsvFindWholeWord | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word and case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("ralph-greenwell@psion.com"), *selection, KMsvMessagePartOriginator | KMsvFindWholeWord | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartOriginator);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartOriginator);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	CleanupStack::PopAndDestroy(2); // selection, active, 
+	}
+
+
+LOCAL_C void TestFindRecipientSelectionL()
+	{
+	CMsvOperationWait* active = CMsvOperationWait::NewLC();
+
+	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+
+	selection->AppendL(entry1Id);
+	selection->AppendL(entry2Id);
+	selection->AppendL(entry3Id);
+
+	CMsvFindOperation* find = NULL;
+
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("address"), *selection, KMsvMessagePartRecipient, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    TPckgBuf<TMsvFindOperationProgress> progress;
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartRecipient);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartRecipient);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("xxx"), *selection, KMsvMessagePartRecipient, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 1);
+	test(find->GetFindResult().At(0).iId == entry3Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartRecipient);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("Address"), *selection, KMsvMessagePartRecipient | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("addr"), *selection, KMsvMessagePartRecipient | KMsvFindWholeWord, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("recipient2@address.com"), *selection, KMsvMessagePartRecipient | KMsvFindCaseSensitive | KMsvFindWholeWord, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 2);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartRecipient);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartRecipient);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	CleanupStack::PopAndDestroy(2); // selection, active, testUtils->iMsvEntry, testUtils->iMsvSession, ob
+	}
+
+
+LOCAL_C void TestFindBodySelectionL()
+	{
+	CMsvOperationWait* active = CMsvOperationWait::NewLC();
+
+	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection;
+	CleanupStack::PushL(selection);
+
+	CMsvFindOperation* find = NULL;
+
+	selection->AppendL(entry1Id);
+	selection->AppendL(entry2Id);
+	selection->AppendL(entry3Id);
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("rich"), *selection, KMsvMessagePartBody, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    TPckgBuf<TMsvFindOperationProgress> progress;
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 3);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartBody);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartBody);
+	test(find->GetFindResult().At(2).iId == entry3Id);
+	test(find->GetFindResult().At(2).iPartList == KMsvMessagePartBody);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("RICH"), *selection, KMsvMessagePartBody, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 3);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartBody);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartBody);
+	test(find->GetFindResult().At(2).iId == entry3Id);
+	test(find->GetFindResult().At(2).iPartList == KMsvMessagePartBody);
+
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("rich"), *selection, KMsvMessagePartBody | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("ric"), *selection, KMsvMessagePartBody | KMsvFindWholeWord, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("rich"), *selection, KMsvMessagePartBody | KMsvFindWholeWord, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 3);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartBody);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartBody);
+	test(find->GetFindResult().At(2).iId == entry3Id);
+	test(find->GetFindResult().At(2).iPartList == KMsvMessagePartBody);
+
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word and case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("rich"), *selection, KMsvMessagePartBody | KMsvFindWholeWord | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 0);
+
+	CleanupStack::PopAndDestroy(); // find
+
+	// Test find in selection - match whole word and case sensitive
+	active->Start();
+	find = CMsvFindOperation::FindInSelectionL(*testUtils->iMsvSession, _L("Rich"), *selection, KMsvMessagePartBody | KMsvFindWholeWord | KMsvFindCaseSensitive, /*TMsvFindResultAny(),*/ active->iStatus);
+	CleanupStack::PushL(find);
+	CActiveScheduler::Start();
+
+	// Test the progress
+    progress.Copy(find->FinalProgress());
+	test(progress().iError == KErrNone);
+	test(progress().iCompleted == 3);
+	test(progress().iRemaining == 0);
+
+	// Test results
+
+	test(find->GetFindResult().Count() == 3);
+	test(find->GetFindResult().At(0).iId == entry1Id);
+	test(find->GetFindResult().At(0).iPartList == KMsvMessagePartBody);
+	test(find->GetFindResult().At(1).iId == entry2Id);
+	test(find->GetFindResult().At(1).iPartList == KMsvMessagePartBody);
+	test(find->GetFindResult().At(2).iId == entry3Id);
+	test(find->GetFindResult().At(2).iPartList == KMsvMessagePartBody);
+
+	CleanupStack::PopAndDestroy(3); // selection, find,active
+	}
+
+
+LOCAL_C void doMainL()
+	{
+	InitL();
+
+	testUtils->GoClientSideL();
+	CreateMessagesL(KUidFindTestPOP3Mtm);
+	testUtils->TestStart(1);
+	test.Start(_L("POP3 - Finding text in selection"));
+	TestFindInSelectionL();
+	log->AppendComment(_L8("Test 1 OK"));
+	testUtils->TestFinish(1);
+	testUtils->TestStart(2);
+	test.Next(_L("POP3 - Finding text in description"));
+	TestFindDescriptionSelectionL();
+	log->AppendComment(_L8("Test 2 OK"));
+	testUtils->TestFinish(2);
+
+	testUtils->TestStart(3);
+	test.Next(_L("POP3 - Finding text in recipient"));
+	TestFindRecipientSelectionL();
+	log->AppendComment(_L8("Test 3 OK"));
+	testUtils->TestFinish(3);
+
+	testUtils->TestStart(4);
+	test.Next(_L("POP3 - Finding text in originator"));
+	TestFindOriginatorSelectionL();
+	log->AppendComment(_L8("Test 4 OK"));
+	testUtils->TestFinish(4);
+
+	testUtils->TestStart(5);
+	test.Next(_L("POP3 - Finding text in body"));
+	TestFindBodySelectionL();
+	log->AppendComment(_L8("Test 5 OK"));
+	testUtils->TestFinish(5);
+
+	testUtils->TestStart(6);
+	CreateMessagesL(KUidFindTestSMTPMtm);
+	test.Next(_L("SMTP - Finding text in selection"));
+	TestFindInSelectionL();
+	log->AppendComment(_L8("Test 6 OK"));
+	testUtils->TestFinish(6);
+
+	testUtils->TestStart(7);
+	test.Next(_L("SMTP - Finding text in description"));
+	TestFindDescriptionSelectionL();
+	log->AppendComment(_L8("Test 7 OK"));
+	testUtils->TestFinish(7);
+
+	testUtils->TestStart(8);
+	test.Next(_L("SMTP - Finding text in recipient"));
+	TestFindRecipientSelectionL();
+	log->AppendComment(_L8("Test 8 OK"));
+	testUtils->TestFinish(8);
+
+	testUtils->TestStart(9);
+	test.Next(_L("SMTP - Finding text in originator"));
+	TestFindOriginatorSelectionL();
+	log->AppendComment(_L8("Test 9 OK"));
+	testUtils->TestFinish(9);
+
+	testUtils->TestStart(10);
+	test.Next(_L("SMTP - Finding text in body"));
+	TestFindBodySelectionL();
+	log->AppendComment(_L8("Test 10 OK"));
+	testUtils->TestFinish(10);
+
+	testUtils->TestStart(11);
+	CreateMessagesL(KUidFindTestIMAP4Mtm);
+	test.Next(_L("IMAP4 - Finding text in selection"));
+	TestFindInSelectionL();
+	log->AppendComment(_L8("Test 11 OK"));
+	testUtils->TestFinish(11);
+
+	testUtils->TestStart(12);
+	test.Next(_L("IMAP4 - Finding text in description"));
+	TestFindDescriptionSelectionL();
+	log->AppendComment(_L8("Test 12 OK"));
+	testUtils->TestFinish(12);
+
+	testUtils->TestStart(13);
+	test.Next(_L("IMAP4 - Finding text in recipient"));
+	TestFindRecipientSelectionL();
+	log->AppendComment(_L8("Test 13 OK"));
+	testUtils->TestFinish(13);
+
+	testUtils->TestStart(14);
+	test.Next(_L("IMAP4 - Finding text in originator"));
+	TestFindOriginatorSelectionL();
+	log->AppendComment(_L8("Test 14 OK"));
+	testUtils->TestFinish(14);
+
+	testUtils->TestStart(15);
+	test.Next(_L("IMAP4 - Finding text in body"));
+	TestFindBodySelectionL();
+	log->AppendComment(_L8("Test 15 OK"));
+	testUtils->TestFinish(15);
+
+	log->AppendComment(_L8("TESTS PASSED"));
+	testUtils->TestHarnessCompleted();
+	Closedown();		
+	}
+	
+
+LOCAL_C void doFindTestL()
+	{
+	InitL();
+
+	testUtils->GoClientSideL();
+	CreateMessagesL(KUidFindTestPOP3Mtm);
+	testUtils->TestStart(1);
+	test.Start(_L("POP3 - Finding text in Header"));
+	log->AppendComment(_L8("Test 1 OK"));
+	testUtils->TestFinish(1);
+	
+	log->AppendComment(_L8("TESTS PASSED"));
+	testUtils->TestHarnessCompleted();
+	Closedown();		
+	}
+
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	theCleanup=CTrapCleanup::New();
+	TRAPD(ret,doMainL());		
+	test(ret==KErrNone);
+	delete theCleanup;	
+	test.Console()->SetPos(0, 13);
+	test.End();
+	test.Close();
+	__UHEAP_MARKEND;
+	return(KErrNone);
+	}
+