diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/TE_Socket/SocketTestSection10.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/test/TE_Socket/SocketTestSection10.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,255 @@ +// 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 10 +// +// + +// EPOC includes +#include +#include + +// Test system includes +#include "SocketTestSection10.h" + + +// Test step 10.1 +const TDesC& CSocketTest10_1::GetTestName() + { + _LIT(ret,"Test10.1"); + return ret; + } + +enum TVerdict CSocketTest10_1::InternalDoTestStepL( void ) + { + TVerdict verdict = EPass; + + Logger().WriteFormat(_L("Test Purpose: Shutdown with EStopOutput")); + + // 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("Opening a socket on Dummy protocol 2")); + RSocket sk; + ret = sk.Open(ss, _L("Dummy Protocol 2")); + Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret)); + TESTL(KErrNone == ret); + + Logger().WriteFormat(_L("Shutting down socket with EStopOutput")); + TRequestStatus shutStat; + TRequestStatus rstat; + sk.Shutdown(RSocket::EStopOutput, shutStat); + TESTL(KRequestPending == shutStat.Int()); + + // Check we can still receive + Logger().WriteFormat(_L("Attempting to receive data")); + TSockXfrLength len; + TBuf8<6> buf; + TBuf<6> buf16; + sk.Recv(buf, 0, rstat, len); + User::WaitForRequest(rstat); + TESTL(KErrNone == rstat.Int()); + buf16.Copy(buf); + Logger().WriteFormat(_L("Recv status %S, length %d, buf '%S'"), + &EpocErrorToText(rstat.Int()), len(), &buf16); + TESTL(KErrNone == rstat.Int()); + TESTL(_L8("End of") == buf); + TESTL(6 == len()); + + // Check writing fails + Logger().WriteFormat(_L("Attempting to Send data")); + buf.SetLength(1); + sk.Send(buf, 0, rstat); + User::WaitForRequest(rstat); + Logger().WriteFormat(_L("Send status %S"), &EpocErrorToText(rstat.Int())); + TESTL(KErrNotReady == rstat.Int()); + + Logger().WriteFormat(_L("Attempting to receive more data")); + sk.Recv(buf, 0, rstat, len); + User::WaitForRequest(rstat); + buf16.Copy(buf); + Logger().WriteFormat(_L("Recv status %S, length %d, buf '%S'"), + &EpocErrorToText(rstat.Int()), len(), &buf16); + TESTL(KErrEof == rstat.Int()); + TESTL(_L8(" Data") == buf); + TESTL(5 == len()); + + Logger().WriteFormat(_L("Attempting to receive more data")); + sk.Recv(buf, 0, rstat, len); + User::WaitForRequest(rstat); + buf16.Copy(buf); + Logger().WriteFormat(_L("Recv status %S, length %d, buf '%S'"), + &EpocErrorToText(rstat.Int()), len(), &buf16); + TESTL(KErrEof == rstat.Int()); + TESTL(0 == buf.Length()); + TESTL(0 == len()); + + Logger().WriteFormat(_L("Closing socket")); + sk.Close(); // Should cancel shutStat + User::WaitForRequest(shutStat); + Logger().WriteFormat(_L("Shutdown status %S"), &EpocErrorToText(shutStat.Int())); + TESTL(KErrCancel == shutStat.Int()); + + ss.Close(); + + CleanupStack::Pop(&ss); + + SetTestStepResult(verdict); + return verdict; + } + +// Test step 10.2 +const TDesC& CSocketTest10_2::GetTestName() + { + _LIT(ret,"Test10.2"); + return ret; + } + +enum TVerdict CSocketTest10_2::InternalDoTestStepL( void ) + { + TVerdict verdict = EPass; + + Logger().WriteFormat(_L("Test Purpose: Shutdown")); + + // 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("Opening a socket on Dummy protocol 2")); + RSocket sk; + ret = sk.Open(ss, _L("Dummy Protocol 2")); + Logger().WriteFormat(_L("Open returned %S"), &EpocErrorToText(ret)); + TESTL(KErrNone == ret); + + Logger().WriteFormat(_L("Shutting down socket with EStopInput")); + TRequestStatus shutStat; + TRequestStatus rstat; + sk.Shutdown(RSocket::EStopInput, shutStat); // Dummy doesn't complete EStopInput + + // Check we can still send + Logger().WriteFormat(_L("Attempting to Send data")); + TBuf8<6> buf; + buf.SetLength(1); + sk.Send(buf, 0, rstat); + sk.CancelSend(); + User::WaitForRequest(rstat); + Logger().WriteFormat(_L("Send status %S"), &EpocErrorToText(rstat.Int())); + TESTL(KErrNotReady == rstat.Int()); + + // Check receiving fails + Logger().WriteFormat(_L("Attempting to Receive data")); + TSockXfrLength len; + sk.Recv(buf, 0, rstat, len); + User::WaitForRequest(rstat); + Logger().WriteFormat(_L("Recv status %S, length %d"), &EpocErrorToText(rstat.Int()), len()); + TESTL(KErrEof == rstat.Int()); + TESTL(0 == len()); + + Logger().WriteFormat(_L("Closing socket")); + sk.Close(); // Should cancel shutStat + User::WaitForRequest(shutStat); + Logger().WriteFormat(_L("Shutdown status %S"), &EpocErrorToText(shutStat.Int())); + TESTL(KErrCancel == shutStat.Int()); + + CleanupStack::Pop(&ss); + ss.Close(); + + SetTestStepResult(verdict); + return verdict; + } + + // Test step 10.2 + const TDesC& CSocketTest10_3::GetTestName() + { + _LIT(ret,"Test10.3"); + return ret; + } + + enum TVerdict CSocketTest10_3::InternalDoTestStepL( void ) + { + TVerdict verdict = EPass; + + Logger().WriteFormat(_L("Testing close before completion of accept on new socket")); + RSocketServ ss; + TInt ret=OptimalConnect(ss); + CleanupClosePushL(ss); + TESTL(KErrNone == ret); + + Logger().WriteFormat(_L("Opening main socket by name")); + RSocket sock, sock2; + ret=sock.Open(ss,_L("Dummy Protocol 2")); + TESTL(KErrNone == ret); + + Logger().WriteFormat(_L("Opening null socket")); + ret=sock2.Open(ss); // null socket to accept onto + TESTL(KErrNone == ret); + + TSockAddr addr; + Logger().WriteFormat(_L("Binding main socket")); + ret=sock.Bind(addr); + TESTL(KErrNone == ret); + + Logger().WriteFormat(_L("Performing Listen")); + Logger().WriteFormat(_L("Listen")); + ret=sock.Listen(5); + TESTL(KErrNone == ret); + + Logger().WriteFormat(_L("Performing Accept")); + TRequestStatus rstat; + sock.Accept(sock2, rstat); + TESTL(rstat.Int() == KRequestPending); + + User::After(2 * 1000 * 1000); // make sure accept processing has proceeded before closing the socket, otherwise + // we risk incurring a BadHandle panic from it (as seen on SMP testing) + + Logger().WriteFormat(_L("Closing new socket")); + sock2.Close(); + + Logger().WriteFormat(_L("Attempting to simulate a connect and complete the accept")); + //emulate en connect complete event + ret=sock.SetOpt(KDummyOptionSetConnectComplete,KIoctlDummyLevel,NULL); + TESTL(KErrNone == ret); + User::WaitForRequest(rstat); //Just a wait to allow something to possibly go wrong + TESTL(rstat.Int() == KErrCancel); + + Logger().WriteFormat(_L("Opening null socket")); + ret=sock2.Open(ss); // null socket to accept onto + TESTL(KErrNone == ret); + + Logger().WriteFormat(_L("Performing Accept again")); + sock.Accept(sock2, rstat); + TESTL(rstat.Int() == KRequestPending); + + Logger().WriteFormat(_L("Attempting to simulate a connect and complete the accept")); + //emulate en connect complete event + ret=sock.SetOpt(KDummyOptionSetConnectComplete,KIoctlDummyLevel,NULL); + TESTL(KErrNone == ret); + User::WaitForRequest(rstat); //Just a wait to allow something to possibly go wrong + TESTL(rstat.Int() == KErrNone); + + CleanupStack::Pop(&ss); + ss.Close(); + + SetTestStepResult(verdict); + return verdict; + } +