diff -r 000000000000 -r 72b543305e3a email/pop3andsmtpmtm/servermtmutils/test/src/T_MSGConnTest.cpp --- /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 +#include +#include +#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 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 buffer; + iLineStatus=iImSocket->GetCurrentTextLine(buffer); + g_Test.Printf(TRefByValue_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_L("%S"),&buffer16); + if(iReceive) + { + if(iLineStatus==EBufferTooSmall) + { + while(iLineStatus!=ECRLFTerminated) + { + iLineStatus=iImSocket->GetCurrentTextLine(buffer); + g_Test.Printf(TRefByValue_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 buffer16; + buffer16.Copy(someBinaryData); + g_Test.Printf(TRefByValue_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; + }