email/pop3andsmtpmtm/clientmtms/test/src/T_POPC.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/clientmtms/test/src/T_POPC.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,2325 @@
+// 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_POPC
+// Component: IMCM
+// Owner: KP
+// Brief description of test harness:
+// Tests the client-side API of POP3 MTM; Query capability; standard POP3 
+// functionality; CImPop3GetMail API.
+// 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_POPC\T_IMCM.log
+// <DRIVE>:\msglogs\T_POPC\Entry_Structure.txt
+// Output files produced by running test harness:
+// <DRIVE>:\msglogs\T_POPC.<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_POPC.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_POPC.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_POPC.exe on the other platform
+// 
+//
+
+#include "emailtestutils.h"
+#include <txtrich.h>
+#include <c32comm.h>
+#include <commdb.h>
+#include <mtmuids.h>
+#include "TESTENV.h"
+#include <bacline.h>
+#include <cemailaccounts.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
+#include "cimmessagepart.h"
+#endif
+
+
+// For loading the serial comms device drivers 
+#if defined (__WINS__)
+	#define PDD_NAME		_L("ECDRV")
+	#define LDD_NAME		_L("ECOMM")
+#else
+	#define PDD_NAME		_L("EUART1")
+	#define LDD_NAME		_L("ECOMM")
+#endif
+
+// local variables etc //
+
+_LIT(KImcmTest, "T_POPC - Testing CImPop3GetMail");
+RTest test(KImcmTest);
+
+_LIT(KTestParams,"-testparams");
+enum TCmdLineArgs
+	{
+	EArgProgramName,
+	EArgTestParams,
+	EArgServerAddress,
+	EArgLogin,
+	EArgPassword,
+	EArgPopulationLimit,
+	EArgEnd
+	};
+
+
+LOCAL_D TMsvId Pop3Service;
+LOCAL_D TMsvId smtpService;
+
+LOCAL_D CTrapCleanup* theCleanup;
+LOCAL_D CEmailTestUtils* testUtils;
+
+LOCAL_D CMsvOperation* msvOperation;
+LOCAL_D CMsvEntrySelection* msvSelection;
+
+LOCAL_D CMsvEntrySelection* messageSelection;
+
+LOCAL_D CConsoleBase* console;
+
+class COperationActive;
+LOCAL_D COperationActive* opActive;
+LOCAL_D TInt testNo = 1;
+LOCAL_D TInt globalError = 0;
+LOCAL_D TBool iDoCancel = EFalse;
+
+_LIT(KTestSettingsServerAddress,"2.2.2.2");
+const TInt KTestSettingsPort = 111;
+_LIT8(KTestSettingsLoginName,"testuser");
+_LIT8(KTestSettingsPassword,"password");
+const TInt KTestPopulationLimit=30;
+
+_LIT(KServer, "lon-cn-exchng2k.msexchange2k.closedtest.intra");
+_LIT8(KLoginName, "t_popc");
+_LIT8(KPassword, "t_popc");
+
+
+//
+class TestUiTimer : public CTimer
+	{
+public:
+	static TestUiTimer* NewLC(CConsoleBase* aConsole);
+	~TestUiTimer();
+
+	void RunL();
+	void DoCancel();
+	void ConstructL();
+	void IssueRequest();
+	void SetOperation(CMsvOperation* aOperation);
+	TTimeIntervalMicroSeconds32 period;
+	TPtrC Progress(TInt progressNumber);
+	void SetCancelState(TInt aState);
+protected:
+	TestUiTimer(CConsoleBase* aConsole);
+	
+	CConsoleBase*		iConsole;
+public:
+	CMsvOperation*		iOperation;
+private:
+	TInt	iCancelState;
+	};
+
+//
+TestUiTimer* TestUiTimer::NewLC(CConsoleBase* aConsole)
+	{
+	TestUiTimer* self = new(ELeave) TestUiTimer(aConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+TestUiTimer::TestUiTimer(CConsoleBase* aConsole)
+	: CTimer(1), iCancelState(KMaxTInt)
+	{
+	iConsole = aConsole;
+	period = 10000;
+	}
+
+TestUiTimer::~TestUiTimer()
+	{
+	delete iOperation;
+	}
+
+void TestUiTimer::ConstructL()
+	{
+	CTimer::ConstructL();
+	CActiveScheduler::Add(this);
+	}
+
+void TestUiTimer::IssueRequest()
+	{
+	After(period);
+	}
+
+void TestUiTimer::SetOperation(CMsvOperation* aOperation)
+	{
+	if(iOperation)
+		{
+		delete iOperation;
+		iOperation=NULL;
+		}
+	iOperation = aOperation;
+	}
+
+void TestUiTimer::DoCancel()
+	{
+	CTimer::DoCancel();
+	}
+
+TPtrC TestUiTimer::Progress(TInt progressNumber)
+	{
+	switch (progressNumber)
+		{
+		case 0:
+			return _L("Refreshing              ");
+		case 1:
+			return _L("Copying                 ");
+		case 2:
+			return _L("Deleting                ");
+		case 3:
+			return _L("Connecting              ");
+		case 4:
+			return _L("Tidying                 ");
+		case 5:
+			return _L("Connected and Idle      ");
+		case 6:
+			return _L("Disconnecting           ");
+		case 7:
+			return _L("Disconnected            ");
+		case 8:
+			return _L("Moving                  ");
+		case 9:
+			return _L("Copying New Mail        ");
+		case 10:
+			return _L("Moving New Mail         ");
+		case 11:
+			return _L("Copying Mail Selection  ");
+		case 12:
+			return _L("Moving Mail Selection   ");
+		case 13:
+			return _L("Copying All Mail        ");
+		case 14:
+			return _L("Moving All Mail         ");
+		default:
+			return _L("Unknown Progress        ");
+		}
+	}
+
+void TestUiTimer::SetCancelState(TInt aState)
+	{
+	iCancelState = aState;
+	}
+
+void TestUiTimer::RunL()
+	{
+	// display the current progress
+	if(iOperation!=NULL)
+		{
+		if(iDoCancel == TBool(ETrue))
+			{
+			iOperation->Cancel();
+			}
+		TPop3Progress temp;	
+		TPckgC<TPop3Progress> paramPack(temp);
+		paramPack.Set(iOperation->ProgressL());
+		TPop3Progress progress=paramPack();	
+
+		if (iCancelState == progress.iPop3SubStateProgress)
+			{
+			iConsole->Printf(_L("	Calling Cancel\n"));
+			iOperation->Cancel();
+			}
+
+		iConsole->SetPos(0, 12);
+		TBuf<80> progressBuf = Progress(progress.iPop3Progress);
+		iConsole->Printf(TRefByValue<const TDesC>_L("   Super Operation Progress: %S           "), &progressBuf);
+		iConsole->SetPos(0, 13);
+		progressBuf = Progress(progress.iPop3SubStateProgress);
+		iConsole->Printf(TRefByValue<const TDesC>_L("   Sub Operation Progress  : %S           "), &progressBuf);
+		iConsole->SetPos(0, 14);
+		iConsole->Printf(TRefByValue<const TDesC>_L("   Progress:  %d/%d %d/%d Total:%d                \n"),
+					progress.iTotalMsgs-progress.iMsgsToProcess,
+					progress.iTotalMsgs,
+					progress.iBytesDone,
+					progress.iTotalBytes,
+					progress.iTotalSize);
+		iConsole->SetPos(0, 15);
+		iConsole->Printf(TRefByValue<const TDesC>_L("   Error: %d                             \n"), progress.iErrorCode);
+		if (progress.iErrorCode && !globalError)
+			{
+			if(!iDoCancel || progress.iErrorCode!=KErrCancel)
+				{// we should not report KErrCancel as an error when iDoCancel is true because that is expected behviour
+				globalError=progress.iErrorCode;
+				}
+			}
+		}
+	IssueRequest();
+	};
+
+//
+
+class COperationActive : public CActive
+	{
+public:
+	COperationActive();
+	~COperationActive();
+	static COperationActive* NewL();
+	void StartL(TBool aDisableProgress = EFalse);
+	void SetOperation(CMsvOperation*);
+	void SetCancelState(TInt aCancelState);
+	
+protected:
+	void DoCancel();
+	void RunL();
+public:	
+	TestUiTimer* iTimer;
+private:
+	TBool iSetActive;
+	};
+
+//
+COperationActive::COperationActive()
+: CActive(0)
+	{
+	}
+
+COperationActive::~COperationActive()
+	{
+	Cancel();
+	delete iTimer;
+	}
+
+COperationActive* COperationActive::NewL()
+	{
+	COperationActive* self = new (ELeave) COperationActive;
+	CActiveScheduler::Add(self);
+
+	self->iSetActive = ETrue;
+	self->iTimer = TestUiTimer::NewLC(test.Console());
+	CleanupStack::Pop();
+	return self;
+	}
+
+void COperationActive::DoCancel()
+	{
+	iTimer->DoCancel();
+	}
+
+void COperationActive::StartL(TBool aDisableProgress)
+	{
+	if(aDisableProgress)
+		{
+		iTimer->IssueRequest();	// Start the connect observation timer
+		SetActive();
+		test.Printf(TRefByValue<const TDesC>_L("POP3 progress disabled"));
+		}
+	else
+		{	
+		TPop3Progress temp;	
+		TPckgC<TPop3Progress> paramPack(temp);
+		paramPack.Set(iTimer->iOperation->ProgressL());
+		TPop3Progress progress=paramPack();	
+
+		switch(progress.iPop3Progress)
+			{
+			case TPop3Progress::EPopDisconnected:
+			case TPop3Progress::EPopDisconnecting:
+				// don't set active
+				iSetActive = EFalse;
+				break;
+			case TPop3Progress::EPopCopyNewMail:
+			case TPop3Progress::EPopMoveNewMail:
+			case TPop3Progress::EPopCopyMailSelection:
+			case TPop3Progress::EPopMoveMailSelection:
+			case TPop3Progress::EPopCopyAllMail:
+			case TPop3Progress::EPopMoveAllMail:
+			case TPop3Progress::EPopPopulating:
+			default:
+				switch(progress.iPop3SubStateProgress)
+					{
+					// don't set active if we are in the disconnecting state or if we have disconnected.
+					case TPop3Progress::EPopDisconnected:
+					case TPop3Progress::EPopDisconnecting:
+					default:
+						// don't set active
+						iSetActive = EFalse;	
+						break;
+					case TPop3Progress::EPopCopying:
+					case TPop3Progress::EPopDeleting:
+					case TPop3Progress::EPopConnectedAndIdle:
+					case TPop3Progress::EPopMoving:
+					case TPop3Progress::EPopRefreshing:
+					case TPop3Progress::EPopConnecting:
+					case TPop3Progress::EPopTidying:
+						{
+						if (iSetActive && iTimer->iOperation->IsActive())
+							{
+							
+							iTimer->IssueRequest();	// Start the connect observation timer
+							SetActive();
+							
+							}
+						}
+					}
+			}
+
+		test.Console()->SetPos(0, 17);
+		test.Printf(TRefByValue<const TDesC>_L("Operation TRequestStatus %d"), iStatus);
+		
+		}
+	}
+
+void COperationActive::SetOperation(CMsvOperation *aOperation)
+	{
+	iTimer->SetOperation(aOperation);
+	}
+
+void COperationActive::SetCancelState(TInt aCancelState)
+	{
+	iTimer->SetCancelState(aCancelState);
+	}
+
+void COperationActive::RunL() 
+	{
+	iTimer->Cancel();
+	test.Console()->SetPos(25, 17);
+	test.Printf(_L("                "));
+	test.Console()->SetPos(0, 17);
+	test.Printf(TRefByValue<const TDesC>_L("Operation TRequestStatus %d"), iStatus);
+	CActiveScheduler::Stop();
+	}
+
+//
+
+LOCAL_C void StoreClientSettingsL()
+//
+// Dummy settings for checking that StoreSettingsL work for the client mtm
+//	
+	{
+	testUtils->WriteComment(_L("Storing settings in client mtm"));
+	CImPop3Settings* pop3Settings = new(ELeave)CImPop3Settings;
+	CleanupStack::PushL(pop3Settings);
+	pop3Settings->CopyL(testUtils->iPopClientMtm->Settings());
+    pop3Settings->SetServerAddressL(KTestSettingsServerAddress);
+	pop3Settings->SetPort(KTestSettingsPort);
+	pop3Settings->SetLoginNameL(KTestSettingsLoginName);
+	pop3Settings->SetPasswordL(KTestSettingsPassword);
+	pop3Settings->SetPopulationLimitL(KTestPopulationLimit);
+	testUtils->iPopClientMtm->SetSettingsL(*pop3Settings);
+	CleanupStack::PopAndDestroy(pop3Settings);
+	testUtils->iPopClientMtm->StoreSettingsL();
+	}
+
+LOCAL_C TInt VerifyStoredClientSettingsL()
+//
+// Comparison of the settings stored to see that the client commits after storing
+//
+	{
+	// Handle command line arguments
+	CCommandLineArguments* cmdLineArg=CCommandLineArguments::NewLC();
+	TInt count = cmdLineArg->Count();
+	TBool isCmdLine=FALSE;
+	if (count>2)	// Command line arguments?
+		{
+		if ((!(cmdLineArg->Arg(EArgTestParams).Compare(KTestParams))) && count==EArgEnd)
+			isCmdLine=TRUE;
+		}	
+
+	testUtils->WriteComment(_L("Checking stored settings in client mtm"));
+	testUtils->iPopClientMtm->RestoreSettingsL();
+	CImPop3Settings* pop3Settings = new(ELeave)CImPop3Settings;
+	CleanupStack::PushL(pop3Settings);
+	pop3Settings->CopyL(testUtils->iPopClientMtm->Settings());
+
+    TInt result=0;
+	result += pop3Settings->ServerAddress().Compare(KTestSettingsServerAddress);
+	result += pop3Settings->Port() - KTestSettingsPort;
+	result += pop3Settings->LoginName().Compare(KTestSettingsLoginName);
+	result += pop3Settings->Password().Compare(KTestSettingsPassword);
+    result += (pop3Settings->PopulationLimit()!=KTestPopulationLimit);
+
+	pop3Settings->Reset();
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TLex lex(cmdLineArg->Arg(EArgServerAddress));
+		buf=lex.NextToken();
+		pop3Settings->SetServerAddressL(buf);
+		}
+	else
+		{
+		pop3Settings->SetServerAddressL(KServer);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TBuf8<64> data;
+		TLex lex(cmdLineArg->Arg(EArgLogin));
+		buf=lex.NextToken();
+		data.Copy(buf);
+		pop3Settings->SetLoginNameL(data);
+		}
+	else
+		{
+		pop3Settings->SetLoginNameL(KLoginName);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TBuf8<64> data;
+		TLex lex(cmdLineArg->Arg(EArgPassword));
+		buf=lex.NextToken();
+		data.Copy(buf);
+		pop3Settings->SetPasswordL(data);
+		}
+	else
+		{
+		pop3Settings->SetPasswordL(KPassword);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TLex lex(cmdLineArg->Arg(EArgPopulationLimit));
+		buf=lex.NextToken();
+		TInt limit;
+		TLex lex2(buf);
+		lex2.Val(limit);
+		pop3Settings->SetPopulationLimitL(limit);
+		}
+	else
+		{
+		TInt populationLimit=40;
+		pop3Settings->SetPopulationLimitL(populationLimit);
+		}
+
+	
+	pop3Settings->SetPort(110);
+	testUtils->iPopClientMtm->SetSettingsL(*pop3Settings);
+	testUtils->iPopClientMtm->StoreSettingsL();
+	
+   	TRequestStatus st;
+   	TMsvId s=0;
+   	TMsvPartList retPart=KMsvMessagePartBody;
+   	TUint id=0;
+   	TInt add=0;
+   	
+   	TBuf<1> des;
+   	TBuf8<1> des8;
+
+	TRAP_IGNORE(testUtils->iPopClientMtm->SaveMessageL());
+	TRAP_IGNORE(testUtils->iPopClientMtm->ReplyL(s,retPart,st));
+	TRAP_IGNORE(testUtils->iPopClientMtm->ForwardL(s,retPart,st));
+	testUtils->iPopClientMtm->ValidateMessage(retPart);
+	TRAP_IGNORE(testUtils->iPopClientMtm->AddAddresseeL(des));
+	TRAP_IGNORE(testUtils->iPopClientMtm->AddAddresseeL(des,des));
+	testUtils->iPopClientMtm->RemoveAddressee(add);
+	TRAP_IGNORE(testUtils->iPopClientMtm->AddAttachmentL(des, des8,id,st));
+	TRAP_IGNORE(testUtils->iPopClientMtm->AddLinkedAttachmentL(des,des8,id,st));
+	TRAP_IGNORE(testUtils->iPopClientMtm->AddEntryAsAttachmentL(s,st));
+	TRAP_IGNORE(testUtils->iPopClientMtm->CreateMessageL(s));
+	TRAP_IGNORE(testUtils->iPopClientMtm->DefaultServiceL());
+	TRAP_IGNORE(testUtils->iPopClientMtm->RemoveDefaultServiceL());
+	TRAP_IGNORE(testUtils->iPopClientMtm->ChangeDefaultServiceL(s));
+	
+	CleanupStack::PopAndDestroy(pop3Settings);
+	CleanupStack::PopAndDestroy();	// cmdLineArg
+	return result;
+	}
+
+LOCAL_C void ConnectToServerL()
+	{
+	testUtils->WriteComment(_L("Connecting to the Pop3 server"));
+	TBuf8<1> aParameter;
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnect, *msvSelection, aParameter, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	// Start the connect active object
+	}
+
+LOCAL_C void DisconnectFromServerL()
+	{
+	testUtils->WriteComment(_L("Disconnecting from the Pop3 server"));
+	TBuf8<1> aParameter;
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMDisconnect, *msvSelection, aParameter, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	// Start the disconnect active object
+	}
+
+//
+// Get Mail when already Connected tests
+//
+
+LOCAL_C void CopyNewMailWhenAlreadyConnectedL()
+	{
+	testUtils->WriteComment(_L("Copying New Mail when already connected")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMCopyNewMailWhenAlreadyConnected, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	// Start the copy new mail active object
+	}
+
+
+LOCAL_C void MoveNewMailWhenAlreadyConnectedL()
+	{
+	testUtils->WriteComment(_L("Moving New Mail when already connected"));
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002);
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize=KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder= KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMMoveNewMailWhenAlreadyConnected,*msvSelection,package,opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);
+	}
+
+
+LOCAL_C void CopyAllMailWhenAlreadyConnectedL()
+	{
+	testUtils->WriteComment(_L("Copying All Mail when already connected")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMCopyAllMailWhenAlreadyConnected, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	// Start the copy all mail active object
+	}
+
+
+LOCAL_C void MoveAllMailWhenAlreadyConnectedL()
+	{
+	testUtils->WriteComment(_L("Moving All Mails when already connected"));
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMMoveAllMailWhenAlreadyConnected, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	
+	}
+
+
+LOCAL_C void CopyMailSelectionWhenAlreadyConnectedL()
+	{
+	testUtils->WriteComment(_L("Copying Mail Selection when already connected")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+
+	testUtils->SetEntryL(Pop3Service);
+	CMsvEntrySelection* sel = testUtils->iMsvEntry->ChildrenL();
+	CleanupStack::PushL(sel);
+	if (sel->Count()>1)
+		{
+		msvSelection->AppendL((*sel)[0]); 
+		msvSelection->AppendL((*sel)[1]); 
+		}
+	else if (sel->Count())
+		msvSelection->AppendL((*sel)[0]);
+	CleanupStack::PopAndDestroy(); //sel
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMCopyMailSelectionWhenAlreadyConnected, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	// Start the copy mail selection active object
+	}
+
+
+LOCAL_C void MoveMailSelectionWhenAlreadyConnectedL()
+	{
+	testUtils->WriteComment(_L("Moving Mail Selection when already connected")); 
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);	//Pop3Service is already set while connecting to the server
+	testUtils->SetEntryL(Pop3Service);
+	CMsvEntrySelection* sel = testUtils->iMsvEntry->ChildrenL();
+	CleanupStack::PushL(sel);
+	if (sel->Count()>1)
+		{
+		msvSelection->AppendL((*sel)[0]); 
+		msvSelection->AppendL((*sel)[1]); 
+		}
+	else if (sel->Count())
+		msvSelection->AppendL((*sel)[0]);
+	CleanupStack::PopAndDestroy(); //sel
+		
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMMoveMailSelectionWhenAlreadyConnected, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	// Start the move mail selection active object
+	}
+
+
+//
+// Connect, Get Mail and Disconnect tests
+//
+
+LOCAL_C void ConnectAndCopyNewMailAndDisconnectL()
+	{
+	testUtils->WriteComment(_L("Connect, Copying New Mail, Disconnect")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndCopyNewMailAndDisconnect, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	// Start the copy new mail active object
+	}
+
+LOCAL_C void ConnectAndMoveNewMailAndDisconnectL()
+	{
+	testUtils->WriteComment(_L("Connect, Move New Mail, Disconnect")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndMoveNewMailAndDisconnect, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	
+	}
+
+LOCAL_C void ConnectAndCopyAllMailAndDisconnectL()
+	{
+	testUtils->WriteComment(_L("Connect, Copying All Mail, Disconnect")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndCopyAllMailAndDisconnect, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	// Start the copy all mail active object
+	}
+
+
+LOCAL_C void ConnectAndMoveAllMailAndDisconnectL()
+	{
+	testUtils->WriteComment(_L("Connect, Moving All Mail, Disconnect")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndMoveAllMailAndDisconnect, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	
+	}
+
+
+
+
+
+LOCAL_C void ConnectAndCopyMailSelectionAndDisconnectL(TBool aEmptyMessageSelection = EFalse)
+	{
+	testUtils->WriteComment(_L("Connect, Copying Mail Selection, Disconnect")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+
+	if (!aEmptyMessageSelection)
+		{
+		testUtils->SetEntryL(Pop3Service);
+		CMsvEntrySelection* sel = testUtils->iMsvEntry->ChildrenL();
+		CleanupStack::PushL(sel);
+		if (sel->Count()>1)
+			{
+			msvSelection->AppendL((*sel)[0]); 
+			msvSelection->AppendL((*sel)[1]); 
+			}
+		else if (sel->Count())
+			msvSelection->AppendL((*sel)[0]);
+		CleanupStack::PopAndDestroy(); //sel
+		}
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndCopyMailSelectionAndDisconnect, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	// Start the copy all mail active object
+	}
+
+
+LOCAL_C void ConnectAndMoveMailSelectionAndDisconnectL(TBool aEmptyMessageSelection = EFalse)
+	{
+	testUtils->WriteComment(_L("Connect, Move Mail Selection, Disconnect")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+
+	if (!aEmptyMessageSelection)
+		{
+		testUtils->SetEntryL(Pop3Service);
+		CMsvEntrySelection* sel = testUtils->iMsvEntry->ChildrenL();
+		CleanupStack::PushL(sel);
+		if (sel->Count()>1)
+			{
+			msvSelection->AppendL((*sel)[0]); 
+			msvSelection->AppendL((*sel)[1]); 
+			}
+		else if (sel->Count())
+			msvSelection->AppendL((*sel)[0]);
+		CleanupStack::PopAndDestroy(); //sel
+		}
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndMoveMailSelectionAndDisconnect, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();
+	}
+
+//
+// Connect, Get Mail and Stay Online tests
+//
+
+LOCAL_C void ConnectAndCopyNewMailAndStayOnlineL()
+	{
+	testUtils->WriteComment(_L("Connect, Copying New Mail, Stay Online")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndCopyNewMailAndStayOnline, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	// Start the copy new mail active object
+	}
+
+
+LOCAL_C void ConnectAndMoveNewMailAndStayOnlineL()
+	{
+	testUtils->WriteComment(_L("Connect, Moving New Mail, Stay Online"));
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndMoveNewMailAndStayOnline, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();
+	}
+
+LOCAL_C void ConnectAndCopyAllMailAndStayOnlineL()
+	{
+	testUtils->WriteComment(_L("Connect, Copying All Mail, Stay Online")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndCopyAllMailAndStayOnline, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	// Start the copy all mail active object
+	}
+
+
+LOCAL_C void ConnectAndMoveAllMailAndStayOnlineL()
+	{
+	testUtils->WriteComment(_L("Connect, Move All Mail, Stay Online")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+	msvSelection->AppendL(0x00100002); // remote inbox
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndMoveAllMailAndStayOnline, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	
+	}
+
+
+LOCAL_C void ConnectAndCopyMailSelectionAndStayOnlineL()
+	{
+	testUtils->WriteComment(_L("Connect, Copying Mail Selection, Stay Online")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+
+	testUtils->SetEntryL(Pop3Service);
+	CMsvEntrySelection* sel = testUtils->iMsvEntry->ChildrenL();
+	CleanupStack::PushL(sel);
+	if (sel->Count()>1)
+		{
+		msvSelection->AppendL((*sel)[0]); 
+		msvSelection->AppendL((*sel)[1]); 
+		}
+	else if (sel->Count())
+		msvSelection->AppendL((*sel)[0]);
+	CleanupStack::PopAndDestroy(); //sel
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndCopyMailSelectionAndStayOnline, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	// Start the copy message selection active object
+	}
+
+LOCAL_C void ConnectAndMoveMailSelectionAndStayOnlineL()
+	{
+	testUtils->WriteComment(_L("Connect, Move Mail Selection, Stay Online")); 
+
+	msvSelection->ResizeL(0);
+	msvSelection->AppendL(Pop3Service);
+
+	testUtils->SetEntryL(Pop3Service);
+	CMsvEntrySelection* sel = testUtils->iMsvEntry->ChildrenL();
+	CleanupStack::PushL(sel);
+	if (sel->Count()>1)
+		{
+		msvSelection->AppendL((*sel)[0]); 
+		msvSelection->AppendL((*sel)[1]); 
+		}
+	else if (sel->Count())
+		msvSelection->AppendL((*sel)[0]);
+	CleanupStack::PopAndDestroy(); //sel
+	
+	TImPop3GetMailInfo Pop3GetMailInfo;
+	Pop3GetMailInfo.iMaxEmailSize = KMaxTInt;
+	Pop3GetMailInfo.iDestinationFolder = KMsvGlobalInBoxIndexEntryIdValue;
+	TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
+	
+	opActive->iStatus = KRequestPending;
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMConnectAndMoveMailSelectionAndStayOnline, *msvSelection, package, opActive->iStatus);
+	opActive->SetOperation(msvOperation);
+	opActive->StartL();	
+	}
+
+
+//
+
+LOCAL_C void ConnectAndDisconnectL()
+	{
+	console->SetPos(0, 6);
+	test.Printf(_L("\nPerforming Tests\n"));
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to Pop server                        \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+	}
+
+//
+
+
+LOCAL_C void CreateReplyEmailMessage()
+	{
+	testUtils->WriteComment(_L("Creating a Reply Email Message"));
+	msvSelection->ResizeL(0);
+	
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+	messageSelection = testUtils->iMsvEntry->ChildrenWithTypeL(KUidMsvMessageEntry);
+	//CleanupStack::PushL(messageSelection);
+	msvSelection->AppendL(KMsvGlobalOutBoxIndexEntryId); //destination id
+	msvSelection->AppendL(messageSelection->At(5)); // message id to which the reply is to be assigned
+	//CleanupStack::PopAndDestroy(); 	 //messageSelection
+	
+	//create an object of type TImCreateMessageOptions
+	TImCreateMessageOptions Pop3CreateMessage;
+	
+	//Initialize the member variables of TImCreateMessageOptions suitably 
+	Pop3CreateMessage.iMsvPartList = KMsvMessagePartBody;
+	Pop3CreateMessage.iMsvEmailTypeList = 0;
+	Pop3CreateMessage.iMessageType = KUidMsgTypeSMTP;
+	TPckgBuf<TImCreateMessageOptions> package(Pop3CreateMessage);
+	
+	//set the status
+	opActive->iStatus = KRequestPending;
+	
+	//invoke the func InvokeAsyncFunctionL()
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMCreateReplyEmailMessage, *msvSelection, package, opActive->iStatus);
+	
+	//start the operation
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	
+	delete messageSelection;
+	}
+
+
+LOCAL_C void CreateForwardEmailMessage()
+	{
+	testUtils->WriteComment(_L("Creating a Forward Email Message"));
+	msvSelection->ResizeL(0);
+	
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+	messageSelection = testUtils->iMsvEntry->ChildrenWithTypeL(KUidMsvMessageEntry);
+	msvSelection->AppendL(KMsvGlobalOutBoxIndexEntryId); //destination id
+	msvSelection->AppendL(messageSelection->At(5)); // message id to which the reply is to be assigned
+		
+	//create an object of type TImCreateMessageOptions
+	TImCreateMessageOptions Pop3CreateMessage;
+	
+	//Initialize the member variables of TImCreateMessageOptions suitably 
+	Pop3CreateMessage.iMsvPartList = KMsvMessagePartBody;
+	Pop3CreateMessage.iMsvEmailTypeList = 0;
+	Pop3CreateMessage.iMessageType = KUidMsgTypeSMTP;
+	TPckgBuf<TImCreateMessageOptions> package(Pop3CreateMessage);
+	
+	//set the status
+	opActive->iStatus = KRequestPending;
+	
+	//invoke the func InvokeAsyncFunctionL()
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMCreateForwardEmailMessage, *msvSelection, package, opActive->iStatus);
+	
+	//start the operation
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	
+	delete messageSelection;
+	}
+
+
+LOCAL_C void CreateForwardAsAttachmentEmailMessage()
+	{
+	testUtils->WriteComment(_L("Creating a Forward As Attachment Email Message"));
+	msvSelection->ResizeL(0);
+	
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+	messageSelection = testUtils->iMsvEntry->ChildrenWithTypeL(KUidMsvMessageEntry);
+	
+	msvSelection->AppendL(Pop3Service); //destination id
+	msvSelection->AppendL(messageSelection->At(1)); // message id to which the reply is to be assigned
+	
+	
+	//create an object of type TImCreateMessageOptions
+	TImCreateMessageOptions Pop3CreateMessage;
+	
+	//Initialize the member variables of TImCreateMessageOptions suitably 
+	Pop3CreateMessage.iMsvPartList =KMsvMessagePartBody | KMsvMessagePartAttachments;
+	Pop3CreateMessage.iMsvEmailTypeList = KMsvEmailTypeListMHTMLMessage;
+	Pop3CreateMessage.iMessageType = KUidMsgTypeSMTP;
+	TPckgBuf<TImCreateMessageOptions> package(Pop3CreateMessage);
+	
+	//set the status
+	opActive->iStatus = KRequestPending;
+	
+	//invoke the func InvokeAsyncFunctionL()
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMCreateForwardAsAttachmentEmailMessage, *msvSelection, package, opActive->iStatus);
+	
+	//start the operation
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	
+	delete messageSelection;
+	}
+
+
+LOCAL_C void CreateReceiptEmailMessage()
+	{
+	testUtils->WriteComment(_L("Creating a Receipt Email Message"));
+	msvSelection->ResizeL(0);
+	
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);
+	messageSelection = testUtils->iMsvEntry->ChildrenWithTypeL(KUidMsvMessageEntry);
+	
+	msvSelection->AppendL(KMsvGlobalOutBoxIndexEntryId); //destination id
+	msvSelection->AppendL(messageSelection->At(5)); // message id 
+	
+	
+	//create an object of type TImCreateMessageOptions
+	TImCreateMessageOptions Pop3CreateMessage;
+	
+	//Initialize the member variables of TImCreateMessageOptions suitably 
+	Pop3CreateMessage.iMsvPartList = KMsvMessagePartBody;
+	Pop3CreateMessage.iMsvEmailTypeList = 0;
+	Pop3CreateMessage.iMessageType = KUidMsgTypeSMTP;
+	TPckgBuf<TImCreateMessageOptions> package(Pop3CreateMessage);
+	
+	//set the status
+	opActive->iStatus = KRequestPending;
+	
+	//invoke the func InvokeAsyncFunctionL()
+	msvOperation = testUtils->iPopClientMtm->InvokeAsyncFunctionL(KPOP3MTMCreateReceiptEmailMessage, *msvSelection, package, opActive->iStatus);
+	
+	//start the operation
+	opActive->SetOperation(msvOperation);
+	opActive->StartL(ETrue);	
+	delete messageSelection;
+	}
+
+
+LOCAL_C void TestCapabilityL()
+	{
+	TInt response = 0;
+	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQuerySupportedBody, response) == KErrNone);
+	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQuerySupportAttachments, response) == KErrNone);
+//	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQuerySupportSubject, response) == KErrNone);
+//	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQuerySupportsFolder, response) == KErrNotSupported);
+//	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQueryOffLineAllowed, response) == KErrNotSupported);
+	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQueryCanSendMsg, response) == KErrNotSupported);
+	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQueryCanReceiveMsg, response) == KErrNone);
+	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQuerySendAsRequiresRenderedImage, response) == KErrNotSupported);
+	test(testUtils->iPopClientMtm->QueryCapability(KUidMtmQueryMaxRecipientCount, response) == KErrNotSupported);
+	}
+
+LOCAL_C void DeleteAndCreateServicesL()
+	{
+	// Handle command line arguments
+	CCommandLineArguments* cmdLineArg=CCommandLineArguments::NewLC();
+	TInt count = cmdLineArg->Count();
+	TBool isCmdLine=FALSE;
+	if (count>2)	// Command line arguments?
+		{
+		if ((!(cmdLineArg->Arg(EArgTestParams).Compare(KTestParams))) && count==EArgEnd)
+			isCmdLine=TRUE;
+		}	
+
+	// delete services
+	testUtils->iMsvEntry->SetEntryL(KMsvRootIndexEntryId);
+	testUtils->iMsvEntry->DeleteL(Pop3Service);
+	testUtils->iMsvEntry->DeleteL(smtpService);
+
+	// Create Services
+	smtpService = testUtils->CreateSmtpServiceL();
+	Pop3Service = testUtils->CreatePopServiceL();
+
+	testUtils->iMsvEntry->SetEntryL(Pop3Service);
+
+//	TUint32 iap=0;
+//	CCommsDatabase* db =CCommsDatabase::NewL();
+//	CleanupStack::PushL(db);
+//	db->GetGlobalSettingL(TPtrC(DIAL_OUT_IAP),iap);
+//	CleanupStack::PopAndDestroy(); //db
+
+	//overwrite the settings with test code one.  Don't want the default settings.
+	CEmailAccounts* accounts = CEmailAccounts::NewLC();
+
+	CImPop3Settings* settings = new(ELeave) CImPop3Settings();
+	CleanupStack::PushL(settings);
+	settings->Reset();
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TLex lex(cmdLineArg->Arg(EArgServerAddress));
+		buf=lex.NextToken();
+		settings->SetServerAddressL(buf);
+		}
+	else
+		{
+		settings->SetServerAddressL(KServer);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TBuf8<64> data;
+		TLex lex(cmdLineArg->Arg(EArgLogin));
+		buf=lex.NextToken();
+		data.Copy(buf);
+		settings->SetLoginNameL(data);
+		}
+	else
+		{
+		settings->SetLoginNameL(KLoginName);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TBuf8<64> data;
+		TLex lex(cmdLineArg->Arg(EArgPassword));
+		buf=lex.NextToken();
+		data.Copy(buf);
+		settings->SetPasswordL(data);
+		}
+	else
+		{
+		settings->SetPasswordL(KPassword);
+		}
+	
+	settings->SetPort(110);
+	TPopAccount pop3AccountId;
+	accounts->GetPopAccountL(Pop3Service, pop3AccountId);
+	accounts->SavePopSettingsL( pop3AccountId, *settings);
+	
+	CleanupStack::PopAndDestroy(2); //settings, store/accounts
+	CleanupStack::PopAndDestroy();	// cmdLineArg
+	}
+
+LOCAL_C void InitL()
+	{
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+	CActiveScheduler::Install(scheduler);
+	CleanupStack::PushL(scheduler);
+
+	testUtils = CEmailTestUtils::NewLC(test);
+	console = test.Console();
+	testUtils->FileSession().SetSessionPath(_L("C:\\"));
+	testUtils->CleanMessageFolderL();
+	testUtils->ClearEmailAccountsL();
+	// Create Services
+	testUtils->GoClientSideL();
+	testUtils->ClearEmailAccountsL();
+	smtpService = testUtils->CreateSmtpServiceL();
+	Pop3Service = testUtils->CreatePopServiceL();
+	testUtils->GoServerSideL();
+	
+	console->SetPos(0, 3);
+	test.Printf(_L("Create Data Component FileStores"));
+	testUtils->CreateSmtpServerMtmRegL();
+	testUtils->CreatePopServerMtmRegL();
+
+	// Load the DLLs
+	testUtils->CreateRegistryObjectAndControlL();
+	testUtils->InstallSmtpMtmGroupL();
+	testUtils->InstallPopMtmGroupL();
+
+	// Create Services
+
+	testUtils->WriteComment(_L("********** T_POPC Test CImPop3GetMail class **********"));
+
+	}
+	
+LOCAL_C void Closedown()
+	{
+	// mkn testUtils->WriteComment(_L("**********      T_POPC Tests Complete      **********"));
+
+	CleanupStack::PopAndDestroy(2);  //testUtils, scheduler
+	}
+
+//
+
+LOCAL_C TPtrC Progress(TInt progressNumber)
+	{
+	switch (progressNumber)
+		{
+		case 0:
+			return _L("Refreshing              ");
+		case 1:
+			return _L("Copying                 ");
+		case 2:
+			return _L("Deleting                ");
+		case 3:
+			return _L("Connecting              ");
+		case 4:
+			return _L("Tidying                 ");
+		case 5:
+			return _L("Connected and Idle      ");
+		case 6:
+			return _L("Disconnecting           ");
+		case 7:
+			return _L("Disconnected            ");
+		case 8:
+			return _L("Moving                  ");
+		case 9:
+			return _L("Copying New Mail        ");
+		case 10:
+			return _L("Moving New Mail         ");
+		case 11:
+			return _L("Copying Mail Selection  ");
+		case 12:
+			return _L("Moving Mail Selection   ");
+		case 13:
+			return _L("Copying All Mail        ");
+		case 14:
+			return _L("Moving All Mail         ");
+		default:
+			return _L("Unknown Progress        ");
+		}
+	}
+
+LOCAL_C void doMainL()
+	{
+	InitL();
+	testUtils->FileSession().SetSessionPath(_L("c:\\"));
+
+	testUtils->CreateMessageFilesL(Pop3Service, KMsvGlobalInBoxIndexEntryId, _L("c:\\mailtest\\IMCM\\"));
+	// Load the serial comms device drivers.  If this is not done,
+	// connecting via NT-RAS returns KErrNotFound (-1).
+	TInt driverErr;
+	driverErr=User::LoadPhysicalDevice(PDD_NAME);
+	if (driverErr!=KErrNone && driverErr!=KErrAlreadyExists)
+		User::Leave(driverErr);
+	driverErr=User::LoadLogicalDevice(LDD_NAME);
+	if (driverErr!=KErrNone && driverErr!=KErrAlreadyExists)
+		User::Leave(driverErr);
+
+	// Delete any *.scr files in c:\logs\email directory.
+	testUtils->DeleteScriptFilesFromLogsDirL();
+
+	// Instantiate the Pop3 Client MTM
+	testUtils->GoClientSideL();
+
+	testUtils->iMsvEntry->SetEntryL(Pop3Service);
+
+	TMsvEntry entry=testUtils->iMsvEntry->Entry();
+	testUtils->iMsvEntry->ChangeL(entry);
+
+	// Handle command line arguments
+	CCommandLineArguments* cmdLineArg=CCommandLineArguments::NewLC();
+	TInt count = cmdLineArg->Count();
+	TBool isCmdLine=FALSE;
+	if (count>2)	// Command line arguments?
+		{
+		if ((!(cmdLineArg->Arg(EArgTestParams).Compare(KTestParams))) && count==EArgEnd)
+			isCmdLine=TRUE;
+		}	
+
+	//overwrite the settings with test code one.  Don't want the default settings.
+	CImPop3Settings* settings = new(ELeave) CImPop3Settings();
+	CleanupStack::PushL(settings);
+
+	CEmailAccounts* accounts = CEmailAccounts::NewLC();
+	
+	TPopAccount pop3AccountId;
+	accounts->GetPopAccountL(Pop3Service, pop3AccountId);
+	accounts->LoadPopSettingsL(pop3AccountId, *settings);
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TLex lex(cmdLineArg->Arg(EArgServerAddress));
+		buf=lex.NextToken();
+		test.Printf(_L("Server address: %S\n"),&buf);
+		settings->SetServerAddressL(buf);
+		}
+	else
+		{
+		settings->SetServerAddressL(KServer);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TBuf8<64> data;
+		TLex lex(cmdLineArg->Arg(EArgLogin));
+		buf=lex.NextToken();
+		test.Printf(_L("Login: %S\n"),&buf);
+		data.Copy(buf);
+		settings->SetLoginNameL(data);
+		}
+	else
+		{
+		settings->SetLoginNameL(KLoginName);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TBuf8<64> data;
+		TLex lex(cmdLineArg->Arg(EArgPassword));
+		buf=lex.NextToken();
+		test.Printf(_L("Password: %S\n"),&buf);
+		data.Copy(buf);
+		settings->SetPasswordL(data);
+		}
+	else
+		{
+		settings->SetPasswordL(KPassword);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TLex lex(cmdLineArg->Arg(EArgPopulationLimit));
+		buf=lex.NextToken();
+		TInt limit;
+		TLex lex2(buf);
+		lex2.Val(limit);
+		settings->SetPopulationLimitL(limit);
+		}
+	else
+		{
+		TInt populationLimit=40;
+		settings->SetPopulationLimitL(populationLimit);
+		}
+	
+	settings->SetPort(110);
+	accounts->SavePopSettingsL(pop3AccountId, *settings);
+	CleanupStack::PopAndDestroy(2); // store/accounts, settings
+	CleanupStack::PopAndDestroy();	// cmdLineArg
+
+	console->SetPos(0, 3);
+	test.Printf(_L("Instantiating POP3 Client MTM"));
+	testUtils->InstantiatePopClientMtmL();
+	testUtils->WriteComment(_L("Instantiated POP3 Client MTM"));
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	// Check that CPop3ClientMtm::StoreSettingsL() really works.
+	testUtils->TestStart(testNo++);
+	console->SetPos(0, 7);
+	test.Printf(_L("Storing settings								 \n"));
+	StoreClientSettingsL();
+	TInt result = VerifyStoredClientSettingsL();
+	test(result == KErrNone);
+	testUtils->TestFinish(testNo-1);
+
+	// Copy New Mail when already connected to server
+	testUtils->TestStart(testNo++);
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to Pop server                         \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+
+	
+	
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Copy New Mail when already connected to server   \n"));
+	CopyNewMailWhenAlreadyConnectedL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	iDoCancel = ETrue;
+	CActiveScheduler::Start();
+	iDoCancel = EFalse;
+
+		{
+	// wait 5 seconds so that user can see the final progess!
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(10000000);
+	CActiveScheduler::Start();  
+	delete timer;
+		}
+		
+		
+	testUtils->TestFinish(testNo-1);
+	
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	
+	testUtils->TestStart(testNo++);
+	/*Step1: Connect to the POP3 server*/
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0,7);
+	test.Printf(_L("Connecting to Pop server\n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+	
+	CleanupStack::PopAndDestroy();	//opActive
+	
+	/*Step2: Move new mails*/
+	opActive =  COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0,7);
+	test.Printf(_L("Move new mail when already connected to server  \n"));
+	MoveNewMailWhenAlreadyConnectedL();	
+	CActiveScheduler::Start();
+	
+	CleanupStack::PopAndDestroy();	//opActive
+	
+	/*Step 3: Disconnect from the server */
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0,7);
+	test.Printf(_L("Disconnecting from server\n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+	
+	testUtils->TestFinish(testNo-1);
+	//cleanup for next test
+	CleanupStack::PopAndDestroy(2);  //opActive, msvSelection
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	
+	testUtils->TestStart(testNo++);
+	// Copy All Mail when already connected to server
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to Pop server                        \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);  
+	test.Printf(_L("Copy All Mail when already connected to server   \n"));
+	CopyAllMailWhenAlreadyConnectedL();
+	CActiveScheduler::Start();
+	
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+  	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+
+	testUtils->TestStart(testNo++);
+	// Step 1: connect to server
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to Pop server                        \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+
+	//Step 2: Move All Mails 
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);  
+	test.Printf(_L("Move All Mail when already connected to server   \n"));
+	MoveAllMailWhenAlreadyConnectedL();
+	CActiveScheduler::Start();
+		
+	//Step 3: Disconnect the server	
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+		
+	testUtils->TestStart(testNo++);
+	// Copy Mail Selection when already connected to server
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to Pop server                        \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);			
+	test.Printf(_L("Copy Msg selection when already connected        \n"));
+	CopyMailSelectionWhenAlreadyConnectedL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+
+	testUtils->TestStart(testNo++);
+	//Step 1: connect to server
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to Pop server                        \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+
+	//Step 2: Move Selected mails when already connected
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);			
+	test.Printf(_L("Move Mail selection when already connected        \n"));
+	MoveMailSelectionWhenAlreadyConnectedL();
+	CActiveScheduler::Start();
+	
+	//Step 3:Disconnect the server
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+	
+	//clean up for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	
+	//
+	// 			Tests for Creating Replies and Forwards     				//
+	//
+	//Creating a Reply Email Message
+
+	testUtils->TestStart(testNo++);
+	// Connecting to server
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to server             \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+			
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);			
+	test.Printf(_L("Create Reply Email Message               \n"));
+	CreateReplyEmailMessage();
+	CActiveScheduler::Start();
+			
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+			
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	
+	//Creating a Forward Email Message
+
+	testUtils->TestStart(testNo++);
+	// Connecting to server
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to server             \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+			
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);			
+	test.Printf(_L("Create Reply Email Message               \n"));
+	CreateForwardEmailMessage();
+	CActiveScheduler::Start();
+			
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+			
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+
+	//Creating a Forward As Attachment Email Message
+
+	testUtils->TestStart(testNo++);
+	// Connecting to server
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to server             \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+				
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);			
+	test.Printf(_L("Create a Forward As Attachment Email Message               \n"));
+	CreateForwardAsAttachmentEmailMessage();
+	CActiveScheduler::Start();
+				
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+				
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	
+	//Create Receipt Email Message
+
+	testUtils->TestStart(testNo++);
+	// Connecting to server
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connecting to server             \n"));
+	ConnectToServerL();
+	CActiveScheduler::Start();
+					
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);			
+	test.Printf(_L("Create a Receipt Email Message               \n"));
+	CreateReceiptEmailMessage();
+	CActiveScheduler::Start();
+					
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+					
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	
+	testUtils->TestStart(testNo++);
+	// Connect, Copy New Mail and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	
+	test.Printf(_L("Connect, Copy New Mail, Disconnect               \n"));
+	ConnectAndCopyNewMailAndDisconnectL();
+	CActiveScheduler::Start();
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+
+	testUtils->TestStart(testNo++);
+	// Connect, Move New Mail and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+		
+	test.Printf(_L("Connect, Move New Mail, Disconnect               \n"));
+	ConnectAndMoveNewMailAndDisconnectL();
+	CActiveScheduler::Start();
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	
+	testUtils->TestStart(testNo++);
+	// Connect, Copy All Mail and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Copy All Mail, Disconnect               \n"));
+	ConnectAndCopyAllMailAndDisconnectL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	testUtils->TestStart(testNo++);
+
+	// Connect, Move All Mail and then disconnect
+		opActive = COperationActive::NewL();
+		CleanupStack::PushL(opActive);
+		console->SetPos(0, 7);
+		test.Printf(_L("Connect,Move All Mail, Disconnect               \n"));
+		ConnectAndMoveAllMailAndDisconnectL();
+		CActiveScheduler::Start();
+
+		testUtils->TestFinish(testNo-1);
+
+		// cleanup for next test
+		CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+		DeleteAndCreateServicesL();
+		testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+		msvSelection = new (ELeave) CMsvEntrySelection;
+		CleanupStack::PushL(msvSelection);
+		testUtils->TestStart(testNo++);
+
+	
+	// connect and then disconnect to update mailbox
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Disconnect                              \n"));
+	ConnectAndDisconnectL();
+	CleanupStack::PopAndDestroy(); // opActive
+
+	// Connect, Copy Mail Selection and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Copy Mail Selection, Disconnect         \n"));
+	ConnectAndCopyMailSelectionAndDisconnectL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	testUtils->TestStart(testNo++);
+	
+
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Move Mail Selection, Disconnect         \n"));
+	ConnectAndMoveMailSelectionAndDisconnectL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+
+	testUtils->TestStart(testNo++);
+	// Connect, Copy New Mail and Stay Online
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Copy New Mail, Stay Online              \n"));
+	ConnectAndCopyNewMailAndStayOnlineL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+
+	testUtils->TestStart(testNo++);
+	// Connect, Move New Mail and Stay Online
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Move New Mail, Stay Online              \n"));
+	ConnectAndMoveNewMailAndStayOnlineL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+	
+
+	
+	
+	testUtils->TestStart(testNo++);
+	// Connect, Copy All Mail and Stay Online
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Copy All Mail, Stay Online              \n"));
+	ConnectAndCopyAllMailAndStayOnlineL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	testUtils->TestStart(testNo++);
+	
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Move All Mail, Stay Online              \n"));
+	ConnectAndMoveAllMailAndStayOnlineL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+	
+	
+	testUtils->TestStart(testNo++);
+	// connect and then disconnect to update mailbox
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Disconnect                              \n"));
+	ConnectAndDisconnectL();
+	CleanupStack::PopAndDestroy(); // opActive
+
+	// Connect, Copy Mail Selection and Stay Online
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Copy Msg Selection, Stay Online         \n"));
+	ConnectAndCopyMailSelectionAndStayOnlineL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+	
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Move Msg Selection, Stay Online         \n"));
+	ConnectAndMoveMailSelectionAndStayOnlineL();
+	CActiveScheduler::Start();
+
+	CleanupStack::PopAndDestroy(); // opActive
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Disconnecting from the server                    \n"));
+	DisconnectFromServerL();
+	CActiveScheduler::Start();
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+		
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+	
+	
+//
+//	Test an empty message selection (does not cause a panic!)
+//
+
+	testUtils->TestStart(testNo++);
+	// Connect, Copy All Mail and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	test.Printf(_L("Connect, Copy Empty Message Selection, Disconnect\n"));
+	ConnectAndCopyMailSelectionAndDisconnectL(ETrue);
+	CActiveScheduler::Start();
+
+	// check that final progress showing the correct information
+	TPckgBuf<TPop3Progress> progress;
+	progress.Copy(opActive->iTimer->iOperation->FinalProgress());
+
+	console->SetPos(0, 11);
+	console->Printf(_L("Final Progress:                    "));
+	console->SetPos(0, 12);
+	TBuf<80> progressBuf = Progress(progress().iPop3Progress);
+	console->Printf(TRefByValue<const TDesC>_L("   Super Operation Progress: %S           "), &progressBuf);
+	console->SetPos(0, 13);
+	progressBuf = Progress(progress().iPop3SubStateProgress);
+	console->Printf(TRefByValue<const TDesC>_L("   Sub Operation Progress  : %S           "), &progressBuf);
+	console->SetPos(0, 14);
+	console->Printf(TRefByValue<const TDesC>_L("   Progress:  %d/%d %d/%d Total:%d               \n"),
+				progress().iTotalMsgs-progress().iMsgsToProcess,
+				progress().iTotalMsgs,
+				progress().iBytesDone,
+				progress().iTotalBytes,
+				progress().iTotalSize);
+	console->SetPos(0, 15);
+	console->Printf(TRefByValue<const TDesC>_L("   Error: %d                             \n"), progress().iErrorCode);
+
+	// wait 5 seconds so that user can see the final progess!
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(5000000);
+	CActiveScheduler::Start();
+	delete timer;
+
+	testUtils->TestFinish(testNo-1);
+
+//
+//	Do Cancel Operation Tests
+//
+
+	testUtils->WriteComment(_L("Doing Cancel Tests"));
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	testUtils->TestStart(testNo++);
+	// Connect, Copy New Mail and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 11);
+	console->Printf(_L("                                       "));
+	console->SetPos(0, 7);
+	opActive->SetCancelState(TPop3Progress::EPopConnecting);
+	test.Printf(_L("Connect, Copy New Mail, Disconnect               \n"));
+	ConnectAndCopyNewMailAndDisconnectL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	testUtils->TestStart(testNo++);
+	// Connect, Copy New Mail and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	opActive->SetCancelState(TPop3Progress::EPopRefreshing);
+	test.Printf(_L("Connect, Copy New Mail, Disconnect               \n"));
+	ConnectAndCopyNewMailAndDisconnectL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+
+	testUtils->TestStart(testNo++);
+	// Connect, Copy New Mail and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	opActive->SetCancelState(TPop3Progress::EPopCopying);
+	test.Printf(_L("Connect, Copy New Mail, Disconnect               \n"));
+	ConnectAndCopyNewMailAndDisconnectL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	DeleteAndCreateServicesL();
+	testUtils->iPopClientMtm->SwitchCurrentEntryL(Pop3Service);
+
+	msvSelection = new (ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(msvSelection);
+	
+	
+
+	testUtils->TestStart(testNo++);
+	// Connect, Copy New Mail and then disconnect
+	opActive = COperationActive::NewL();
+	CleanupStack::PushL(opActive);
+	console->SetPos(0, 7);
+	opActive->SetCancelState(TPop3Progress::EPopDisconnecting);
+	test.Printf(_L("Connect, Copy New Mail, Disconnect               \n"));
+	ConnectAndCopyNewMailAndDisconnectL();
+	CActiveScheduler::Start();
+
+	testUtils->TestFinish(testNo-1);
+
+	testUtils->TestStart(testNo++);
+	TestCapabilityL();
+	testUtils->TestFinish(testNo-1);
+	if (globalError)
+		testUtils->TestHarnessFailed(globalError);
+	else
+		testUtils->TestHarnessCompleted();
+	// cleanup for next test
+	CleanupStack::PopAndDestroy(2); //msvSelection, opActive, 
+	testUtils->Reset();
+	Closedown();
+	}
+
+GLDEF_C TInt E32Main()
+	{	
+	__UHEAP_MARK;
+	test.Start(_L("T_POPC Test CImPop3GetMail class"));
+	theCleanup=CTrapCleanup::New();
+	TRAPD(ret,doMainL());		
+	test(ret==KErrNone);
+	delete theCleanup;	
+	test.End();
+	test.Close();
+	__UHEAP_MARKEND;
+	User::Heap().Check();
+	return(KErrNone);
+	}