datacommsserver/esockserver/test/protocols/pdummy/T_IPWINS.CPP
changeset 0 dfb7c4ff071f
--- /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 <es_inet.h>
+#include <e32test.h>
+
+
+#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;i<numSockets;i++)
+		{
+		ret=sock[i].Open(ss,KAFInet,KSockStream,KProtocolInetTCP);
+		test(ret==KErrNone);
+		}
+
+	((TSocketThreadArg *)anArg)->iSem->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;i<aBuf.Length();i++)
+		{
+		aBuf[i]=(TText8)character;
+		if(++character>anEndChar)
+			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;
+	}
+
+