datacommsserver/esockserver/test/TE_IPCTest/Test06IPCTestSelect.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_IPCTest/Test06IPCTestSelect.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,411 @@
+// 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:
+// Contains IPC Test 02
+//
+//
+
+// EPOC includes
+#include <e32base.h>
+#include <es_sock.h>
+#include <ss_std.h>
+
+// Test system includes
+#include "Test06IPCTestSelect.h"
+
+
+const TDesC& CTest06IPCTestSelect::GetTestName()
+	{
+	_LIT(ret,"IPCTest06");
+	return ret;
+	}
+
+enum TVerdict CTest06IPCTestSelect::InternalDoTestStepL(void)
+	{
+	_LIT8(KTestMsg, "Hello");
+	
+	//-------------------substep 00-----------------------------	
+	Logger().Write(_L("00 Open socket server:"));
+	
+	TInt err;
+	RSocketServ ss;
+	CleanupClosePushL(ss);
+	if ( (err = OptimalConnect(ss)) != KErrNone )
+		{
+		Logger().WriteFormat(_L("Connecting to socket server failed with %d"), err);
+		User::Leave(EFail);
+		}
+
+	//-------------------substep 01-----------------------------	
+	Logger().Write(_L("01 Open server socket, set local port & set to listen:"));
+
+	RSocket aClientSock, aNewConn, aServerSock;
+	CleanupClosePushL(aClientSock);
+	CleanupClosePushL(aServerSock);
+	CleanupClosePushL(aNewConn);
+	
+	TRequestStatus aAcceptStat, aConnectStat;
+	TSockAddr aAddr;
+	
+	if ( (err=aServerSock.Open(ss, iProt)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not open server socket. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	if ( (err=aServerSock.SetLocalPort(257)) != KErrTooBig)
+		{
+		_LIT(aLog,"Error:Set illegal port returned %d instead of %d"); 
+		Logger().WriteFormat(aLog, err, KErrTooBig);
+		User::Leave(EFail);
+		}
+	
+	if ( (err=aServerSock.SetLocalPort(1)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not set port. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+
+	if ( (err=aServerSock.Listen(1)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not set up socket to listen. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 02-----------------------------	
+	Logger().Write(_L("02 Set server socket to non-blocking mode:"));
+	if ( (err=aServerSock.SetOpt(KSONonBlockingIO, KSOLSocket)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not set socket option. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 03-----------------------------	
+	Logger().Write(_L("03 Open blank socket, assosiate it to server socket (with accept)...:"));
+	Logger().Write(_L("   ...and check that return status is WOULD BLOCK:"));
+	if ( (err=aNewConn.Open(ss)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not open blank socket. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	aServerSock.Accept(aNewConn, aAcceptStat);
+    User::WaitForRequest(aAcceptStat);
+    err = aAcceptStat.Int();
+    if (err != KErrWouldBlock)
+		{
+		_LIT(aLog,"Error:Accept method returned wrong value %d instead of %d"); 
+		Logger().WriteFormat(aLog, err, KErrWouldBlock);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 04-----------------------------	
+	Logger().Write(_L("04 Assosiate local buffer as status buffer on server socket,..."));
+	Logger().Write(_L("   ...with initial value READ + WRITE + EXCEPTION:"));
+	TPckgBuf<TUint> aSbuf, aCbuf;
+	aSbuf()=KSockSelectRead | KSockSelectWrite | KSockSelectExcept;
+	aServerSock.Ioctl(KIOctlSelect, aAcceptStat, &aSbuf, KSOLSocket);
+	
+    //-------------------substep 05-----------------------------	
+	Logger().Write(_L("05 Associate local buffer as status buffer on client socket,..."));
+	Logger().Write(_L("   ...with initial value WRITE:"));
+
+	// Create client socket.
+	if ( (err=aClientSock.Open(ss, iProt)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not open socket. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	// Set client socket to non-blocking mode.
+	if ( (err=aClientSock.SetOpt(KSONonBlockingIO, KSOLSocket)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not set socket option. err = %d");
+		Logger().WriteFormat(aLog, err);
+		aNewConn.Close();
+		User::Leave(EFail);
+		}
+	
+	// Connect client socket to server socket.
+	aAddr.SetPort(1);
+	aClientSock.Connect(aAddr, aConnectStat);
+	User::WaitForRequest(aConnectStat);
+	err = aConnectStat.Int();
+    if ( (err != KErrNone) && (err != KErrWouldBlock))
+		{
+		_LIT(aLog,"Error:Connection method returned wrong value: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+
+	aCbuf()=KSockSelectWrite;
+    aClientSock.Ioctl(KIOctlSelect, aConnectStat, &aCbuf, KSOLSocket);
+	User::WaitForRequest(aConnectStat);
+	err = aConnectStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Ioctl method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+
+    //-------------------substep 06-----------------------------	
+	Logger().Write(_L("06 Check client status buffer to be WRITE..."));
+	Logger().Write(_L("   ...and server status buffer to be READ:"));
+
+	if ( aCbuf() != KSockSelectWrite)
+		{
+		_LIT(aLog,"Error:Wrong value of buffer: %d");
+		Logger().WriteFormat(aLog, aCbuf());
+		User::Leave(EFail);
+		}
+
+    User::WaitForRequest(aAcceptStat);
+	err = aAcceptStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Ioctl method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+
+    if (aSbuf() != KSockSelectRead)
+		{
+		_LIT(aLog,"Error:Wrong value of buffer: %d");
+		Logger().WriteFormat(aLog, aSbuf());
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 07-----------------------------	
+	Logger().Write(_L("07 Assosiate blank socket to the server socket:"));
+	
+	// Re-open blank client socket.
+	aNewConn.Close();
+	if ( (err=aNewConn.Open(ss)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not open socket. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+		
+	aServerSock.Accept(aNewConn, aAcceptStat);
+	User::WaitForRequest(aAcceptStat);
+	err = aAcceptStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Accept method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 08-----------------------------	
+	Logger().Write(_L("08 Chack that blank socket is in non blocking mode as well"));
+	if ( (err=aNewConn.GetOpt(KSONonBlockingIO, KSOLSocket, aSbuf)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not get socket option. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+    if (!aSbuf())
+		{
+		_LIT(aLog,"Error:Wrong value of option: %d");
+		Logger().WriteFormat(aLog, aSbuf());
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 09-----------------------------	
+	Logger().Write(_L("09 Try to read on server side and check that it would block"));
+	TRequestStatus aReadStat, aWriteStat;
+	TBuf8<5> aReadbuf;
+	aReadbuf.SetMax();
+	aNewConn.Read(aReadbuf, aReadStat);
+	User::WaitForRequest(aReadStat);
+	err = aReadStat.Int();
+    if (err != KErrWouldBlock)
+		{
+		_LIT(aLog,"Error:Read method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 10-----------------------------	
+	Logger().Write(_L("10 Assosiate local buffer as status buffer of blank socket,..."));
+	Logger().Write(_L("   ...with initial value: READ + EXCEPTION"));
+	aSbuf()=KSockSelectRead | KSockSelectExcept;
+	aNewConn.Ioctl(KIOctlSelect, aAcceptStat, &aSbuf, KSOLSocket);
+	
+	//-------------------substep 11-----------------------------	
+	Logger().Write(_L("11 Write a message on the client side, and chack that"));
+	Logger().Write(_L("   ...status of the other side of connection is now: READ"));
+
+	aClientSock.Write(KTestMsg, aWriteStat);
+	User::WaitForRequest(aWriteStat);
+	err = aWriteStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Write method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	User::WaitForRequest(aAcceptStat);
+	err = aAcceptStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Ioctl method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+
+    if (aSbuf()!=KSockSelectRead)
+		{
+		_LIT(aLog,"Error:Wrong value of option: %d");
+		Logger().WriteFormat(aLog, aSbuf());
+		User::Leave(EFail);
+		}
+
+    //-------------------substep 12-----------------------------	
+	Logger().Write(_L("12 Read the message on server side and check the content:"));
+	aReadbuf.SetMax();
+	
+	aNewConn.Read(aReadbuf, aReadStat);
+	User::WaitForRequest(aReadStat);
+	err = aReadStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Read method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+
+    if (aReadbuf != KTestMsg)
+		{
+		_LIT(aLog,"Error:Read/Write mismatch");
+		Logger().Write(aLog);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 13-----------------------------	
+	Logger().Write(_L("13 Try to read again on server side and check that ..."));
+	Logger().Write(_L("   ...the status of the action is: WOULD BLOCK"));
+	aReadbuf.SetMax();
+
+	aNewConn.Read(aReadbuf, aReadStat);
+	User::WaitForRequest(aReadStat);
+	err = aReadStat.Int();
+    if (err != KErrWouldBlock)
+		{
+		_LIT(aLog,"Error:Read method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 14-----------------------------	
+	Logger().Write(_L("14 Write the message on the client side:"));
+	aClientSock.Write(KTestMsg, aWriteStat);
+	User::WaitForRequest(aWriteStat);
+	err = aWriteStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Write method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 15-----------------------------	
+	Logger().Write(_L("15 Get SelectPoll option of the server side and check..."));
+	Logger().Write(_L("   ...it is READ + WRITE"));
+
+	if ( (err=aNewConn.GetOpt(KSOSelectPoll, KSOLSocket, aSbuf)) != KErrNone)
+		{
+		_LIT(aLog,"Error:Could not get socket option. err = %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+ 
+	if (aSbuf()!=(KSockSelectRead | KSockSelectWrite))
+		{
+		_LIT(aLog,"Error:Wrong value of option: %d");
+		Logger().WriteFormat(aLog, aSbuf());
+		User::Leave(EFail);
+		}
+
+	//-------------------substep 16-----------------------------	
+	Logger().Write(_L("16 Assosiate local buffer as status buffer on server side,..."));
+	Logger().Write(_L("   ...with initial value: READ + EXCEPTION. Chack that it stays READ only"));
+
+	aSbuf()=KSockSelectRead | KSockSelectExcept;
+	aNewConn.Ioctl(KIOctlSelect, aAcceptStat, &aSbuf, KSOLSocket);
+	User::WaitForRequest(aAcceptStat);
+	err = aAcceptStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Ioctl method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+
+    if (aSbuf() != KSockSelectRead)
+		{
+		_LIT(aLog,"Error:Wrong value of option: %d");
+		Logger().WriteFormat(aLog, aSbuf());
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 17-----------------------------	
+	Logger().Write(_L("17 Read the message on server side and check the content:"));
+
+	aReadbuf.SetMax();
+	aNewConn.Read(aReadbuf, aReadStat);
+	User::WaitForRequest(aReadStat);
+	err = aReadStat.Int();
+    if (err != KErrNone)
+		{
+		_LIT(aLog,"Error:Read method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+
+    if (aReadbuf != KTestMsg)
+		{
+		_LIT(aLog,"Error:Read/Write mismatch");
+		Logger().Write(aLog);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 18-----------------------------	
+	Logger().Write(_L("18 Close the server side. Access server side and the check that..."));
+	Logger().Write(_L("   ...status of the action is DISCONNECTED:"));
+	CleanupStack::PopAndDestroy(&aNewConn);
+	aCbuf()=KSockSelectRead | KSockSelectExcept;
+	
+	aClientSock.Ioctl(KIOctlSelect, aConnectStat, &aCbuf, KSOLSocket);
+	User::WaitForRequest(aConnectStat);
+	err = aConnectStat.Int();
+    if (err != KErrDisconnected)
+		{
+		_LIT(aLog,"Error:Ioctl method returned wrong status: %d");
+		Logger().WriteFormat(aLog, err);
+		User::Leave(EFail);
+		}
+	
+	//-------------------substep 19-----------------------------	
+	Logger().Write(_L("19 Close all socket and socket server:"));
+	CleanupStack::PopAndDestroy(3, &ss);
+	return EPass;
+	}
+