diff -r 000000000000 -r 7f656887cf89 plugins/networking/winsockprt/tsrc/t_wsp.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include + + +// +// 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 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; + }