--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_ESock/EsockTestSection8.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,1539 @@
+// Copyright (c) 2001-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 8
+//
+//
+
+// EPOC includes
+#include <e32base.h>
+#include <in_sock.h>
+
+// Test system includes
+#include "EsockTestSection8.h"
+
+
+// Test step 8.1
+const TDesC& CEsockTest8_1::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.1");
+
+ return ret;
+ }
+
+CEsockTest8_1::~CEsockTest8_1()
+ {
+ }
+
+enum TVerdict CEsockTest8_1::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.1"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_1::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - 1 byte read out-of-band
+
+ // for client enable KSoTcpNextSendUrgentData
+ TESTL(iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1)==KErrNone);
+
+ // send a single byte from the client
+ TRequestStatus stat;
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("7"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // wait for 1 second
+ User::After(1000000);
+
+ // check on server that urgent data is available
+ TInt nRet;
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == 1, nRet);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == 0, nRet);
+
+ // check the number of bytes to read (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == 0, nRet);
+
+ // get the last error - check it is KErrUrgentData (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOSelectLastError, KSOLSocket, nRet);
+ TESTEL(KErrUrgentData == ret, ret);
+
+ // peek for urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpPeekUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == '7', nRet);
+
+ // peek again
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpPeekUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == '7', nRet);
+
+ // read the urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == '7', nRet);
+
+ // read again
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNotFound == ret, ret);
+
+ return EPass;
+ }
+
+
+// Test step 8.2
+const TDesC& CEsockTest8_2::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.2");
+
+ return ret;
+ }
+
+CEsockTest8_2::~CEsockTest8_2()
+ {
+ }
+
+enum TVerdict CEsockTest8_2::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.2"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_2::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - 2 bytes, 1 of urgent data read out-of-band
+
+ // for client enable KSoTcpNextSendUrgentData
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // send 2 bytes of data from the client
+ TRequestStatus stat;
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("89"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // check on server that urgent data is not available
+ TInt nRet;
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // wait for 1 second
+ User::After(1000000);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // check the number of bytes to read (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // read the data - check only a single byte is read
+ TBuf8<40> rbuf;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrUrgentData, stat.Int());
+ TESTL(rbuf==_L8("8"));
+
+ // check that urgent data is now available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // check KSoTcpNextSendUrgentData option is disabled (client)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex2).GetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // get the last error - check it is KErrUrgentData (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOSelectLastError, KSOLSocket, nRet);
+ TESTEL(KErrUrgentData == ret, ret);
+
+ // peek for urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpPeekUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTL(nRet=='9');
+
+ // read the urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTL(nRet=='9');
+
+ // read again
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNotFound == ret, ret);
+
+ return EPass;
+ }
+
+
+// Test step 8.3
+const TDesC& CEsockTest8_3::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.3");
+
+ return ret;
+ }
+
+CEsockTest8_3::~CEsockTest8_3()
+ {
+ }
+
+enum TVerdict CEsockTest8_3::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.3"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_3::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - 14 bytes (4th is urgent) read out-of-band
+
+ // for client enable KSoTcpNextSendUrgentData
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // send 4 bytes of data from the client
+ TRequestStatus stat;
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("1234"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // send 10 more bytes of data from the client
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("abcdefghij"), stat);
+
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // wait for 1 second
+ User::After(1000000);
+
+ // check on server that urgent data is not available
+ TInt nRet;
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(3 == nRet, nRet);
+
+ // check the number of bytes to read before urgent data(server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(3 == nRet, nRet);
+
+ // read the data - check only 3 bytes are read
+ TBuf8<10> rbuf;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrUrgentData, stat.Int());
+ TESTL(rbuf==_L8("123"));
+
+ // check that urgent data is now available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // check the number of bytes to read before urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // peek for urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpPeekUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTL(nRet=='4');
+
+ // read the urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTL(nRet=='4');
+
+ User::After(1000);
+
+ // check the number of bytes to read is now updated since we read out urgent data
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(10 == nRet, nRet);
+
+ // read the rest of the data
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf==_L8("abcdefghij"));
+
+ return EPass;
+ }
+
+
+// Test step 8.4
+const TDesC& CEsockTest8_4::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.4");
+
+ return ret;
+ }
+
+CEsockTest8_4::~CEsockTest8_4()
+ {
+ }
+
+enum TVerdict CEsockTest8_4::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.4"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_4::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - 8000 bytes (7998th is urgent) read out-of-band
+
+ // send data from client - 8000 bytes with 7998th marked urgent
+ TBuf8<100> wbuf;
+ TRequestStatus stat;
+ for (TInt i=0 ; i<80 ; i++)
+ {
+ wbuf.SetMax();
+ wbuf.Fill(TChar((TUint8)i)); // fill buffer with data
+
+ if (i==79) // send 100 chars with 98th marked urgent
+ {
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(wbuf.Mid(0,97), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ TESTL(iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1)==KErrNone);
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("?"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("yz"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ }
+ else // send 100 chars
+ {
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(wbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ }
+ }
+
+ User::After(1000000);
+
+ // check on server that urgent data is not available
+ TInt nRet;
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(7997 == nRet, nRet);
+
+ // check the number of bytes to read before urgent data(server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(7997 == nRet, nRet);
+
+ // read the data - check all bytes are read
+ TInt expectedRet = KErrNone;
+ TBuf8<100> rbuf;
+ TInt count;
+ for (count = 0; count < 7997;)
+ {
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTL(stat==expectedRet);
+ count+=rbuf.Length();
+ if (count == 7900)
+ {
+ expectedRet = KErrUrgentData;
+ }
+ }
+ TESTEL(7997 == count, count);
+
+ // check that urgent data is now available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // check the number of bytes to read before urgent data(server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // read the urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTL(nRet=='?');
+
+ User::After(1000);
+
+ // check the number of bytes to read (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(2 == nRet, nRet);
+
+ // read the rest of the data
+ TBuf8<2> rbuf2;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf2, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf2==_L8("yz"));
+
+ return EPass;
+ }
+
+
+// Test step 8.5
+const TDesC& CEsockTest8_5::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.5");
+
+ return ret;
+ }
+
+CEsockTest8_5::~CEsockTest8_5()
+ {
+ }
+
+enum TVerdict CEsockTest8_5::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.5"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_5::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - 1 byte of data read in-band
+
+ // for server enable KSoTcpOobInline
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex3).SetOpt(KSoTcpOobInline, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // for client enable KSoTcpNextSendUrgentData
+ ret = iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // send a single data byte from the client
+ TRequestStatus stat;
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("7"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // delay for 1 second
+ User::After(1000000);
+
+ // check on server that urgent data is available
+ TInt nRet;
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // check the number of bytes to read (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // check KSoTcpNextSendUrgentData option is disabled (client)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex2).GetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // check that there is no error state for the socket
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOSelectLastError, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+
+ // peek for urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpPeekUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNotFound == ret, ret);
+
+ // read urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNotFound == ret, ret);
+
+ // read the data - check only 1 byte is read
+ TBuf8<1> rbuf;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf==_L8("7"));
+
+ return EPass;
+ }
+
+
+// Test step 8.6
+const TDesC& CEsockTest8_6::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.6");
+
+ return ret;
+ }
+
+CEsockTest8_6::~CEsockTest8_6()
+ {
+ }
+
+enum TVerdict CEsockTest8_6::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.6"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_6::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - 2 bytes one of urgent data read in-band
+
+ // for server enable KSoTcpOobInline
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex3).SetOpt(KSoTcpOobInline, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // for client enable KSoTcpNextSendUrgentData
+ ret = iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // send 2 bytes of data from the client
+ TRequestStatus stat;
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("89"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ User::After(1000000);
+
+ // check on server that urgent data is not available
+ TInt nRet;
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // check the number of bytes to read before urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // read the data - check only 1 byte is read
+ TBuf8<1> rbuf;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf==_L8("8"));
+
+ User::After(1000);
+
+ // read again - check the remaining byte is read
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf==_L8("9"));
+
+ // check urgent data is not available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // peek for urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpPeekUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNotFound == ret, ret);
+
+ // read urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNotFound == ret, ret);
+
+ return EPass;
+ }
+
+
+// Test step 8.7
+const TDesC& CEsockTest8_7::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.7");
+
+ return ret;
+ }
+
+CEsockTest8_7::~CEsockTest8_7()
+ {
+ }
+
+enum TVerdict CEsockTest8_7::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.7"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_7::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - 14 bytes (4th is urgent) read in-band
+
+ // for server enable KSoTcpOobInline
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex3).SetOpt(KSoTcpOobInline, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // for client enable KSoTcpNextSendUrgentData
+ ret = iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // send 4 bytes of data from the client
+ TRequestStatus stat;
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("1234"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // send 10 more bytes of data from the client
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("1234567890"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ User::After(1000000);
+
+ // check on server that urgent data is not available
+ TInt nRet;
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(3 == nRet, nRet);
+
+ // check the number of bytes to read before urgent data(server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(3 == nRet, nRet);
+
+ // read the data - check only 3 bytes are read
+ TBuf8<11> rbuf;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf==_L8("123"));
+
+ // check urgent data is available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // read again - check the remaining data is read
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf==_L8("41234567890"));
+
+ // check urgent data is not available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // peek for urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpPeekUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNotFound == ret, ret);
+
+ // read urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNotFound == ret, ret);
+
+ return EPass;
+ }
+
+
+// Test step 8.8
+const TDesC& CEsockTest8_8::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.8");
+
+ return ret;
+ }
+
+CEsockTest8_8::~CEsockTest8_8()
+ {
+ }
+
+enum TVerdict CEsockTest8_8::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.8"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_8::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - 8000 bytes (7998th is urgent) read in-band
+
+ // for server enable KSoTcpOobInline
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex3).SetOpt(KSoTcpOobInline, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // send data from client - 8000 bytes with 7998th marked urgent
+ TBuf8<100> wbuf;
+ TRequestStatus stat;
+ for (TInt i=0 ; i<80 ; i++)
+ {
+ wbuf.SetMax();
+ wbuf.Fill(TChar((TUint8)i)); // fill buffer with data
+
+ if (i==79) // send 100 chars with 98th marked urgent
+ {
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(wbuf.Mid(0,97), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ TESTL(iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1)==KErrNone);
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("?"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("yz"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ }
+ else // send 100 chars
+ {
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(wbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ }
+ }
+
+ // check on server that urgent data is not available
+ TInt nRet;
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ User::After(1000000);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(7997 == nRet, nRet);
+
+ // check the number of bytes to read before urgent data (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(7997 == nRet, nRet);
+
+ // read the data - check all 7997 bytes are read
+ TBuf8<100> rbuf;
+ TInt count;
+ for (count = 0; count < 7997;)
+ {
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ count+=rbuf.Length();
+ if (count == 7900)
+ rbuf.SetLength(97);
+ }
+ TESTEL(7997 == count, count);
+
+ // check that urgent data is available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // attempt to read the urgent data (server)
+ TESTL(iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet)==KErrNotFound);
+
+ // read data - check only a single byte is returned
+ TBuf8<1> rbuf2;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf2, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf2==_L8("?"));
+
+ // check that urgent data is not available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // check the number of bytes to read (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(2 == nRet, nRet);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // read the rest of the data - expecting 'y' followed by 'z'
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf2, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf2==_L8("y"));
+
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf2, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf2==_L8("z"));
+
+ return EPass;
+ }
+
+
+// Test step 8.9
+const TDesC& CEsockTest8_9::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.9");
+
+ return ret;
+ }
+
+CEsockTest8_9::~CEsockTest8_9()
+ {
+ }
+
+enum TVerdict CEsockTest8_9::easyTestStepPreambleL()
+ {
+ TInt connections;
+ TRAPD(ret, connections = OpenConnectionsL(_L("Test_8.9"), iSockIndex2, iSockIndex3));
+ if (KErrNone != ret)
+ {
+ return EFail;
+ }
+ if (0 >= connections)
+ {
+ return EFail;
+ }
+
+ return EPass;
+ }
+
+enum TVerdict CEsockTest8_9::easyTestStepL()
+ {
+ TESTL(EPass == TestStepResult());
+
+ // Urgent data test - send 1 urgent byte and then another read out-of-band
+
+ // send 4 bytes of data from the client
+ TRequestStatus stat;
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("1234"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // for client enable KSoTcpNextSendUrgentData
+ TInt ret = iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // send 4 more bytes
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("5678"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ User::After(2000000); // Per the outcome of DEF036402, the stack behaviour is not to guarantee that urgent data
+ // forces segment send. Hence here we for 5 seconds to ensure that it does get sent
+
+ // send 5 more bytes
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("90abc"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // enable KSoTcpNextSendUrgentData again
+ ret = iEsockSuite->GetSocketHandle(iSockIndex2).SetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, 1);
+ TESTEL(KErrNone == ret, ret);
+
+ // send 4 more bytes
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("defg"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // send a final 4 bytes
+ iEsockSuite->GetSocketHandle(iSockIndex2).Write(_L8("hijk"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ User::After(1000000);
+
+ // check on server that urgent data is not available
+ TInt nRet;
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // check the urgent data offset (server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(15 == nRet, nRet);
+
+ // check the number of bytes to read before urgent data(server)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(7 == nRet, nRet);
+
+ // check KSoTcpNextSendUrgentData option is disabled (client)
+ ret = iEsockSuite->GetSocketHandle(iSockIndex2).GetOpt(KSoTcpNextSendUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // Attempt to read 10 bytes of data (server). Due to urgent data should complete with KErrUrgentData and
+ // 7 bytes
+ TBuf8<10> rbuf;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrUrgentData, stat.Int());
+ TESTL(rbuf==_L8("1234567"));
+
+ // the test code below matches the current stack behaviour but it doesn't seem very sensible/intuitive
+ // In essence it is that the position of the urgent data mark is that of the most recently received urgent data
+ // even though the stack tracks several urgent data marks in the stream. Specifically, the above test indicates
+ // urgent data at byte 8, but the RcvAtMark is not set, the offset points to the second mark, and the byte at
+ // that position is the second urgent write's "g". If the second urgent write is suppressed then here we see
+ // that we are at the urgent mark, its offset is 0, and the byte is "8".
+
+ // check that urgent data is not available
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ Logger().WriteFormat(_L("TcpRcvAtMark=%d."), nRet);
+ TESTL(nRet==0);
+
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ Logger().WriteFormat(_L("KSOUrgentDataOffset=%d."), nRet);
+ TESTL(nRet==8);
+
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ Logger().WriteFormat(_L("KSOReadBytesPending=%d."), nRet);
+ TESTL(nRet==8);
+
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf==_L8("90abcdef"));
+
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpRcvAtMark, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ Logger().WriteFormat(_L("KSoTcpRcvAtMark=%d."), nRet);
+ TESTL(nRet==1);
+
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOUrgentDataOffset, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ Logger().WriteFormat(_L("KSOUrgentDataOffset=%d."), nRet);
+ TESTL(nRet==0);
+
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSoTcpReadUrgentData, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ Logger().WriteFormat(_L("KSoTcpReadUrgentData=%d."), nRet);
+ TESTL(nRet=='g');
+
+ User::After(1000);
+
+ ret = iEsockSuite->GetSocketHandle(iSockIndex3).GetOpt(KSOReadBytesPending, KSOLSocket, nRet);
+ TESTEL(KErrNone == ret, ret);
+ Logger().WriteFormat(_L("KSOReadBytesPending=%d."), nRet);
+ TESTL(nRet==4);
+
+ // read the remaining data
+ TBuf8<4> rbuf2;
+ iEsockSuite->GetSocketHandle(iSockIndex3).Read(rbuf2, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTL(rbuf2==_L8("hijk"));
+
+ return EPass;
+ }
+
+
+// Test step 8.10
+const TDesC& CEsockTest8_10::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.10");
+
+ return ret;
+ }
+
+CEsockTest8_10::~CEsockTest8_10()
+ {
+ }
+
+enum TVerdict CEsockTest8_10::easyTestStepL()
+ {
+ TInetAddr addrLocal, addrRemote;
+ TInt sockIndex1, sockIndex2, sockIndex3;
+
+ // get local ip address
+ TESTL(GetIpAddressFromConfig(_L("Test_8.10"), _L("ipAddressLocal"), addrLocal));
+
+ // get ip address to connect to (usually loopback)
+ TESTL(GetIpAddressFromConfig(_L("Test_8.10"), _L("ipAddressRemote"), addrRemote));
+ addrRemote.SetPort(1);
+
+ // open socket and listen for connect requests
+ TESTL(KErrNone == OpenListeningSocketL(addrLocal, sockIndex1));
+
+ RSocket sock;
+ TInt nRet = sock.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // set receive window size
+ TInt ret = sock.SetOpt(KSoTcpRecvWinSize, KSolInetTcp, 20);
+ TESTEL(KErrNone == ret, ret);
+
+ TRequestStatus stat;
+ sock.Connect(addrRemote, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ sockIndex2 = iEsockSuite->AddSocketToListL(sock);
+
+ // accept connect request
+ TESTL(KErrNone == AcceptConnectionL(sockIndex3, sockIndex1));
+
+ // write 35 bytes (server to client)
+ iEsockSuite->GetSocketHandle(sockIndex3).Write(_L8("abcdefghijklmnopqrstuvwxyz012345678"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // client has nothing to read
+ iEsockSuite->GetSocketHandle(sockIndex2).GetOpt(KSoTcpReadBytesPending, KSolInetTcp, nRet);
+ TESTEL(0 == nRet, nRet);
+
+ // server has data buffered for sending
+ iEsockSuite->GetSocketHandle(sockIndex3).GetOpt(KSoTcpSendBytesPending, KSolInetTcp, nRet);
+ TESTEL(35 == nRet, nRet);
+
+ // write another 35 bytes
+ iEsockSuite->GetSocketHandle(sockIndex3).Write(_L8("abcdefghijklmnopqrstuvwxyz012345678"), stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // client has only 20 bytes to read
+ iEsockSuite->GetSocketHandle(sockIndex2).GetOpt(KSoTcpReadBytesPending, KSolInetTcp, nRet);
+ TESTEL(20 == nRet, nRet);
+
+ // server has remainder buffered
+ iEsockSuite->GetSocketHandle(sockIndex3).GetOpt(KSoTcpSendBytesPending, KSolInetTcp, nRet);
+ TESTEL(50 == nRet, nRet);
+
+ // read on client
+ TBuf8<100> rbuf;
+ TSockXfrLength len;
+ iEsockSuite->GetSocketHandle(sockIndex2).RecvOneOrMore(rbuf, 0, stat, len);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+ TESTEL(20 == len(), len());
+
+ // client has only 20 bytes to read
+ iEsockSuite->GetSocketHandle(sockIndex2).GetOpt(KSoTcpReadBytesPending, KSolInetTcp, nRet);
+ TESTEL(20 == nRet, nRet);
+
+ // server has remainder buffered
+ iEsockSuite->GetSocketHandle(sockIndex3).GetOpt(KSoTcpSendBytesPending, KSolInetTcp, nRet);
+ TESTEL(30 == nRet, nRet);
+
+ iEsockSuite->GetSocketHandle(sockIndex2).RecvOneOrMore(rbuf, 0, stat, len);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ return EPass;
+ }
+
+
+
+// Test step 8.13
+const TDesC& CEsockTest8_13::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.13");
+
+ return ret;
+ }
+
+CEsockTest8_13::~CEsockTest8_13()
+ {
+ }
+
+enum TVerdict CEsockTest8_13::easyTestStepL()
+ {
+ // Reuse of address test
+
+ // get ip address
+ TInetAddr addr;
+ TESTL(GetIpAddressFromConfig(_L("Test_8.13"), _L("ipAddress"), addr));
+
+ // get port number
+ TInt port;
+ TESTL(GetIntFromConfig(_L("Test_8.13"), _L("port"), port));
+
+ RSocket sock1;
+ CleanupClosePushL(sock1);
+ TInt nRet = sock1.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+ // store socket handle
+ TInt sockIndex1 = iEsockSuite->AddSocketToListL(sock1);
+ CleanupStack::Pop();
+
+ RSocket sock2;
+ CleanupClosePushL(sock2);
+ nRet = sock2.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+ // store socket handle
+ TInt sockIndex2 = iEsockSuite->AddSocketToListL(sock2);
+ CleanupStack::Pop();
+
+ // set the port number
+ addr.SetPort(port);
+
+ // bind the socket
+ nRet = sock1.Bind(addr);
+ TESTEL(nRet==KErrNone, nRet);
+
+ // bind the socket to the same address - check for failure
+ nRet = sock2.Bind(addr);
+ TESTEL(nRet==KErrInUse, nRet);
+
+ // close the 2 sockets
+ iEsockSuite->CloseSocket(sockIndex2);
+ iEsockSuite->CloseSocket(sockIndex1);
+
+ CleanupClosePushL(sock1);
+ nRet = sock1.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+ sockIndex1=iEsockSuite->AddSocketToListL(sock1);
+ CleanupStack::Pop();
+
+ CleanupClosePushL(sock2);
+ nRet = sock2.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+ sockIndex2=iEsockSuite->AddSocketToListL(sock2);
+ CleanupStack::Pop();
+
+ // for each of the 2 sockets enable the KSoReuseAddr option
+ TESTL(sock1.SetOpt(KSoReuseAddr, KSolInetIp, 1)==KErrNone);
+ TESTL(sock2.SetOpt(KSoReuseAddr, KSolInetIp, 1)==KErrNone);
+
+ // bind the first socket
+ nRet = sock1.Bind(addr);
+ TESTEL(nRet==KErrNone, nRet);
+
+ // bind the second socket - this time it is successful
+ nRet = sock2.Bind(addr);
+ TESTEL(nRet==KErrNone, nRet);
+
+ // close the sockets (run test 1.15 to close any sockets)
+
+ return EPass;
+ }
+
+
+// Test step 8.14
+const TDesC& CEsockTest8_14::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.14");
+
+ return ret;
+ }
+
+CEsockTest8_14::~CEsockTest8_14()
+ {
+ }
+
+enum TVerdict CEsockTest8_14::easyTestStepL()
+ {
+ TInetAddr addrLocal, addrRemote;
+ TInt sockIndex1, sockIndex2, sockIndex3;
+
+ // 2MSL wait test
+
+ // get local ip address
+ TESTL(GetIpAddressFromConfig(_L("Test_8.14"), _L("ipAddressLocal"), addrLocal));
+
+ // get ip address to connect to (usually loopback)
+ TESTL(GetIpAddressFromConfig(_L("Test_8.14"), _L("ipAddressRemote"), addrRemote));
+
+ // open socket and listen for connect requests
+ TESTL(KErrNone == OpenListeningSocketL(addrLocal, sockIndex1));
+
+ // open active socket and make connect request
+ TESTL(KErrNone == OpenActiveSocketL(addrRemote, sockIndex2));
+
+ // accept connect request
+ TESTL(KErrNone == AcceptConnectionL(sockIndex3, sockIndex1));
+
+ // close the sockets - should now be in 2MSL wait state
+ iEsockSuite->GetSocketHandle(sockIndex3).Close();
+ iEsockSuite->GetSocketHandle(sockIndex2).Close();
+ iEsockSuite->GetSocketHandle(sockIndex1).Close();
+
+ // open a TCP socket
+ RSocket sock;
+ CleanupClosePushL(sock);
+ TInt nRet = sock.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // bind the socket to the same address - check for failure
+ addrLocal.SetPort(1);
+ nRet = sock.Bind(addrLocal);
+ TESTEL(nRet==KErrInUse, nRet);
+
+ // check that the bind is successful after 2MSL wait period has expired
+ do
+ {
+ User::After(1000000); // 1 second delay
+ nRet = sock.Bind(addrLocal); // keep trying
+ } while (nRet==KErrInUse);
+
+ TESTEL(nRet==KErrNone, nRet); // check bind is successful after the delay
+
+ // close the socket???
+ CleanupStack::PopAndDestroy();
+
+ // open socket and listen for connect requests
+ TESTL(KErrNone == OpenListeningSocketL(addrLocal, sockIndex1));
+
+ // open active socket and make connect request
+ TESTL(KErrNone == OpenActiveSocketL(addrRemote, sockIndex2));
+
+ // accept connect request
+ TESTL(KErrNone == AcceptConnectionL(sockIndex3, sockIndex1));
+
+ // close the client and server sockets - leaving them in a 2MSL wait state
+ iEsockSuite->GetSocketHandle(sockIndex3).Close();
+ iEsockSuite->GetSocketHandle(sockIndex2).Close();
+
+ // open a TCP socket
+ CleanupClosePushL(sock);
+ nRet = sock.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // enable the KSoReuseAddr socket option
+ TESTL(sock.SetOpt(KSoReuseAddr, KSolInetIp, 1)==KErrNone);
+
+ // bind the socket to the same address - bind is now successful
+ nRet = sock.Bind(addrLocal);
+ TESTEL(nRet==KErrNone, nRet);
+
+ // attempt to connect - check for failure
+ TRequestStatus stat;
+ addrRemote.SetPort(1);
+ sock.Connect(addrRemote, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrInUse, stat.Int()); // still in 2MSL wait state
+
+ // enable the KSoTcpAsync2MslWait option
+ TESTL(sock.SetOpt(KSoTcpAsync2MslWait, KSolInetTcp, 1)==KErrNone);
+
+ // attempt connection again - should succeed now
+ sock.Connect(addrRemote, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // close the sockets
+ CleanupStack::PopAndDestroy();
+ iEsockSuite->GetSocketHandle(sockIndex1).Close();
+
+ return EPass;
+ }
+
+
+// Test step 8.15
+const TDesC& CEsockTest8_15::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.15");
+
+ return ret;
+ }
+
+CEsockTest8_15::~CEsockTest8_15()
+ {
+ }
+
+enum TVerdict CEsockTest8_15::easyTestStepL()
+ {
+ // Number of sockets test
+ RSocket sock1, sock2, sock3;
+ CleanupClosePushL(sock3);
+ CleanupClosePushL(sock2);
+ CleanupClosePushL(sock1);
+
+ // open a TCP socket
+ TInt nRet = sock1.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // get the KSoTcpNumSockets socket option
+ TInt ret = sock1.GetOpt(KSoTcpNumSockets, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == 1, nRet);
+
+ // open another TCP socket
+ nRet = sock2.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // get the KSoTcpNumSockets socket option for the second socket
+ ret = sock2.GetOpt(KSoTcpNumSockets, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == 2, nRet);
+
+ // open a UDP socket
+ nRet = sock3.Open(iEsockSuite->iSocketServer, KAfInet, KSockDatagram, KProtocolInetUdp);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // get the KSoTcpNumSockets socket option for the UDP socket - not supported
+ ret = sock3.GetOpt(KSoTcpNumSockets, KSolInetTcp, nRet);
+ TESTEL(KErrNotSupported == ret, ret);
+
+ // get the KSoTcpNumSockets socket option for the first TCP socket
+ ret = sock1.GetOpt(KSoTcpNumSockets, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == 2, nRet);
+
+ // close the first TCP socket
+ CleanupStack::PopAndDestroy(1, &sock1);
+
+ // get the KSoTcpNumSockets socket option for the second TCP socket
+ ret = sock2.GetOpt(KSoTcpNumSockets, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(nRet == 1, nRet);
+
+ // close the remaining TCP socket
+ CleanupStack::PopAndDestroy(1, &sock2);
+
+ // close the UDP socket
+ CleanupStack::PopAndDestroy(1, &sock3);
+
+ return EPass;
+ }
+
+
+// Test step 8.16
+const TDesC& CEsockTest8_16::GetTestName()
+ {
+ // store the name of this test case
+ _LIT(ret,"Test8.16");
+
+ return ret;
+ }
+
+CEsockTest8_16::~CEsockTest8_16()
+ {
+ }
+
+enum TVerdict CEsockTest8_16::easyTestStepL()
+ {
+ // socket listening test
+
+ TInetAddr addrLocal, addrRemote;
+ // get local ip address
+ TESTL(GetIpAddressFromConfig(_L("Test_8.16"), _L("ipAddressLocal"), addrLocal));
+
+ // get ip address to connect to (usually loopback)
+ TESTL(GetIpAddressFromConfig(_L("Test_8.16"), _L("ipAddressRemote"), addrRemote));
+
+ // get port number
+ TInt port;
+ TESTL(GetIntFromConfig(_L("Test_8.16"), _L("port"), port));
+
+ // open a TCP socket
+ RSocket sock1;
+ CleanupClosePushL(sock1);
+ TInt nRet = sock1.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // get the KSoTcpListening socket option - indicates socket is not listening
+ TInt ret = sock1.GetOpt(KSoTcpListening, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // bind the socket to local address
+ addrLocal.SetPort(port);
+ nRet = sock1.Bind(addrLocal);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // listen on the socket
+ nRet = sock1.Listen(5);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // get the KSoTcpListening socket option - indicates socket is listening
+ ret = sock1.GetOpt(KSoTcpListening, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // open another socket (client)
+ RSocket sock2;
+ CleanupClosePushL(sock2);
+ nRet = sock2.Open(iEsockSuite->iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // connect via loopback
+ TRequestStatus stat;
+ addrRemote.SetPort(port);
+ sock2.Connect(addrRemote, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // open a blank socket
+ RSocket sock3;
+ CleanupClosePushL(sock3);
+ nRet = sock3.Open(iEsockSuite->iSocketServer);
+ TESTEL(KErrNone == nRet, nRet);
+
+ // accept the connection
+ sock1.Accept(sock3, stat);
+ User::WaitForRequest(stat);
+ TESTEL(stat==KErrNone, stat.Int());
+
+ // get the KSoTcpListening socket option for the listening socket
+ ret = sock1.GetOpt(KSoTcpListening, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(1 == nRet, nRet);
+
+ // get the KSoTcpListening socket option for the client socket
+ ret = sock2.GetOpt(KSoTcpListening, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ // get the KSoTcpListening socket option for the server socket
+ ret = sock3.GetOpt(KSoTcpListening, KSolInetTcp, nRet);
+ TESTEL(KErrNone == ret, ret);
+ TESTEL(0 == nRet, nRet);
+
+ CleanupStack::PopAndDestroy(3, &sock1);
+ return EPass;
+ }
+