diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/TE_IPCTest/Test06IPCTestSelect.cpp --- /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 +#include +#include + +// 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 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; + } +