email/pop3andsmtpmtm/clientmtms/test/src/T_SMTC.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/clientmtms/test/src/T_SMTC.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,825 @@
+// 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_SMTC
+// Component: IMCM
+// Owner: KP
+// Brief description of test harness:
+// Query Capability of the SMTP client and sends plaintext email.
+// Detailed description of test harness:
+// As above.
+// Input files required to run test harness:
+// \MSG\IMCMTSRC\rfc82201.txt				<DRIVE>:\msgtest\IMCM\rfc82201.txt
+// Intermediate files produced while running test harness:
+// <DRIVE>:\msglogs\T_SMTC\T_IMCM.log
+// <DRIVE>:\msglogs\T_SMTC\Entry_Structure.txt
+// Output files produced by running test harness:
+// <DRIVE>:\msglogs\T_SMTC.<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_SMTC.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_SMTC.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_SMTC.exe on the other platform
+// 
+//
+
+#include "emailtestutils.h"
+#include <c32comm.h>
+#include <commdb.h>
+#include <mtmuids.h>
+#include <cemailaccounts.h>
+
+#include "TESTENV.h"
+#include <miutlog.h>
+#include "SMTCMTM.H" // CSmtpClientMtm
+#include "SMTPSET.H" // CImSmtpSettings
+#include <bacline.h>
+
+#include <mmsvattachmentmanager.h>
+
+_LIT(KAttachment1, "C:\\mailtest\\IMCM\\plain_text.txt");	
+_LIT8(KMimeType, "text/plain");
+
+// 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 //
+
+LOCAL_D RTest test(_L("SMTP.dll Testrig"));
+
+_LIT(KTestParams,"-testparams");
+enum TCmdLineArgs
+	{
+	EArgProgramName,
+	EArgTestParams,
+	EArgServerAddress,
+	EArgEmail,
+	EArgEnd
+	};
+
+LOCAL_D CTrapCleanup* theCleanup;
+
+LOCAL_D CEmailTestUtils* testUtils;
+LOCAL_D CImLog* log;
+LOCAL_D CMsvOperation* msvOperation;
+
+LOCAL_D TMsvId smtpService;
+LOCAL_D TInt testNo = 1;
+
+LOCAL_D TMsvId CreateMessageL();
+
+#define KMsgSmtpRefreshMailboxPriority 1
+#define KPeriod 10000	// period of timer
+
+_LIT(KTestSettingsEmailAddress,"testuser@user");
+const TInt KTestSettingsPort = 111;
+
+//
+
+class TestUiTimer : public CTimer
+	{
+public:
+	static TestUiTimer* NewLC(CConsoleBase* aConsole, CImEmailOperation* aEmailOperation);
+
+	void RunL();
+	void DoCancel();
+	void ConstructL();
+	void IssueRequest();
+	TPtrC Progress(TInt progressNumber);
+	
+	CConsoleBase*				iConsole;
+	CImEmailOperation*			iEmailOperation;
+	TTimeIntervalMicroSeconds32 period;
+protected:
+	TInt iCount;
+	TBool iClosing;
+	TestUiTimer(CConsoleBase* aConsole, CImEmailOperation* aEmailOperation);
+	};
+
+//
+// Progress timer
+//	  
+TestUiTimer* TestUiTimer::NewLC(CConsoleBase* aConsole, CImEmailOperation* aEmailOperation)
+	{
+	TestUiTimer* self = new(ELeave) TestUiTimer(aConsole, aEmailOperation);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+TestUiTimer::TestUiTimer(CConsoleBase* aConsole, CImEmailOperation* aEmailOperation)
+	: CTimer(EPriorityStandard+3), iEmailOperation(aEmailOperation)
+	{
+	iConsole = aConsole;
+	period = KPeriod;
+	iClosing = EFalse;
+	iCount = 0;
+	}
+
+void TestUiTimer::ConstructL()
+	{
+	CTimer::ConstructL();
+	CActiveScheduler::Add(this);
+	}
+
+void TestUiTimer::IssueRequest()
+	{
+	After(period);
+	}
+
+void TestUiTimer::DoCancel()
+	{
+	CTimer::DoCancel();
+	}
+
+TPtrC TestUiTimer::Progress(TInt progressNumber)
+	{
+	switch (progressNumber)
+		{
+		case EConnectingToSmtp:
+			return _L("Connecting              ");
+		case 1:
+			return _L("Waiting for reply       ");
+		case 2:
+			return _L("Authorising Smtp        ");
+		case 3:
+			return _L("Sending StartTls        ");
+		case 4:
+			return _L("Setting Security        ");
+		case 5:
+			return _L("Sending Email           ");
+		case 6:
+			return _L("Log Data Event          ");
+		case 7:
+			return _L("Closing Smtp            ");
+		default:
+			return _L("Unknown Progress        ");
+		}
+	}
+
+void TestUiTimer::RunL()
+	{
+	// display the current progress
+	if(iEmailOperation!=NULL)
+		{
+		TImSmtpProgress temp;	
+		TPckgC<TImSmtpProgress> paramPack(temp);
+		paramPack.Set(iEmailOperation->ProgressL());
+		TImSmtpProgress progress=paramPack();	
+
+		iConsole->SetPos(0, 12);
+		TBuf<80> progressBuf = Progress(progress.iSendFileProgress.iSessionState);
+		iConsole->Printf(TRefByValue<const TDesC>_L("   Operation Progress      : %S           "), &progressBuf);
+		iConsole->SetPos(0, 13);
+		iConsole->Printf(TRefByValue<const TDesC>_L("   Progress:  %d/%d %d/%d                \n"),
+					progress.MsgNo() + 1,
+					progress.SendTotal(),
+					progress.iSendFileProgress.iBytesSent,
+					progress.iSendFileProgress.iBytesSent + progress.iSendFileProgress.iBytesToSend);
+		iConsole->SetPos(0, 15);
+		iConsole->Printf(TRefByValue<const TDesC>_L("   Error: %d                             \n"), progress.Error());
+		}
+	IssueRequest();
+	};
+
+class CSmtpTimer : public CTimer
+	{
+public:
+	static CSmtpTimer* NewL(CTestActive& aActive);
+	void StartL();
+private:
+	CSmtpTimer(CTestActive& aActive);
+	void RunL();	
+	CTestActive& iSmtpActive;
+	};
+
+CSmtpTimer::CSmtpTimer(CTestActive& aActive)
+: CTimer(EPriorityLow),	iSmtpActive(aActive)
+	{}
+
+
+CSmtpTimer* CSmtpTimer::NewL(CTestActive& aActive)
+	{
+	CSmtpTimer* self = new(ELeave) CSmtpTimer(aActive);
+	CleanupStack::PushL(self);
+	CActiveScheduler::Add(self);
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CSmtpTimer::StartL()
+	{
+	CTimer::ConstructL();
+	TRequestStatus* status=&iStatus;
+	User::RequestComplete(status,KErrNone);
+	SetActive();
+	}
+
+void CSmtpTimer::RunL()
+	{
+	test.Console()->SetPos(0, 10);
+
+	if (!iSmtpActive.IsActive())   //this is how you check if the MTM is finished or not!
+		{
+		iSmtpActive.Cancel();
+		CActiveScheduler::Stop();
+		return;
+		}
+	else
+		After(400);
+	}
+
+LOCAL_C void TestStoreSettingsL()
+//
+// Dummy settings for checking that StoreSettingsL work for the client mtm
+//	
+	{
+    CImSmtpSettings *smtpSettings = new(ELeave)CImSmtpSettings;
+	CleanupStack::PushL(smtpSettings);
+	
+	CEmailAccounts* accounts = CEmailAccounts::NewLC();
+	TSmtpAccount smtpAccountId;
+	accounts->GetSmtpAccountL(smtpService, smtpAccountId);
+	accounts->LoadSmtpSettingsL(smtpAccountId, *smtpSettings);
+	CleanupStack::PopAndDestroy(accounts);
+    smtpSettings->SetEmailAddressL(KTestSettingsEmailAddress);
+	smtpSettings->SetPort(KTestSettingsPort);
+	testUtils->iSmtpClientMtm->SetSettingsL(*smtpSettings);
+	TRAPD(err,testUtils->iSmtpClientMtm->StoreSettingsL());
+	CleanupStack::PopAndDestroy(smtpSettings);
+   	test(err==KErrNone);
+   	
+   	//To Improve Coverage.
+  	TMsvPartList partList = KMsvMessagePartBody;
+   	testUtils->iSmtpClientMtm->ValidateMessage(partList);
+   	void AddAddresseeL(const TDesC& aRealAddress, const TDesC& aAlias);
+   	TBufC<1> tt;
+   	TRAP_IGNORE(testUtils->iSmtpClientMtm->AddAddresseeL(tt,tt));
+   	TInt ii = 0;
+   	testUtils->iSmtpClientMtm->RemoveAddressee(ii);
+   
+   	TRAP_IGNORE(testUtils->iSmtpClientMtm->RemoveDefaultServiceL());
+	}
+
+LOCAL_C int VerifyStoredSettingsL()
+//
+// Comparison of the settings stored to see that the client commits after storing
+//
+	{
+	TRAPD(err,testUtils->iSmtpClientMtm->RestoreSettingsL());
+	test(err==KErrNone);
+    CImSmtpSettings *smtpSettings = new(ELeave)CImSmtpSettings;
+	CleanupStack::PushL(smtpSettings);
+    smtpSettings->CopyL(testUtils->iSmtpClientMtm->Settings());
+    
+    TInt result=0;
+	result += smtpSettings->EmailAddress().Compare(KTestSettingsEmailAddress);
+	result += smtpSettings->Port() - KTestSettingsPort;
+
+ 	testUtils->iSmtpClientMtm->SetSettingsL(*smtpSettings);
+	TRAP(err,testUtils->iSmtpClientMtm->StoreSettingsL());
+   	test(err==KErrNone);
+
+	CleanupStack::PopAndDestroy(smtpSettings);
+    return result;
+	}
+
+LOCAL_C void TestSendingMessagesL()
+	{
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+
+	testUtils->iMsvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);
+	CMsvEntrySelection* sendSel = testUtils->iMsvEntry->ChildrenL();
+	CleanupStack::PushL(sendSel);
+	TInt count=sendSel->Count();
+	if (!count)
+		{
+		log->AppendComment(_L8("\t No messages to send in the outbox"));
+		CleanupStack::PopAndDestroy(2); //testActive, sendsel
+		return;
+		}
+	log->AppendError(_L8("\t messages to send in the outbox -"), count);
+	testUtils->iSmtpClientMtm->SetCurrentEntryL(testUtils->iMsvSession->GetEntryL(KMsvGlobalOutBoxIndexEntryId));
+	msvOperation = testUtils->iSmtpClientMtm->Entry().CopyL(*sendSel, smtpService, testActive->iStatus);
+	CleanupStack::PushL(msvOperation);
+	CSmtpTimer* timer = CSmtpTimer::NewL(*testActive);
+	CleanupStack::PushL(timer);
+
+	testActive->StartL();
+	timer->StartL();
+	CActiveScheduler::Start();
+	//check progress
+	log->AppendError(_L8("\t CopyL completed with "), testActive->iStatus.Int());
+ 	TImSmtpProgress temp;	
+	TPckgC<TImSmtpProgress> paramPack(temp);
+
+	const TDesC8& progBuf = msvOperation->ProgressL();
+	paramPack.Set(progBuf);
+	TImSmtpProgress progress=paramPack();	
+	log->AppendError(_L8("\t Progress error ="), progress.Error());
+	CleanupStack::PopAndDestroy(4); //testActive, sendsel, timer, msvOperation
+	}
+
+LOCAL_C void TestForwardMessageL()
+	{
+	TMsvId messageId = CreateMessageL();
+
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+	
+	TMsvPartList partList = KMsvMessagePartBody | KMsvMessagePartAttachments | KMsvMessagePartDescription | KMsvMessagePartOriginator;
+	testUtils->iSmtpClientMtm->SetCurrentEntryL(testUtils->iMsvSession->GetEntryL(messageId));
+	testUtils->iSmtpClientMtm->LoadMessageL();
+	msvOperation = testUtils->iSmtpClientMtm->ForwardL(KMsvDraftEntryId, partList, testActive->iStatus);
+	CleanupStack::PushL(msvOperation);
+	CSmtpTimer* timer = CSmtpTimer::NewL(*testActive);
+	CleanupStack::PushL(timer);
+
+	testActive->StartL();
+	timer->StartL();
+	CActiveScheduler::Start();
+	//check progress
+	log->AppendError(_L8("\t ForwardL completed with "), testActive->iStatus.Int());
+	TImSmtpProgress temp;    
+	TPckgC<TImSmtpProgress> paramPack(temp);
+
+	const TDesC8& progBuf = msvOperation->ProgressL();
+	paramPack.Set(progBuf);
+	TImSmtpProgress progress=paramPack();    
+	log->AppendError(_L8("\t Progress error ="), progress.Error());
+
+	CleanupStack::PopAndDestroy(timer);
+	CleanupStack::PopAndDestroy(msvOperation);
+	CleanupStack::PopAndDestroy(testActive);
+	}
+
+LOCAL_C void TestReplyMessageL()
+	{
+	TMsvId messageId = CreateMessageL();
+
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+
+	TMsvPartList partList = KMsvMessagePartBody | KMsvMessagePartAttachments | KMsvMessagePartDescription | KMsvMessagePartOriginator;
+	testUtils->iSmtpClientMtm->SetCurrentEntryL(testUtils->iMsvSession->GetEntryL(messageId));
+	testUtils->iSmtpClientMtm->LoadMessageL();
+	msvOperation = testUtils->iSmtpClientMtm->ReplyL(KMsvDraftEntryId, partList, testActive->iStatus);
+	CleanupStack::PushL(msvOperation);
+	CSmtpTimer* timer = CSmtpTimer::NewL(*testActive);
+	CleanupStack::PushL(timer);
+
+	testActive->StartL();
+	timer->StartL();
+	CActiveScheduler::Start();
+	//check progress
+	log->AppendError(_L8("\t ReplyL completed with "), testActive->iStatus.Int());
+	TImSmtpProgress temp;    
+	TPckgC<TImSmtpProgress> paramPack(temp);
+
+	const TDesC8& progBuf = msvOperation->ProgressL();
+	paramPack.Set(progBuf);
+	TImSmtpProgress progress=paramPack();    
+	log->AppendError(_L8("\t Progress error ="), progress.Error());
+
+	CleanupStack::PopAndDestroy(timer);
+	CleanupStack::PopAndDestroy(msvOperation);
+	CleanupStack::PopAndDestroy(testActive);
+	}
+
+// Menu Selection,Main and Init Functions //
+
+LOCAL_C void TestCapabilityL()
+	{
+	TInt response = 0;
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQuerySupportedBody, response) == KErrNone);
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQuerySupportAttachments, response) == KErrNone);
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQuerySupportSubject, response) == KErrNone);
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQuerySupportsFolder, response) == KErrNotSupported);
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQueryOffLineAllowed, response) == KErrNotSupported);
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQueryCanSendMsg, response) == KErrNone);
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQueryCanReceiveMsg, response) == KErrNotSupported);
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQuerySendAsRequiresRenderedImage, response) == KErrNotSupported);
+	test(testUtils->iSmtpClientMtm->QueryCapability(KUidMtmQueryMaxRecipientCount, response) == KErrNotSupported);
+	}
+
+LOCAL_C void InitL()
+	{
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+	CActiveScheduler::Install(scheduler);
+	CleanupStack::PushL(scheduler);
+
+	testUtils = CEmailTestUtils::NewLC(test);
+	testUtils->FileSession().SetSessionPath(_L("C:\\"));
+	testUtils->CleanMessageFolderL();
+	testUtils->ClearEmailAccountsL();
+	testUtils->CreateAllTestDirectories();
+	testUtils->GoClientSideL();
+
+	smtpService = testUtils->CreateSmtpServiceL();
+	testUtils->CreatePopServiceL();
+	
+	log = CImLog::NewL(_L("c:\\logs\\email\\T_IMCM.log"), EAppend);
+	CleanupStack::PushL(log);
+	log->AppendComment(_L8("********** T_SMTC Test SMTP Client MTM **********"));
+	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_SMTC Tests Complete    **********"));
+	log->AppendComment(_L8(""));
+
+	CleanupStack::PopAndDestroy(3);  //testUtils, log, scheduler
+	}
+
+LOCAL_C TMsvId CreateMessageL()
+	{
+	// 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->TestStart(testNo++);
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+
+	TMsvPartList partList = KMsvMessagePartBody | KMsvMessagePartAttachments | KMsvMessagePartDescription | KMsvMessagePartOriginator;
+	TMsvEmailTypeList msvEmailTypeList = 0;
+	CImEmailOperation* emailOperation = CImEmailOperation::CreateNewL(testActive->iStatus, *(testUtils->iMsvSession), KMsvGlobalOutBoxIndexEntryId, partList, msvEmailTypeList, KUidMsgTypeSMTP);
+	CleanupStack::PushL(emailOperation);
+
+	TestUiTimer* testUiTimer = TestUiTimer::NewLC(test.Console(), emailOperation);
+	testActive->StartL();
+	testUiTimer->IssueRequest();
+	CActiveScheduler::Start();
+
+	TMsvId temp;	
+	TPckgC<TMsvId> paramPack(temp);
+	const TDesC8& progBuf = emailOperation->ProgressL();
+	paramPack.Set(progBuf);
+	TMsvId messageId=paramPack();
+	TInt error = emailOperation->iStatus.Int();
+
+	CleanupStack::PopAndDestroy(3, testActive); // testActive, emailOperation, testUiTimer
+	testUtils->TestFinish(testNo-1, error);
+	log->AppendComment(_L8(" Messages created in the outbox"));
+
+	// fill in details for email message
+	testUtils->iMsvEntry->SetEntryL(messageId);
+	CMsvStore* store = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(store);
+	CImHeader* header = CImHeader::NewLC();
+	header->RestoreL(*store);
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TLex lex(cmdLineArg->Arg(EArgEmail));
+		buf=lex.NextToken();
+		header->ToRecipients().AppendL(buf);
+		}
+	else
+		header->ToRecipients().AppendL(_L("t_smtc@lon-msgtest06.intra"));
+
+	header->SetSubjectL(_L("Message from T_SMTC Typhoon!!"));
+	header->StoreL(*store);
+	store->CommitL();
+ 	CleanupStack::PopAndDestroy(3, cmdLineArg); // cmdLineArg, header, store
+
+	//store some body text!!
+	CParaFormatLayer* paraFormatLayer=CParaFormatLayer::NewL();
+	CleanupStack::PushL(paraFormatLayer);
+
+	CCharFormatLayer* charFormatLayer=CCharFormatLayer::NewL(); 
+	CleanupStack::PushL(charFormatLayer);
+
+	CRichText* bodyText=CRichText::NewL(paraFormatLayer, charFormatLayer, CEditableText::EFlatStorage, 256);
+	CleanupStack::PushL(bodyText);
+
+	TBuf<100> bodyContents = _L("Test body contents so that we can test the store body text code.");
+	bodyText->InsertL(0, bodyContents);
+
+	// store the body text
+	testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+
+	CImEmailMessage* imEmailMessage = CImEmailMessage::NewLC(*(testUtils->iMsvEntry));
+	imEmailMessage->StoreBodyTextL(messageId, *bodyText, testActive->iStatus);
+	testActive->StartL();
+	CActiveScheduler::Start();	// wait for the asynch operation to complete
+	CleanupStack::PopAndDestroy(5, paraFormatLayer); // imEmailMessage, testActive, bodyText, charFormatLayer, paraFormatLayer
+
+	// Add an attachment
+	testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+
+	imEmailMessage = CImEmailMessage::NewLC(*(testUtils->iMsvEntry));
+	CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile);
+	CleanupStack::PushL(attachmentInfo);
+	imEmailMessage->AttachmentManager().AddAttachmentL(KAttachment1,attachmentInfo,testActive->iStatus);
+	CleanupStack::Pop(attachmentInfo);
+	testActive->StartL();
+	CActiveScheduler::Start();	// wait for the asynch operation to complete
+	CleanupStack::PopAndDestroy(2, testActive);
+
+	return messageId;
+	}
+
+LOCAL_C void OverwriteSmtpSettingsL(TBool aRequestReceipt)
+	{
+	// 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->iMsvEntry->SetEntryL(smtpService);
+	//overwrite the setings with test code one.  Don't want the default settings.
+
+	CImSmtpSettings* settings = new(ELeave) CImSmtpSettings();
+	CleanupStack::PushL(settings);
+
+	CEmailAccounts* accounts = CEmailAccounts::NewLC();
+
+	TSmtpAccount smtpAccountId;
+	accounts->GetSmtpAccountL(smtpService, smtpAccountId);
+	accounts->LoadSmtpSettingsL(smtpAccountId, *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
+		{
+		_LIT(KSmtpServer, "lon-msgtest06.intra");
+		settings->SetServerAddressL(KSmtpServer);
+		}
+
+	if (isCmdLine)
+		{
+		TBuf<100> buf;
+		TLex lex(cmdLineArg->Arg(EArgEmail));
+		buf=lex.NextToken();
+		test.Printf(_L("Email: %S\n"),&buf);
+		settings->SetEmailAddressL(buf);
+		settings->SetReplyToAddressL(buf);
+		settings->SetReceiptAddressL(buf);
+		}
+	else
+		{
+		_LIT(KSmtpEmailAddress, "<t_smtc@lon-msgtest06.intra>");
+		settings->SetEmailAddressL(KSmtpEmailAddress);
+		settings->SetReplyToAddressL(KSmtpEmailAddress);
+		settings->SetReceiptAddressL(KSmtpEmailAddress);
+		}
+	settings->SetEmailAliasL(_L("SMTP Test1"));
+	settings->SetBodyEncoding(EMsgOutboxMIME);
+	settings->SetRequestReceipts(aRequestReceipt);
+	settings->SetPort(25);
+	accounts->SaveSmtpSettingsL(smtpAccountId, *settings);
+	CleanupStack::PopAndDestroy(2); // store/accounts, settings
+	CleanupStack::PopAndDestroy();	// cmdLineArg
+
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(5000000);
+	CActiveScheduler::Start();
+	delete timer;
+	}
+
+LOCAL_C void CreateNewEmailMessageL()
+	{	
+	testUtils->WriteComment(_L("CreateNewEmailMessageL"));
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+
+	TMsvPartList partList = KMsvMessagePartBody | KMsvMessagePartAttachments | KMsvMessagePartDescription | KMsvMessagePartOriginator;
+	TMsvEmailTypeList msvEmailTypeList = 0;
+	CImEmailOperation* emailOperation = CImEmailOperation::CreateNewL(testActive->iStatus, *(testUtils->iMsvSession), KMsvGlobalOutBoxIndexEntryId, partList, msvEmailTypeList, KUidMsgTypeSMTP);
+	CleanupStack::PushL(emailOperation);
+
+	TestUiTimer* testUiTimer = TestUiTimer::NewLC(test.Console(), emailOperation);
+	testActive->StartL();
+	testUiTimer->IssueRequest();
+	CActiveScheduler::Start();
+
+	TMsvId temp;	
+	TPckgC<TMsvId> paramPack(temp);
+	const TDesC8& progBuf = emailOperation->ProgressL();
+	paramPack.Set(progBuf);
+	TMsvId messageId=paramPack();
+	TInt error = emailOperation->iStatus.Int();
+
+	CleanupStack::PopAndDestroy(3, testActive); // testActive, emailOperation, testUiTimer
+
+	// fill in details for email message
+	testUtils->iMsvEntry->SetEntryL(messageId);
+	CMsvStore* store = testUtils->iMsvEntry->EditStoreL();
+	CleanupStack::PushL(store);
+	CImHeader* header = CImHeader::NewLC();
+	header->RestoreL(*store);
+	header->SetSubjectL(_L("Message from T_SMTC Typhoon!!"));
+	header->StoreL(*store);
+	store->CommitL();
+ 	CleanupStack::PopAndDestroy(2, store); // header, store
+
+	//store some body text!!
+	CParaFormatLayer* paraFormatLayer=CParaFormatLayer::NewL();
+	CleanupStack::PushL(paraFormatLayer);
+
+	CCharFormatLayer* charFormatLayer=CCharFormatLayer::NewL(); 
+	CleanupStack::PushL(charFormatLayer);
+
+	CRichText* bodyText=CRichText::NewL(paraFormatLayer, charFormatLayer, CEditableText::EFlatStorage, 256);
+	CleanupStack::PushL(bodyText);
+
+	TBuf<100> bodyContents = _L("Test body contents so that we can test the store body text code.");
+	bodyText->InsertL(0, bodyContents);
+
+	// store the body text
+	testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+
+	CImEmailMessage* imEmailMessage = CImEmailMessage::NewLC(*(testUtils->iMsvEntry));
+	imEmailMessage->StoreBodyTextL(messageId, *bodyText, testActive->iStatus);
+	testActive->StartL();
+	CActiveScheduler::Start();	// wait for the asynch operation to complete
+	CleanupStack::PopAndDestroy(5, paraFormatLayer); // imEmailMessage, testActive, bodyText, charFormatLayer, paraFormatLayer	}
+	}
+	
+LOCAL_C void TestCancelAttachmentOperationL()
+	{
+	CreateNewEmailMessageL();
+	testUtils->WriteComment(_L("TestCancelAttachmentOperationL"));
+	
+	// Add an attachment
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+	
+	TRAPD(error, testUtils->iSmtpClientMtm->AddAttachmentL(KAttachment1(), KMimeType(), 0, testActive->iStatus));
+
+	testUtils->WriteComment(_L("Cancel the Attachment Operation"));
+	testUtils->iSmtpClientMtm->CancelAttachmentOperation();
+	testUtils->WriteComment(_L("Attachment Operation cancelled"));
+
+	testActive->StartL();
+	CActiveScheduler::Start();// wait for the asynch operation to complete
+	test(testActive->iStatus.Int() == KErrCancel);
+	CleanupStack::PopAndDestroy(testActive);
+	}
+	
+	
+LOCAL_C void doMainL()
+	{
+	InitL();
+
+	// 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);
+
+
+	test.Printf(_L("\nPerforming Tests\n"));
+	testUtils->iMsvEntry->SetEntryL(smtpService);
+//	testUtils->DeleteScriptFilesFromLogsDirL();
+	
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(5000000);
+	CActiveScheduler::Start();
+	delete timer;
+
+	// store service as default service
+	CEmailAccounts* accounts = CEmailAccounts::NewLC();
+	TSmtpAccount smtpAccountId;
+	accounts->GetSmtpAccountL(smtpService, smtpAccountId);
+	accounts->SetDefaultSmtpAccountL(smtpAccountId);
+	CleanupStack::PopAndDestroy(accounts);
+
+	OverwriteSmtpSettingsL(EFalse);
+	CreateMessageL();
+
+	// Create a message that will request a receipt
+	OverwriteSmtpSettingsL(ETrue);
+	CreateMessageL();
+
+	testUtils->InstantiateSmtpClientMtmL();
+
+	timer = CTestTimer::NewL();
+	timer->After(5000000);
+	CActiveScheduler::Start();
+	delete timer;
+
+	// testing the CSmtpClientMtm::StoreSettingsL() method making sure it commits its settings
+	testUtils->TestStart(testNo++);
+	TestStoreSettingsL();
+	TInt result = VerifyStoredSettingsL();
+	test(result == KErrNone);
+	testUtils->TestFinish(testNo-1);
+	OverwriteSmtpSettingsL(ETrue);
+
+	testUtils->TestStart(testNo++);
+	TestSendingMessagesL();
+	testUtils->TestFinish(testNo-1);
+
+	testUtils->TestStart(testNo++);
+	TestForwardMessageL();
+	testUtils->TestFinish(testNo-1);
+
+	testUtils->TestStart(testNo++);
+	TestReplyMessageL();
+	testUtils->TestFinish(testNo-1);
+
+	testUtils->TestStart(testNo++);
+	TestCapabilityL();
+	testUtils->TestFinish(testNo-1);
+
+	testUtils->TestStart(testNo++);
+	TestCancelAttachmentOperationL();
+	testUtils->TestFinish(testNo-1);
+
+	testUtils->TestHarnessCompleted();
+	Closedown();
+	}
+
+
+GLDEF_C TInt E32Main()
+	{	
+	__UHEAP_MARK;
+	test.Start(_L("T_SMTC - Test Harness"));
+	theCleanup=CTrapCleanup::New();
+	TRAPD(ret,doMainL());		
+	test(ret==KErrNone);
+	delete theCleanup;	
+	test.Console()->SetPos(0, 13);
+	test.End();
+	test.Close();
+	__UHEAP_MARKEND;
+	return(KErrNone);
+	}