diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/TE_ESock/EsockTestSection3.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/test/TE_ESock/EsockTestSection3.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,477 @@ +// 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 3 +// +// + +// EPOC includes +#include +#include + +// Test system includes +#include "EsockTestSection3.h" + +static const TInt KMicrosecondsPerSecond = 1000000; + +// Test step 3.1 +const TDesC& CEsockTest3_1::GetTestName() + { + // store the name of this test case + _LIT(ret,"Test3.1"); + + return ret; + } + +CEsockTest3_1::~CEsockTest3_1() + { + } + +enum TVerdict CEsockTest3_1::easyTestStepPreambleL() + { + if (KErrNone != OpenMinSockets(_L("Test_3.1"),KAfInet, KSockStream, KProtocolInetTcp)) + { + return EFail; + } + + return EPass; + } + +enum TVerdict CEsockTest3_1::easyTestStepL() + { + // Test 1.x Open a socket + + // Set the address to loopback and the port to 0, IPv4 or IPv6 address + TInetAddr addr; + TESTL(GetIpAddressFromConfig(SectionName(_L("Test_3.1")), _L("ipAddress"), addr)); + + addr.SetPort(0); + + TRequestStatus stat; + for (TInt i = 1; i <= iEsockSuite->GetSocketListCount(); i++) + { + // Connect to the loopback address on port 0 + iEsockSuite->GetSocketHandle(i).Connect(addr, stat); + User::WaitForRequest(stat); + TESTEL(stat==KErrGeneral, stat.Int()); + } + + // Test 1.15 Close socket + + return EPass; + } + + +// Test step 3.2 +const TDesC& CEsockTest3_2::GetTestName() + { + // store the name of this test case + _LIT(ret,"Test3.2"); + + return ret; + } + +CEsockTest3_2::~CEsockTest3_2() + { + } + +enum TVerdict CEsockTest3_2::easyTestStepPreambleL() + { + if (KErrNone != OpenMinSockets(_L("Test_3.2"),KAfInet, KSockStream, KProtocolInetTcp)) + { + return EFail; + } + + return EPass; + } + +enum TVerdict CEsockTest3_2::easyTestStepL() + { + // Test 1.x Open a socket + + // Set the address to loopback IPv4 or IPv6 address + TInetAddr addr; + TESTL(GetIpAddressFromConfig(SectionName(_L("Test_3.2")), _L("ipAddress"), addr)); + + // set the port numnber + addr.SetPort(65537); + + TRequestStatus stat; + for (TInt i = 1; i <= iEsockSuite->GetSocketListCount(); i++) + { + // Connect to the loopback address on port 65537 + iEsockSuite->GetSocketHandle(i).Connect(addr, stat); + User::WaitForRequest(stat); + TESTEL(stat==KErrGeneral, stat.Int()); + } + + // Test 1.15 Close socket + + return EPass; + } + + +// Test step 3.3 +const TDesC& CEsockTest3_3::GetTestName() + { + // store the name of this test case + _LIT(ret,"Test3.3"); + + return ret; + } + +CEsockTest3_3::~CEsockTest3_3() + { + } + +enum TVerdict CEsockTest3_3::easyTestStepPreambleL() + { + if (KErrNone != OpenMinSockets(_L("Test_3.3"),KAfInet, KSockStream, KProtocolInetTcp)) + { + return EFail; + } + + return EPass; + } + +enum TVerdict CEsockTest3_3::easyTestStepL() + { + // Test 1.x Open a socket + + // Set the address to loopback, IPv4 or IPv6 address + TInetAddr addr; + TESTL(GetIpAddressFromConfig(SectionName(_L("Test_3.3")), _L("ipAddress"), addr)); + + // Set to a non listening port + TInt port; + TESTL(GetIntFromConfig(_L("Test_3.3"), _L("port"), port)); + + addr.SetPort(port); + + TRequestStatus stat; + for (TInt i = 1; i <= iEsockSuite->GetSocketListCount(); i++) + { + // Connect to the loopback address on the non listening port n + iEsockSuite->GetSocketHandle(i).Connect(addr, stat); + User::WaitForRequest(stat); + TESTEL(stat==KErrCouldNotConnect, stat.Int()); + } + + // Test 1.15 Close socket + + return EPass; + } + +// Test step 3.4 +const TDesC& CEsockTest3_4::GetTestName() + { + // store the name of this test case + _LIT(ret,"Test3.4"); + + return ret; + } + +CEsockTest3_4::~CEsockTest3_4() + { + } + +enum TVerdict CEsockTest3_4::easyTestStepL() + { + // Test 1.x Open a socket + + // Set the address to Remote host, IPv4 or IPv6 address + TInetAddr addr; + TESTL(GetIpAddressFromConfig(SectionName(_L("Test_3.4")), _L("ipAddress"), addr)); + + // Set to non listening port + TInt port; + TESTL(GetIntFromConfig(_L("Test_3.4"), _L("port"), port)); + addr.SetPort(port); + + TRequestStatus stat; + for (TInt i = 1; i <= iEsockSuite->GetSocketListCount(); i++) + { + // Connect to the remote host address on the non listening port n + iEsockSuite->GetSocketHandle(i).Connect(addr, stat); + User::WaitForRequest(stat); + TESTEL(stat==KErrCouldNotConnect, stat.Int()); + } + + // Test 1.15 Close socket + + return EPass; + } + +// Test step 3.5 +const TDesC& CEsockTest3_5::GetTestName() + { + // store the name of this test case + _LIT(ret,"Test3.5"); + + return ret; + } + +CEsockTest3_5::~CEsockTest3_5() + { + } + +enum TVerdict CEsockTest3_5::easyTestStepPreambleL() + { + CloseSockets(); + if (KErrNone != OpenMinSockets(_L("Test_3.5"),KAfInet, KSockStream, KProtocolInetTcp)) + { + return EFail; + } + + return EPass; + } + +enum TVerdict CEsockTest3_5::easyTestStepL() + { + TRequestStatus stat; + TInetAddr addr; + TInt port; + + // Test 1.x Open a socket + + // Set the address to Remote host, IPv4 or IPv6 address + TESTL(GetIpAddressFromConfig(_L("Test_Common"), _L("ipAddress"), addr)); + + // Set to echo port + TESTL(GetIntFromConfig(SectionName(_L("Test_3.5")), _L("port"), port)); + addr.SetPort(port); + + // Connect to the remote host address on the echo port + iEsockSuite->GetSocketHandle(1).Connect(addr, stat); + iEsockSuite->GetSocketHandle(1).CancelConnect(); + User::WaitForRequest(stat); + TESTEL(stat==KErrCancel, stat.Int()); + + // Test 1.15 Close socket + + return EPass; + } + + +// Test step 3.6 +const TDesC& CEsockTest3_6::GetTestName() + { + // store the name of this test case + _LIT(ret,"Test3.6"); + + return ret; + } + +CEsockTest3_6::~CEsockTest3_6() + { + } + + +enum TVerdict CEsockTest3_6::subTest2(RTimer &aWatchdog, + RSocket &aSocket, + TDes8 &aBuffer, + TInt aExpectedStatus) + { + TBool finished = EFalse; + TInt i = 1; + TRequestStatus sendStatus; + TRequestStatus recvStatus; + TRequestStatus timerStatus; + while ((i <= iNumTries) && !finished) + { + aWatchdog.After(timerStatus, 7 * KMicrosecondsPerSecond); + Logger().Write(_L("Issuing recv...")); + aSocket.Recv(aBuffer, 0, recvStatus); + Logger().Write(_L("Sending...")); + aSocket.SendTo(aBuffer, iAddr, 0, sendStatus); + + User::WaitForRequest(timerStatus, recvStatus); + aWatchdog.Cancel(); + aSocket.CancelRecv(); + User::WaitForAnyRequest(); + + finished = recvStatus == aExpectedStatus && + (timerStatus == KRequestPending || timerStatus == KErrNone || timerStatus == KErrCancel); + + if (!finished) + { + User::After(1 * KMicrosecondsPerSecond); + i++; + } + } + + if (!finished) + { + return EFail; + } + return EPass; + } + + +enum TVerdict CEsockTest3_6::easyTestStepPreambleL() + { + // Get the ini file data. + _LIT(KIniTestKey, "Test_3.6"); + + // Set the address to Remote host, IPv4 or IPv6 address + _LIT(KIniAddressKey, "ipAddress"); + TESTL(GetIpAddressFromConfig(KIniTestKey(), KIniAddressKey(), iAddr)); + + // Set to non-existent port + _LIT(KIniErrPortKey, "errorPort"); + TESTL(GetIntFromConfig(KIniTestKey(), KIniErrPortKey, iErrorPort)); + iAddr.SetPort(iErrorPort); + + // Get the valid port + _LIT(KIniValPortKey, "validPort"); + TESTL(GetIntFromConfig(KIniTestKey(), KIniValPortKey, iValidPort)); + + // Get the number of times to try the sub-test before giving up. + _LIT(KIniValTries, "validTries"); + TESTL(GetIntFromConfig(KIniTestKey(), KIniValTries, iNumTries)); + + if (KErrNone != OpenMinSockets(KIniTestKey(), KAfInet, KSockDatagram, KProtocolInetUdp)) + { + return EFail; + } + + // Enable notification of ICMP errors. + RSocket &sock = iEsockSuite->GetSocketHandle(1); + TInt ret = sock.SetOpt(KSoUdpReceiveICMPError, KSolInetUdp, 1); + if (KErrNone != ret) + { + Logger().WriteFormat(_L("SetOpt to receive ICMP errors returns %d"), ret); + return EFail; + } + + return EPass; + } + + +enum TVerdict CEsockTest3_6::easyTestStepL() + { + TESTL(EPass == TestStepResult()); + TVerdict verdict = EPass; + + const TInt KStringMaxLen = 40; + TBuf addressBuf; + iAddr.Output(addressBuf); + Logger().Write(_L("")); + Logger().WriteFormat(_L("Test3.6 - Testing address = %S, errorPort = %d, validPort = %d"), &addressBuf, iErrorPort, iValidPort); + + RTimer watchdog; + CleanupClosePushL(watchdog); + watchdog.CreateLocal(); + + const TInt KBufferLength = 10; + TBuf8 buffer; + buffer.SetMax(); + buffer.FillZ(); + + RSocket &sock = iEsockSuite->GetSocketHandle(1); + + // Part 1. Invalid port#, no pending receive + // + // First Recv returns -34, second one will pause. + + Logger().WriteFormat(_L("Test3.6 Part 1 - Address = %S, errorPort = %d"), &addressBuf, iErrorPort); + + TBool finished = EFalse; + TInt i = 1; + TRequestStatus status; + TRequestStatus recvStatus; + TRequestStatus timerStatus; + TInt ret; + while ((i <= iNumTries) && !finished) + { + status = recvStatus = timerStatus = KRequestPending; + + sock.SendTo(buffer, iAddr, 0, status); + User::WaitForRequest(status); + ret = status.Int(); + Logger().WriteFormat(_L("Send returned %d"), ret); + TESTL(KErrNone == ret); + + // Delay to allow the connection to come up. + User::After(5 * KMicrosecondsPerSecond); + + watchdog.After(timerStatus, 5 * KMicrosecondsPerSecond); + sock.Recv(buffer, 0, recvStatus); + User::WaitForRequest(timerStatus, recvStatus); + watchdog.Cancel(); + sock.CancelRecv(); + User::WaitForAnyRequest(); + ret = recvStatus.Int(); + Logger().WriteFormat(_L("1st recv returned %d"), ret); + + // This Recv should complete with -34. + finished = recvStatus == KErrCouldNotConnect && + (timerStatus == KRequestPending || timerStatus == KErrNone || timerStatus == KErrCancel); + + if (finished) + { + recvStatus = timerStatus = KRequestPending; + + watchdog.After(timerStatus, 5 * KMicrosecondsPerSecond); + sock.Recv(buffer, 0, recvStatus); + User::WaitForRequest(timerStatus, recvStatus); + watchdog.Cancel(); + sock.CancelRecv(); + User::WaitForAnyRequest(); + ret = recvStatus.Int(); + Logger().WriteFormat(_L("2nd recv returned %d"), ret); + + // This time we expect the watchdog to fire, an immediate Recv completion here means the + // test has failed (error not cleared down). + + finished = timerStatus == KErrNone && + (recvStatus == KRequestPending || recvStatus == KErrNone || recvStatus == KErrCancel); + } + + if (!finished) + { + User::After(1 * KMicrosecondsPerSecond); + i++; + } + } + + if (!finished) + { + verdict = EFail; + } + TESTL(EPass == verdict); + + // Part 2. Invalid port#, with pending receive; should complete with -34 + Logger().WriteFormat(_L("Test3.6 Part 2 - Address = %S, errorPort = %d"), &addressBuf, iErrorPort); + TVerdict subTestVerdict = subTest2(watchdog, sock, buffer, KErrCouldNotConnect); + if (verdict == EPass) + { + verdict = subTestVerdict; + } + TESTL(EPass == verdict); + + // Part 3. Valid port#, with pending receive; should complete with KErrNone + Logger().WriteFormat(_L("Test3.6 Part 3 - Address = %S, validPort = %d"), &addressBuf, iValidPort); + iAddr.SetPort(iValidPort); + subTestVerdict = subTest2(watchdog, sock, buffer, KErrNone); + if (verdict == EPass) + { + verdict = subTestVerdict; + } + TESTL(EPass == verdict); + + // Test 1.15 Close socket + CleanupStack::PopAndDestroy(1, &watchdog); + return EPass; + } +