email/pop3andsmtpmtm/servermtmutils/test/src/T_MSGConnTest.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/servermtmutils/test/src/T_MSGConnTest.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1217 @@
+// Copyright (c) 2002-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 the test harness : T_MSGCONNTEST
+// Component: IMUT
+// Owner: 
+// Brief description of test harness:
+// Tests the changes IMUT for multihoming which allows more than one connection 
+// Detailed description of test harness:
+// Implements a range of tests for IMUT testing the following
+// funtionality:
+// -Single default connection
+// -Single specified connection
+// -Two Default connections serially (both the connections being default) 
+// -Two Default connections parallelly
+// -Two Different connections serially(one Default and the other Specified)
+// -Two Different connections parallelly
+// -Two Connection , one default connection and another explicit connection
+// to the default IAP.	
+// Input files required to run test harness:
+// Intermediate files produced while running test harness:	
+// Output files produced by running test harness:
+// \msglogs\T_MSGCONNTEST.WINS.DEB
+// Description of how to build test harness:
+// -Get the 3GComms code from the directory ---TYPHOON CODE-----  and build it
+// -Get the messagiing code from //EPOC/development/messaging/3gcomm/msg/ (Perforce database)
+// and build it.
+// Description of how to run test harness:
+// -Navigate to the directory \epoc32\release\wins\udeb from the command prompt
+// -Run T_MsgConnTest.exe from this directory.
+// -To view the test results check the file \epoc32\wins\c\MsgLogs\T_MSGCONNTEST.WINS.DEB
+// 
+//
+
+#include <nd_err.h>
+#include <imsk.h>
+#include <iapprefs.h>
+#include "t_ConnUtils.h"
+#include "emailtestutils.h"
+
+#define EActivePriorityLow		-1
+
+#define ETestSingleDefaultConn '1'
+#define ETestSingleSpecifiedConn '2'
+#define ETestTwoDefaultSerialConns '3'
+#define ETestTwoDefaultParallelConns '4'
+#define ETestTwoDifferentSerialConns '5'
+#define ETestTwoDifferentParallelConns '6'
+#define ETestExplicitDefaultConn '7'
+#define ETestAllCases 'a'
+
+const TInt KMaxSizeOfBinaryData = 200;
+
+LOCAL_D RTest g_Test(_L("T_MSG_CONN CImTextServerSession Test"));
+LOCAL_D CTrapCleanup* theCleanup;
+LOCAL_D CEmailTestUtils* gTestUtils; 
+LOCAL_D TBuf8<KMaxSizeOfBinaryData> someBinaryData=_L8("");
+
+LOCAL_D TBuf<30> KPipexServer =_L("pop.dial.pipex.com");
+LOCAL_D TBuf8<30> KPipexUser= _L8("USER abf75\r\n");
+LOCAL_D TBuf8<30> KPipexPass= _L8("PASS oodifama\r\n");
+LOCAL_D TInt KPopPort=110;
+// Can use either the demon server or the fastmail.fm account
+LOCAL_D TBuf<16> KDemonServer = _L("194.217.242.59");//_L("209.61.183.86");//
+LOCAL_D TBuf8<30> KDemonUser = _L8("USER psion8\r\n");//_L8("USER catherine2k\r\n");//
+LOCAL_D TBuf8<30> KDemonPass = _L8("PASS Bag8Nut\r\n");//_L8("PASS junkjunk\r\n");//
+
+LOCAL_D TInt g_NoOfConnections;
+LOCAL_D TInt g_Count;
+
+//=======================================//
+
+#if defined (__WINS__)
+#define PDD_NAME	_L("ECDRV")
+#define LDD_NAME	_L("ECOMM")
+#define LDD_FNAME	_L("ECOMM")
+#else
+#define PDD_NAME	_L("EUART1")
+#define PDD2_NAME	 _L("EUART2")
+#define LDD_NAME	_L("ECOMM")
+#define LDD_FNAME	_L("FCOMM")
+#endif
+
+TInt CTestHarnessUtil::CommInit()
+	{
+	TInt err=User::LoadPhysicalDevice(PDD_NAME);
+	if (err!=KErrNone && err!=KErrAlreadyExists)
+		return err;
+
+	err=User::LoadLogicalDevice(LDD_NAME);
+	if (err!=KErrNone && err!=KErrAlreadyExists)
+		return err;
+
+	return KErrNone;
+	}
+
+// Installs the scheduler
+void CTestHarnessUtil::InitSchedulerL()
+	{
+	iScheduler = new (ELeave) CActiveScheduler();
+	CActiveScheduler::Install( iScheduler );
+	}
+
+CTestHarnessUtil* CTestHarnessUtil::NewL()
+	{
+	CTestHarnessUtil* me = new (ELeave) CTestHarnessUtil();
+	CleanupStack::PushL(me);
+	me->ConstructL();
+	CleanupStack::Pop(me);
+	return me;
+	}
+
+void CTestHarnessUtil::ConstructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	iFs.SetSessionPath(_L("C:\\"));
+	iFs.SetSessionPath(_L("c:\\"));
+	iFs.MkDir(_L("c:\\logs\\"));
+	iFs.MkDir(_L("c:\\logs\\email\\"));
+
+	InitSchedulerL();
+	CommInit();
+	}
+
+CTestHarnessUtil::CTestHarnessUtil()
+	{
+	}
+
+CTestHarnessUtil::~CTestHarnessUtil()
+	{
+	delete iScheduler;
+	iFs.Close();
+	}
+
+
+//=====================================//
+//CTestHarnessParent
+
+CTestHarnessParent::CTestHarnessParent() // construct high-priority active object
+	: CActive(EPriorityHigh)
+	{
+	}
+
+CTestHarnessParent  *CTestHarnessParent::NewLC()
+	{
+	CTestHarnessParent* self=new (ELeave) CTestHarnessParent();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+CTestHarnessParent  *CTestHarnessParent::NewL()
+	{
+	CTestHarnessParent* self=NewLC();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CTestHarnessParent::ConstructL()
+	{
+	iState=EConnect;
+	iPopCmdServiceA=NULL;
+	iPopCmdServiceB=NULL;
+
+	CActiveScheduler::Add(this); // add to active scheduler
+	}
+
+CTestHarnessParent::~CTestHarnessParent()
+	{ 
+	Cancel(); // make sure we're cancelled
+	if(iPopCmdServiceA!=NULL)
+		{
+		delete iPopCmdServiceA;
+		iPopCmdServiceA=NULL;
+		}
+
+	if(iPopCmdServiceB!=NULL)
+		{
+		delete iPopCmdServiceB;
+		iPopCmdServiceB=NULL;
+		}	
+	}
+
+void CTestHarnessParent::TestSingleDefaultConnL()
+	{
+	gTestUtils->WriteComment(_L("Test Single Default Connection Started"));
+	iPopCmdServiceA=MakeBasicConnectionLC(KPipexServer, 
+												KPipexUser, 
+												KPipexPass);
+	iPopCmdServiceA->ConnectionL();
+	iState = ESend;
+	iStatus = KRequestPending;
+	SetActive();
+	CActiveScheduler::Start();
+
+	gTestUtils->WriteComment(_L("End of Single Default Connection"));
+	gTestUtils->WriteComment(_L("\r\n"));
+	}	
+
+void CTestHarnessParent::TestSingleSpecifiedConnL()
+	{
+	gTestUtils->WriteComment(_L("Test Single Specified Connection Started"));
+	iPopCmdServiceA=MakeOverrideConnectionLC(KDemonServer, 
+												KDemonUser, 
+												KDemonPass);
+	
+	iPopCmdServiceA->ConnectionL();
+	iState = ESend;
+	iStatus = KRequestPending;
+	SetActive();
+	CActiveScheduler::Start();
+
+	gTestUtils->WriteComment(_L("End of Single Specified Connection"));
+	gTestUtils->WriteComment(_L("\r\n"));
+	}	
+
+void CTestHarnessParent::TestTwoDefaultConnectionsSeriallyL()
+	{
+	gTestUtils->WriteComment(_L("Test Two Default Serial Connections Started"));
+
+	iPopCmdServiceA=MakeBasicConnectionLC(KPipexServer, 
+												KPipexUser, 
+												KPipexPass);
+
+	iPopCmdServiceB=MakeBasicConnectionLC(KDemonServer, 
+												KDemonUser, 
+												KDemonPass);
+	iPopCmdServiceA->ConnectionL();
+	iState = ESend;
+	iStatus = KRequestPending;
+	SetActive();
+	CActiveScheduler::Start();
+	
+	gTestUtils->WriteComment(_L("End of Test Two Default Serial Connections "));
+	gTestUtils->WriteComment(_L("\r\n"));
+	}
+
+void  CTestHarnessParent::TestTwoDefaultConnectionsParallellyL()
+	{
+	gTestUtils->WriteComment(_L("Test Two Default Parallel Connections Started"));
+	gTestUtils->WriteComment(_L("\nFirst Connection Start"));
+	iPopCmdServiceA=MakeBasicConnectionLC(KPipexServer, 
+												KPipexUser, 
+												KPipexPass);
+	iPopCmdServiceA->ConnectionL();
+
+	gTestUtils->WriteComment(_L("\nSecond Connection Start"));
+	iPopCmdServiceB=MakeBasicConnectionLC(KDemonServer, 
+												KDemonUser, 
+												KDemonPass);
+	iPopCmdServiceB->ConnectionL();
+
+	iState = ESend;
+	iStatus = KRequestPending;
+	SetActive();
+	CActiveScheduler::Start();
+
+	gTestUtils->WriteComment(_L("End of Test Two Default Parallel Connections "));
+	gTestUtils->WriteComment(_L("\r\n"));
+	}
+
+void CTestHarnessParent::TestTwoDifferentConnectionsSeriallyL()
+	{
+	gTestUtils->WriteComment(_L("Test Two Different Serial Connections Started"));
+	gTestUtils->WriteComment(_L("\nFirst Connection Start"));
+
+	iPopCmdServiceA=MakeBasicConnectionLC(KPipexServer, 
+												KPipexUser, 
+												KPipexPass);
+
+	iPopCmdServiceB=MakeOverrideConnectionLC(KDemonServer, 
+												KDemonUser, 
+												KDemonPass);
+	iPopCmdServiceA->ConnectionL();
+	iState = ESend;
+	iStatus = KRequestPending;
+	SetActive();
+	CActiveScheduler::Start();
+	
+	gTestUtils->WriteComment(_L("End of Test Two Different Serial Connections "));
+	gTestUtils->WriteComment(_L("\r\n"));
+
+	}
+
+void  CTestHarnessParent::TestTwoDifferentConnectionsParallellyL()
+	{
+	gTestUtils->WriteComment(_L("Test Two Differenet Parallel Connections Started"));
+	gTestUtils->WriteComment(_L("\nFirst Connection Start"));
+	
+	iPopCmdServiceA=MakeBasicConnectionLC(KPipexServer, 
+												KPipexUser, 
+												KPipexPass);
+	iPopCmdServiceA->ConnectionL();
+
+	gTestUtils->WriteComment(_L("\nSecond Connection Start"));
+	iPopCmdServiceB=MakeOverrideConnectionLC(KDemonServer, 
+												KDemonUser, 
+												KDemonPass);
+	iPopCmdServiceB->ConnectionL();
+
+	iState = ESend;
+	iStatus = KRequestPending;
+	SetActive();
+	CActiveScheduler::Start();
+
+	gTestUtils->WriteComment(_L("End of Test Two Different Parallel Connections "));
+	gTestUtils->WriteComment(_L("\r\n"));
+	}
+
+
+void CTestHarnessParent::TestExplicitDefaultConnL()
+	{
+	gTestUtils->WriteComment(_L("Test Explicit-Default Parallel Connections Started"));
+	gTestUtils->WriteComment(_L("\nFirst Connection Start"));
+
+	iPopCmdServiceA=MakeBasicConnectionLC(KPipexServer, 
+												KPipexUser, 
+												KPipexPass);
+	iPopCmdServiceA->ConnectionL();
+
+	gTestUtils->WriteComment(_L("\nSecond Connection Start"));
+	iPopCmdServiceB=MakeExplicitDefaultConnectionLC(KDemonServer, 
+												KDemonUser, 
+												KDemonPass);
+	iPopCmdServiceB->ConnectionL();
+
+	iState = ESend;
+	iStatus = KRequestPending;
+	SetActive();
+	CActiveScheduler::Start();
+
+	gTestUtils->WriteComment(_L("End of Test Explicit-Default Parallel Connections"));
+	gTestUtils->WriteComment(_L("\r\n"));
+	}
+
+void CTestHarnessParent::DoCancel()
+	{
+	}
+
+void CTestHarnessParent::SetTestMode(TTestMode aTestMode)
+	{
+	iTestMode=aTestMode;
+	}
+
+// Called by active scheduler if there is an outstanding task
+void CTestHarnessParent::RunL()
+	{
+	switch(iTestMode)
+		{
+		case ESingleDefaultConn:
+			SingleDefaultConnection();
+		break;
+		
+		case ESingleSpecifiedConn:
+			SingleDefaultConnection();
+		break;
+		
+		case ETwoDefaultSerialConn: 
+		case ETwoDifferentSerialConn:
+			TwoSerialConnectionsL();
+		break;
+	
+		case ETwoDefaultParallelConn:
+		case ETwoDifferentParallelConn:
+		case EExplicitDefaultConn:
+			TwoParallelConnections();
+		break;
+		default:
+		break;
+		}
+	}
+
+void CTestHarnessParent::TwoSerialConnectionsL()
+	{
+	switch (iState)
+		{
+		case EConnect:
+		break;
+		case ESend:	
+			g_Count=g_NoOfConnections;
+			iState=EDisConnect;
+			iStatus = KRequestPending;
+			SetActive();
+
+			if(!iPopCmdServiceA->IsChildCompleteSet())
+				{
+				if(iPopCmdServiceA->iStatus.Int() == KErrNone || 
+							iPopCmdServiceA->iStatus.Int() == KErrInUse)
+					{
+					iPopCmdServiceA->List();
+					}
+				}
+			else
+				ChildFinished();
+		break;
+		case EDisConnect:
+			g_Count=g_NoOfConnections;
+			iState=EConnect2;
+			iStatus = KRequestPending;
+			SetActive();
+			if(!iPopCmdServiceA->IsChildCompleteSet())
+				{
+				iPopCmdServiceA->DisConnect();
+				}
+			else
+				ChildFinished();
+		break;
+		case EConnect2:
+			g_Count=g_NoOfConnections;
+			iPopCmdServiceB->ConnectionL();
+			iState=ESend2;
+			iStatus = KRequestPending;
+			SetActive();
+		break;
+		case ESend2:
+			g_Count=g_NoOfConnections;
+			iState=EDisConnect2;
+			iStatus = KRequestPending;
+			SetActive();
+
+			if(!iPopCmdServiceB->IsChildCompleteSet())
+				{
+				if(iPopCmdServiceB->iStatus.Int() == KErrNone || 
+							iPopCmdServiceB->iStatus.Int() == KErrInUse)
+					{
+					iPopCmdServiceB->List();
+					}
+				}
+			else
+				ChildFinished();
+			break;
+		case EDisConnect2:
+			g_Count=g_NoOfConnections;
+			iState=EStop;
+			iStatus = KRequestPending;
+			SetActive();
+
+			if(!iPopCmdServiceB->IsChildCompleteSet())
+				{
+				iPopCmdServiceB->DisConnect();
+				}
+			else
+				ChildFinished();
+		break;
+		case EStop:
+			CActiveScheduler::Stop();
+		break;
+		default:
+		break;
+		}
+	}
+
+
+void CTestHarnessParent::TwoParallelConnections()
+	{
+	switch (iState)
+		{
+		case EConnect:
+		break;
+		case ESend:	// have set encryption
+			g_Count=g_NoOfConnections;
+			iState=EDisConnect;
+			iStatus = KRequestPending;
+			SetActive();
+
+			if(!iPopCmdServiceA->IsChildCompleteSet())
+				{
+				if(iPopCmdServiceA->iStatus.Int() == KErrNone || 
+						iPopCmdServiceA->iStatus.Int() == KErrInUse)
+					{
+					iPopCmdServiceA->List();
+					}
+				}
+			else
+				ChildFinished();
+					
+			if(!iPopCmdServiceB->IsChildCompleteSet())
+				{
+				if(iPopCmdServiceB->iStatus.Int() == KErrNone || 
+						iPopCmdServiceB->iStatus.Int() == KErrInUse)
+					{
+					iPopCmdServiceB->List();
+					}
+				}
+			else
+				ChildFinished();
+		break;
+		case EDisConnect:
+			g_Count=g_NoOfConnections;
+			iState=EStop;
+			iStatus = KRequestPending;
+			SetActive();
+
+			if(!iPopCmdServiceA->IsChildCompleteSet())
+				iPopCmdServiceA->DisConnect();
+			else
+				ChildFinished();
+
+			if(!iPopCmdServiceB->IsChildCompleteSet())
+				iPopCmdServiceB->DisConnect();
+			else
+				ChildFinished();
+		break;
+		case EStop:
+			CActiveScheduler::Stop();
+		break;
+		default:
+		break;
+		} // end of switch
+	}
+
+void CTestHarnessParent::SingleDefaultConnection()
+	{
+	switch (iState)
+		{
+		case EConnect:
+		break;
+		case ESend:	
+			g_Count=g_NoOfConnections;
+			iState=EDisConnect;
+			iStatus = KRequestPending;
+			SetActive();
+			if(!iPopCmdServiceA->IsChildCompleteSet())
+				{
+				if(iPopCmdServiceA->iStatus.Int() == KErrNone || 
+						iPopCmdServiceA->iStatus.Int() == KErrInUse)
+					{
+					iPopCmdServiceA->List();
+					}
+				}
+			else
+				ChildFinished();
+		break;
+		case EDisConnect:
+			g_Count=g_NoOfConnections;
+			iState=EStop;
+			iStatus = KRequestPending;
+			SetActive();
+			
+			if(!iPopCmdServiceA->IsChildCompleteSet())
+				{
+				iPopCmdServiceA->DisConnect();
+				}
+			else
+				ChildFinished();
+		break;
+		case EStop:
+			CActiveScheduler::Stop();
+		break;
+		default:
+		break;
+		} // end of switch
+	}
+
+void CTestHarnessParent::ChildFinished() 
+	{
+	TRequestStatus *status;
+	status = &iStatus;
+	g_Count-- ;
+	if(g_Count==0)
+		User::RequestComplete(status,KErrNone);
+	}
+
+// Default connection
+CSendPopCommandMessage* CTestHarnessParent::MakeBasicConnectionLC(TDes& aServAddress, TDes8& aUser, TDes8& aPass/*,CTestHarnessParent* aParent*/)
+	{
+	CSendPopCommandMessage* popCmdService = CSendPopCommandMessage::NewL(aServAddress,KPopPort, aUser, aPass,this);
+	return popCmdService;
+	}
+
+// Override connection
+CSendPopCommandMessage* CTestHarnessParent::MakeOverrideConnectionLC(TDes& aServAddress, TDes8& aUser, TDes8& aPass/*,CTestHarnessParent* aParent*/)
+	{
+	CSendPopCommandMessage* popCmdService = CSendPopCommandMessage::NewL(aServAddress,KPopPort, aUser, aPass, this);
+	
+	TImIAPChoice choice;
+	choice.iIAP = 1; // Specified IAP 
+	choice.iDialogPref = ECommDbDialogPrefDoNotPrompt;
+	CImIAPPreferences*		theIAPPreferences = CImIAPPreferences::NewLC();
+	theIAPPreferences->AddIAPL(choice);
+	
+	popCmdService->SetConnectionPrefs(theIAPPreferences);
+	CleanupStack::Pop(theIAPPreferences);
+	return popCmdService;
+	}
+
+// Explicit connection to the default IAP
+CSendPopCommandMessage* CTestHarnessParent::MakeExplicitDefaultConnectionLC(TDes& aServAddress, TDes8& aUser, TDes8& aPass)
+	{
+	CSendPopCommandMessage* popCmdService = CSendPopCommandMessage::NewL(aServAddress,KPopPort, aUser, aPass, this);
+	
+	TImIAPChoice choice;
+	choice.iIAP = 0;  // Explicitly connecting to the default IAP
+	choice.iDialogPref = ECommDbDialogPrefDoNotPrompt;
+	CImIAPPreferences*		theIAPPreferences = CImIAPPreferences::NewLC();
+	theIAPPreferences->AddIAPL(choice);
+	
+	popCmdService->SetConnectionPrefs(theIAPPreferences);
+	CleanupStack::Pop(theIAPPreferences);
+	return popCmdService;
+	}
+
+// Displays the error code 
+void CSendPopCommandMessage::DisplayErrorReason(TInt& aReason)
+	{
+	if (aReason!=KErrNone)
+		{
+		gTestUtils->WriteComment(_L("\nERROR - "));
+		}
+
+	TBuf<64> logString;
+	switch (aReason)
+		{
+		case KErrNone:
+			gTestUtils->WriteComment(_L("Session completed successfully"));
+		break;
+		case KErrCancel:
+			gTestUtils->WriteComment(_L("Session cancelled"));
+			logString.Format(_L(" Session Cancelled %d"),KErrCancel);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrAlreadyExists:
+			gTestUtils->WriteComment(_L(" something Already Exists"));
+			logString.Format(_L(" something Already Exists %d"),KErrAlreadyExists);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrEof:
+			gTestUtils->WriteComment(_L("No messages to send"));
+			logString.Format(_L(" No messages to send %d"),KErrEof);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrNoMemory:
+			gTestUtils->WriteComment(_L("No memory"));
+			logString.Format(_L(" No Memory %d"),KErrNoMemory);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrAccessDenied:
+			gTestUtils->WriteComment(_L("Switch link off"));
+			logString.Format(_L(" Switch link off %d"),KErrAccessDenied);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrExitNoModem:
+			gTestUtils->WriteComment(_L("No modem"));
+			logString.Format(_L(" No Modem %d"),KErrExitNoModem);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrExitLoginFail:
+			gTestUtils->WriteComment(_L("Login failed"));
+			logString.Format(_L(" Login Failed %d"),KErrExitLoginFail);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrExitModemError:
+			gTestUtils->WriteComment(_L("Modem error"));
+			logString.Format(_L(" Modem Error %d"),KErrExitModemError);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrExitScriptError:
+			gTestUtils->WriteComment(_L("Script error"));
+			logString.Format(_L(" Script Error %d"),KErrExitScriptError);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KImskErrorDNSNotFound:
+			gTestUtils->WriteComment(_L("Failed to find SMTP server"));
+			logString.Format(_L(" Failed to find SMTP server %d"),KImskErrorDNSNotFound);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrTimedOut:
+			gTestUtils->WriteComment(_L("Timed out waiting to communicate to server"));
+			logString.Format(_L(" Timed out waiting to communicate to server %d"),KErrTimedOut);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrDisconnected:
+			gTestUtils->WriteComment(_L("Server disconnected from socket"));
+			logString.Format(_L(" Server disconnected from socket %d"),KErrDisconnected);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrCouldNotConnect:
+			gTestUtils->WriteComment(_L("Could not connect to the server"));
+			logString.Format(_L(" Could not connect to the server %d"),KErrCouldNotConnect);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrCouldNotDisconnect:
+			gTestUtils->WriteComment(_L("Could not disconnect from the server"));
+			logString.Format(_L(" Could not disconnect from the server %d"),KErrCouldNotDisconnect);
+			gTestUtils->WriteComment(logString);
+		break;
+		case KErrServerTerminated:
+			gTestUtils->WriteComment(_L("Server terminated"));
+			logString.Format(_L(" Server terminated %d"),KErrServerTerminated);
+			gTestUtils->WriteComment(logString);
+		break;
+		default:
+			// unknown error 
+			logString.Format(_L(" Error %d"),aReason);
+			gTestUtils->WriteComment(logString);
+		}
+	}
+
+
+// create an active object to send the message
+
+CSendPopCommandMessage::CSendPopCommandMessage() 
+	: CActive(EPriorityHigh), 
+	iServerAddress(KPipexServer), 
+	iPort(KPopPort),
+	iUserName(KPipexUser),
+	iPass(KPipexPass)
+	{
+	}
+
+CSendPopCommandMessage::CSendPopCommandMessage(TDesC& aServerAddress, 
+											   TInt aPort, 
+											   TDesC8& aUser,
+											   TDesC8& aPass ,
+											   CTestHarnessParent* aParent,
+											   CImIAPPreferences* aConnPref)
+	: CActive(EPriorityHigh), 
+	iServerAddress(aServerAddress), 
+	iPort(aPort),
+	iUserName(aUser),
+	iPass(aPass),
+	iParent(aParent),
+	iIAPPreferences(aConnPref) 
+
+	{
+	}
+
+CSendPopCommandMessage  *CSendPopCommandMessage::NewLC(TDesC& aServerAddress, 
+													   TInt aPort, 
+													   TDesC8& aUser,
+													   TDesC8& aPass,
+													   CTestHarnessParent* aParent,
+													   CImIAPPreferences* aConnPref)
+	{
+	CSendPopCommandMessage* self=new (ELeave) CSendPopCommandMessage(aServerAddress, 
+																		aPort,
+																		aUser,
+																		aPass,
+																		aParent,
+																		aConnPref);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+CSendPopCommandMessage  *CSendPopCommandMessage::NewL(TDesC& aServerAddress, 
+													  TInt aPort, 
+													  TDesC8& aUser,
+													  TDesC8& aPass,
+													  CTestHarnessParent* aParent,
+													  CImIAPPreferences* aConnPref)
+	{
+	CSendPopCommandMessage* self=NewLC(aServerAddress, aPort, aUser, aPass, 
+														aParent,aConnPref);
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CSendPopCommandMessage::ConstructL()
+	{
+	iSendState=EConnect;
+	CActiveScheduler::Add(this); // add to active scheduler
+	iImSocket= CImTextServerSession::NewL();
+	iReceive=EFalse;
+	}
+
+TBool CSendPopCommandMessage::IsChildCompleteSet()
+	{
+	return iComplete;	
+	}
+
+void CSendPopCommandMessage::SetConnectionPrefs(CImIAPPreferences* aConnPref)
+	{
+	if (iIAPPreferences)
+		delete iIAPPreferences;
+	iIAPPreferences = aConnPref;
+	}
+
+CSendPopCommandMessage::~CSendPopCommandMessage()
+	{ 
+	Cancel(); // make sure we're cancelled
+	delete iImSocket;
+	delete iBuf;
+	delete iIAPPreferences;
+	}
+
+void CSendPopCommandMessage::SetSelfComplete(TBool aComplete)
+	{
+	iComplete=aComplete;
+	}
+
+void CSendPopCommandMessage::DoCancel()
+	{
+	iImSocket->Cancel();
+	}
+
+void CSendPopCommandMessage::SetLastError(TInt aError)
+	{
+	iLastError=aError;
+	}
+
+TInt CSendPopCommandMessage::GetLastError()
+	{
+	return iLastError;
+	}
+
+// Displays the error reason, disconnects the server connection and starts the active
+void CSendPopCommandMessage::Complete(TInt aError)
+	{
+	iImSocket->LogError(_L8("\t\tEnd of POP3 g_Test session; completion code="),aError);
+	TBuf8<KImMailMaxBufferSize> buffer;
+	iLineStatus=iImSocket->GetCurrentTextLine(buffer);
+	g_Test.Printf(TRefByValue<const TDesC>_L("Final %S\n "),&buffer);
+
+	SetSelfComplete(ETrue);
+	DisplayErrorReason(aError);
+	if (aError==KErrNone)
+		gTestUtils->WriteComment(_L("PASSED g_Test"));
+	else
+		gTestUtils->WriteComment(_L("FAILED g_Test"));
+	}
+
+// Called by active scheduler if there is an outstanding task
+void  CSendPopCommandMessage::RunL()
+	{
+	switch (iSendState)
+		{
+		case EConnect:
+			if(iStatus.Int()==KErrNone || iStatus.Int()==KErrInUse)
+				{	
+				iReceive=ETrue;
+				QueueNextReceive();
+				iSendState = EConnectDone;
+				}
+			else
+				{
+				SetLastError(iStatus.Int());
+				DisConnect();
+				}
+		break;
+		case EConnectDone:
+			iParent->ChildFinished();
+			iSendState = EUserName;
+		break;
+		case EStat:	// have set encryption
+			iReceive=EFalse;
+			RequestSend();
+			iSendState=EList;
+		break;
+		case EUserName:	// response from sending user name
+		case EPassword:	// response from sending password`
+		case EList:
+			List();
+		break;
+		case EQuit:	
+			Quit();	
+		break;
+		case EQuitDone:
+			iParent->ChildFinished();
+		break;
+		case EComplete:
+			Complete(GetLastError());
+			iParent->ChildFinished();
+		break;
+		default:
+		break;
+		} // end of switch 
+	}
+
+// Called by RunL when it leaves
+TInt CSendPopCommandMessage::RunError(TInt aError)
+	{
+	Cancel(); // make sure we're cancelled
+	delete iImSocket;
+	delete iBuf;
+	delete iIAPPreferences;
+
+	if(aError != KErrNone)
+		return aError;
+
+	return KErrNone;
+	}
+
+// Disconect the server connection
+void CSendPopCommandMessage::DisConnect()
+	{
+	iImSocket->Disconnect(iStatus);
+	iSendState=EComplete;
+	SetActive();
+	}
+
+// USER,PASS and LIST command sent to the server
+void CSendPopCommandMessage::List()
+	{
+	someBinaryData=_L8("");
+	if(iStatus.Int()!=KErrNone)
+		{
+		SetLastError(iStatus.Int());
+		DisConnect();
+		return;
+		}
+	else
+		{
+		TBuf8<40> buffer;
+		TBuf<40> buffer16;
+		iLineStatus=iImSocket->GetCurrentTextLine(buffer);
+		buffer16.Copy(buffer);
+		g_Test.Printf(TRefByValue<const TDesC>_L("%S"),&buffer16);
+		if(iReceive)
+			{
+			if(iLineStatus==EBufferTooSmall)
+				{
+				while(iLineStatus!=ECRLFTerminated)
+					{
+					iLineStatus=iImSocket->GetCurrentTextLine(buffer);
+					g_Test.Printf(TRefByValue<const TDesC>_L("%S"),&buffer);
+					}
+				}
+			iReceive=EFalse;
+			RequestSend();
+			TInt iSt = (TInt) iSendState;
+			iSt++;
+			iSendState = (TSendState)iSt;
+			}
+		else
+			{
+			iReceive=ETrue;
+			QueueNextReceive();
+			}
+		}
+	}
+
+// Receives the data from the server and sends the QUIT message
+void CSendPopCommandMessage::Quit()
+	{
+	TInt length=0;
+	if(iStatus.Int()!=KErrNone)
+		{
+		SetLastError(iStatus.Int());
+		DisConnect();
+		return;
+		}
+	length=someBinaryData.Length();
+	if (length>2)
+		{
+		TBuf<KMaxSizeOfBinaryData> buffer16;
+		buffer16.Copy(someBinaryData);
+		g_Test.Printf(TRefByValue<const TDesC>_L("%S"),&buffer16);
+		if ((someBinaryData[length-3]=='.' && someBinaryData[length-2]==0x0D 
+										&& someBinaryData[length-1]==0x0A)
+			||(someBinaryData[length-3]=='-' && someBinaryData[length-2]=='E' 
+										&& someBinaryData[length-1]=='R'))
+			{
+			// got ".CRLF" string (-ERR string) from LIST command, so go onto next state
+			iReceive=EFalse;
+			RequestSend();
+			iSendState=EQuitDone;
+			return;
+			}
+		}
+	// queue a read
+	iReceive=ETrue;
+	iImSocket->ReceiveBinaryData(iStatus,someBinaryData,someBinaryData.MaxLength());
+	SetActive();
+	}
+
+// Receives new request from socket
+void CSendPopCommandMessage::QueueNextReceive()
+	{
+	//queues a new request from the socket 
+	iImSocket->QueueReceiveNextTextLine(iStatus);
+	SetActive();
+	}
+
+// Request function for the active object
+void CSendPopCommandMessage::RequestSend()
+	{
+	_LIT8(KImStat,"STAT\r\n");
+	_LIT8(KImList,"LIST\r\n");
+	_LIT8(KImQuit,"QUIT\r\n");
+
+	switch(iSendState)
+		{
+		case EConnect:
+		case EConnectDone:
+		case EQuitDone:
+		break;
+		case EUserName:
+	        gTestUtils->WriteComment(_L("IP address of client is "));
+			gTestUtils->WriteComment(iImSocket->LocalName());
+	
+			TUint32 convalue;
+			TInt err;
+			err=iImSocket->GetIAPValue(convalue);
+			if(err==KErrNone)
+				g_Test.Printf(_L("GetIAPValue returned %u\n"),convalue);
+			else 
+				g_Test.Printf(_L("GetIAPValue error %d\n"),err);
+			err=iImSocket->GetIAPBearer(convalue);
+			if(err==KErrNone)
+				g_Test.Printf(_L("GetIAPBearer returned %u\n"),convalue);
+			else 
+				g_Test.Printf(_L("GetIAPBearer error %d\n"),err);
+			iImSocket->Send(iStatus,iUserName);
+			gTestUtils->WriteComment(_L("\tSent Message USER"));
+			g_Test.Printf(_L("\tSent Message USER\n"));
+		break;
+		case EPassword:
+			iImSocket->Send(iStatus,iPass);
+			gTestUtils->WriteComment(_L("\tSent Message PASS"));
+			g_Test.Printf(_L("\tSent Message PASS\n"));
+		break;
+		case EStat:
+			iImSocket->Send(iStatus,KImStat());
+			gTestUtils->WriteComment(_L("\tSent Message STAT"));
+			g_Test.Printf(_L("\tSent Message STAT\n"));
+		break;
+		case EList:
+			iImSocket->Send(iStatus,KImList());
+			gTestUtils->WriteComment(_L("\tSent Message LIST"));
+			g_Test.Printf(_L("\tSent Message LIST\n"));
+		break;
+		case EQuit:
+			iImSocket->Send(iStatus,KImQuit());
+			gTestUtils->WriteComment(_L("\tSent Message QUIT"));
+			g_Test.Printf(_L("\tSent Message QUIT\n"));
+		break;
+		case EComplete:
+			gTestUtils->WriteComment(_L("\tReq Complete"));
+		break;
+		}
+	SetActive();
+	}
+	
+void CSendPopCommandMessage::ConnectionL()
+	{
+	g_Test.Next(_L("QueueConnect"));
+	SetSelfComplete(EFalse);
+	if (!iIAPPreferences)
+		{
+		iIAPPreferences = CImIAPPreferences::NewLC();
+		CleanupStack::Pop(); // iIAPPrefernces
+		}
+	iImSocket->QueueConnectL(iStatus,iServerAddress,iPort,*iIAPPreferences);
+	SetActive();
+	g_Test.Next(_L("Connect Queued"));
+	gTestUtils->WriteComment(_L("Connect Queued"));
+	}
+
+//=========================================//
+
+// Clears the screen
+LOCAL_C void ClearScreen()
+	{
+	g_Test.Console()->ClearScreen();
+	}
+
+// Draws menu on screen for user input 
+/*
+LOCAL_C void DrawMenu()
+	{
+	g_Test.Printf(_L("\r\n"));
+	g_Test.Printf(_L("(1) Single Default Connection (IAP A)\r\n"));
+	g_Test.Printf(_L("(2) Single Specified Connection (IAP B)\r\n"));
+	g_Test.Printf(_L("(3) Two Default Connections Serially (IAP A and B)\r\n"));
+	g_Test.Printf(_L("(4) Two Default Connections Parallelly (IAP A and B)\r\n"));
+	g_Test.Printf(_L("(5) One Default and One Specified Connections Serially (IAP A and B)\r\n"));
+	g_Test.Printf(_L("(6) One Default and One Specified Connections Parallely (IAP A and B)\r\n"));
+	g_Test.Printf(_L("(7) Explicitly connecting to the default IAP\r\n"));
+	g_Test.Printf(_L("(a) Test All Cases\r\n"));
+	g_Test.Printf(_L("(x) Exit\r\n"));
+	g_Test.Printf(_L("\r\n"));
+	g_Test.Printf(_L("Select: "));
+	}
+*/
+//Accepts the user input and calls the desired test case
+LOCAL_C void doMainL()
+	{
+	TChar option('0');
+	g_NoOfConnections=0;
+	
+	CTestHarnessUtil* testHarnessUtil=CTestHarnessUtil::NewL();
+	CleanupStack::PushL(testHarnessUtil); 
+
+	gTestUtils = CEmailTestUtils::NewLC(g_Test);
+	gTestUtils->WriteComment(_L("T_MSG_CONN Testing Email Test Socket"));
+	gTestUtils->WriteComment(_L("Please make sure that pipex is the default IAP."));
+
+	CTestHarnessParent *test_harness = NULL;
+	test_harness=CTestHarnessParent::NewL();
+	CleanupStack::PushL(test_harness); 
+
+//	DrawMenu();
+//	option = TChar(g_Test.Getch());
+//	g_Test.Printf(_L("%c\r\n"), option);
+//	ClearScreen();
+	option=ETestAllCases;
+
+	switch(option)
+		{
+		case ETestSingleDefaultConn:
+			g_NoOfConnections=1;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ESingleDefaultConn);
+			test_harness->TestSingleDefaultConnL();
+		break;
+		case ETestSingleSpecifiedConn:
+			g_NoOfConnections=1;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ESingleSpecifiedConn);
+			test_harness->TestSingleSpecifiedConnL();
+		break;
+		case ETestTwoDefaultSerialConns:
+			g_NoOfConnections=1;	//Coz, connections one after the other
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ETwoDefaultSerialConn);
+			test_harness->TestTwoDefaultConnectionsSeriallyL();
+		break;
+		case ETestTwoDefaultParallelConns:
+			g_NoOfConnections=2;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ETwoDefaultParallelConn);
+			test_harness->TestTwoDefaultConnectionsParallellyL();
+		break;
+		case ETestTwoDifferentSerialConns:
+			g_NoOfConnections=1;	//Coz, connections one after the other
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ETwoDifferentSerialConn);
+			test_harness->TestTwoDifferentConnectionsSeriallyL();
+		break;
+		case ETestTwoDifferentParallelConns:
+			g_NoOfConnections=2;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ETwoDifferentParallelConn);
+			test_harness->TestTwoDifferentConnectionsParallellyL();
+		break;
+		case ETestExplicitDefaultConn:
+			g_NoOfConnections=2;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(EExplicitDefaultConn);
+			test_harness->TestExplicitDefaultConnL();
+			break;
+		case ETestAllCases:
+			g_NoOfConnections=1;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ESingleDefaultConn);
+			test_harness->TestSingleDefaultConnL();
+
+			g_NoOfConnections=1;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ESingleSpecifiedConn);
+			test_harness->TestSingleSpecifiedConnL();
+
+			g_NoOfConnections=1;	//Coz, connections one after the other
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ETwoDefaultSerialConn);
+			test_harness->TestTwoDefaultConnectionsSeriallyL();
+
+			g_NoOfConnections=2;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ETwoDefaultParallelConn);
+			test_harness->TestTwoDefaultConnectionsParallellyL();
+
+			g_NoOfConnections=1;	//Coz, connections one after the other
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ETwoDifferentSerialConn);
+			test_harness->TestTwoDifferentConnectionsSeriallyL();
+
+			g_NoOfConnections=2;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(ETwoDifferentParallelConn);
+			test_harness->TestTwoDifferentConnectionsParallellyL();
+
+			g_NoOfConnections=2;
+			g_Count=g_NoOfConnections;
+			test_harness->SetTestMode(EExplicitDefaultConn);
+			test_harness->TestExplicitDefaultConnL();
+		break;
+		default:
+			gTestUtils->WriteComment(_L("Exit"));
+		}
+	ClearScreen();
+	gTestUtils->WriteComment(_L("**********       T_MSG_CONN Tests Complete       **********"));
+	gTestUtils->TestHarnessCompleted();
+
+	CleanupStack::PopAndDestroy(test_harness);
+	CleanupStack::PopAndDestroy(gTestUtils);
+	CleanupStack::PopAndDestroy(testHarnessUtil);
+	}
+
+// Entry point 
+GLDEF_C TInt E32Main()
+	{
+	g_Test.Title();
+	g_Test.Start(_L("Testing Email Text Socket"));
+	__UHEAP_MARK;
+
+	theCleanup=CTrapCleanup::New();
+	g_Test (theCleanup!=NULL);
+	TRAPD(ret,doMainL());		
+	g_Test (ret==KErrNone);
+	delete theCleanup;
+
+	__UHEAP_MARKEND;
+	g_Test.End();
+	return 0;
+	}