datacommsserver/esockserver/test/TE_ESock/EsockTestSection5.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_ESock/EsockTestSection5.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,1559 @@
+// Copyright (c) 2001-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:
+// This contains ESock Test cases from section 5
+// EPOC includes
+// 
+//
+
+#include <e32base.h>
+#include <in_sock.h>
+#include <e32math.h>
+
+//anonymous namespace
+namespace
+    {
+    //once the aRefBoolFlag set to false it never gets set again...
+    void setResultFlagBool(const TBool aFlag, TBool& aRefBoolFlag)
+        {
+        if (aRefBoolFlag)
+            {
+            aRefBoolFlag = aFlag;
+            }
+        }
+    
+    //once the aRefBoolFlag set to false it never gets set again...
+     void setResultFlagInt(const TInt aFlag, TBool& aRefBoolFlag)
+        {
+        if (aRefBoolFlag)
+            {
+            if (aFlag != KErrNone)
+                {
+                    aRefBoolFlag = EFalse;
+                }
+            }
+        }
+        
+        const TUint KMaxTestStepCounter = 5;
+    }
+// Test system includes
+#include "EsockTestSection5.h"
+
+// Test step SendData
+// this test is used by the integration test scripts
+// and is based on esock test 5.3
+// This test step sends TCP and UDP (if enabled in ini file) data
+const TDesC& CEsockSendData::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"SendData");
+	
+	return ret;
+	}
+
+CEsockSendData::~CEsockSendData()
+	{
+	}
+
+enum TVerdict CEsockSendData::easyTestStepL()
+	{
+	TInetAddr addrRemote, addr;
+	TRequestStatus stat(KErrNone);
+	TInt connectTimer, Port;
+	TBool UdpEnable;
+	
+	TInt testStepCounter = 0;
+	TBool testStepResult;
+	TBool socketConnected = EFalse;
+	TBool udpBindOK = EFalse;
+	
+	do
+	    {
+	    testStepResult = ETrue;
+	    
+    	// get ip address to connect to (on echo port)
+    	TESTL(GetIpAddressFromConfig(_L("Test_Common"), _L("ipAddress"), addrRemote));
+    	
+    	// get the port number
+    	TESTL(GetIntFromConfig(_L("SendData"), _L("Port"), Port));
+    	addrRemote.SetPort(Port);
+    	
+    	// format for display 
+    	TBuf<39> AddrBuf;
+    	addrRemote.OutputWithScope(AddrBuf);
+    	
+    	// check if UDP test enabled
+    	TBool res = GetBoolFromConfig(_L("SendData"), _L("UdpEnable"), UdpEnable );
+    	
+    	if (( res == EFalse ) || ( UdpEnable == EFalse ))
+    		{
+    		Logger().WriteFormat( _L("UDP test disabled"));
+    		UdpEnable = EFalse;
+    		}
+    	
+    	// get a value for the connection guard timer 
+    	TESTL(GetIntFromConfig(_L("SendData"), _L("connectTimer"), connectTimer));
+    	
+    	// create timer to use as a guard timer
+    	RTimer GuardTimer;
+    	GuardTimer.CreateLocal();			// for this thread
+    	TRequestStatus TimerStatus;			// status to monitor timer
+    	TInt RepeatCount = 0;				// repeat counter 
+    	TInt WaitTimeout = 5000000;
+
+        if (!socketConnected)
+            {
+        	// try 5 times (sometimes it fails because of test network)
+        	for(RepeatCount=0; RepeatCount <=5;  RepeatCount++)
+        		{
+        		// connect
+        		(iEsockSuite->GetSocketHandle(1)).Connect(addrRemote, stat);
+        		
+        		// start timer
+        		GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+        		
+        		// wait for either timer or connect
+        		User::WaitForRequest(stat, TimerStatus);
+        		GuardTimer.Cancel();
+        		User::WaitForAnyRequest();
+        		
+        		// check connect result
+        		if (stat.Int() == KRequestPending)
+        			{
+        			(iEsockSuite->GetSocketHandle(1)).CancelConnect();
+        			Logger().WriteFormat( _L("Socket connect to %S port %d has not completed within %d seconds (connectTimer from ini) "), 
+        				&AddrBuf,
+        				Port,
+        				connectTimer ); 
+        			User::After(WaitTimeout);
+        			continue; // next attempt
+        			}
+        		else if(stat.Int() != KErrNone)
+        			{
+        			Logger().WriteFormat( _L("Socket connect failed with error %d"), stat.Int());
+        			if(RepeatCount <= 5)
+        				{
+        				Logger().WriteFormat( _L("Try to reconnect. RepeatCount %d"), RepeatCount);
+        				User::After(WaitTimeout);
+        				continue; // next attempt
+        				}
+        		    else
+        		        {
+        		        setResultFlagInt(stat.Int(), testStepResult);
+        		        }
+        			}
+        		else
+        		    {
+        		    socketConnected = ETrue;
+        		    }
+        		
+        		break; // exit "for"
+        		}
+        	
+        	TESTEL((stat.Int()==KErrNone),stat.Int());
+            }
+    	
+    	// get number of packets and size of packets 
+    	TInt PacketSize = 0;
+    	TESTL(GetIntFromConfig(_L("SendData"), _L("PacketSize"), PacketSize));
+    	TInt NoPackets = 0;
+    	TESTL(GetIntFromConfig(_L("SendData"), _L("NoPackets"), NoPackets));
+    	Logger().WriteFormat( _L("Sending to %S port %d TCP data %d packets of %d bytes = %d"), 
+    		&AddrBuf, Port, NoPackets, PacketSize, NoPackets * PacketSize);
+    	
+    	// set up data buffers
+    	HBufC8 * writebuf = HBufC8::NewMaxLC( PacketSize );
+    	HBufC8 * readbuf  = HBufC8::NewMaxLC( PacketSize );
+    	TPtr8 ptrWritebuf = writebuf->Des();
+    	TPtr8 ptrReadbuf = readbuf->Des();
+    	
+    	// small buffer for data pattern to be sent
+    	TBuf8<50> Data;
+    	
+    	// send data (NoPackets packets of PacketSize bytes)
+    	TInt recvCount = 0;
+    	for (TInt i = 0; i < NoPackets; i++)
+    		{
+    		// initialise data
+    		Data.Format(_L8("TCP-packet:%d helloworld"),i);
+    		ptrWritebuf.Repeat( Data );
+    		
+    		// write data 
+    		GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+    		(iEsockSuite->GetSocketHandle(1)).Write(ptrWritebuf, stat);
+    		User::WaitForRequest(stat, TimerStatus);
+    		GuardTimer.Cancel();
+    		User::WaitForAnyRequest();
+    		
+    		if (stat == KRequestPending)
+    			{
+    			(iEsockSuite->GetSocketHandle(1)).CancelWrite();
+    			Logger().WriteFormat(_L("Timeout on Tcp Send packet %d after %d seconds"), i, connectTimer);
+    			setResultFlagInt(stat.Int(), testStepResult);
+    			}
+    		else if (stat != KErrNone)
+    			{
+    			Logger().WriteFormat(_L("Tcp Send packet %d failed with error %d"), i, stat.Int());
+    			setResultFlagInt(stat.Int(), testStepResult);
+    			}
+    		TESTEL( stat == KErrNone, stat.Int() );
+    		
+    		// read data (from echo server)
+    		GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+    		(iEsockSuite->GetSocketHandle(1)).Read(ptrReadbuf, stat);
+    		User::WaitForRequest(stat, TimerStatus);
+    		GuardTimer.Cancel();
+    		User::WaitForAnyRequest();
+    		
+    		TESTE( stat == KErrNone, stat.Int() );
+    		if (stat == KRequestPending)
+    			{
+    			(iEsockSuite->GetSocketHandle(1)).CancelRead();
+    			Logger().WriteFormat(_L("Timeout on Tcp Recv packet %d after %d seconds"), i, connectTimer);
+    			setResultFlagInt(stat.Int(), testStepResult);
+    			}
+    		else if (stat != KErrNone)
+    			{
+    			Logger().WriteFormat(_L("Tcp Recv packet %d failed with error %d"), i, stat.Int());
+    			setResultFlagInt(stat.Int(), testStepResult);
+    			}
+    		else
+    			{
+    			// compare the data
+    			TEST( ptrWritebuf.Compare( ptrReadbuf ) == 0);
+    			recvCount+=ptrReadbuf.Length();
+    			}
+    		}
+    	
+    	// check the total received.
+    	TEST(recvCount==(NoPackets*PacketSize));
+    	
+    	//** UDP STARTS HERE
+    	// test UDP if required
+    	if ( UdpEnable )
+    		{
+    		TESTL(GetIntFromConfig(_L("SendData"), _L("UdpPacketSize"), PacketSize));
+    		
+    		// get the port number
+    		// Can't send back on Echo port as it would enter an infinite loop
+    		if (!GetIntFromConfig(_L("SendData"), _L("UdpPort"), Port))
+    			// use default
+    			Port = 9200;
+    		
+    		Logger().WriteFormat( _L("Sending to %S Port %d UDP data %d packets of %d bytes = %d"), 
+    			&AddrBuf, Port, NoPackets, PacketSize, NoPackets * PacketSize);
+    		
+    		
+    		// and make some new buffers the correct size
+    		HBufC8 * UdpWritebuf = HBufC8::NewMaxLC( PacketSize );
+    		HBufC8 * UdpReadbuf  = HBufC8::NewMaxLC( PacketSize );
+    		TPtr8 ptrUdpWritebuf = UdpWritebuf->Des();
+    		TPtr8 ptrUdpReadbuf = UdpReadbuf->Des();
+    		
+    		// open a udp socket
+    		RSocket UdpSock;
+    		TInt nRet = UdpSock.Open(iEsockSuite->iSocketServer, KAfInet, KSockDatagram, KProtocolInetUdp);
+    		if (nRet != KErrNone)
+    			{
+    			Logger().WriteFormat(_L("Failed to open socket: return value = <%d>"), nRet);
+    			setResultFlagBool(EFail, testStepResult);
+    			//return EFail;  
+    			}
+    		
+    		if (testStepResult)
+    		    {
+            		addr.SetPort(Port);
+            		
+            		// Bind
+            		TInt result = UdpSock.SetOpt(KSoUdpSynchronousSend, KSolInetUdp, 1 );
+            		
+            		UdpSock.SetOpt(KSoReuseAddr, KSolInetIp, KMaxTestStepCounter);
+            		
+            		TESTEL( KErrNone ==result,result);
+            		
+            		if (!udpBindOK)
+            		    {
+                		result = UdpSock.Bind(addr);
+                		TESTEL( KErrNone ==result,result);
+                		udpBindOK = ETrue;
+            		    }
+            		
+            		
+            		// write & read back the data
+            		recvCount = 0;
+            		for (TInt j = 0; j < NoPackets; j++)
+            			{
+            			// initialise data
+            			Data.Format(_L8("UDP-packet:%d helloworld"),j);
+            			ptrUdpWritebuf.Repeat( Data );
+            			
+            			// write data 
+            			GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+            			UdpSock.SendTo(ptrUdpWritebuf, addrRemote, 0, stat);
+            			User::WaitForRequest(stat, TimerStatus);
+            			GuardTimer.Cancel();
+            			User::WaitForAnyRequest();
+            			
+            			if (stat == KRequestPending)
+            				{
+            				UdpSock.CancelSend();
+            				Logger().WriteFormat(_L("Timeout on Udp Send packet %d after %d seconds"), j, connectTimer);
+            				setResultFlagInt(stat.Int(), testStepResult);
+                            
+            				}
+            			else if (stat != KErrNone)
+            				{
+            				Logger().WriteFormat(_L("Udp Send packet %d failed with error %d"), j, stat.Int());
+            				setResultFlagInt(stat.Int(), testStepResult);
+            				}
+            			
+            			// read data (from echo server)
+            			GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+            			UdpSock.RecvFrom(ptrUdpReadbuf, addr, 0, stat);
+            			User::WaitForRequest(stat, TimerStatus);
+            			GuardTimer.Cancel();
+            			User::WaitForAnyRequest();
+            			
+            			if (stat == KRequestPending)
+            				{
+            				UdpSock.CancelRecv();
+            				Logger().WriteFormat(_L("Timeout on Udp Recv packet %d after %d seconds"), j, connectTimer);
+            				setResultFlagInt(stat.Int(), testStepResult);
+            				}
+            			else if (stat.Int() != KErrNone) 
+            				{
+            				Logger().WriteFormat(_L("Udp Recv packet %d failed with error %d"), j, stat.Int());
+            				setResultFlagInt(stat.Int(), testStepResult);
+            				}
+            			//TEST( stat == KErrNone );  ** We could have packet loss with UDP in real life
+            			else
+            				{
+            				// compare the data
+            				TEST( ptrUdpWritebuf.Compare( ptrUdpReadbuf ) == 0);
+            				recvCount += ptrUdpReadbuf.Length();
+            				}
+            			}
+            		
+            		Logger().WriteFormat(_L("Udp data sent %d bytes, data received %d bytes"),(NoPackets*PacketSize),recvCount);
+            		
+            		// check the total received (95 per cent is allowable for us)
+            		//TESTE( recvCount >= (NoPackets*PacketSize), (NoPackets*PacketSize) );
+            				
+            		// close the UDP socket
+                    UdpSock.Close();
+    		    }
+            
+    		// get rid of the old buffers 
+    		CleanupStack::PopAndDestroy();	//	UdpWritebuf;
+    		CleanupStack::PopAndDestroy();	//	UdpReadbuf;
+    		}
+    		
+    	CleanupStack::PopAndDestroy();	//	writebuf;
+    	CleanupStack::PopAndDestroy();	//	readbuf;
+    	
+    	
+    	if (!testStepResult)
+    	    {
+    	    Logger().WriteFormat(_L("TestStep failed %d time(s) from %d. Trying further..."), testStepCounter, KMaxTestStepCounter);
+    	    
+    	    ++testStepCounter;
+    	    }
+    	
+	    }
+	    while ( (testStepCounter < KMaxTestStepCounter) &&
+	          (!testStepResult) ); //big while...
+         
+
+    if ( testStepResult )
+        {
+	    return EPass;
+        }
+    else
+        {
+        return EFail;
+        }
+	}
+	
+	
+// Test step SendTcpData
+// this test is used by the integration test scripts
+// and is based on esock test 5.3
+// This test step sends TCP data only
+const TDesC& CEsockSendTcpData::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"SendTcpData");
+	
+	return ret;
+	}
+
+CEsockSendTcpData::~CEsockSendTcpData()
+	{
+	}
+
+enum TVerdict CEsockSendTcpData::easyTestStepL()
+	{
+	TInetAddr addrRemote;
+	TRequestStatus stat;
+	TInt connectTimer, Port;
+	
+	// get ip address to connect to (on echo port)
+	TESTL(GetIpAddressFromConfig(_L("Test_Common"), _L("ipAddress"), addrRemote));
+	
+	// get the port number
+	TESTL(GetIntFromConfig(_L("SendData"), _L("Port"), Port));
+	addrRemote.SetPort(Port);
+	
+	// format for display 
+	TBuf<39> AddrBuf;
+	addrRemote.OutputWithScope(AddrBuf);
+	
+	// get a value for the connection guard timer 
+	TESTL(GetIntFromConfig(_L("SendData"), _L("connectTimer"), connectTimer));
+	
+	// create timer to use as a guard timer
+	RTimer GuardTimer;
+	GuardTimer.CreateLocal();			// for this thread
+	TRequestStatus TimerStatus;			// status to monitor timer
+	
+    // connect
+    (iEsockSuite->GetSocketHandle(1)).Connect(addrRemote, stat);
+	
+	// start timer
+	GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+	
+	// wait for either timer or connect
+	User::WaitForRequest(stat, TimerStatus);
+	GuardTimer.Cancel();
+	User::WaitForAnyRequest();
+	
+	// check connect result
+	if (stat!=KErrNone)
+		{
+		// either connect failed or timer expired
+		// because it may be the timer cancel connect
+		(iEsockSuite->GetSocketHandle(1)).CancelConnect();
+		
+		Logger().WriteFormat( _L("Socket connect has not completed within %d seconds (connectTimer from ini) "), connectTimer ); 
+		
+		// report this failure and leave
+		TESTL((stat==KErrNone));
+		}
+	
+	// get number of packets and size of packets 
+	TInt PacketSize = 0;
+	TESTL(GetIntFromConfig(_L("SendData"), _L("PacketSize"), PacketSize));
+	TInt NoPackets = 0;
+	TESTL(GetIntFromConfig(_L("SendData"), _L("NoPackets"), NoPackets));
+	Logger().WriteFormat( _L("Sending to %S TCP data %d packets of %d bytes = %d"), 
+		&AddrBuf, NoPackets, PacketSize, NoPackets * PacketSize);
+	
+	// set up data buffers
+	HBufC8 * writebuf = HBufC8::NewMaxLC( PacketSize );
+	HBufC8 * readbuf  = HBufC8::NewMaxLC( PacketSize );
+	TPtr8 ptrWritebuf = writebuf->Des();
+	TPtr8 ptrReadbuf = readbuf->Des();
+	
+	// initialise data
+	TBuf8<50> Data;
+	
+	// send data (NoPackets packets of PacketSize bytes)
+	TInt recvCount = 0;
+	for (TInt i = 0; i < NoPackets; i++)
+		{
+		// initialise data
+		Data.Format(_L8("TCP-packet:%d helloworld"),i);
+		ptrWritebuf.Repeat( Data );
+		
+		// write data 
+		GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+		(iEsockSuite->GetSocketHandle(1)).Write(ptrWritebuf, stat);
+		User::WaitForRequest(stat, TimerStatus);
+		GuardTimer.Cancel();
+		User::WaitForAnyRequest();
+		
+		if (stat != KErrNone) Logger().WriteFormat(_L("Timeout on Tcp Send after %d seconds"), connectTimer);
+		TESTL( stat == KErrNone );
+		
+		// read data (from echo server)
+		GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+		(iEsockSuite->GetSocketHandle(1)).Read(ptrReadbuf, stat);
+		User::WaitForRequest(stat, TimerStatus);
+		GuardTimer.Cancel();
+		User::WaitForAnyRequest();
+		
+		if (stat != KErrNone) Logger().WriteFormat(_L("Timeout on Tcp Recv after %d seconds"), connectTimer);
+		TESTL( stat == KErrNone );
+		
+		// compare the data
+		TESTL( ptrWritebuf.Compare( ptrReadbuf ) == 0);
+		
+		recvCount+=ptrReadbuf.Length();
+		}
+	
+	// check the total received.
+	TESTL(recvCount==(NoPackets*PacketSize));
+	
+	CleanupStack::PopAndDestroy();	//	writebuf;
+	CleanupStack::PopAndDestroy();	//	readbuf;
+	
+	return EPass;
+	}
+	
+// Open Udp Socket
+const TDesC& CEsockOpenUdpSocket::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"OpenUdpSocket");
+	
+	return ret;
+	}
+
+CEsockOpenUdpSocket::~CEsockOpenUdpSocket()
+	{
+	}
+
+enum TVerdict CEsockOpenUdpSocket::easyTestStepL()
+	{
+	TInt nRet;
+	TInt nSockets; // number of sockets to open
+	TInetAddr addr;
+	TBuf<32> buf;
+	TInt i;
+	
+	RSocket sock;
+	
+	// get number of sockets from script
+	TESTL(GetIntFromConfig(SectionName(_L("Test_1.2")), _L("numSockets"), nSockets));
+	
+	Logger().WriteFormat(_L("Open <%d> UDP socket(s)"), nSockets);
+	for (i = 0; i < nSockets; i++)
+		{
+		
+		// open a UDP socket
+		nRet = sock.Open(iEsockSuite->iSocketServer, KAfInet, KSockDatagram, KProtocolInetUdp);
+		
+		if (nRet != KErrNone)
+			{
+			
+			Logger().WriteFormat(_L("Failed to open socket: return value = <%d>"), nRet);
+			return EFail;  // do not try to open more sockets
+			}
+		
+		// store socket handle
+		iEsockSuite->AddSocketToListL(sock);
+		}
+	
+	for (i = 0; i < nSockets; i++)
+		{
+		// Get local address of the socket (Empty)
+		(iEsockSuite->GetSocketHandle(i + 1)).LocalName(addr);
+		
+		// Check length of buffer, should be set to (Zero)
+		addr.OutputWithScope(buf);
+		TESTL(buf.Length() == 0);
+		}
+	
+	return EPass;
+	}
+
+// send Udp Data
+const TDesC& CEsockSendUdpData::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"SendUdpData");
+	
+	return ret;
+	}
+
+CEsockSendUdpData::~CEsockSendUdpData()
+	{
+	}
+
+enum TVerdict CEsockSendUdpData::easyTestStepL()
+	{
+	TInt testStepCounter = 0;
+	TBool bindIsOK = EFalse;
+	TBool testStepResult;
+	
+	TInetAddr addrRemote, addr;
+	TRequestStatus stat;
+	TInt connectTimer, Port;
+	TInt result;
+	
+	do
+	    {
+	    testStepResult = ETrue;
+	    
+    	// get ip address to connect to (on echo port)
+    	TESTL(GetIpAddressFromConfig(_L("Test_Common"), _L("ipAddress"), addrRemote));
+    	
+    	// get the port number
+    	TESTL(GetIntFromConfig(_L("SendData"), _L("Port"), Port));
+    	addrRemote.SetPort(Port);
+    	
+    	// get the port number
+    	if(!GetIntFromConfig(_L("SendData"), _L("UdpPort"), Port))
+    		Port = 9200;  // WAP UDP by default
+    	
+    	// Can't send back on Echo port as it would enter an infinite loop
+    	addr.SetPort(Port);
+    	
+    	// format for display 
+    	TBuf<39> AddrBuf;
+    	addrRemote.OutputWithScope(AddrBuf);
+    	
+    	// get a value for the connection guard timer 
+    	TESTL(GetIntFromConfig(_L("SendData"), _L("connectTimer"), connectTimer));
+    	
+    	// create timer to use as a guard timer
+    	RTimer GuardTimer;
+    	GuardTimer.CreateLocal();			// for this thread
+    	TRequestStatus TimerStatus;			// status to monitor timer
+    	
+    	// get number of packets and size of packets 
+    	TInt PacketSize = 0;
+    	TESTL(GetIntFromConfig(_L("SendData"), _L("UdpPacketSize"), PacketSize));
+    	TInt NoPackets = 0;
+    	TESTL(GetIntFromConfig(_L("SendData"), _L("NoPackets"), NoPackets));
+    	Logger().WriteFormat( _L("Send Udp Data to %S port %d in %d packets of %d bytes = %d"), 
+    		&AddrBuf, Port, NoPackets, PacketSize, NoPackets * PacketSize);
+    	
+    	// and make some new buffers the correct size
+    	HBufC8 * UdpWritebuf = HBufC8::NewMaxLC( PacketSize );
+    	HBufC8 * UdpReadbuf  = HBufC8::NewMaxLC( PacketSize );
+    	TPtr8 ptrUdpWritebuf = UdpWritebuf->Des();
+    	TPtr8 ptrUdpReadbuf = UdpReadbuf->Des();
+    	
+    	result = (iEsockSuite->GetSocketHandle(1)).SetOpt(KSoUdpSynchronousSend, KSolInetUdp, 1 );
+    	
+    	// Bind
+    	if (!bindIsOK)
+    	    {
+    	    result = (iEsockSuite->GetSocketHandle(1)).Bind(addr);
+    	    TESTEL( KErrNone ==result,result);
+    	    bindIsOK = ETrue;
+    	    }
+    	
+    	TBuf8<50> Data;
+    	
+    	// write & read back the data
+    	TInt recvCount = 0;
+    	for (TInt i = 0; i < NoPackets; i++)
+    		{
+    		// initialise data
+    		Data.Format(_L8("UDP-packet:%d helloworld"),i);
+    		ptrUdpWritebuf.Repeat( Data );
+    		
+    		// write data 
+    		GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+    		(iEsockSuite->GetSocketHandle(1)).SendTo(ptrUdpWritebuf, addrRemote, 0, stat);
+    		User::WaitForRequest(stat, TimerStatus);
+    		GuardTimer.Cancel();
+    		User::WaitForAnyRequest();
+    		
+    		if (stat.Int() != KErrNone)
+    		    {
+    			Logger().WriteFormat(_L("Error on Udp Send after %d seconds, reason"), connectTimer, stat.Int());
+    			setResultFlagInt(stat.Int(), testStepResult);
+    		    }
+    		
+    		//TESTE( stat.Int() == KErrNone, stat.Int() );
+    		
+    		// read data (from echo server)
+    		GuardTimer.After(TimerStatus,connectTimer * 1000000); 
+    		(iEsockSuite->GetSocketHandle(1)).RecvFrom(ptrUdpReadbuf, addr, 0, stat);
+    		User::WaitForRequest(stat, TimerStatus);
+    		GuardTimer.Cancel();
+    		User::WaitForAnyRequest();
+    		
+    		if (stat.Int() != KErrNone) 
+    			{
+    			Logger().WriteFormat(_L("Error on Udp Recv (packet %d) after %d seconds, reason %d"), i, connectTimer, stat.Int());
+    			(iEsockSuite->GetSocketHandle(1)).CancelRecv();
+    			setResultFlagInt(stat.Int(), testStepResult);
+    			//TESTE( (stat.Int() == KErrNone), stat.Int() );  ** this is UDP, packet loss possible
+    			}
+    		else
+    			{
+    			// compare the data
+    			TEST( ptrUdpWritebuf.Compare( ptrUdpReadbuf ) == 0 );
+    			recvCount += ptrUdpReadbuf.Length();
+    			}
+    		
+    		}
+    	// Log what the % of the data was received!
+    	Logger().WriteFormat(_L("Number of UDP packets sent %d, Number received %d"),NoPackets,recvCount);
+    	
+    	
+    	// get rid of the old buffers 
+    	CleanupStack::PopAndDestroy();	//	UdpWritebuf;
+    	CleanupStack::PopAndDestroy();	//	UdpReadbuf;
+    	
+    	
+	    if (!testStepResult)
+    	    {
+    	    Logger().WriteFormat(_L("TestStep failed %d time(s) from %d. Trying further..."), testStepCounter, KMaxTestStepCounter);
+    	    
+    	    ++testStepCounter;
+    	    }
+    	    
+	    }
+	    while ( (testStepCounter < KMaxTestStepCounter) &&
+	          (!testStepResult) ); //big while...
+     
+
+    if ( testStepResult )
+        {
+	    return EPass;
+        }
+    else
+        {
+        return EFail;
+        }
+	}
+	
+	
+// Test step 5.1
+const TDesC& CEsockTest5_1::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"Test5.1");
+	
+	return ret;
+	}
+
+CEsockTest5_1::~CEsockTest5_1()
+	{
+	}
+
+enum TVerdict CEsockTest5_1::easyTestStepPreambleL()
+	{
+	TInt connections;
+	TRAPD(ret, connections = OpenConnectionsL(_L("Test_5.1"), iSockIndex2, iSockIndex3));
+	if (KErrNone != ret)
+		{
+		return EFail;
+		}
+	if (0 >= connections)
+		{
+		return EFail;
+		}
+
+	return EPass;
+	}
+
+enum TVerdict CEsockTest5_1::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+	
+	// set up data buffers
+	TBuf8<100> wbuf, rbuf1;
+	TBuf8<20> rbuf2;
+	wbuf.SetLength(20);
+	StripeDes(wbuf, 0, wbuf.Length(), '@', 'Z');
+	
+	// for each pair of connected sockets
+	TRequestStatus stat;
+	TInt i;
+	for (i = 0; i < iNumSockets; i++)
+		{
+		// send data from client to server (20 bytes)
+		iEsockSuite->GetSocketHandle(iSockIndex2 + (i*2)).Write(wbuf, stat);
+		User::WaitForRequest(stat);
+		TESTEL(stat==KErrNone, stat.Int());
+		
+		// read data (server)
+		iEsockSuite->GetSocketHandle(iSockIndex3 + (i*2)).Read(rbuf2, stat);
+		User::WaitForRequest(stat);
+		TESTEL(stat==KErrNone, stat.Int());
+		TESTL(rbuf2==wbuf);
+		}
+	
+	// send data from server to client (100 bytes)
+	wbuf.SetMax();
+	StripeDes(wbuf, 0, wbuf.Length(), '@', 'Z');
+	
+	// for each pair of connected sockets
+	for (i = 0; i < iNumSockets; i++)
+		{
+		// send data from server to client
+		(iEsockSuite->GetSocketHandle(iSockIndex2 + (i*2))).Write(wbuf, stat);
+		User::WaitForRequest(stat);
+		TESTEL(stat==KErrNone, stat.Int());
+		
+		// read data (client)
+		(iEsockSuite->GetSocketHandle(iSockIndex3 + (i*2))).Read(rbuf1, stat);
+		User::WaitForRequest(stat);
+		TESTEL(stat==KErrNone, stat.Int());
+		
+		// check received data
+		TESTL(rbuf1==wbuf);
+		}
+	
+	return EPass;
+	}
+
+
+// Test step 5.2
+const TDesC& CEsockTest5_2::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"Test5.2");
+	
+	return ret;
+	}
+
+CEsockTest5_2::~CEsockTest5_2()
+	{
+	}
+
+enum TVerdict CEsockTest5_2::easyTestStepPreambleL()
+	{
+	TInt connections;
+	TRAPD(ret, connections = OpenConnectionsL(_L("Test_5.2"), iSockIndex2, iSockIndex3));
+	if (KErrNone != ret)
+		{
+		return EFail;
+		}
+	if (0 >= connections)
+		{
+		return EFail;
+		}
+
+	return EPass;
+	}
+
+enum TVerdict CEsockTest5_2::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+	
+	// set up data buffers
+	TBuf8<1024> wbuf;
+	
+	StripeDes(wbuf, 0, wbuf.MaxLength(), '@', 'Z');
+	wbuf.SetLength(20);
+	
+	// send data from client to server (20 bytes)
+	TRequestStatus stat;
+	iEsockSuite->GetSocketHandle(iSockIndex2).Send(wbuf, 0, stat);
+	User::WaitForRequest(stat);
+	TESTEL(stat==KErrNone, stat.Int());
+	
+	// read data 
+	TBuf8<20> rbuf2;
+	iEsockSuite->GetSocketHandle(iSockIndex3).Recv(rbuf2, 0, stat);
+	User::WaitForRequest(stat);
+	TESTEL(stat==KErrNone, stat.Int());
+	
+	TESTL(wbuf==rbuf2);
+	
+	// send data from server to client (20 packets of 1024 bytes)
+	wbuf.SetLength(1024);
+	TInt recvCount = 0;
+	TBuf8<1024> rbuf1;
+	for (TInt i = 0; i < 20; i++)
+		{
+		iEsockSuite->GetSocketHandle(iSockIndex3).Send(wbuf, 0, stat);
+		User::WaitForRequest(stat);
+		TESTL(stat==KErrNone);
+		
+		iEsockSuite->GetSocketHandle(iSockIndex2).Recv(rbuf1, 0, stat);
+		User::WaitForRequest(stat);
+		TESTEL(stat==KErrNone, stat.Int());
+		
+		recvCount+=rbuf1.Length();
+		}
+	
+	// check number of bytes received
+	TESTL(recvCount==(20*1024));
+	
+	// send data from client to server (20 packets of 512 bytes)
+	wbuf.SetLength(512);
+	recvCount = 0;
+	TBuf8<512> rbuf3;
+	for (TInt ii = 0; ii < 20; ii++)
+		{
+		iEsockSuite->GetSocketHandle(iSockIndex2).Send(wbuf, 0, stat);
+		User::WaitForRequest(stat);
+		TESTL(stat==KErrNone);
+		
+		iEsockSuite->GetSocketHandle(iSockIndex3).Recv(rbuf3, 0, stat);
+		User::WaitForRequest(stat);
+		TESTEL(stat==KErrNone, stat.Int());
+		
+		recvCount+=rbuf3.Length();
+		}
+	
+	// check number of bytes received
+	TESTL(recvCount==(20*512));
+	
+	return EPass;
+	}
+
+
+// Test step 5.3
+const TDesC& CEsockTest5_3::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"Test5.3");
+	
+	return ret;
+	}
+
+CEsockTest5_3::~CEsockTest5_3()
+	{
+	}
+
+enum TVerdict CEsockTest5_3::easyTestStepPreambleL()
+	{
+	CloseSockets();
+	if (KErrNone != OpenMinSockets(_L("Test_5.3"),KAfInet, KSockStream, KProtocolInetTcp))
+		{
+		return EFail;
+		}
+
+	// get ip address to connect to (on echo port)
+	TInetAddr addrRemote;
+	if (!GetIpAddressFromConfig(_L("Test_Common"), _L("ipAddress"), addrRemote))
+		{
+		return EFail;
+		}
+	addrRemote.SetPort(7);
+	
+	// get log level
+	if (!GetIntFromConfig(_L("Test_5.3"), _L("logLevel"), iLogLevel))
+		{
+		iLogLevel = 0;
+		}
+
+	// connect
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("Connect to remote host..."));
+		}
+	TRequestStatus stat;
+	(iEsockSuite->GetSocketHandle(1)).Connect(addrRemote, stat);
+	User::WaitForRequest(stat);
+	if (KErrNone != stat.Int())
+		{
+		Logger().WriteFormat(_L("Connect returned %d"), stat.Int());
+		return EFail;
+		}
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("completed"));
+		}
+
+	return EPass;
+	}
+
+enum TVerdict CEsockTest5_3::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+	
+	// set up data buffers
+	TBuf8<512> wbuf;
+	StripeDes(wbuf, 0, wbuf.MaxLength(), '@', 'Z');
+	
+	// send data (20 bytes)
+	wbuf.SetLength(20);
+	TRequestStatus stat;
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("Sending..."));
+		}
+	RSocket& sock = iEsockSuite->GetSocketHandle(1);
+	sock.Write(wbuf, stat);
+	User::WaitForRequest(stat);
+	TInt ret = stat.Int();
+	TESTEL(KErrNone == ret, ret);
+	
+	// read data (from echo server)
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("Receiving..."));
+		}
+	TBuf8<20> rbuf2;
+	sock.Read(rbuf2, stat);
+	User::WaitForRequest(stat);
+	ret = stat.Int();
+	TESTEL(KErrNone == ret, ret);
+	
+	TESTL(rbuf2==wbuf);
+	
+	// send data (20 packets of 512 bytes)
+	wbuf.SetMax();
+	TInt sendCount = 0;
+
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("Send loop..."));
+		}
+	for (TInt i = 0; i < 20; i++)
+		{
+		sock.Write(wbuf, stat);
+		User::WaitForRequest(stat);
+		ret = stat.Int();
+		TESTEL(KErrNone == ret, ret);
+		sendCount += wbuf.Length();
+		}
+
+	TBuf8<128> rbuf1;
+	TInt recvCount = 0;
+	ret = KErrNone;
+	while (recvCount < sendCount)
+		{
+		sock.Read(rbuf1, stat);
+		User::WaitForRequest(stat);
+		ret = stat.Int();
+		
+		if (KErrNone != ret)
+			{
+			break;
+			}
+		
+		recvCount += rbuf1.Length();
+		if (iLogLevel > 0)
+			{
+			Logger().WriteFormat(_L("Received %d octets"), rbuf1.Length());
+			}
+		}
+	TESTEL(sendCount == recvCount, recvCount);
+	
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("End Test 5.3"));
+		}
+	
+	return EPass;
+	}
+
+
+// Test step 5.4
+const TDesC& CEsockTest5_4::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"Test5.4");
+	
+	return ret;
+	}
+
+CEsockTest5_4::~CEsockTest5_4()
+	{
+	}
+
+enum TVerdict CEsockTest5_4::easyTestStepPreambleL()
+	{
+	CloseSockets();
+	if (KErrNone != OpenMinSockets(_L("Test_5.4"),KAfInet, KSockStream, KProtocolInetTcp))
+		{
+		return EFail;
+		}
+
+	// get ip address to connect to (on echo port)
+	TInetAddr addrRemote;
+	if (!GetIpAddressFromConfig(_L("Test_Common"), _L("ipAddress"), addrRemote))
+		{
+		return EFail;
+		}
+	addrRemote.SetPort(7);
+	
+	// get log level
+	if (!GetIntFromConfig(_L("Test_5.4"), _L("logLevel"), iLogLevel))
+		{
+		iLogLevel = 0;
+		}
+
+	// connect
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("Connect to remote host..."));
+		}
+	TRequestStatus stat;
+	(iEsockSuite->GetSocketHandle(1)).Connect(addrRemote, stat);
+	User::WaitForRequest(stat);
+	if (KErrNone != stat.Int())
+		{
+		Logger().WriteFormat(_L("Connect returned %d"), stat.Int());
+		return EFail;
+		}
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("completed"));
+		}
+	return EPass;
+	}
+
+enum TVerdict CEsockTest5_4::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+	
+	// set up data buffers
+	TBuf8<512> wbuf;
+	TBuf8<128> rbuf;
+	StripeDes(wbuf, 0, wbuf.MaxLength(), '@', 'Z');
+	
+	// send data (30 bytes)
+	wbuf.SetLength(30);
+	TRequestStatus stat;
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("Sending..."));
+		}
+	RSocket& sock = iEsockSuite->GetSocketHandle(1);
+	sock.Send(wbuf, 0, stat);
+	User::WaitForRequest(stat);
+	TInt ret = stat.Int();
+	TESTEL(KErrNone == ret, ret);
+	
+	// read data (from echo server)
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("Receiving..."));
+		}
+	TSockXfrLength xfrLen;
+	sock.RecvOneOrMore(rbuf, 0, stat, xfrLen);
+	User::WaitForRequest(stat);
+	ret = stat.Int();
+	TESTEL(KErrNone == ret, ret);
+	TInt len = xfrLen();
+	TESTEL(30 == len, len);
+	
+	TESTL(rbuf==wbuf);
+	
+	// send data (20 packets of 512 bytes)
+	wbuf.SetMax();
+	TInt sendCount = 0;
+
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("Send loop..."));
+		}
+	for (TInt i = 0; i < 20; i++)
+		{
+		sock.Send(wbuf, 0, stat);
+		User::WaitForRequest(stat);
+		ret = stat.Int();
+		TESTEL(KErrNone == ret, ret);
+		sendCount += wbuf.Length();
+		}
+
+	TInt recvCount = 0;
+	while (recvCount < sendCount)
+		{
+		sock.RecvOneOrMore(rbuf, 0, stat, xfrLen);
+		User::WaitForRequest(stat);
+		ret = stat.Int();
+
+		if (KErrNone != ret)
+			{
+			break;
+			}
+
+		recvCount += xfrLen();
+		if (iLogLevel > 0)
+			{
+			Logger().WriteFormat(_L("Received %d octets"), xfrLen());
+			}
+		}
+	TESTEL(sendCount == recvCount, recvCount);
+	
+	if (iLogLevel > 0)
+		{
+		Logger().Write(_L("End Test 5.4"));
+		}
+	return EPass;
+	}
+
+
+// Test step 5.5
+const TDesC& CEsockTest5_5::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"Test5.5");
+	
+	return ret;
+	}
+
+CEsockTest5_5::~CEsockTest5_5()
+	{
+	}
+
+enum TVerdict CEsockTest5_5::easyTestStepPreambleL()
+	{
+	TInt connections;
+	TRAPD(ret, connections = OpenConnectionsL(_L("Test_5.5"), iSockIndex2, iSockIndex3));
+	if (KErrNone != ret)
+		{
+		return EFail;
+		}
+	if (0 >= connections)
+		{
+		return EFail;
+		}
+
+	return EPass;
+	}
+
+enum TVerdict CEsockTest5_5::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+	
+	const TInt KBufSize = 15000;
+	// Constructs an empty 8 bit modifiable buffer descriptor. It contains no data.
+	typedef TBuf8<KBufSize> TBuffer;
+	
+	TBuffer* wtemp=new (ELeave) TBuffer;
+	CleanupStack::PushL(wtemp);
+	TBuffer& wbuf=*wtemp;
+	
+	StripeDes(wbuf, 0, wbuf.MaxLength(), '@', 'Z');
+	wbuf.SetMax();
+
+	TRequestStatus wstat;
+	(iEsockSuite->GetSocketHandle(iSockIndex2)).Write(wbuf, wstat);
+	(iEsockSuite->GetSocketHandle(iSockIndex2)).CancelWrite();
+	User::WaitForRequest(wstat);
+	TESTEL(wstat==KErrNone || wstat==KErrCancel, wstat.Int());
+	
+	Logger().WriteFormat(_L("wstat =  %d"),wstat.Int());
+	
+	TBuf8<1024> wbuf2, rbuf;
+	
+	StripeDes(wbuf2, 0, wbuf2.MaxLength(), '@', 'Z');
+	wbuf2.SetMax();
+	
+	iEsockSuite->GetSocketHandle(iSockIndex2).Write(wbuf2, wstat);
+	User::WaitForRequest(wstat);
+	TESTL(wstat==KErrNone);
+
+	TRequestStatus rstat;
+	iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, rstat);
+	User::WaitForRequest(rstat);	
+	TESTEL(rstat==KErrNone, rstat.Int());
+	
+	TESTL(rbuf==wbuf2);
+	
+	CleanupStack::PopAndDestroy();
+	
+	// shutdown the client socket - do not wait for completion
+	return EPass;
+	}
+
+
+// Test step 5.6
+const TDesC& CEsockTest5_6::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"Test5.6");
+	
+	return ret;
+	}
+
+CEsockTest5_6::~CEsockTest5_6()
+	{
+	}
+
+enum TVerdict CEsockTest5_6::easyTestStepPreambleL()
+	{
+	TInt connections;
+	TRAPD(ret, connections = OpenConnectionsL(_L("Test_5.6"), iSockIndex2, iSockIndex3));
+	if (KErrNone != ret)
+		{
+		return EFail;
+		}
+	if (0 >= connections)
+		{
+		return EFail;
+		}
+
+	return EPass;
+	}
+
+enum TVerdict CEsockTest5_6::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+	
+	const TInt KBufSize = 15000;
+	// Constructs an empty 8 bit modifiable buffer descriptor. It contains no data.
+	typedef TBuf8<KBufSize> TBuffer;
+	
+	TBuffer* wtemp=new (ELeave) TBuffer;
+	CleanupStack::PushL(wtemp);
+	TBuffer& wbuf=*wtemp;
+	
+	StripeDes(wbuf, 0, wbuf.MaxLength(), '@', 'Z');
+	wbuf.SetMax();
+	
+	TRequestStatus wstat;
+	(iEsockSuite->GetSocketHandle(iSockIndex2)).Send(wbuf, 0, wstat);	
+	(iEsockSuite->GetSocketHandle(iSockIndex2)).CancelSend();
+	User::WaitForRequest(wstat);
+	TESTEL(wstat==KErrNone || wstat==KErrCancel, wstat.Int());
+	
+	Logger().WriteFormat(_L("wstat =  %d"),wstat.Int());
+	
+	TBuf8<1024> wbuf2, rbuf;
+	
+	StripeDes(wbuf2, 0, wbuf2.MaxLength(), '@', 'Z');
+	wbuf2.SetMax();
+	
+	(iEsockSuite->GetSocketHandle(iSockIndex2)).Send(wbuf2, 0, wstat);
+	User::WaitForRequest(wstat);
+	TESTL(wstat==KErrNone);
+
+	TRequestStatus rstat;
+	(iEsockSuite->GetSocketHandle(iSockIndex3)).Recv(rbuf, 0, rstat);
+	User::WaitForRequest(rstat);
+	TESTEL(rstat==KErrNone, rstat.Int());
+	
+	TESTL(rbuf==wbuf2);
+	
+	CleanupStack::PopAndDestroy();
+	
+	// shutdown the client socket - do not wait for completion
+	return EPass;
+	}
+
+
+// Test step 5.7
+const TDesC& CEsockTest5_7::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"Test5.7");
+	
+	return ret;
+	}
+
+CEsockTest5_7::~CEsockTest5_7()
+	{
+	}
+
+enum TVerdict CEsockTest5_7::easyTestStepPreambleL()
+	{
+	TInt connections;
+	TRAPD(ret, connections = OpenConnectionsL(_L("Test_5.7"), iSockIndex2, iSockIndex3));
+	if (KErrNone != ret)
+		{
+		return EFail;
+		}
+	if (0 >= connections)
+		{
+		return EFail;
+		}
+
+	return EPass;
+	}
+
+enum TVerdict CEsockTest5_7::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+	
+	TBuf8<24> wbuf, rbuf;
+	StripeDes(wbuf, 0, wbuf.MaxLength(), '1', '9');
+	// send data (20 bytes)
+	wbuf.SetLength(20);
+	
+	TRequestStatus wstat;
+	iEsockSuite->GetSocketHandle(iSockIndex2).Write(wbuf, wstat);
+	User::WaitForRequest(wstat);
+	TESTL(wstat==KErrNone);
+	
+	// read the data - deliberately trying to read more than was sent so as to block indefinitely
+	TRequestStatus rstat;
+	iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, rstat);
+	User::After(1000000);	// wait a second so that initial 20 bytes can be recv'd
+	// cancel read before it completes
+	iEsockSuite->GetSocketHandle(iSockIndex3).CancelRead();
+	User::WaitForRequest(rstat);
+	TESTL(rstat==KErrCancel);
+	
+	TBuf8<1024> wbuf2, rbuf2;
+	StripeDes(wbuf2, 0, wbuf2.MaxLength(), '@', 'Z');
+	wbuf2.SetMax();
+	
+	iEsockSuite->GetSocketHandle(iSockIndex2).Write(wbuf2, wstat);
+	User::WaitForRequest(wstat);
+	TESTL(wstat==KErrNone);
+	iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf2, rstat);
+	User::WaitForRequest(rstat);
+	TESTL(rstat==KErrNone);
+	
+	TESTL(wbuf2==rbuf2);
+	
+	// shutdown the client socket - do not wait for completion
+	return EPass;
+	}
+
+
+// Test step 5.8
+const TDesC& CEsockTest5_8::GetTestName()
+	{
+	// store the name of this test case
+	_LIT(ret,"Test5.8");
+	
+	return ret;
+	}
+
+CEsockTest5_8::~CEsockTest5_8()
+	{
+	}
+
+enum TVerdict CEsockTest5_8::easyTestStepPreambleL()
+	{
+	TInt connections;
+	TRAPD(ret, connections = OpenConnectionsL(_L("Test_5.8"), iSockIndex2, iSockIndex3));
+	if (KErrNone != ret)
+		{
+		return EFail;
+		}
+	if (0 >= connections)
+		{
+		return EFail;
+		}
+
+	return EPass;
+	}
+
+enum TVerdict CEsockTest5_8::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+
+	TBuf8<24> wbuf, rbuf;
+	StripeDes(wbuf, 0, wbuf.MaxLength(), '1', '9');
+	// send data (20 bytes)
+	wbuf.SetLength(20);
+	
+	TRequestStatus wstat;
+	iEsockSuite->GetSocketHandle(iSockIndex2).Send(wbuf, 0, wstat);
+	User::WaitForRequest(wstat);
+	TESTL(wstat==KErrNone);
+	// read the data - deliberately trying to read more than was sent so as to block indefinitely
+	
+	TRequestStatus rstat;
+	iEsockSuite->GetSocketHandle(iSockIndex3).Recv(rbuf, 0, rstat);
+	User::After(1000000);	// wait a second so that initial 20 bytes can be recv'd
+	// cancel read before it completes
+	iEsockSuite->GetSocketHandle(iSockIndex3).CancelRecv();
+	User::WaitForRequest(rstat);
+	TESTL(rstat==KErrCancel);
+	
+	TBuf8<1024> wbuf2, rbuf2;
+	StripeDes(wbuf2, 0, wbuf2.MaxLength(), '@', 'Z');
+	wbuf2.SetMax();
+	
+	iEsockSuite->GetSocketHandle(iSockIndex2).Send(wbuf2, 0, wstat);
+	User::WaitForRequest(wstat);
+	TESTL(wstat==KErrNone);
+	iEsockSuite->GetSocketHandle(iSockIndex3).Recv(rbuf2, 0, rstat);
+	User::WaitForRequest(rstat);
+	TESTL(rstat==KErrNone);
+	
+	TESTL(wbuf2==rbuf2);
+	
+	// shutdown the client socket - do not wait for completion
+	return EPass;
+	}
+
+// Test step 5.9
+// Open a TCP socket along with a RawIP socket on TCP protocol. Write some data to the 
+// TCP socke and perform a read on the RawIP socket, this should not fail.
+const TDesC& CEsockTest5_9::GetTestName()
+	{		
+	// store the name of this test case
+	_LIT(ret,"Test5.9");
+	
+	return ret;
+	}
+
+CEsockTest5_9::~CEsockTest5_9()
+	{
+	}
+
+enum TVerdict CEsockTest5_9::easyTestStepPreambleL()
+	{
+	CloseSockets();
+	if (KErrNone != OpenMinSockets(_L("Test_5.9"),KAfInet, KSockStream, KProtocolInetTcp))
+		{
+		return EFail;
+		}
+
+	TInetAddr addrRemote;
+	// get ip address to connect to (on echo port)
+	if (!GetIpAddressFromConfig(_L("Test_Common"), _L("ipAddress"), addrRemote))
+		{
+		return EFail;
+		}
+	addrRemote.SetPort(7);	
+		
+	// connect
+	TRequestStatus stat;
+	(iEsockSuite->GetSocketHandle(1)).Connect(addrRemote, stat);
+	User::WaitForRequest(stat);
+	TInt ret = stat.Int();
+	if (KErrNone != ret)
+		{
+		Logger().WriteFormat(_L("Connect returned %d"), ret);
+		return EFail;
+		}
+
+	return EPass;
+	}
+		
+TVerdict CEsockTest5_9::easyTestStepL()
+	{
+	TESTL(EPass == TestStepResult());
+	
+	// prepare for test
+	// set up data buffers
+	TBuf8<512> wbuf;
+	StripeDes(wbuf, 0, wbuf.MaxLength(), '@', 'Z');
+	
+	// setup data (30 bytes) for send
+	wbuf.SetLength(30);
+	
+	// open RawIP socket
+	RSocket rawsock;
+	CleanupClosePushL(rawsock);
+	_LIT(KRawIp, "rawip");
+	TInt ret = rawsock.Open(iEsockSuite->iSocketServer, KRawIp);
+	TESTEL(KErrNone == ret, ret);
+		
+	// bind RawIP socket to TCP protocol
+	ret = rawsock.SetLocalPort(KProtocolInetTcp);
+	TESTEL(KErrNone == ret, ret);
+	
+	// prepare to receive data
+	TBuf8<30> recvBuf;
+	recvBuf.Zero();
+	TRequestStatus receiveStat;
+	rawsock.Read(recvBuf, receiveStat);
+	
+	// now there is an outstanding receive send to the echo server
+	TRequestStatus stat;
+	(iEsockSuite->GetSocketHandle(1)).Write(wbuf, stat);
+	User::WaitForRequest(stat);
+	ret = stat.Int();
+	TESTEL(KErrNone == ret, ret);
+	
+	// check that we have received the echo'ed data
+	User::WaitForRequest(receiveStat);
+	ret = receiveStat.Int();
+	TESTEL(KErrNone == ret, ret);
+	TESTL(recvBuf.Length() != 0);
+	
+	CleanupStack::PopAndDestroy(&rawsock);
+	return EPass;
+	}
+