datacommsserver/esockserver/test/TE_Socket/SocketTestSection5.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_Socket/SocketTestSection5.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,303 @@
+// Copyright (c) 2004-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 <es_sock.h>
+#include <ss_std.h>
+#include <test/es_dummy.h>
+
+// Test system includes
+#include "SocketTestSection5.h"
+
+
+// Test step 5.1
+const TDesC& CSocketTest5_1::GetTestName()
+	{
+	_LIT(ret,"Test5.1");
+	return ret;
+	}
+
+enum TVerdict CSocketTest5_1::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+	
+	Logger().WriteFormat(_L("Test Purpose: Memory Leak opening bad socket"));
+	
+#if defined(_DEBUG_SOCKET_FUNCTIONS)
+	
+	// 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);
+	
+	// open a bad socket
+    Logger().WriteFormat(_L("Attempting to create bad socket type with heap checking"));
+	//	ss.__DbgMarkHeap();		// in ESOCKMT leak checking is best done by shutting down the server
+	RSocket sock;
+    ret = sock.Open(ss, 0, 0, 0);
+	//	ss.__DbgMarkEnd(0);
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrBadName == ret);
+	
+	CleanupStack::Pop(&ss);
+	ss.Close();
+#else
+	Logger().WriteFormat(_L("TestDisabled on release build."));
+	verdict = EInconclusive;
+#endif
+	
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+
+// Test step 5.2
+const TDesC& CSocketTest5_2::GetTestName()
+	{
+	_LIT(ret,"Test5.2");
+	return ret;
+	}
+
+enum TVerdict CSocketTest5_2::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+	
+	Logger().WriteFormat(_L("Test Purpose: Memory Leak connecting to server and disconnecting from server"));
+	
+#if defined(_DEBUG_SOCKET_FUNCTIONS)
+	// connect to esock
+	Logger().WriteFormat(_L("Main thread : Attempting to connect to socket server"));
+    RSocketServ ss;
+	TInt ret = OptimalConnect(ss);
+	CleanupClosePushL(ss);
+	Logger().WriteFormat(_L("Main Thread : Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	
+	Logger().WriteFormat(_L("Main thread : Creating semaphore for threads"));
+	RSemaphore s;
+	s.CreateLocal(0);
+	RThread t;
+	
+	TSocketThreadArg tArg;
+	tArg.iHandle = this;
+	tArg.iSem  = &s;
+	tArg.iNumSockets = 0;
+	
+	// try connect and close in separate thread
+	Logger().WriteFormat(_L("Main thread : Creating sub thread to connect"));
+	//	ss.__DbgMarkHeap();		// in ESOCKMT leak checking is best done by shutting down the server
+	t.Create(_L("socketThread2"), ConnectThread, KDefaultStackSize, KDefaultHeapSize, KDefaultHeapSize, &tArg);
+	t.Resume();
+	s.Wait();
+	t.Close();
+	//	ss.__DbgMarkEnd(0);
+	Logger().WriteFormat(_L("Main thread : Connect thread completed"));
+	
+	CleanupStack::Pop(&ss);
+	ss.Close();
+#else
+	Logger().WriteFormat(_L("TestDisabled on release build."));
+	verdict = EInconclusive;
+#endif
+	
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+// Test step 5.3
+const TDesC& CSocketTest5_3::GetTestName()
+	{
+	_LIT(ret,"Test5.3");
+	return ret;
+	}
+
+enum TVerdict CSocketTest5_3::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+	
+	Logger().WriteFormat(_L("Test Purpose: Memory Leak killing thread with open resources"));
+	
+#if defined(_DEBUG_SOCKET_FUNCTIONS)
+	// connect to esock
+	Logger().WriteFormat(_L("Main thread : Attempting to connect to socket server"));
+    RSocketServ ss;
+	TInt ret = OptimalConnect(ss);
+	CleanupClosePushL(ss);
+	Logger().WriteFormat(_L("Main Thread : Connect returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	
+	Logger().WriteFormat(_L("Main thread : Creating semaphore for threads"));
+	RSemaphore s;
+	s.CreateLocal(0);
+	
+	// try create in separate thread and kill it
+	Logger().WriteFormat(_L("Main Thread : Creating sub thread to create sockets and resolvers"));
+	//	ss.__DbgMarkHeap();		// in ESOCKMT leak checking is best done by shutting down the server
+	TSocketThreadArg a;
+	a.iHandle = this;
+	a.iSem = &s;
+	a.iNumSockets = 1;
+	RThread t2;
+	t2.Create(_L("socketThread3"), SocketThread, KDefaultStackSize, KDefaultHeapSize, KDefaultHeapSize, &a);
+	t2.Resume();
+	s.Wait();
+	Logger().WriteFormat(_L("Main Thread : Killing Create sub thread"));
+	t2.Kill(KErrNone);
+	t2.Close();
+	
+	Logger().WriteFormat(_L("Main Thread : Waiting 100ms for thread to clear up"));
+	User::After(100000);
+	//	ss.__DbgMarkEnd(0);
+	Logger().WriteFormat(_L("Main Thread : Create thread completed"));
+	
+	CleanupStack::Pop(&ss);
+	ss.Close();
+#else
+	Logger().WriteFormat(_L("TestDisabled on release build."));
+	verdict = EInconclusive;
+#endif
+	
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+// Test step 5.4
+const TDesC& CSocketTest5_4::GetTestName()
+	{
+	_LIT(ret,"Test5.4");
+	return ret;
+	}
+
+enum TVerdict CSocketTest5_4::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+	
+	Logger().WriteFormat(_L("Test Purpose: Memory Leak Getting Protocol Info and Opening Socket"));
+	
+#if defined(_DEBUG_SOCKET_FUNCTIONS)
+	// 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);
+	//	ss.__DbgMarkEnd(0);
+	
+	Logger().WriteFormat(_L("Trying GetProtocolInfo until Dummy Protocol 1 is found"));
+	//	ss.__DbgMarkHeap();		// in ESOCKMT leak checking is best done by shutting down the server
+	TProtocolDesc protoInfo;
+	TUint aIndex;
+	TBool aFound = false;
+	for (aIndex=1;aIndex<=numProtocols;aIndex++) {
+		ret = ss.GetProtocolInfo(aIndex, protoInfo);
+		TESTL(KErrNone == ret || KErrCannotFindProtocol == ret);
+		if (protoInfo.iName ==_L("Dummy Protocol 1")){
+			aFound = true;
+			break;
+			}
+		}
+	//	ss.__DbgMarkEnd(0);
+	if (!aFound) {
+		Logger().WriteFormat(_L("Could not find Dummy Protocol 1"));
+		return EFail;
+		}
+	
+	Logger().WriteFormat(_L("Trying socket Open to load protocol"));
+	RSocket sock;
+	ret = sock.Open(ss, protoInfo.iAddrFamily, protoInfo.iSockType, protoInfo.iProtocol);
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	sock.Close();
+	
+	Logger().WriteFormat(_L("Trying socket Open with Heap checking"));
+	//	ss.__DbgMarkHeap();		// in ESOCKMT leak checking is best done by shutting down the server
+	RSocket sock1;
+	ret = sock1.Open(ss, protoInfo.iAddrFamily, protoInfo.iSockType, protoInfo.iProtocol);
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+	sock1.Close();
+	//	ss.__DbgMarkEnd(0);
+	
+	CleanupStack::Pop(&ss);
+	ss.Close();
+#else
+	Logger().WriteFormat(_L("TestDisabled on release build."));
+	verdict = EInconclusive;
+#endif
+	
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+
+// Test step 5.5
+const TDesC& CSocketTest5_5::GetTestName()
+	{
+	_LIT(ret,"Test5.5");
+	return ret;
+	}
+
+enum TVerdict CSocketTest5_5::InternalDoTestStepL( void )
+	{
+	TVerdict verdict = EPass;
+	
+	Logger().WriteFormat(_L("Test Purpose: Validating leak detection upon shutdown"));
+	
+#if defined(_DEBUG_SOCKET_FUNCTIONS)
+	// 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("Open a socket on Dummy Protocol 1"));
+	RSocket sock;
+	ret = sock.Open(ss,_L("Dummy Protocol 1"));
+	Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret));
+	TESTL(KErrNone == ret);
+
+	sock.SetOpt(KDummyOptionLeakMemory, 4);
+	sock.Close();
+	
+	CleanupStack::PopAndDestroy(&ss);
+#else
+	Logger().WriteFormat(_L("TestDisabled on release build."));
+	verdict = EInconclusive;
+#endif
+	
+	SetTestStepResult(verdict);
+	return verdict;
+	}
+
+
+