--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_EsockTestSteps/src/Sockets.TestSteps.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,1195 @@
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file Sockets.TestSteps.cpp
+*/
+
+#include "Sockets.TestSteps.h"
+#include "SocketServer.TestSteps.h"
+#include "Connections.TestSteps.h"
+#include "SubConnections.TestSteps.h"
+
+#include <utf.h>
+
+
+// Open Socket
+//------------
+
+COpenRSocketStep::COpenRSocketStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KOpenRSocketStep);
+ }
+
+TInt COpenRSocketStep::ConfigureFromIni()
+ {
+ iParams.Reset();
+
+ // Read in appropriate fields
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF1(_L("Couldn't find appropriate field in config file"));
+ return KErrNotFound;
+ }
+
+ if (GetStringFromConfig(iSection,KTe_SocketServName,iParams.iSockServName)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Socket server name missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ if ((GetStringFromConfig(iSection,KTe_ConnectionName,iParams.iConnectionName)==1)
+ && iParams.iConnectionName.Length()>0)
+ {
+ INFO_PRINTF2(_L("%S: connection name found - opening with RConnection."),&iParams.iSocketName);
+ }
+ else if ((GetStringFromConfig(iSection,KTe_SubConnectionName,iParams.iSubconnectionName)==1)
+ && iParams.iSubconnectionName.Length()>0)
+ {
+ INFO_PRINTF2(_L("%S: subconnection name found - opening with RSubConnection."),&iParams.iSocketName);
+ }
+ else
+ {
+ INFO_PRINTF2(_L("%S: connection or subconnection names missing - opening implicit."),&iParams.iSocketName);
+ }
+
+ if (GetStringFromConfig(iSection,KTe_ProtocolName,iParams.iProtocolName)==1)
+ {
+ INFO_PRINTF2(_L("%S: Protocol name found."),&iParams.iProtocolName);
+ }
+ else
+ {
+ TPtrC protocol;
+ if (GetStringFromConfig(iSection,KTe_Protocol,protocol)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Protocol missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ if (protocol.Compare(KTe_TCPName)==0)
+ { iParams.iProtocol = KProtocolInetTcp; iParams.iSocketType = KSockStream; }
+ else if (protocol.Compare(KTe_UDPName)==0)
+ { iParams.iProtocol = KProtocolInetUdp; iParams.iSocketType = KSockDatagram; }
+ else if (protocol.Compare(KDummyProtocolName)==0)
+ {
+ iParams.iProtocol = KProtocolInetDummy;
+ iParams.iSocketType = KSockDatagram;
+ }
+ else
+ {
+ INFO_PRINTF3(_L("%S: Protocol (%S) not recognised."),&iParams.iSocketName,&protocol);
+ return KErrNotFound;
+ }
+ }
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict COpenRSocketStep::doSingleTestStep()
+ {
+ TInt error = iEsockTest->OpenSocket(iParams);
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not open socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ SetTestStepError(error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+// Close Socket
+//-------------
+
+CCloseRSocketStep::CCloseRSocketStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KCloseRSocketStep);
+ }
+
+TInt CCloseRSocketStep::ConfigureFromIni()
+ {
+ iSocketName.Set(KNullDesC);
+
+ if((GetStringFromConfig(iSection, KTe_SocketName, iSocketName) != 1)
+ || (iSocketName.Length() == 0))
+ {
+ INFO_PRINTF1(_L("Couldn't find appropriate field in config file"));
+ return KErrNotFound;
+ }
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict CCloseRSocketStep::doSingleTestStep()
+ {
+ TInt error = iEsockTest->CloseSocket(iSocketName);
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not close socket (%S)."),&iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+// Create Socket
+//--------------
+
+CCreateRSocketStep::CCreateRSocketStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KCreateRSocketStep);
+ }
+
+TVerdict CCreateRSocketStep::doTestStepPreambleL()
+ {
+ SetTestStepResult(EFail);
+
+ if (iEsockTest==NULL)
+ iEsockTest = new (ELeave) CCEsockTestBase;
+
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ }
+
+TInt CCreateRSocketStep::ConfigureFromIni()
+ {
+ iParams.Reset();
+
+ // Read in appropriate fields
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF1(_L("Couldn't find appropriate field in config file"));
+ return KErrNotFound;
+ }
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict CCreateRSocketStep::doSingleTestStep()
+ {
+ TInt error = iEsockTest->CreateSocket(iParams.iSocketName);
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not create socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+// Connect Socket
+//---------------
+
+CConnectRSocketStep::CConnectRSocketStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KConnectRSocketStep);
+ }
+
+TInt CConnectRSocketStep::ConfigureFromIni()
+ {
+ iParams.Reset();
+
+ // Read in appropriate fields
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF1(_L("Couldn't find appropriate field in config file"));
+ return KErrNotFound;
+ }
+
+ TPtrC protocol;
+ if (GetStringFromConfig(iSection,KTe_Protocol,protocol)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Protocol missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ if (protocol.Compare(KTe_TCPName)==0)
+ { iParams.iProtocol = KProtocolInetTcp; }
+ else if (protocol.Compare(KTe_UDPName)==0)
+ { iParams.iProtocol = KProtocolInetUdp; }
+ else if (protocol.Compare(KDummyProtocolName)==0)
+ {
+ iParams.iProtocol = KProtocolInetDummy;
+ }
+ else
+ {
+ INFO_PRINTF3(_L("%S: Protocol (%S) not recognised."),&iParams.iSocketName,&protocol);
+ return KErrNotFound;
+ }
+
+ // IP Address Local
+ if (GetIpAddressFromConfig(iSection,KTe_SourceAddressName,iParams.iLocalIP)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Local address missing."),&iParams.iSocketName);
+ //return KErrNotFound; // Source Address is not mandatory always.
+ }
+
+ // IP Address Remote
+ if (GetIpAddressFromConfig(iSection,KTe_DestinationAddressName,iParams.iRemoteIP)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Remote address missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ // Port Number Local
+ TInt portLocal;
+ if (GetIntFromConfig(iSection,KTe_SourcePortName,portLocal)!=1)
+ {
+ portLocal = 0;
+ INFO_PRINTF2(_L("%S: Source port missing. Defaulting to unassigned (port=0)."), &iParams.iSocketName);
+ }
+ iParams.iLocalIP.SetPort(portLocal);
+
+ // Port Number
+ // Port Number Remote
+ TInt port;
+ if (GetIntFromConfig(iSection,KTe_DestinationPortName,port)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Remote port missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ // Attach the port number to remote IP
+ iParams.iRemoteIP.SetPort(port);
+
+ iCancelFlag = EFalse;
+ GetBoolFromConfig(iSection,KTe_ImmediateCancelFlagName,iCancelFlag);
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict CConnectRSocketStep::doSingleTestStep()
+ {
+ TRequestStatus reqStat;
+ TInt error = iEsockTest->ConnectSocket(iParams,reqStat);
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not connect socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ SetTestStepResult(EFail);
+ }
+ else
+ {
+ if (iCancelFlag)
+ {
+ error = iEsockTest->CancelConnectSocket(iParams);
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not cancel connecting socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ SetTestStepResult(EFail);
+ }
+ }
+ User::WaitForRequest(reqStat);
+ if (reqStat.Int()!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not connect socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ SetTestStepResult(EFail);
+ }
+ }
+ return TestStepResult();
+ }
+
+
+// Send Receive on Socket
+//-----------------------
+_LIT(KPayloadColour, "PayloadColour");
+
+CSendReceiveRSocketStep::CSendReceiveRSocketStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KSendReceiveRSocketStep);
+ }
+
+TInt CSendReceiveRSocketStep::ConfigureFromIni()
+ {
+ iParams.Reset();
+
+ // Read in appropriate fields
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF1(_L("Couldn't find appropriate field in config file"));
+ return KErrNotFound;
+ }
+
+ if (GetIntFromConfig(iSection,KTe_PacketSizeName,iParams.iPacketSize)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Packet size missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ if (GetIntFromConfig(iSection,KTe_NrOfPacketsName,iParams.iNrOfPackets)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Nr of packets missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ TPtrC protocol;
+ if (GetStringFromConfig(iSection,KTe_Protocol,protocol)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Protocol missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ if (protocol.Compare(KTe_TCPName)==0)
+ { iParams.iProtocol = KProtocolInetTcp; }
+ else if (protocol.Compare(KTe_UDPName)==0)
+ { iParams.iProtocol = KProtocolInetUdp; }
+ else if (protocol.Compare(KDummyProtocolName)==0)
+ {
+ iParams.iProtocol = KProtocolInetDummy;
+ }
+ else
+ {
+ INFO_PRINTF3(_L("%S: Protocol (%S) not recognised."),&iParams.iSocketName,&protocol);
+ return KErrNotFound;
+ }
+
+ // OPTIONAL: colouring data by access point Id
+ iParams.iPayloadColouringIsEnabled = EFalse;
+ if (GetIntFromConfig(iSection, KPayloadColour, iParams.iPayloadColour) == 1)
+ {
+ if((iParams.iPayloadColour < 0) || (iParams.iPayloadColour > 255))
+ {
+ INFO_PRINTF2(_L("Payload colour out of range. Must be (0 <= x <= 255)."), iParams.iPayloadColour);
+ return KErrArgument;
+ }
+ else if (iParams.iProtocol != KProtocolInetUdp)
+ {
+ INFO_PRINTF2(_L("Payload colouring only available on UDP sockets."), iParams.iPayloadColour);
+ return KErrArgument;
+ }
+ else
+ {
+ // All good
+ iParams.iPayloadColouringIsEnabled = ETrue;
+ INFO_PRINTF2(_L("Payload colouring enabled. payloadColour:%d"), iParams.iPayloadColour);
+ }
+ }
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict CSendReceiveRSocketStep::doSingleTestStep()
+ {
+ TRAPD(error,iEsockTest->SendAndReceiveDataL(iParams));
+ SetTestStepError(error);
+
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not send/receive on socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+
+// Add Socket to SubConnection
+//----------------------------
+
+CAddRSocketToRSubConnectionStep::CAddRSocketToRSubConnectionStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KAddRSocketToRSubConnectionStep);
+ }
+
+TInt CAddRSocketToRSubConnectionStep::ConfigureFromIni()
+ {
+ iParams.Reset();
+
+ // Read in appropriate fields
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF1(_L("Couldn't find appropriate field in config file"));
+ return KErrNotFound;
+ }
+
+ if (GetStringFromConfig(iSection,KTe_SubConnectionName,iParams.iSubConnectionName)!=1
+ || iParams.iSubConnectionName.Length()==0)
+ {
+ INFO_PRINTF2(_L("%S: SubConnection name missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict CAddRSocketToRSubConnectionStep::doSingleTestStep()
+ {
+ TRequestStatus reqStat;
+ TInt error = iEsockTest->AddSocketToSubConnection(iParams,reqStat);
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF3(_L("Could not add socket (%S) to subconnection (%S)."),&iParams.iSocketName,&iParams.iSubConnectionName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+
+ User::WaitForRequest(reqStat);
+ error = reqStat.Int();
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF3(_L("Could not add socket (%S) to subconnection (%S)."),&iParams.iSocketName,&iParams.iSubConnectionName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+// Add Socket to SubConnection without calling User::WaitForRequest
+// Tests PDEF134595
+//----------------------------
+
+CAddRSocketToRSubConNoWaitStep::CAddRSocketToRSubConNoWaitStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KAddRSocketToRSubConNoWaitStep);
+ }
+
+TInt CAddRSocketToRSubConNoWaitStep::ConfigureFromIni()
+ {
+ //clean parameters from previous runs
+ iParams.Reset();
+
+ if (GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1
+ || iParams.iSocketName.Length()==0)
+ return KErrNotFound;
+
+ if (GetStringFromConfig(iSection,KTe_SubConnectionName,iParams.iSubConnectionName)!=1
+ || iParams.iSubConnectionName.Length()==0)
+ {
+ INFO_PRINTF2(_L("%S: SubConnection name missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ return KErrNone;
+ }
+
+TVerdict CAddRSocketToRSubConNoWaitStep::doSingleTestStep()
+ {
+ TRequestStatus reqStat,reqStat2;
+ TInt error;
+ error = iEsockTest->AddSocketToSubConnection(iParams, reqStat);
+ if (error != KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not add socket (%d)!"), error);
+ SetTestStepResult(EFail);
+ }
+ return TestStepResult();
+ }
+
+
+// Add Socket to SubConnection (OOM)
+//----------------------------------
+
+CAddRSocketToRSubConnectionOOMStep::CAddRSocketToRSubConnectionOOMStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KAddRSocketToRSubConnectionOOMStep);
+ }
+
+TInt CAddRSocketToRSubConnectionOOMStep::ConfigureFromIni()
+ {
+ iParams.Reset();
+
+ // Read in appropriate fields
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF1(_L("Couldn't find appropriate field in config file"));
+ return KErrNotFound;
+ }
+
+ if (GetStringFromConfig(iSection, KTe_SubConnectionName, iParams.iSubConnectionName)!=1
+ || iParams.iSubConnectionName.Length()==0)
+ {
+ INFO_PRINTF2(_L("%S: SubConnection name missing."), &iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ if (GetStringFromConfig(iSection,KTe_SocketServName,iParams.iSockServName)!=1
+ || iParams.iSockServName.Length()==0)
+ {
+ INFO_PRINTF2(_L("%S: Socket server name missing."),&iParams.iSockServName);
+ return KErrNotFound;
+ }
+
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TInt CAddRSocketToRSubConnectionOOMStep::AddSocketToSubConnectionOOM()
+ {
+ TInt errorAddingSocket = KErrNoMemory;
+ TInt errorRemovingSocket;
+ TBool errorNextWillFail = iEsockTest->__DbgCheckFailNext(iParams.iSockServName);
+ TRequestStatus reqStatus;
+
+ for (TInt j = 1; !errorNextWillFail; ++j)
+ {
+ INFO_PRINTF3(_L("CCEsockTestBase::__DbgCheckFailNext() returned (%d) in OOM Loop (%d)..."), errorNextWillFail, j);
+ iEsockTest->__DbgFailNext(iParams.iSockServName, j);
+
+ iEsockTest->AddSocketToSubConnection(iParams, reqStatus);
+ User::WaitForRequest(reqStatus);
+ errorAddingSocket = reqStatus.Int();
+ INFO_PRINTF3(_L("RSubConnection::AddSocket() returned (%d) in OOM loop (%d)..."), errorAddingSocket, j);
+
+ if (errorAddingSocket == KErrNone)
+ {
+ iEsockTest->RemoveSocketFromSubConnection(iParams, reqStatus);
+ User::WaitForRequest(reqStatus);
+ errorRemovingSocket = reqStatus.Int();
+ INFO_PRINTF3(_L("RSubConnection::RemoveSocket() returned (%d) in OOM loop (%d)..."), errorRemovingSocket, j);
+
+ // Reset the "FailNext" flag in iEsockTest
+ iEsockTest->__DbgFailNext(iParams.iSockServName, -1);
+ return KErrNone;
+ }
+
+ errorNextWillFail = iEsockTest->__DbgCheckFailNext(iParams.iSockServName);
+ }
+
+ INFO_PRINTF2(_L("CCEsockTestBase::__DbgCheckFailNext() returned (%d). OOM Loop Finished."), errorNextWillFail);
+
+ // Reset the "FailNext" flag in iEsockTest
+ iEsockTest->__DbgFailNext(iParams.iSockServName, -1);
+
+ return errorAddingSocket;
+ }
+
+TVerdict CAddRSocketToRSubConnectionOOMStep::doSingleTestStep()
+ {
+ TInt error = AddSocketToSubConnectionOOM();
+ if (error != KErrNoMemory && error != KErrNone)
+ {
+ INFO_PRINTF3(_L("Could not add socket (%S) to subconnectiont (%S)."),&iParams.iSocketName,&iParams.iSubConnectionName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+// Remove Socket from SubConnection
+//---------------------------------
+
+CRemoveRSocketFromRSubConnectionStep::CRemoveRSocketFromRSubConnectionStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KRemoveRSocketFromRSubConnectionStep);
+ }
+
+TInt CRemoveRSocketFromRSubConnectionStep::ConfigureFromIni()
+ {
+ //clean parameters from previous runs
+ iParams.Reset();
+
+ if (GetStringFromConfig(iSection,KTe_SocketName,iParams.iSocketName)!=1
+ || iParams.iSocketName.Length()==0)
+ return KErrNotFound;
+
+ if (GetStringFromConfig(iSection,KTe_SubConnectionName,iParams.iSubConnectionName)!=1
+ || iParams.iSubConnectionName.Length()==0)
+ {
+ INFO_PRINTF2(_L("%S: SubConnection name missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ return KErrNone;
+ }
+
+TVerdict CRemoveRSocketFromRSubConnectionStep::doSingleTestStep()
+ {
+ TRequestStatus reqStat;
+ TInt error = iEsockTest->RemoveSocketFromSubConnection(iParams,reqStat);
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF3(_L("Could not remove socket (%S) from subconnection (%S)."),&iParams.iSocketName,&iParams.iSubConnectionName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+
+ User::WaitForRequest(reqStat);
+ error = reqStat.Int();
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF3(_L("Could not remove socket (%S) from subconnection (%S)."),&iParams.iSocketName,&iParams.iSubConnectionName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+// Remove Socket from SubConnection (OOM)
+//---------------------------------------
+
+CRemoveRSocketFromRSubConnectionOOMStep::CRemoveRSocketFromRSubConnectionOOMStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KRemoveRSocketFromRSubConnectionOOMStep);
+ }
+
+TInt CRemoveRSocketFromRSubConnectionOOMStep::ConfigureFromIni()
+ {
+ //clean parameters from previous runs
+ iParams.Reset();
+
+ if (GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName)!=1
+ || iParams.iSocketName.Length()==0)
+ return KErrNotFound;
+
+ if (GetStringFromConfig(iSection,KTe_SubConnectionName,iParams.iSubConnectionName)!=1
+ || iParams.iSubConnectionName.Length()==0)
+ {
+ INFO_PRINTF2(_L("%S: SubConnection name missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ return KErrNone;
+ }
+
+
+TInt CRemoveRSocketFromRSubConnectionOOMStep::RemoveSocketFromSubConnectionOOM()
+ {
+ TInt error = KErrNoMemory;
+ for (TInt j = 1; error == KErrNoMemory; j++)
+ {
+ TRequestStatus status;
+#ifdef _DEBUG
+ iEsockTest->__DbgFailNext(iParams.iSockServName, j);
+#endif
+ iEsockTest->RemoveSocketFromSubConnection(iParams,status);
+ User::WaitForRequest(status);
+ error = status.Int();
+ INFO_PRINTF2(_L("Error = (%d)!."),error);
+
+ if (error != KErrNoMemory && error != KErrNone)
+ {
+ INFO_PRINTF2(_L("RSubConnection::RemoveSocket() failed in OOM (%d)!.."),error);
+ SetTestStepResult(EFail);
+ }
+ }
+#ifdef _DEBUG
+ iEsockTest->__DbgFailNext(iParams.iSockServName, -1);
+#endif
+ return error;
+ }
+
+TVerdict CRemoveRSocketFromRSubConnectionOOMStep::doSingleTestStep()
+ {
+ TInt error = RemoveSocketFromSubConnectionOOM();
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not remove socket from subconnection (%S)."),&iParams.iSubConnectionName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+// Move Connected Socket
+//----------------------
+
+CmoveConnectedSocketToSubconnectionStep::CmoveConnectedSocketToSubconnectionStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KmoveConnectedSocketToSubconnectionStep);
+ }
+
+TVerdict CmoveConnectedSocketToSubconnectionStep::doTestStepPreambleL()
+ {
+ SetTestStepResult(EFail);
+
+ if (iEsockTest==NULL)
+ {
+ iEsockTest = new (ELeave) CCEsockTestBase;
+ }
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ }
+
+TInt CmoveConnectedSocketToSubconnectionStep::ConfigureFromIni()
+ {
+ // This test configures itself
+ return KErrNone;
+ }
+
+TVerdict CmoveConnectedSocketToSubconnectionStep::doSingleTestStep()
+ {
+
+ RSocket socket;
+ TInetAddr dstAddr;
+ RSocketServ socketServer;
+ RConnection conn;
+ RSubConnection subconn;
+ TRequestStatus status;
+ TRequestStatus eventStatus;
+ TNotificationEventBuf subconnNotifBuf;
+ TInt ret;
+
+ CleanupClosePushL(socketServer);
+ CleanupClosePushL(conn);
+ CleanupClosePushL(socket);
+ CleanupClosePushL(subconn);
+
+ // Connect to ESOCK
+ ret = socketServer.Connect();
+ if (ret != KErrNone)
+ {
+ INFO_PRINTF2(_L("Failed to connect toEsock due to Error: %d."),ret);
+ return EFail;
+ }
+
+ // Open a connection
+ ret = conn.Open(socketServer);
+ if (ret != KErrNone)
+ {
+ INFO_PRINTF2(_L("Failed to open connection due to Error: %d."),ret);
+ return EFail;
+ }
+
+ // Start the connection
+ conn.Start(status);
+ User::WaitForRequest(status);
+
+ if (status != KErrNone)
+ {
+ INFO_PRINTF2(_L("Failed to start connection due to Error: %d."),status.Int());
+ return EFail;
+ }
+
+
+ // Open UDP socket
+ ret = socket.Open(socketServer,
+ KAfInet,
+ KSockDatagram,
+ KProtocolInetUdp,
+ conn);
+ if (ret != KErrNone)
+ {
+ INFO_PRINTF2(_L("Failure to open socket due to Error: %d."),ret);
+ return EFail;
+ }
+
+
+ dstAddr.SetPort(3441);
+ _LIT(KText50, "127.0.0.1");
+ dstAddr.Input( KText50 );
+
+ ret = socket.SetLocalPort(3442);
+ if (ret != KErrNone)
+ {
+ INFO_PRINTF2(_L("Failed to set port on socket due to Error: %d."),ret);
+ return EFail;
+ }
+
+ socket.Connect(dstAddr, status);
+ User::WaitForRequest(status);
+
+ if (status != KErrNone)
+ {
+ INFO_PRINTF2(_L("Socket failed to connect to dst addr due to Error: %d."),status.Int());
+ return EFail;
+ }
+
+ // Create a new sub-connection
+ ret = subconn.Open(socketServer,
+ RSubConnection::ECreateNew,
+ conn);
+ if (ret != KErrNone)
+ {
+ INFO_PRINTF2(_L("Failed to create new sub-connection due to Error: %d."),ret);
+ return EFail;
+ }
+
+ // Move the connected socket onto the new sub-connection
+ subconn.Add(socket, status);
+ User::WaitForRequest(status);
+
+ if (status != KErrNotReady)
+ {
+ INFO_PRINTF2(_L("Socket could not be added to subconn due to Error: %d."),status.Int());
+ return EFail;
+ }
+
+ // close and destroy
+ CleanupStack::PopAndDestroy(&subconn);
+ CleanupStack::PopAndDestroy(&socket);
+ CleanupStack::PopAndDestroy(&conn);
+ CleanupStack::PopAndDestroy(&socketServer);
+
+ return EPass;
+ }
+
+
+// Shutdown Socket
+//----------------
+
+CShutdownRSocketStep::CShutdownRSocketStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KShutdownRSocketStep);
+ }
+
+TInt CShutdownRSocketStep::ConfigureFromIni()
+ {
+ iParams.Reset();
+
+ // Read in appropriate fields
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF1(_L("Couldn't find appropriate field in config file"));
+ return KErrNotFound;
+ }
+
+ TPtrC shutdownType;
+ if (GetStringFromConfig(iSection,KTe_ShutdownTypeName,shutdownType)!=1)
+ {
+ INFO_PRINTF2(_L("%S: Shutdown type missing."),&iParams.iSocketName);
+ return KErrNotFound;
+ }
+
+ if (shutdownType.Compare(KTe_ShutdownNormal)==0)
+ { iParams.iShutdownType = RSocket::ENormal; }
+ else if (shutdownType.Compare(KTe_ShutdownStopInput)==0)
+ { iParams.iShutdownType = RSocket::EStopInput; }
+ else if (shutdownType.Compare(KTe_ShutdownStopOutput)==0)
+ { iParams.iShutdownType = RSocket::EStopOutput; }
+ else if (shutdownType.Compare(KTe_ShutdownImmediate)==0)
+ { iParams.iShutdownType = RSocket::EImmediate; }
+ else
+ {
+ INFO_PRINTF3(_L("%S: Shutdown type (%S) not recognised."),&iParams.iSocketName,&shutdownType);
+ return KErrNotFound;
+ }
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict CShutdownRSocketStep::doSingleTestStep()
+ {
+ TRequestStatus reqStat;
+ TInt error = iEsockTest->ShutdownSocket(iParams,reqStat);
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not connect socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+
+ User::WaitForRequest(reqStat);
+ error = reqStat.Int();
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not connect socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+ return EPass;
+ }
+
+
+// Ioctls
+//-------
+
+CSendReceiveIoctlStep::CSendReceiveIoctlStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KSendReceiveIoctlStep);
+ }
+
+_LIT(KIoctlCommand, "IoctlCommand");
+_LIT(KIoctlLevel, "IoctlLevel");
+_LIT(KExpectedIoctlOutput, "ExpectedOutput");
+
+TInt CSendReceiveIoctlStep::ConfigureFromIni()
+ {
+ // Reset the parameters and read in necessary fields
+ iParams.Reset();
+
+ // Socket to apply it to
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF3(KErrString_MissingConfigFileField, &iSection, &KTe_SocketName);
+ return KErrNotFound;
+ }
+
+ // Ioctl command
+ if (GetIntFromConfig(iSection, KIoctlCommand, iParams.iIoctlCommand) != 1)
+ {
+ INFO_PRINTF3(KErrString_MissingConfigFileField, &iSection, &KIoctlCommand);
+ return KErrNotFound;
+ }
+
+ // Ioctl level
+ // Default to
+ if (GetIntFromConfig(iSection, KIoctlLevel, iParams.iIoctlLevel) != 1)
+ {
+ INFO_PRINTF1(_L("Ioctl level not specified: defaulting"));
+ iParams.iIoctlLevel = KLevelUnspecified;
+ }
+
+ // Output to compare it with
+ if(GetStringFromConfig(iSection, KExpectedIoctlOutput, iParams.iExpectedIoctlOutput) != 1)
+ {
+ INFO_PRINTF3(KErrString_MissingConfigFileField, &iSection, &KExpectedIoctlOutput);
+ return KErrNotFound;
+ }
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict CSendReceiveIoctlStep::doSingleTestStep()
+ {
+ TRequestStatus requestStatus;
+
+ TBuf8<256> outputBuffer;
+ TInt error = iEsockTest->IoctlSocket(iParams, outputBuffer, requestStatus);
+
+ if (error != KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not find socket (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+
+ User::WaitForRequest(requestStatus);
+
+ error = requestStatus.Int();
+
+ if (error!=KErrNone)
+ {
+ INFO_PRINTF2(_L("Could not complete ioctl (%S)."),&iParams.iSocketName);
+ INFO_PRINTF2(_L("Error: %d."),error);
+ return EFail;
+ }
+
+ // Convert the output to wide chars
+ TBuf<256> outputConvertedToWideChars;
+ CnvUtfConverter::ConvertToUnicodeFromUtf8(outputConvertedToWideChars, outputBuffer);
+
+ // Validate the output with that expected
+ return (outputConvertedToWideChars == iParams.iExpectedIoctlOutput) ?
+ EPass :
+ EFail;
+ }
+
+
+// Get options
+//------------
+
+CSocketGetOptionStep::CSocketGetOptionStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KSocketGetOptionStep);
+ }
+
+_LIT(KOptionName, "OptionName");
+_LIT(KOptionLevel, "OptionLevel");
+_LIT(KExpectedOptionText, "ExpectedOptionText");
+_LIT(KExpectedOptionValue, "ExpectedOptionValue");
+
+TInt CSocketGetOptionStep::ConfigureFromIni()
+ {
+ // Reset the parameters and read in necessary fields
+ iParams.Reset();
+
+ // Socket to apply it to
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF3(KErrString_MissingConfigFileField, &iSection, &KTe_SocketName);
+ return KErrNotFound;
+ }
+
+ // Option "name"
+ if (GetIntFromConfig(iSection, KOptionName, iParams.iOptionName) != 1)
+ {
+ INFO_PRINTF3(KErrString_MissingConfigFileField, &iSection, &KOptionName);
+ return KErrNotFound;
+ }
+
+ // Option level
+ if (GetIntFromConfig(iSection, KOptionLevel, iParams.iOptionLevel) != 1)
+ {
+ INFO_PRINTF1(_L("Option level not specified: defaulting to KLevelUnspecified"));
+ iParams.iOptionLevel = KLevelUnspecified;
+ }
+
+ // Output string to compare it with
+ if(GetStringFromConfig(iSection, KExpectedOptionText, iParams.iExpectedOptionOutputText) == 1)
+ {
+ iParams.iTextExpected = ETrue;
+ }
+
+ // Output value to compare it with
+ if(GetIntFromConfig(iSection, KExpectedOptionValue, iParams.iExpectedOptionOutputValue) == 1)
+ {
+ iParams.iValueExpected = ETrue;
+ }
+
+ // Checks on config values
+ if(iParams.iValueExpected && iParams.iTextExpected)
+ {
+ INFO_PRINTF1(_L("Can be only value of text expected. Not both"));
+ return KErrCorrupt;
+ }
+
+ if(!iParams.iValueExpected && !iParams.iTextExpected)
+ {
+ INFO_PRINTF1(_L("Must have value or text expected."));
+ return KErrCorrupt;
+ }
+
+
+ // All ok if we got this far
+ return KErrNone;
+ }
+
+TVerdict CSocketGetOptionStep::doSingleTestStep()
+ {
+ TRequestStatus requestStatus;
+
+ TBuf8<256> outputBuffer;
+ TInt outputValue;
+ TInt error;
+ if(iParams.iTextExpected)
+ {
+ error = iEsockTest->GetOptSocket(iParams, outputBuffer);
+ }
+ else
+ {
+ error = iEsockTest->GetOptSocket(iParams, outputValue);
+ }
+
+ if (error != KErrNone)
+ {
+ INFO_PRINTF3(_L("Socket get option error. socket:%S, error:%d"), &iParams.iSocketName, error);
+ SetTestStepError(error);
+ return EFail;
+ }
+
+ if(iParams.iTextExpected)
+ {
+ // Convert the output to wide chars
+ TBuf<256> outputConvertedToWideChars;
+ CnvUtfConverter::ConvertToUnicodeFromUtf8(outputConvertedToWideChars, outputBuffer);
+
+ // Log what was returned
+ INFO_PRINTF2(_L("Socket returned get opt value. value:%S"), &outputConvertedToWideChars);
+ INFO_PRINTF2(_L("Expected get opt value. value:%S"), &iParams.iExpectedOptionOutputText);
+
+ // Validate the output with that expected
+ TVerdict verdict = (outputConvertedToWideChars == iParams.iExpectedOptionOutputText) ? EPass : EFail;
+ SetTestStepResult(verdict);
+ }
+ else
+ {
+ // Log what was returned
+ INFO_PRINTF2(_L("Socket returned get opt value. value:%d"), outputValue);
+ INFO_PRINTF2(_L("Expected get opt value. value:%d"), iParams.iExpectedOptionOutputValue);
+
+ // Validate the output with that expected
+ TVerdict verdict = (outputValue == iParams.iExpectedOptionOutputValue) ? EPass : EFail;
+ SetTestStepResult(verdict);
+ }
+
+ // Return the result
+ return TestStepResult();
+ }
+
+
+
+// Socket protocol description
+//----------------------------
+CSocketProtocolDescriptionStep::CSocketProtocolDescriptionStep(CCEsockTestBase*& aEsockTest)
+: CTe_EsockStepBase(aEsockTest)
+ {
+ SetTestStepName(KSocketProtocolDescriptionStep);
+ }
+
+TInt CSocketProtocolDescriptionStep::ConfigureFromIni()
+ {
+ // Reset the parameters and read in necessary fields
+ iParams.Reset();
+
+ // Socket to apply it to
+ if((GetStringFromConfig(iSection, KTe_SocketName, iParams.iSocketName) != 1)
+ || (iParams.iSocketName.Length() == 0))
+ {
+ INFO_PRINTF3(KErrString_MissingConfigFileField, &iSection, &KTe_SocketName);
+ return KErrNotFound;
+ }
+
+ TInt descStatus = TProtocolDescriptionParams::FetchDescription(iParams.iProtocolDescParams, *this);
+ return descStatus;
+ }
+
+
+TVerdict CSocketProtocolDescriptionStep::doSingleTestStep()
+ {
+ TProtocolDesc desc;
+ TInt error = iEsockTest->ProtocolDescription(iParams, desc);
+
+ if (error != KErrNone)
+ {
+ INFO_PRINTF3(_L("Could not fetch protocol description from socket. socket:%S, error:%d"), &iParams.iSocketName, error);
+ return EFail;
+ }
+
+ // Validate the output with that expected
+ if(iParams.iProtocolDescParams.MatchesExpected(desc))
+ {
+ return EPass;
+ }
+ else
+ {
+ INFO_PRINTF1(_L("Protocol description does not match that expected"));
+ return EFail;
+ }
+ }
+
+
+