datacommsserver/esockserver/test/TE_Socket/SocketTestSection10.cpp
changeset 0 dfb7c4ff071f
--- /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 <e32base.h>
+#include <test/es_dummy.h>
+
+// 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;
+	}
+