diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/protocols/pdummy/T_IPWINS.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/test/protocols/pdummy/T_IPWINS.CPP Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,460 @@ +// Copyright (c) 1997-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: +// + +// #include +#include + + +#define TCP_PORT_CHARGEN (TUint16)19 +#define TCP_PORT_ECHO (TUint16)7 +#define TCP_PORT_DISCARD (TUint16)9 +#define TCP_PORT_FINGER (TUint16)79 +#define TCP_PORT_TEST (TUint16)20000 +#define TCP_CONNECT_BACK_PORT (TUint16)20003 + +#define IPADDR(a,b,c,d) (TUint32)(((a)<<24)|((b)<<16)|((c)<<8)|(d)) + +#define BUFFER_SIZE 8192 + +const TUint KDefaultHeapSize=0x1000; +const TUint KNumSockets=10; + +TInetAddr HostAddr; + +// #define TEST_ADDR IPADDR(194,129,1,226) +#define TEST_ADDR IPADDR(194,129,1,6) +#define NULL_ADDR IPADDR(0,0,0,0) +#define TEST_PORT TCP_PORT_TEST + + +typedef TBuf8<0x4000> TBuf_4000; + +RTest test(_L("eSock Emulation test")); + + +struct TSocketThreadArg + { + RSemaphore* iSem; + TUint iNumSockets; + }; + +TInt socketThread(TAny * anArg) +// +// +// + { + + RTest test(_L("eSock client test sub thread - creating sockets")); + RSocketServ ss; + TInt ret=ss.Connect(); + test(ret==KErrNone); + + TInt numSockets=((TSocketThreadArg *)anArg)->iNumSockets; + + RSocket* sock=new RSocket[numSockets]; + RHostResolver* hostR=new RHostResolver[numSockets]; + RServiceResolver* servR=new RServiceResolver[numSockets]; + + for (TInt i=0;iiSem->Signal(); + User::WaitForAnyRequest(); + + return KErrNone; + } + + +void StripeMem(TDes8 &aBuf,TUint aStartChar,TUint anEndChar) +// +// Mark a buffer with repeating byte pattern +// + { + +// __ASSERT_ALWAYS(aStartChar<=anEndChar,Panic(EBadArg)); + + if (aStartChar==anEndChar) + { + aBuf.Fill(aStartChar); + return; + } + + TUint character=aStartChar; + for (TInt i=0;ianEndChar) + character=aStartChar; + } + } + +TInt test0() +// +// Name resolver tests +// + { + test.Start(_L("eSock Emulation test - Name resolution")); + + // Connect to the actual socket server + RSocketServ ss; + TInt ret=ss.Connect(); + test(ret==KErrNone); + + test.Next(_L("Create host resolver")); + RHostResolver hr; + ret=hr.Open(ss,KAFInet,KSockStream); + test(ret==KErrNone); + + test.Next(_L("Get host name")); + TBuf<20> name; + ret=hr.GetHostName(name); + test(ret==KErrNone); + test.Printf(_L("Hostname: %S\r\n"),&name); + + TNameRecord t; + TNameEntry addrEnt(t); + ret=hr.GetByName(name,addrEnt); + test(ret==KErrNone); + + HostAddr=addrEnt().iAddr; + TUint32 ad=ByteOrder::Swap32(HostAddr.Address()); + test.Printf(_L("Address: %d.%d.%d.%d"),(ad&0x000000ff),(ad&0x0000ff00)>>8,(ad&0x00ff0000)>>16,(ad&0xff000000)>>24); + test.Printf(_L(" (0x%X.0x%X.0x%X.0x%X) \r\n"),(ad&0x000000ff),(ad&0x0000ff00)>>8,(ad&0x00ff0000)>>16,(ad&0xff000000)>>24); + hr.Close(); + ss.Close(); + test.End(); // } + + return 0; + + } + + + +TInt test1() +// +// Test connection and disconnection +// + { + test.Start(_L("eSock Emulation test - connect/disconnect")); + + // Connect to the actual socket server + RSocketServ ss; + TInt ret = ss.Connect(); + test(ret==KErrNone); + + test.Next(_L("Create socket")); // { + + RSocket sock; + ret = sock.Open(ss, KAFInet, KSockStream, KProtocolInetTCP); + test(ret==KErrNone); + + test.Next(_L("Connecting")); + HostAddr.SetPort(TEST_PORT); + TRequestStatus status; + sock.Connect(HostAddr, status); + User::WaitForRequest(status); + test(status==KErrNone); + + test.Next(_L("Closing")); + sock.Close(); + + ss.Close(); + + test.End(); // } + + return 0; + + } + + +TInt test2() +// +// Test read and write +// + { + test.Start(_L("eSock Emulation test - read/write")); + + // Connect to the actual socket server + RSocketServ ss; + TInt ret = ss.Connect(); + test(ret==KErrNone); + + test.Next(_L("Create socket")); // { + + RSocket sock; + ret = sock.Open(ss, KAFInet, KSockStream, KProtocolInetTCP); + test(ret==KErrNone); + + test.Next(_L("Connecting")); + HostAddr.SetPort(TEST_PORT); + TRequestStatus status; + sock.Connect(HostAddr, status); + User::WaitForRequest(status); + test(status==KErrNone); + + TRequestStatus readStatus; + TRequestStatus writeStatus; + + test.Next(_L("Writing")); + TBuf_4000* temp=new TBuf_4000; + TBuf_4000& outBuf=*temp; + outBuf.SetLength(100); + StripeMem(outBuf, 'A', 'Z'); + sock.Write(outBuf,writeStatus); + + TRequestStatus stat; + sock.SetOpt(KSOBlockingIO,KSOLSocket); + User::WaitForRequest(writeStatus); + test(writeStatus==KErrNone); + + test.Next(_L("Reading")); + TBuf_4000* temp2=new TBuf_4000; + TBuf_4000& inBuf=*temp2; + inBuf.SetLength(100); + sock.Read(inBuf,readStatus); + User::WaitForRequest(readStatus); + test(status==KErrNone); + test(readStatus==KErrNone); + + test.Next(_L("Checking Reply")); + test(outBuf.Compare(inBuf)==0); + + test.Next(_L("Closing")); + sock.Close(); + + delete temp; + delete temp2; + test.End(); // } + + return 0; + + } + +void test3() +// +// Test that everything is funky when we close sockets by killing a thread +// + { + + test.Start(_L("Checking thread termintaion clean up code")); + RSemaphore s; + s.CreateLocal(0); + RThread t; + + TSocketThreadArg a; + a.iSem=&s; + a.iNumSockets=KNumSockets; + + test.Next(_L("Creating sub thread")); + t.Create(_L("socketThread"),socketThread,KDefaultStackSize,KDefaultHeapSize,KDefaultHeapSize,&a); + t.Resume(); + s.Wait(); + test.Next(_L("Killing Sub thread")); + t.Kill(KErrNone); + t.Close(); + test.End(); + } + + +TInt test4() +// +// Stuff about a megabyte down its neck. +// + { + test.Start(_L("Read/write multiple")); + + User::After(400000); + + // Connect to the actual socket server + RSocketServ ss; + TInt ret = ss.Connect(); + test(ret==KErrNone); + + test.Next(_L("Create socket")); // { + + RSocket sock; + ret = sock.Open(ss, KAFInet, KSockStream, KProtocolInetTCP); + test(ret==KErrNone); + + test.Next(_L("Connecting")); + TInetAddr addr(HostAddr); + TRequestStatus status; + sock.Connect(addr, status); + User::WaitForRequest(status); + test(status==KErrNone); + + TRequestStatus stat; + sock.SetOpt(KSOBlockingIO,KSOLSocket); + + TRequestStatus writeStatus; + TBuf_4000* temp=new TBuf_4000; + TBuf_4000& outBuf=*temp; + outBuf.SetLength(BUFFER_SIZE); + StripeMem(outBuf, 'A', 'Z'); + + TRequestStatus readStatus; + TBuf_4000* temp2=new TBuf_4000; + TBuf_4000& inBuf=*temp2; + inBuf.SetLength(BUFFER_SIZE); + + test.Next(_L("Reading and Writing")); + for (int i=0; i<128; i++) + { + + sock.Write(outBuf,writeStatus); + User::WaitForRequest(writeStatus); + + sock.Read(inBuf,readStatus); + User::WaitForRequest(readStatus); + + test(writeStatus==KErrNone); + test(readStatus==KErrNone); + + test(outBuf.Compare(inBuf)==0); + test.Printf(_L("Written %d K\r"),(i*BUFFER_SIZE)/1024); + } + + test.Printf(_L("\n")); + + test.Next(_L("Closing")); + sock.Close(); + + test.End(); // } + delete temp; + delete temp2; + + return 0; + + } + +void test5() + { + test.Start(_L("Dual socket Read/write multiple")); + + RSocketServ ss; + TInt ret = ss.Connect(); + test(ret==KErrNone); + + test.Next(_L("Create sockets")); + + RSocket sock1; + ret = sock1.Open(ss, KAFInet, KSockStream, KProtocolInetTCP); + test(ret==KErrNone); + + RSocket listener; + ret = listener.Open(ss, KAFInet, KSockStream, KProtocolInetTCP); + test(ret==KErrNone); + TInetAddr addr(HostAddr); + addr.SetPort(TCP_CONNECT_BACK_PORT+1); + + TRequestStatus status; + ret=listener.Bind(addr); + test(ret==KErrNone); + + test.Next(_L("Start listening")); + + ret=listener.Listen(5); + test(ret==KErrNone); + + RSocket sock2; + ret = sock2.Open(ss); + test(ret==KErrNone); + + test.Next(_L("Accept")); + + TRequestStatus acceptStat; + TInetAddr from; + sock2.Accept(listener,from,acceptStat); + + test.Next(_L("Start connect")); + + addr.SetPort(TCP_CONNECT_BACK_PORT); + TRequestStatus connectStat; + sock1.Connect(addr,connectStat); + + User::WaitForRequest(connectStat); + test(connectStat==KErrNone); + User::WaitForRequest(acceptStat); + test(acceptStat==KErrNone); + + TBuf_4000* temp=new TBuf_4000; + TBuf_4000& outBuf=*temp; + outBuf.SetLength(BUFFER_SIZE); + + TRequestStatus readStat; + TRequestStatus writeStat; + TBuf_4000* temp2=new TBuf_4000; + TBuf_4000& inBuf=*temp2; + inBuf.SetLength(BUFFER_SIZE); + test.Printf(_L("\n")); + + test.Next(_L("Reading and Writing")); + for (int i=0; i<128; i++) + { + + sock1.Write(outBuf,writeStat); + User::WaitForRequest(writeStat); + test.Printf(_L("\rWritten %d K"),(i*BUFFER_SIZE)/1024); + + sock2.Read(inBuf,readStat); + User::WaitForRequest(readStat); + + test(writeStat==KErrNone); + test(readStat==KErrNone); + + test(outBuf.Compare(inBuf)==0); + StripeMem(outBuf, 'A'+i%13, 'Z'); + + test.Printf(_L(" read %d K"),(i*BUFFER_SIZE)/1024); + } + + test.Printf(_L("\n")); + + sock1.Close(); + + sock2.Close(); + + listener.Close(); + + delete temp; + delete temp2; + test.End(); + } + +TInt E32Main() +// +// +// + { + + test.Title(); + + test.Start(_L("ESock tests")); + + test0(); + test1(); + test2(); + test3(); + test4(); + test5(); + + test.End(); + return 0; + } + +