datacommsserver/esockserver/test/TE_Socket/SocketTestSection1.cpp
changeset 0 dfb7c4ff071f
child 2 dee179edb159
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_Socket/SocketTestSection1.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,584 @@
+// 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:
+// This contains ESock Test cases from section 1
+// 
+//
+
+// EPOC includes
+#include <e32base.h>
+#include <ss_std.h>
+
+// Test system includes
+#include "SocketTestSection1.h"
+
+
+_LIT(KDummyProtocol1Name,"Dummy Protocol 1"); // corresponds to KDummyOneName in pdummy
+
+// Test step 1.1
+const TDesC& CSocketTest1_1::GetTestName()
+	{
+	_LIT(ret,"Test1.1");
+	return ret;
+	}
+
+enum TVerdict CSocketTest1_1::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+
+	Logger().WriteFormat(_L("Test Purpose: Connect and Disconnect"));
+
+	// connect to esock
+	Logger().WriteFormat(_L("Attempting to connect to socket server"));
+    RSocketServ ss1;
+	TInt ret = OptimalConnect(ss1);
+	CleanupClosePushL(ss1);
+	Logger().WriteFormat(_L("Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+	Logger().WriteFormat(_L("Closing Session"));
+	CleanupStack::Pop(&ss1);
+	ss1.Close();
+
+	Logger().WriteFormat(_L("Re-connecting to socket server"));
+    RSocketServ ss;
+	ret = OptimalConnect(ss);
+	CleanupClosePushL(ss);
+	Logger().WriteFormat(_L("Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+	CleanupStack::Pop();
+	ss.Close();
+ 
+ 	SetTestStepResult(verdict);   
+	return verdict;
+	}
+
+
+// Test step 1.2
+const TDesC& CSocketTest1_2::GetTestName()
+	{
+	_LIT(ret,"Test1.2");
+	return ret;
+	}
+	
+enum TVerdict CSocketTest1_2::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+
+	Logger().WriteFormat(_L("Test Purpose: Open and Close Sockets"));
+
+	// connect to esock
+	Logger().WriteFormat(_L("Attempting to connect to socket server"));
+    RSocketServ ss;
+	TInt ret = OptimalConnect(ss);
+	CleanupClosePushL(ss);
+	Logger().WriteFormat(_L("Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+	// NumProtocols and GetProtocolInfo
+	Logger().WriteFormat(_L("Try NumProtocols"));
+//	ss.__DbgMarkHeap();		// in ESOCKMT leak checking is best done by shutting down the server
+	TUint numProtocols;
+	ret = ss.NumProtocols(numProtocols);
+	Logger().WriteFormat(_L("NumProtocols returned %S, number %d"), 
+			&EpocErrorToText(ret), numProtocols);
+	TESTL(KErrNone == ret);
+
+	TProtocolDesc protoInfo;
+	TUint aIndex;
+	TBool aFound = false;
+	RSocket sock1;
+	TInt pdummyIndex = -1;
+ 	Logger().WriteFormat(_L("Trying GetProtocolInfo until Dummy Protocol 1 is found"));
+	for (aIndex=1;aIndex<=numProtocols;aIndex++) 
+		{
+		ret = ss.GetProtocolInfo(aIndex, protoInfo);
+		Logger().WriteFormat(_L("GetProtocolInfo returned %S"), &EpocErrorToText(ret));	
+		TESTL(KErrNone == ret || KErrCannotFindProtocol == ret);
+		Logger().WriteFormat(_L("Protocol Index %d corresponds to %S"), aIndex, &protoInfo.iName);
+		if (protoInfo.iName == KDummyProtocol1Name())
+			{
+			pdummyIndex = aIndex;
+			aFound = true;
+			}
+		}
+
+	if (!aFound) {
+		Logger().WriteFormat(_L("Could not find Dummy Protocol 1"));
+		CleanupStack::PopAndDestroy();
+		return EFail;
+	}
+
+	Logger().WriteFormat(_L("Opening Socket for Family: %d, Sock: %d, protocol: %d"),
+			protoInfo.iAddrFamily, protoInfo.iSockType, protoInfo.iProtocol);
+		
+	ret=sock1.Open(ss, protoInfo.iAddrFamily, protoInfo.iSockType, protoInfo.iProtocol);
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	Logger().WriteFormat(_L("Opened %S socket OK"), &protoInfo.iName);
+
+	Logger().WriteFormat(_L("Getting protocol info for index %d again"),pdummyIndex);
+	ret = ss.GetProtocolInfo(pdummyIndex, protoInfo);
+	Logger().WriteFormat(_L("GetProtocolInfo returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+
+	Logger().WriteFormat(_L("Opening another socket"));
+	RSocket sock2;
+	ret = sock2.Open(ss, protoInfo.iAddrFamily, protoInfo.iSockType, protoInfo.iProtocol);
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	Logger().WriteFormat(_L("Opened %S socket OK"), &protoInfo.iName);
+
+	Logger().WriteFormat(_L("Closing sockets"));
+	sock2.Close();
+	sock1.Close();
+
+	Logger().WriteFormat(_L("Opening another socket"));
+	RSocket sock3;
+	ret = sock3.Open(ss, protoInfo.iAddrFamily, protoInfo.iSockType, protoInfo.iProtocol);
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	Logger().WriteFormat(_L("Opened %S socket OK"), &protoInfo.iName);
+
+	Logger().WriteFormat(_L("Closing socket"));
+	sock3.Close();
+
+	Logger().WriteFormat(_L("Opening a socket by name on dummy protocol 1"));
+	RSocket sock4;
+	ret = sock4.Open(ss, KDummyProtocol1Name());
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	Logger().WriteFormat(_L("Opened %S socket OK"), &protoInfo.iName);
+
+	Logger().WriteFormat(_L("Closing socket"));
+	sock4.Close();
+
+	CleanupStack::Pop(&ss);
+	ss.Close();
+
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+// Test step 1.3
+const TDesC& CSocketTest1_3::GetTestName()
+	{
+	_LIT(ret,"Test1.3");
+	return ret;
+	}
+
+
+enum TVerdict CSocketTest1_3::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+
+	Logger().WriteFormat(_L("Test Purpose: Open Bad Socket Type"));
+
+	// connect to esock
+	Logger().WriteFormat(_L("Attempting to connect to socket server"));
+    RSocketServ ss;
+	TInt ret = OptimalConnect(ss);
+	CleanupClosePushL(ss);
+	Logger().WriteFormat(_L("Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+	Logger().WriteFormat(_L("Attempting to create bad socket type"));
+	RSocket sock;
+	ret = sock.Open(ss, 0, 0, 0); 
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrBadName == ret);
+
+	sock.Close();
+	CleanupStack::Pop(&ss);
+	ss.Close();
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+// Test step 1.4
+const TDesC& CSocketTest1_4::GetTestName()
+	{
+	_LIT(ret,"Test1.4");
+	return ret;
+	}
+	
+enum TVerdict CSocketTest1_4::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+
+	Logger().WriteFormat(_L("Test Purpose: Find Protocols"));
+
+	// connect to esock
+	Logger().WriteFormat(_L("Attempting to connect to socket server"));
+    RSocketServ ss;
+	TInt ret = OptimalConnect(ss);
+	CleanupClosePushL(ss);
+	Logger().WriteFormat(_L("Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+    Logger().WriteFormat(_L("Try to find non-existent protocol"));
+	TProtocolDesc protoInfo;
+	ret = ss.FindProtocol(_L("Not a Protocol Name"), protoInfo);
+	Logger().WriteFormat(_L("FindProtocol returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNotFound == ret);
+
+    Logger().WriteFormat(_L("Try to find dummy protocol 1"));
+	ret = ss.FindProtocol(KDummyProtocol1Name(), protoInfo);
+	Logger().WriteFormat(_L("FindProtocol returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	
+	CleanupStack::Pop(&ss);
+	ss.Close();
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+// Test step 1.5
+const TDesC& CSocketTest1_5::GetTestName()
+	{
+	_LIT(ret,"Test1.5");
+	return ret;
+	}
+
+enum TVerdict CSocketTest1_5::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+
+	Logger().WriteFormat(_L("Test Purpose: Tidy Up Sockets on Thread Death"));
+
+	Logger().WriteFormat(_L("Main thread : Creating sub thread"));
+	RSemaphore s;
+	s.CreateLocal(0);
+	RThread t;
+	TSocketThreadArg a;
+	a.iHandle = this;
+	a.iSem=&s;
+	a.iNumSockets = KNumTestSockets;
+	//Need to share logger across different threads
+	Logger().ShareAuto();
+	t.Create(_L("SocketThread1"), SocketThread, 
+			 KDefaultStackSize, KDefaultHeapSize, KDefaultHeapSize, &a);
+	t.Resume();
+	s.Wait();
+
+	Logger().WriteFormat(_L("Main thread : Killing Sub thread"));
+	t.Kill(KErrNone);
+	t.Close();
+
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+// Test step 1.6
+const TDesC& CSocketTest1_6::GetTestName()
+	{
+	_LIT(ret,"Test1.6");
+	return ret;
+	}
+	
+enum TVerdict CSocketTest1_6::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+
+	Logger().WriteFormat(_L("Test Purpose: Close Uninitialised Socket"));
+
+	Logger().WriteFormat(_L("Attempting to close socket"));
+	RSocket s;
+	s.Close();
+	s.Close();
+
+	return verdict;
+	}
+
+// Test step 1.7
+const TDesC& CSocketTest1_7::GetTestName()
+	{
+	_LIT(ret,"Test1.7");
+	return ret;
+	}
+	
+enum TVerdict CSocketTest1_7::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+	
+	TInt numExhaustiveSockets = iNormalTest ? KNumExhaustiveSockets : 10;
+	iNormalTest = EFalse; // normal test is only run once, the rest are OOM tests
+
+	Logger().WriteFormat(_L("Test Purpose: Exhaustive Socket Open"));
+
+	// connect to esock
+	Logger().WriteFormat(_L("Attempting to connect to socket server"));
+    RSocketServ ss;
+	TInt ret = OptimalConnect(ss);
+	CleanupClosePushL(ss);
+	Logger().WriteFormat(_L("Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+    Logger().WriteFormat(_L("Finding dummy protocol 1"));
+	TProtocolDesc protoInfo;
+	ret = ss.FindProtocol(KDummyProtocol1Name(), protoInfo);
+	Logger().WriteFormat(_L("FindProtocol returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+    Logger().WriteFormat(_L("Opening socket"));
+	RSocket sock;
+	ret = sock.Open(ss,protoInfo.iAddrFamily,protoInfo.iSockType,protoInfo.iProtocol);
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+    Logger().WriteFormat(_L("Closing socket"));
+	sock.Close();
+
+    Logger().WriteFormat(_L("Creating array of %d sockets"), numExhaustiveSockets);
+	RSocket* socks = new (ELeave) RSocket[numExhaustiveSockets];
+	CleanupArrayDeletePushL(socks);
+
+	Logger().WriteFormat(_L("Attempting to Open %d sockets"), numExhaustiveSockets);
+	TInt sockNum=0;
+	ret = KErrNone;
+	while (KErrNone==ret && sockNum<numExhaustiveSockets)
+		{
+		ret = socks[sockNum].Open(ss, protoInfo.iAddrFamily, 
+								  protoInfo.iSockType, protoInfo.iProtocol);
+		sockNum++;
+		}
+	if (ret != KErrNone)
+		{
+		sockNum--;
+		}
+	Logger().WriteFormat(_L("Created %d sockets"), sockNum);
+	
+	Logger().WriteFormat(_L("Freeing sockets in creation order"));
+	TInt i;
+	for (i=0; i<sockNum; i++)
+		{
+		socks[i].Close();
+		}
+		
+
+#if defined (_DEBUG_SOCKET_FUNCTIONS)
+
+	Logger().WriteFormat(_L("Attempting to Open %d sockets"), numExhaustiveSockets);
+	TInt sockCount1 = sockNum;
+	ret = KErrNone;
+	sockNum = 0;
+	while (ret==KErrNone && sockNum<numExhaustiveSockets)
+		{
+		ret=socks[sockNum].Open(ss, protoInfo.iAddrFamily, 
+								protoInfo.iSockType,protoInfo.iProtocol);
+		sockNum++;
+		}
+	if (ret != KErrNone)
+		{
+		sockNum--;
+		}
+	Logger().WriteFormat(_L("Created %d sockets, expected %d sockets"), sockNum, sockCount1);
+	TESTL(sockCount1 == sockNum);
+
+	Logger().WriteFormat(_L("Freeing sockets in creation order"));
+	for (i=0; i<sockNum; i++)
+		{
+		socks[i].Close();
+		}
+
+#endif	// (_DEBUG) }
+
+	CleanupStack::PopAndDestroy(socks);
+
+	CleanupStack::Pop(&ss);
+	ss.Close();
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+	
+// Test step 1.8
+const TDesC& CSocketTest1_8::GetTestName()
+	{
+	_LIT(ret,"Test1.8");
+	return ret;
+	}
+	
+enum TVerdict CSocketTest1_8::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+
+	Logger().WriteFormat(_L("Test Purpose: Exhaustively enumerate all the protocols"));
+
+	// connect to esock
+	Logger().WriteFormat(_L("Attempting to connect to socket server"));
+    RSocketServ ss;
+	TInt ret = ss.Connect();
+	Logger().WriteFormat(_L("Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	CleanupClosePushL(ss);
+	// NumProtocols and GetProtocolInfo
+	Logger().WriteFormat(_L("Try NumProtocols"));
+	TUint numProtocols;
+	ret = ss.NumProtocols(numProtocols);
+	Logger().WriteFormat(_L("NumProtocols returned %S, number %d"), 
+			&EpocErrorToText(ret), numProtocols);
+	TESTL(KErrNone == ret);
+
+	TProtocolDesc protoInfo;
+	TUint aIndex;
+	TInt pdummyIndex = -1;
+ 	Logger().WriteFormat(_L("Trying GetProtocolInfo on each protocol"));
+	for (aIndex=1;aIndex<=numProtocols;aIndex++) 
+		{
+		ret = ss.GetProtocolInfo(aIndex, protoInfo);
+		Logger().WriteFormat(_L("GetProtocolInfo returned %S"), &EpocErrorToText(ret));	
+		TESTL(KErrNone == ret);
+		Logger().WriteFormat(_L("Protocol Index %d corresponds to %S"), aIndex, &protoInfo.iName);
+		if (protoInfo.iName ==KDummyProtocol1Name())
+			{
+			pdummyIndex = aIndex;
+			}
+		}
+	CleanupStack::Pop(&ss);
+	ss.Close();
+	if (pdummyIndex < 0)
+		{
+		Logger().WriteFormat(_L("Could not find Dummy Protocol 1"));
+		verdict = EFail;
+		}
+	verdict = EPass;
+	
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+
+
+
+
+
+
+// Test step 1.9
+const TDesC& CSocketTest1_9::GetTestName()
+	{
+	_LIT(ret,"Test1.9");
+	return ret;
+	}
+	
+	
+enum TVerdict CSocketTest1_9::InternalDoTestStepL( void )
+	{
+
+	// Create socket, shutdown socket then connect 
+	TVerdict verdict = EPass;
+	Logger().WriteFormat(_L("Test Purpose: Connect Socket, then Shutdown"));
+
+	// Connect to esock
+	Logger().WriteFormat(_L("Attempting to connect to socket server"));
+    RSocketServ ss;
+	TInt ret = ss.Connect();
+	Logger().WriteFormat(_L("Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	CleanupClosePushL(ss); 
+
+	// Create and open RConnection
+	Logger().WriteFormat(_L("Creating RConnection"));
+	RConnection conn; 
+	ret = conn.Open(ss);
+	Logger().WriteFormat(_L("Connection Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	CleanupClosePushL(conn);
+
+	// Create and open socket on TCP protocol
+	RSocket socket1;
+	
+	
+	TProtocolDesc protoInfo;
+	
+	TUint numProtocols;
+	ret = ss.NumProtocols(numProtocols);
+	Logger().WriteFormat(_L("NumProtocols returned %S, number %d"), 
+			&EpocErrorToText(ret), numProtocols);
+	TESTL(KErrNone == ret);
+
+	
+	for (TInt index=1;index<=numProtocols;index++) 
+		{
+		ret = ss.GetProtocolInfo(index, protoInfo);
+		Logger().WriteFormat(_L("GetProtocolInfo returned %S"), &EpocErrorToText(ret));	
+		TESTL(KErrNone == ret || KErrCannotFindProtocol == ret);
+		Logger().WriteFormat(_L("Protocol Index %d corresponds to %S"), index, &protoInfo.iName);
+		if (protoInfo.iName == KDummyProtocol1Name())
+			{
+			break;
+			}
+		}
+	
+	
+	
+	Logger().WriteFormat(_L("Opening Socket 1"));
+	ret = socket1.Open(ss, protoInfo.iAddrFamily, protoInfo.iSockType, protoInfo.iProtocol /*KAfInet, KSockStream, KProtocolInetTcp, conn*/);
+	Logger().WriteFormat(_L("Socket 1 Open returned %S"), &EpocErrorToText(ret)); 
+	TESTL(KErrNone == ret);
+	CleanupClosePushL(socket1); 
+
+	// Create Ports for Socket and socket to connect to
+	const TInt KSocket1Port = 3441;
+	const TInt KSocket2Port = 3881;
+	_LIT(KLoopback, "127.0.0.1");
+	_LIT(KLocal, "0.0.0.0");
+
+	// Set the local address of Socket1
+	TInetAddr socket1Addr;
+	socket1Addr.SetPort(KSocket1Port);
+	socket1Addr.Input(KLocal);
+	ret = socket1.Bind(socket1Addr);
+
+	// Set remote address for socket 
+	TInetAddr socket2Addr;
+	socket2Addr.SetPort(KSocket2Port);
+	socket2Addr.Input(KLoopback);
+
+	// Shutdown the Socket
+	Logger().WriteFormat(_L("Shutting down Connection on Socket1"));
+	TRequestStatus shutdownStatus;
+	_LIT8(desOut, "Some test stuff to send to protocol");
+	
+	TBuf8<50> desIn;
+	
+	socket1.Shutdown(RSocket::EImmediate,desOut,desIn, shutdownStatus);
+	User::WaitForRequest(shutdownStatus);
+	Logger().WriteFormat(_L("Socket 1 shutdown returned %S"), &EpocErrorToText(shutdownStatus.Int()));
+
+	// Connect socket1 to remote address
+	TRequestStatus connectSocket1Status;
+	Logger().WriteFormat(_L("Connecting Socket1 "));
+
+	socket1.Connect(socket2Addr, connectSocket1Status);   // used to cause server to panic
+	User::WaitForRequest(connectSocket1Status);
+
+	if(connectSocket1Status != KErrBadHandle)
+		{
+		verdict = EFail;
+		}
+	
+	CleanupStack::PopAndDestroy(); //socket
+	CleanupStack::PopAndDestroy(); //conn
+	CleanupStack::PopAndDestroy(); //ss
+
+	return verdict;
+
+
+	}
+
+
+
+
+