plugins/networking/winsockprt/tsrc/t_wsp.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/networking/winsockprt/tsrc/t_wsp.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,336 @@
+// t_wsp.cpp
+// 
+// Copyright (c) 2002 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32test.h>
+#include <e32svr.h>
+#include <e32math.h>
+#include <f32file.h>
+#include <es_sock.h>
+#include <in_sock.h>
+
+
+//
+// Constants.
+//
+
+//#define _HOME
+#ifdef _HOME
+const TInt KWebPort = 80;
+const TUint32 KSymbianWebServerIpAddress = INET_ADDR(192, 168, 0, 240);
+const TInt KLocalHostPort = 9999;
+const TUint32 KLocalHostIpAddress = INET_ADDR(127, 0, 0, 1);
+_LIT(KSymbianWebServerName, "main");
+_LIT(KAltSymbianWebServerName, "sunshare.office");
+_LIT8(KSmallWebPage,"GET http://sunshare.office/index.html \r\n\r\n");
+_LIT(KLogFile, "c:\\t_wsp.txt");
+#else
+const TInt KWebPort = 80;
+const TUint32 KSymbianWebServerIpAddress = INET_ADDR(81, 89, 143, 203);
+const TInt KLocalHostPort = 9999;
+const TUint32 KLocalHostIpAddress = INET_ADDR(127, 0, 0, 1);
+_LIT(KSymbianWebServerName, "www.symbian.com");
+_LIT(KAltSymbianWebServerName, "www.symbian.com");
+_LIT8(KSmallWebPage,"GET http://www.symbian.com/index.html \r\n\r\n");
+_LIT(KLogFile, "c:\\t_wsp.txt");
+#endif
+
+const TInt KTestTransferDataSize = 8192;
+
+//
+// Globals.
+//
+
+RFs FileServerSession;
+RFile LogFile;
+RSocketServ SocketServerSession;
+RTest TestConsole(_L("t_wsp"));
+
+
+//
+// Functions.
+//
+
+void RandomFill(TDes8& aBuf)
+	{
+	while (aBuf.Length() < (aBuf.MaxLength() - TInt(sizeof(TUint32))))
+		{
+		TUint32 rand = Math::Random();
+		TPckgC<TUint32> randPckg(rand);
+		aBuf.Append(randPckg);
+		}
+	while (aBuf.Length() < (aBuf.MaxLength()))
+		{
+		aBuf.Append(_L("p")); // Pack out last few bytes.
+		}
+	}
+
+void ReceiveHtmlL(RSocket& aSock)
+	{
+	HBufC8* webPage = HBufC8::NewMaxLC(4096);
+
+	TPtr8 des(webPage->Des());
+	des = KSmallWebPage;
+
+	TRequestStatus stat;
+	aSock.Write(*webPage, stat);
+	User::WaitForRequest(stat);
+	User::LeaveIfError(stat.Int());
+
+	TSockXfrLength HTTPHeaderLen;
+	TInt rcount = 0;
+
+	TBuf<128> infoPrintBuf;
+	FOREVER
+		{
+		des.Zero();
+		aSock.RecvOneOrMore(des,0,stat,HTTPHeaderLen);
+		User::WaitForRequest(stat);
+		if (stat != KErrNone)
+			break;
+		
+		LogFile.Write(des);
+		LogFile.Flush();
+		rcount += webPage->Length();
+		infoPrintBuf.Format(_L("\rRecved:%10d Bytes"), rcount);
+		TestConsole.Printf(infoPrintBuf);
+		}
+	if (stat != KErrEof)
+		{
+		User::Leave(stat.Int());
+		}
+
+	CleanupStack::PopAndDestroy(webPage);
+	}
+
+void TcpOpenAndConnectC(RSocket& aSocket)
+	{
+	RHostResolver resolver;
+	TestConsole(resolver.Open(SocketServerSession, KAfInet, KProtocolInetTcp) == KErrNone);
+	CleanupClosePushL(resolver);
+	TNameEntry nameEntry;
+	TestConsole(resolver.GetByName(KSymbianWebServerName, nameEntry) == KErrNone);
+	TNameRecord nameRecord(nameEntry());
+	TInetAddr addr(TInetAddr::Cast(nameRecord.iAddr).Address(), KWebPort);
+	CleanupStack::PopAndDestroy(); // resolver.
+	TestConsole(aSocket.Open(SocketServerSession, KAfInet, KSockStream, KProtocolInetTcp) == KErrNone);
+	CleanupClosePushL(aSocket);
+	TRequestStatus stat;
+	aSocket.Connect(addr, stat);
+	User::WaitForRequest(stat);
+	TestConsole(stat.Int() == KErrNone);
+	}
+
+void GetByAddress()
+	{
+	RHostResolver resolver;
+	TestConsole(resolver.Open(SocketServerSession, KAfInet, KProtocolInetTcp) == KErrNone);
+	CleanupClosePushL(resolver);
+	TNameEntry nameEntry;
+	TInetAddr testAddr(KSymbianWebServerIpAddress, KWebPort);
+	testAddr.SetFamily(KAfInet);
+	TestConsole(resolver.GetByAddress(testAddr, nameEntry) == KErrNone);
+	TNameRecord nameRecord(nameEntry());
+	TestConsole(nameRecord.iName.CompareF(KAltSymbianWebServerName) == KErrNone);
+	CleanupStack::PopAndDestroy(); // resolver.
+	}
+
+void TcpActiveOpen()
+	{
+	RSocket socket;
+	TcpOpenAndConnectC(socket);
+	TRAPD(err, ReceiveHtmlL(socket));
+	TestConsole(err == KErrNone);
+	CleanupStack::PopAndDestroy(); // socket.
+	}
+
+void TcpGetLocalName()
+	{
+	RSocket socket;
+	TcpOpenAndConnectC(socket);
+	TSockAddr localName;
+	socket.LocalName(localName);
+	CleanupStack::PopAndDestroy(); // socket.
+	}
+
+void TcpGetRemoteName()
+	{
+	RSocket socket;
+	TcpOpenAndConnectC(socket);
+	TSockAddr remoteName;
+	socket.RemoteName(remoteName);
+	CleanupStack::PopAndDestroy(); // socket.
+	}
+
+void TcpListenAccept()
+	{
+	// Create a listening server socket and a socket to accept connections.
+	RSocket listeningSocket;
+	TestConsole(listeningSocket.Open(SocketServerSession, KAfInet, KSockStream, KProtocolInetTcp) == KErrNone);
+	TInetAddr addr(KLocalHostIpAddress, KLocalHostPort);
+	TestConsole(listeningSocket.Bind(addr) == KErrNone);
+	TestConsole(listeningSocket.Listen(1) == KErrNone);
+	RSocket serverConnectionSocket;
+	TestConsole(serverConnectionSocket.Open(SocketServerSession) == KErrNone);
+	TRequestStatus acceptStatus;
+	listeningSocket.Accept(serverConnectionSocket, acceptStatus);
+
+	// Create a client socket.
+	RSocket clientSocket;
+	TestConsole(clientSocket.Open(SocketServerSession, KAfInet, KSockStream, KProtocolInetTcp) == KErrNone);
+	TRequestStatus connectStatus;
+	clientSocket.Connect(addr,connectStatus);
+	User::WaitForRequest(connectStatus);
+	User::WaitForRequest(acceptStatus);
+	TestConsole(connectStatus.Int() == KErrNone);
+	TestConsole(acceptStatus.Int() == KErrNone);
+
+	// Write some data from the client to the server.
+	HBufC8* out = HBufC8::NewLC(KTestTransferDataSize);
+	TPtr8 outPtr(out->Des());
+	RandomFill(outPtr);
+	TRequestStatus writeStatus;
+	TRequestStatus readStatus;
+	HBufC8* in = HBufC8::NewLC(KTestTransferDataSize);
+	TPtr8 inPtr(in->Des());
+	clientSocket.Write(*out, writeStatus);
+	serverConnectionSocket.Read(inPtr, readStatus);
+	User::WaitForRequest(writeStatus);
+	User::WaitForRequest(readStatus);
+	TestConsole(writeStatus.Int() == KErrNone);
+	TestConsole(readStatus.Int() == KErrNone);
+	TestConsole(in->Compare(*out) == KErrNone);
+	clientSocket.Close();
+	serverConnectionSocket.Close();
+
+	// Re-connect the client socket.
+	TestConsole(clientSocket.Open(SocketServerSession, KAfInet, KSockStream, KProtocolInetTcp) == KErrNone);
+	TestConsole(serverConnectionSocket.Open(SocketServerSession) == KErrNone);
+	listeningSocket.Accept(serverConnectionSocket, acceptStatus);
+	clientSocket.Connect(addr,connectStatus);
+	User::WaitForRequest(connectStatus);
+	User::WaitForRequest(acceptStatus);
+	TestConsole(connectStatus.Int() == KErrNone);
+	TestConsole(acceptStatus.Int() == KErrNone);
+	listeningSocket.Close();
+
+	// Re-sent the data.
+	inPtr.Zero();
+	clientSocket.Read(inPtr, readStatus);
+	serverConnectionSocket.Write(*out, writeStatus);
+	User::WaitForRequest(writeStatus);
+	User::WaitForRequest(readStatus);
+	TestConsole(writeStatus.Int() == KErrNone);
+	TestConsole(readStatus.Int() == KErrNone);
+	TestConsole(in->Compare(*out) == KErrNone);
+
+	// Cleanup.
+	clientSocket.Close();
+	listeningSocket.Close();
+	CleanupStack::PopAndDestroy(2, out);
+	}
+
+void UdpSendReceive()
+	{
+	// Create a socket to receive data.
+	RSocket receiveSocket;
+	TestConsole(receiveSocket.Open(SocketServerSession, KAfInet, KSockDatagram, KProtocolInetUdp) == KErrNone);
+	TInetAddr receiveAddress(KLocalHostIpAddress, KLocalHostPort);
+	TestConsole(receiveSocket.Bind(receiveAddress) == KErrNone);
+	TBuf8<32> receiveBuf;
+	receiveBuf.SetMax();
+	receiveBuf.Fill('a');
+	TRequestStatus receiveStatus;
+	TInetAddr sendAddress;
+	receiveSocket.RecvFrom(receiveBuf, sendAddress, 0, receiveStatus);
+
+	// Create a socket to send data.
+	RSocket sendSocket;
+	TestConsole(sendSocket.Open(SocketServerSession, KAfInet, KSockDatagram, KProtocolInetUdp) == KErrNone);
+	TBuf8<32> sendBuf;
+	sendBuf.SetMax();
+	sendBuf.Fill('b');
+	TRequestStatus sendStatus;
+	sendSocket.SendTo(sendBuf, receiveAddress, 0, sendStatus);
+
+	// Wait and check.
+	User::WaitForRequest(receiveStatus);
+	User::WaitForRequest(sendStatus);
+	TestConsole(receiveStatus.Int() == KErrNone);
+	TestConsole(sendStatus.Int() == KErrNone);
+	TestConsole(receiveBuf.Compare(sendBuf) == KErrNone);
+
+	// Cleanup.
+	receiveSocket.Close();
+	sendSocket.Close();
+	}
+
+void GetSetOption()
+	{
+	RSocket socket;
+	TcpOpenAndConnectC(socket);
+	TInt val;
+	TestConsole(socket.GetOpt(KSoTcpNoDelay, KSolInetTcp, val) == KErrNone);
+	val = !val;
+	TestConsole(socket.SetOpt(KSoTcpNoDelay, KSolInetTcp, val) == KErrNone);
+	TInt newVal;
+	TestConsole(socket.GetOpt(KSoTcpNoDelay, KSolInetTcp, newVal) == KErrNone);
+	TestConsole(val == newVal);
+	TRAPD(err, ReceiveHtmlL(socket));
+	TestConsole(err == KErrNone);
+	CleanupStack::PopAndDestroy(); // socket.
+	}
+
+TInt InitialiseLC()
+	{
+	User::LeaveIfError(FileServerSession.Connect());
+	CleanupClosePushL(FileServerSession);
+	User::LeaveIfError(LogFile.Replace(FileServerSession, KLogFile,EFileShareAny | EFileWrite | EFileStreamText));
+	CleanupClosePushL(LogFile);
+	User::LeaveIfError(SocketServerSession.Connect());
+	CleanupClosePushL(SocketServerSession);
+	return 3;
+	}
+
+GLDEF_C void RunTestsL()
+	{
+	TInt numItemsOnCleanupStack = InitialiseLC();
+//	GetByAddress();
+	TcpActiveOpen();
+	TcpGetLocalName();
+	TcpGetRemoteName();
+	TcpListenAccept();
+	UdpSendReceive();
+	GetSetOption();
+	CleanupStack::PopAndDestroy(numItemsOnCleanupStack);
+	TestConsole.Close();
+	}
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	CActiveScheduler* scheduler = new CActiveScheduler;
+	if (scheduler)
+		{
+		CActiveScheduler::Install(scheduler);
+		CTrapCleanup* cleanup = CTrapCleanup::New();
+		if (cleanup)
+			{
+			TRAPD(err, RunTestsL());
+			delete cleanup;
+			}
+		delete scheduler;
+		}
+	__UHEAP_MARKEND;
+	return KErrNone;
+	}