datacommsserver/esockserver/test/TE_SocketServer/TE_TestStepSocketServer.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_SocketServer/TE_TestStepSocketServer.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,494 @@
+// 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:
+//
+
+#include<c32root.h>
+#include <e32base.h>
+#include <es_sock.h>
+#include <ss_std.h>
+#include <e32std.h>
+#include <test/es_dummy.h>
+
+#include "TE_TestStepSocketServer.h"
+#include "ES_DUMMY.H"
+
+//_LIT(KProtocolName, "Dummy Protocol 1");          // Name of test protocol to use in these tests
+//_LIT8(KSendStringTest, "Bad descriptor"); // Sample testdata to send in these tests
+_LIT(KOptimalDealerName, "!SocketServer-1*"); //The name of the optimal dealer
+
+//A class needed to get to the protected method CreateSession;
+class RIllegalConnect : public RSessionBase
+	{
+	public:
+		TInt Do(const RSocketServ& aSS); //Does the illegal Connect
+	};
+
+TInt RIllegalConnect::Do(const RSocketServ& aSS)
+	{
+	TFindServer fs(KOptimalDealerName);
+	TFullName fn;
+	TFullName newName;
+	
+	while (fs.Next(newName) == KErrNone)
+		{
+		fn = newName;
+		}
+	
+	return CreateSession(fn, aSS.Version(), KESockDefaultMessageSlots);
+	}
+
+// constructor
+CTestStepSocketServer::CTestStepSocketServer() : iErrText()
+	{
+	}
+
+// destructor
+CTestStepSocketServer::~CTestStepSocketServer()
+	{
+	}
+
+enum TVerdict CTestStepSocketServer::doTestStepPreambleL( void )
+	{
+/*
+	TInt ret;
+	ret = RProperty::Define(KDummyUid, KDummyTerminationProperty,0);
+	if (ret != KErrNone)
+		{
+		Logger().WriteFormat(_L("Error creating property"));
+		return EFail;
+		}
+	
+	ret = iHangingModuleFlag.Attach(KDummyUid, KDummyTerminationProperty);
+	if (ret != KErrNone)
+		{
+		Logger().WriteFormat(_L("Error attaching to property"));
+		return EFail;
+		}
+	ret = iHangingModuleFlag.Set(0);
+	if (ret != KErrNone)
+		{
+		Logger().WriteFormat(_L("Error setting property to 0"));
+		return EFail;
+		}
+*/
+	return EPass;
+	}
+
+enum TVerdict CTestStepSocketServer::doTestStepL()
+	{
+	
+	TRAPD(trapRet,enum TVerdict stepRet = InternalDoTestStepL();\
+		if (stepRet !=EPass)\
+			{\
+			SetTestStepResult(stepRet);\
+			}\
+			)
+			
+			if (trapRet != KErrNone)
+				{
+				SetTestStepResult(EFail);
+				return EFail;
+				}
+			return EPass;
+	};
+
+//This method ensures that any
+enum TVerdict CTestStepSocketServer::doTestStepPostambleL( void )
+	{
+/*
+	TInt ret;
+	TInt hangingModules;
+	iHangingModuleFlag.Get(hangingModules);
+	if (hangingModules > 0)
+		{
+		//The code here is specifically designed to work on the function "void CDummyProvd::HangModule(void)"
+		//It wakes up any modules that have been hung during the course of testing and works in the following
+		//fashion:
+		//Each module when hung gets the value of the hanging modules property 
+		//The module increments the property by 1
+		//The module waits until the module retunrs to the previous value
+		//The module then decrements the decrements the hanging module count
+		//CDummyProvd::HangModule(void) returns
+		//So to start the shutdown process, decrement the hanging modules property by one and 
+		//wait for the property to reach -1
+		RProperty deathCountProp;
+		TInt requiredDeathCount;
+		TInt deathCount = 0;
+		TRequestStatus deathCountStat;
+		TRequestStatus hangingModulesStat;
+#ifdef SYMBIAN_NETWORKING_PLATSEC
+		ret = deathCountProp.Attach(KUidSystemCategory, KUidC32RootModuleDeathKey.iUid);
+#else
+		ret = deathCountProp.Attach(KUidCommsProcess, KC32RootModuleDeathKey);
+#endif
+		if (ret != KErrNone)
+			{
+			Logger().WriteFormat(_L("Attach returned with %d"),ret);
+			}
+		ret =deathCountProp.Get(requiredDeathCount);
+		if (ret != KErrNone)
+			{
+			Logger().WriteFormat(_L("Get returned with %d"),ret);
+			}
+		requiredDeathCount += hangingModules;
+		
+		iHangingModuleFlag.Subscribe(hangingModulesStat);
+		
+		--hangingModules;
+		Logger().WriteFormat(_L("Starting to unwind the hung modules"));
+		iHangingModuleFlag.Set(hangingModules); //Do decrement to begin process
+		iHangingModuleFlag.Get(hangingModules);
+		
+		Logger().WriteFormat(_L("Waiting for all the modules to be unwound"));
+		while(hangingModules > -1)
+			{
+			User::WaitForRequest(hangingModulesStat);
+			iHangingModuleFlag.Subscribe(hangingModulesStat);
+			iHangingModuleFlag.Get(hangingModules);
+			}
+		iHangingModuleFlag.Cancel();
+		Logger().WriteFormat(_L("All modulles now unwound - Waiting for thread to terminate"));
+		
+		//Now just make sure all the "stuck" prts have exited
+		
+		deathCountProp.Subscribe(deathCountStat);	
+		deathCountProp.Get(deathCount);
+		while (deathCount < requiredDeathCount)
+			{
+			User::WaitForRequest(deathCountStat);
+			deathCountProp.Subscribe(deathCountStat);
+			deathCountProp.Get(deathCount);
+			}
+		
+		deathCountProp.Cancel();
+		deathCountProp.Close();
+		Logger().WriteFormat(_L("Thread termination completed"));
+		}
+	iHangingModuleFlag.Close();	
+*/
+	return EPass;
+
+	}
+
+
+// extra logging methods
+const TPtrC& CTestStepSocketServer::EpocErrorToText(const TInt aErrCode)
+/**
+Convert a Error code to text.
+
+  @param aError error code to display as text.
+  @return Text describing the error.
+  */
+	{
+	//	TPtr errText;
+	switch (aErrCode)
+		{
+		case KErrNone:
+			iErrText.Set(_L("KErrNone"));
+			break;
+		case KErrNotFound:
+			iErrText.Set(_L("KErrNotFound"));
+			break;
+		case KErrGeneral:
+			iErrText.Set(_L("KErrGeneral"));
+			break;
+		case KErrCancel:
+			iErrText.Set(_L("KErrCancel"));
+			break;
+		case KErrNoMemory:
+			iErrText.Set(_L("KErrNoMemory"));
+			break;
+		case KErrNotSupported:
+			iErrText.Set(_L("KErrNotSupported"));
+			break;
+		case KErrArgument:
+			iErrText.Set(_L("KErrArgument"));
+			break;
+		case KErrTotalLossOfPrecision:
+			iErrText.Set(_L("KErrTotalLossOfPrecision"));
+			break;
+		case KErrBadHandle:
+			iErrText.Set(_L("KErrBadHandle"));
+			break;
+		case KErrOverflow:
+			iErrText.Set(_L("KErrOverflow"));
+			break;
+		case KErrUnderflow:
+			iErrText.Set(_L("KErrUnderflow"));
+			break;
+		case KErrAlreadyExists:
+			iErrText.Set(_L("KErrAlreadyExists"));
+			break;
+		case KErrPathNotFound:
+			iErrText.Set(_L("KErrPathNotFound"));
+			break;
+		case KErrDied:
+			iErrText.Set(_L("KErrDied"));
+			break;
+		case KErrInUse:
+			iErrText.Set(_L("KErrInUse"));
+			break;
+		case KErrServerTerminated:
+			iErrText.Set(_L("KErrServerTerminated"));
+			break;
+		case KErrServerBusy:
+			iErrText.Set(_L("KErrServerBusy"));
+			break;
+		case KErrCompletion:
+			iErrText.Set(_L("KErrCompletion"));
+			break;
+		case KErrNotReady:
+			iErrText.Set(_L("KErrNotReady"));
+			break;
+		case KErrUnknown:
+			iErrText.Set(_L("KErrUnknown"));
+			break;
+		case KErrCorrupt:
+			iErrText.Set(_L("KErrCorrupt"));
+			break;
+		case KErrAccessDenied:
+			iErrText.Set(_L("KErrAccessDenied"));
+			break;
+		case KErrLocked:
+			iErrText.Set(_L("KErrLocked"));
+			break;
+		case KErrWrite:
+			iErrText.Set(_L("KErrWrite"));
+			break;
+		case KErrDisMounted:
+			iErrText.Set(_L("KErrDisMounted"));
+			break;
+		case KErrEof:
+			iErrText.Set(_L("KErrEof"));
+			break;
+		case KErrDiskFull:
+			iErrText.Set(_L("KErrDiskFull"));
+			break;
+		case KErrBadDriver:
+			iErrText.Set(_L("KErrBadDriver"));
+			break;
+		case KErrBadName:
+			iErrText.Set(_L("KErrBadName"));
+			break;
+		case KErrCommsLineFail:
+			iErrText.Set(_L("KErrCommsLineFail"));
+			break;
+		case KErrCommsFrame:
+			iErrText.Set(_L("KErrCommsFrame"));
+			break;
+		case KErrCommsOverrun:
+			iErrText.Set(_L("KErrCommsOverrun"));
+			break;
+		case KErrCommsParity:
+			iErrText.Set(_L("KErrCommsParity"));
+			break;
+		case KErrTimedOut:
+			iErrText.Set(_L("KErrTimedOut"));
+			break;
+		case KErrCouldNotConnect:
+			iErrText.Set(_L("KErrCouldNotConnect"));
+			break;
+		case KErrCouldNotDisconnect:
+			iErrText.Set(_L("KErrCouldNotDisconnect"));
+			break;
+		case KErrDisconnected:
+			iErrText.Set(_L("KErrDisconnected"));
+			break;
+		case KErrBadLibraryEntryPoint:
+			iErrText.Set(_L("KErrBadLibraryEntryPoint"));
+			break;
+		case KErrBadDescriptor:
+			iErrText.Set(_L("KErrBadDescriptor"));
+			break;
+		case KErrAbort:
+			iErrText.Set(_L("KErrAbort"));
+			break;
+		case KErrTooBig:
+			iErrText.Set(_L("KErrTooBig"));
+			break;
+		case KRequestPending:
+			iErrText.Set(_L("KRequestPending"));
+			break;
+		default:
+			iErrBuff.Format(_L(" %d"),aErrCode);
+			iErrText.Set(iErrBuff.Ptr());
+			break;
+		}
+		return iErrText;
+	}	
+
+TInt CTestStepSocketServer::OptimalConnect(RSocketServ &aSrv)
+	{
+    TSessionPref pref;
+    pref.iAddrFamily = KDummyAddrFamily;
+    pref.iProtocol = KDummyThree;
+	return aSrv.Connect(pref);
+	}
+
+TInt CTestStepSocketServer::IllegalOptimalConnect(RSocketServ &aSrv)
+	{
+	RIllegalConnect ill;
+	return ill.Do(aSrv); 
+	}
+
+
+TInt CTestStepSocketServer::PanicProtocolModule(RSocket &aSock)
+	{
+	TRequestStatus st;
+	TBool jit = User::JustInTime();
+	User::SetJustInTime(EFalse); //Don't stop for panic
+	aSock.Ioctl(KDummyIoctlPanicProtocolModule,st);
+	User::WaitForRequest(st);
+	User::SetJustInTime(jit);
+	return st.Int();
+	}
+
+
+void CTestStepSocketServer::NonCompletingIoclt(RSocket &aSock,TRequestStatus &st)
+	{
+	aSock.Ioctl(KDummyIocltNonCompleting,st);
+	}
+
+
+TInt CTestStepSocketServer::PanicDealer(RSocketServ &aSockServ)
+	{
+	/*This is a really crude way to cause the dealer to panic.
+	It works by marking the heap. Deliberately adding stuff to the heap
+	And then checking to see that nothing was allocated*/
+	TInt ret = aSockServ.__DbgMarkHeap();
+	if (ret != KErrNone)
+		{
+		return ret;
+		}
+	RSocket sock;
+	sock.Open(aSockServ);
+	TBool jit = User::JustInTime();
+	User::SetJustInTime(EFalse); //Don't stop for panic
+	ret = aSockServ.__DbgCheckHeap(0); //Heap should now be dead
+	User::SetJustInTime(jit);
+	return ret;
+	
+	}
+
+TInt CTestStepSocketServer::BlockHardOnClose(RSocket &aSock)
+	{
+	TRequestStatus st;
+	aSock.Ioctl(KDummyIoctBlockHardOnClose,st);
+	User::WaitForRequest(st);
+	return st.Int();
+	}
+
+void CTestStepSocketServer::SlowIoctlReturn(RSocket &aSock, TRequestStatus &aStat,
+											TBool aBlockPermanently)
+	{
+	aBlockPermanently ? aSock.Ioctl(KDummyIoctlHangIoctlReturn,aStat) : 
+aSock.Ioctl(KDummyIoctlSlowIoctlReturn,aStat);
+	}
+
+TInt CTestStepSocketServer::CheckForModuleL(const TDesC8 &aModuleName)
+	{
+	RRootServ rsrv;
+	TRSIter it;
+	TCFModuleName name;
+	int ret;
+	
+	ret = rsrv.Connect();
+	if (ret != KErrNone)
+		{
+		return ret;
+		}
+	
+	CleanupClosePushL(rsrv);
+	
+	TBool tst = false;
+	while (ret == KErrNone && !tst)
+		{
+		ret = rsrv.EnumerateModules(it,name);
+		if (ret != KErrNone && ret != KErrEof)
+			{
+			CleanupStack::PopAndDestroy();
+			return ret;
+			}
+		tst = (name == aModuleName);
+		}
+		
+	CleanupStack::PopAndDestroy(); //rsrv
+	
+	if (tst)
+		{
+		Logger().WriteFormat(_L8("Module was found in module list"));
+		}
+	else
+		{
+		Logger().WriteFormat(_L8("Module does not exist in module list"));
+		}	
+	TESTL(!tst);
+		
+	
+	return ret;
+	}
+
+void CTestStepSocketServer::OpenMultipleSocketsL(RSocketServ &aSS,RSocket *aSockets,TInt aNumSockets)
+	{
+	int ret;
+	int i;
+	for (i = 0; i < aNumSockets; i++)
+		{
+		Logger().WriteFormat(_L("Attempting to open socket %d"),i);
+		ret = aSockets[i].Open(aSS,_L("Dummy Protocol 1"));
+		Logger().WriteFormat(_L("Open returned %S"),&EpocErrorToText(ret));
+		TESTL(ret == KErrNone);
+		}
+	}
+
+TInt CTestStepSocketServer::OpenSocketProtocolStarted()
+	{
+	TRequestStatus protStatus;
+	TRequestStatus exclStatus;
+	TInt ret;
+	RSocketServ ss;
+    
+	TInt err = ss.Connect();
+	if(err != KErrNone)
+		{
+		return err;
+		}			         
+	ss.StartProtocol( KAfInet,KSockDatagram,KProtocolInetUdp, protStatus );
+	User::WaitForRequest(protStatus);
+	if(protStatus.Int() != KErrNone)
+		{
+		return protStatus.Int();
+		}
+	ss.SetExclusiveMode(exclStatus);
+	User::WaitForRequest(exclStatus);
+	if(exclStatus.Int() != KErrNone)
+		{
+		return exclStatus.Int();
+		}
+	RSocket socketArray[2];
+	ret = socketArray[0].Open(ss);
+	if(ret != KErrNone)
+		{
+		return ret;
+		}
+	ret = socketArray[1].Open(ss);
+	if(ret != KErrNone)
+		{
+		return ret;
+		}
+	ss.ClearExclusiveMode();
+	ss.StopProtocol( KAfInet,KProtocolInetTcp, KSockStream, protStatus );
+	return ret;
+	}
+