applayerprotocols/httptransportfw/Test/t_httptransporthandler/ctestengine.cpp
changeset 0 b16258d2340f
child 18 5f1cd966e0d9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httptransportfw/Test/t_httptransporthandler/ctestengine.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,624 @@
+// Copyright (c) 2002-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 "ctestengine.h"
+
+#include <chttptransportlayer.h>
+#include <msocketfactory.h>
+#include <ecom/ecom.h>
+#include<sslerr.h>
+#include <http/rhttpconnectioninfo.h>
+
+#include "csocketlistenerdriver.h"
+#include "csocketconnectordriver.h"
+
+// 'this' used in base member initializer list, The 'this' pointer being used is a base class pointer.
+#pragma warning( disable : 4355 )
+
+_LIT(KTestHttpdTransportHandlerTitle, "HTTP Daemon Transport Handler Unit Test Harness");
+
+const TInt KLogBufSize	= 128;
+const TInt KPortNumber	= 80;
+
+//propagated error code from CSocketConnector.cpp file. not defined prior in any of the files.
+const TInt KErrConnectError=(-5130);
+
+GLDEF_D TBool	gLongHostName;
+GLDEF_D TBool 	gReaderShutdown;
+GLDEF_D TBool 	gInvalidListenPort;
+GLDEF_D TBool 	gInvalidConnectPort; 
+GLDEF_D TBool	gInvalidSecureHost;
+GLDEF_D TBool 	gWriterShutdown;
+GLDEF_D TBool 	gReqCertificate;
+GLDEF_D TBool   gListenAbort;
+
+CTestEngine* CTestEngine::NewL()
+	{
+	CTestEngine* self = new (ELeave) CTestEngine();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CTestEngine::~CTestEngine()
+	{
+	iConnection.Close();
+	iSocketServer.Close();
+
+	delete iTestUtils;
+	}
+
+CTestEngine::CTestEngine()
+: CBase(), iTransportLayerParams(*this), iUseConnection(ETrue)
+	{
+	}
+
+void CTestEngine::ConstructL()
+	{
+	iTestUtils = CHTTPTestUtils::NewL(KTestHttpdTransportHandlerTitle());
+	iTestUtils->InitCommsL();
+
+	// Create and start a comms connection
+	User::LeaveIfError(iSocketServer.Connect());
+	User::LeaveIfError(iConnection.Open(iSocketServer));
+	User::LeaveIfError(iConnection.Start());
+	}
+
+void CTestEngine::DoOOMTest(TTestFunctionL aDoTestFunctionL)
+	{
+	TInt err = 1;
+	TInt count = 0;
+
+	iOOMTesting = ETrue;
+	while( err || iDoingTest )
+		{
+		__UHEAP_MARK;
+		__UHEAP_SETFAIL(RHeap::EFailNext, count); // This is a Macro, not leaving function
+		TRAP(err, (this->*aDoTestFunctionL)());
+		REComSession::FinalClose();
+		__UHEAP_MARKEND;
+		++count;
+		}
+	__UHEAP_RESET;
+	iOOMTesting = EFalse;
+	}
+
+void CTestEngine::DoTestsL()
+	{
+	iTestUtils->SetSilent(EFalse);		
+	TBuf<KLogBufSize> buf;
+	buf.Format(_L("@SYMTestCaseID IWS-APPPROTOCOLS-HTTP-FRAMEWORK-T_HTTPTRANSPORTHANDLER-0001  "));
+	iTestUtils->LogIt(buf);
+	iTestUtils->SetSilent(ETrue);
+	
+	// Run through tests...
+
+	// Don't use the existing comms connection
+	iUseConnection = EFalse;
+
+	// Basic test case
+	iTestUtils->StartTestL(_L("Basic Test Case HTTP-U-2051"));
+	DoBasicTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+
+	// Do OOM testing on Basic test case
+	iTestUtils->StartTestL(_L("OOM Testing of Basic Test Case HTTP-U-2052"));
+	DoOOMTest(&CTestEngine::DoBasicTestCaseL);
+	iTestUtils->EndTest(iTestFailed);
+
+	// Reset so that the existing comms connection is used from this point
+	iUseConnection = ETrue;
+
+	// Do Multiple Connections test case
+	iTestUtils->StartTestL(_L("Multiple Connections Test Case HTTP-U-2053"));
+	DoMultipleConnectionsTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+
+	// Do OOM testing Multiple Connections test case
+	User::After(1000);
+	iTestUtils->StartTestL(_L("OOM Testing of Multiple Connections Test Case HTTP-U-2054"));
+	DoOOMTest(&CTestEngine::DoMultipleConnectionsTestCaseL);
+	iTestUtils->EndTest(iTestFailed);
+
+	// Do Connect Control test case
+	iTestUtils->StartTestL(_L("Connect Control Test Case HTTP-U-2055"));
+	DoConnectControlTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+
+	// Do OOM testing Connect Control test case
+	iTestUtils->StartTestL(_L("OOM Testing of Connect Control Test Case HTTP-U-2056"));
+	DoOOMTest(&CTestEngine::DoConnectControlTestCaseL);
+	iTestUtils->EndTest(iTestFailed);
+
+	// Run secure test
+	iTestUtils->StartTestL(_L("Basic Secure Test Case"));
+	DoBasicSecureTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+
+	// Do OOM testing of secure test case
+	iTestUtils->StartTestL(_L("OOM Testing of Basic Secure Test Case"));
+	DoOOMTest(&CTestEngine::DoBasicSecureTestCaseL);
+	iTestUtils->EndTest(iTestFailed);
+
+
+#if defined (_LOGGING) 
+	// test case - to test invalid LongHostName 
+	gLongHostName = ETrue;
+	iTestUtils->StartTestL(_L("Invalid Long Host Name Test Case "));
+	DoBasicTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+	gLongHostName = EFalse;
+#endif	
+
+	// Run Multiple secure test
+	iTestUtils->StartTestL(_L("Multiple Secure Test Case"));
+	DoMultipleSecureConnectionsTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+
+	//Test case - to test improper shutdown of SocketReader
+	gReaderShutdown = ETrue;
+	iTestUtils->StartTestL(_L(" Invalid Reader Shutdown Test Case "));
+	DoBasicTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+	gReaderShutdown = EFalse;
+	
+	//Test case - to test socket listen on invalid local port
+	gInvalidListenPort = ETrue;
+	iTestUtils->StartTestL(_L("Testing Multiple Listen on Invalid Port"));
+	DoMultipleConnectionsTestCaseL();
+	iTestUtils->EndTest(iTestFailed);	
+	gInvalidListenPort = EFalse;
+	
+	//Test case - to test Basic secure socket connection with non-secure port
+	gLongHostName = EFalse;
+	gInvalidConnectPort = ETrue;
+	iTestUtils->StartTestL(_L("Basic Invalid Secure Host Name Test Case "));
+	DoBasicSecureTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+	gInvalidConnectPort = EFalse;	
+	
+	//Test case - to test improper shutdown of SocketWriter
+	gInvalidSecureHost = ETrue;
+	gWriterShutdown=ETrue;
+	iTestUtils->StartTestL(_L(" Invalid Writer Shutdown Test Case "));
+	DoMultipleSecureConnectionsTestCaseL();
+	iTestUtils->EndTest(iTestFailed);	
+
+	//Test case - to test Multiple secure socket connection with non-secure port
+	gInvalidSecureHost = ETrue;
+	gWriterShutdown=EFalse;
+	iTestUtils->StartTestL(_L(" Multiple Invalid Secure Host Name Test Case "));
+	DoMultipleSecureConnectionsTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+	gInvalidSecureHost = EFalse;
+	
+	//Test case - Requests Server Certificate on Writer for Non-Secure Connection
+	gReqCertificate = ETrue;
+	iTestUtils->StartTestL(_L("Check Server Certificate for Non-Secure Test case"));
+	DoBasicTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+	gReqCertificate = EFalse;	
+	
+	//Test case - Requests Server Certificate on Writer for Secure Connection	
+	gReqCertificate = ETrue;
+	iTestUtils->StartTestL(_L("Check Server Certificate for Secure Test case"));
+	DoBasicSecureTestCaseL();
+	iTestUtils->EndTest(iTestFailed);
+	gReqCertificate = EFalse;	
+		
+	gListenAbort=ETrue;
+	iTestUtils->StartTestL(_L("Improper Socket Listen, Abort Test Case"));
+	DoListenAbortTestL();
+	iTestUtils->EndTest(iTestFailed);
+	gListenAbort=EFalse;
+	
+	}
+
+void CTestEngine::DoBasicTestCaseL()
+	{
+	// Do basic test case...
+
+	do
+		{
+		// Create the http transport layer
+		CHttpTransportLayer* transportLayer = CHttpTransportLayer::NewL(_L8("TCP"), iTransportLayerParams);
+		CleanupStack::PushL(transportLayer);
+
+		// Create the socket listener driver - single connect listener.
+		CSocketListenerDriver* socketListenerDriver = CSocketListenerDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketListenerDriver);
+		socketListenerDriver->SetSingleListenL();
+
+		socketListenerDriver->Start();
+
+		// Create the socket connector driver - single connect connector
+		CSocketConnectorDriver* socketConnectorDriver = CSocketConnectorDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketConnectorDriver);
+		socketConnectorDriver->SetSingleConnectL();
+
+		socketConnectorDriver->Start();
+			
+		StartTesting();
+
+		CleanupStack::PopAndDestroy(3, transportLayer);
+		} while( iResetTest );
+	}
+
+void CTestEngine::DoMultipleConnectionsTestCaseL()
+	{
+	// Do multiple connections test case...
+
+	do
+		{
+		// Create the http transport layer
+		CHttpTransportLayer* transportLayer = CHttpTransportLayer::NewL(_L8("TCP"), iTransportLayerParams);
+		CleanupStack::PushL(transportLayer);
+
+		// Create the socket listener driver - double connect listener.
+		CSocketListenerDriver* socketListenerDriver = CSocketListenerDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketListenerDriver);
+		socketListenerDriver->SetDoubleListenL();
+
+		socketListenerDriver->Start();
+
+		// Create the socket connector driver#1 - single connect connector
+		CSocketConnectorDriver* socketConnectorDriver1 = CSocketConnectorDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketConnectorDriver1);
+		socketConnectorDriver1->SetSingleConnectL();
+
+		socketConnectorDriver1->Start();
+			
+		// Create the socket connector driver#2 - single connect connector
+		CSocketConnectorDriver* socketConnectorDriver2 = CSocketConnectorDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketConnectorDriver2);
+		socketConnectorDriver2->SetSingleConnectL();
+
+		socketConnectorDriver2->Start();
+
+		StartTesting();
+
+		CleanupStack::PopAndDestroy(4, transportLayer);
+		} while( iResetTest );
+	}
+
+void CTestEngine::DoConnectControlTestCaseL()
+	{
+	// Do connect control test case...
+
+	do
+		{
+		// Create the http transport layer
+		CHttpTransportLayer* transportLayer = CHttpTransportLayer::NewL(_L8("TCP"), iTransportLayerParams);
+		CleanupStack::PushL(transportLayer);
+
+		// Create the socket listener driver - single connect listener.
+		CSocketListenerDriver* socketListenerDriver = CSocketListenerDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketListenerDriver);
+		socketListenerDriver->SetSingleListenL();
+
+		socketListenerDriver->Start();
+
+		// Create the socket connector driver - double connect connector
+		CSocketConnectorDriver* socketConnectorDriver = CSocketConnectorDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketConnectorDriver);
+		socketConnectorDriver->SetDoubleConnectL();
+
+		socketConnectorDriver->Start();
+			
+		StartTesting();
+
+		CleanupStack::PopAndDestroy(3, transportLayer);
+		} while( iResetTest );
+	}
+
+void CTestEngine::DoBasicSecureTestCaseL()
+	{
+	// Do basic test case...
+
+	do
+		{
+		// Create the http transport layer
+		CHttpTransportLayer* transportLayer = CHttpTransportLayer::NewL(_L8("TCP"), iTransportLayerParams);
+		CleanupStack::PushL(transportLayer);
+
+		// Create the socket connector driver - single connect connector
+		CSocketConnectorDriver* socketConnectorDriver = CSocketConnectorDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketConnectorDriver);
+		socketConnectorDriver->SetSingleSecureConnectL();
+
+		socketConnectorDriver->Start();
+
+		StartTesting();		
+
+		CleanupStack::PopAndDestroy(2, transportLayer);
+		} while( iResetTest );
+	}
+
+void CTestEngine::DoMultipleSecureConnectionsTestCaseL()
+	{
+	// Do multiple secure connections test case...
+	do
+		{
+		// Create the http transport layer
+		CHttpTransportLayer* transportLayer = CHttpTransportLayer::NewL(_L8("TCP"), iTransportLayerParams);
+		CleanupStack::PushL(transportLayer);
+
+		// Create the socket connector driver#1 - single connect connector
+		CSocketConnectorDriver* socketConnectorDriver1 = CSocketConnectorDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketConnectorDriver1);
+		socketConnectorDriver1->SetSingleSecureConnectL();
+
+		socketConnectorDriver1->Start();
+
+		
+		// Create the socket connector driver#2 - single connect connector
+		CSocketConnectorDriver* socketConnectorDriver2 = CSocketConnectorDriver::NewL(*this, transportLayer->SocketFactory());
+		CleanupStack::PushL(socketConnectorDriver2);
+		socketConnectorDriver2->SetSingleSecureConnectL();
+
+		socketConnectorDriver2->Start();
+
+		StartTesting();		
+
+		CleanupStack::PopAndDestroy(3, transportLayer);
+		} while( iResetTest );
+	}
+
+void CTestEngine::DoListenAbortTestL()
+	{		
+	// Create the http transport layer
+	CHttpTransportLayer* transportLayer = CHttpTransportLayer::NewL(_L8("TCP"), iTransportLayerParams);
+	CleanupStack::PushL(transportLayer);		
+
+	// Create the socket listener driver
+	CSocketListenerDriver* socketListenerDriver = CSocketListenerDriver::NewL(*this, transportLayer->SocketFactory());
+	CleanupStack::PushL(socketListenerDriver);
+	
+	transportLayer->SocketFactory().ListenL(*socketListenerDriver, KPortNumber);
+		
+	// Create the socket connector driver
+	CSocketConnectorDriver* socketConnectorDriver = CSocketConnectorDriver::NewL(*this, transportLayer->SocketFactory());
+	CleanupStack::PushL(socketConnectorDriver);
+	transportLayer->SocketFactory().ConnectL (*socketConnectorDriver, _L8("127.0.0.1"), KPortNumber);	
+		
+	transportLayer->SocketFactory().StopListen();
+	
+	socketConnectorDriver->SetSingleConnectL();
+	socketConnectorDriver->Start();
+	
+	StartTesting();
+		
+	CleanupStack::PopAndDestroy(3, transportLayer);	
+	
+	}
+
+void CTestEngine::StartTesting()
+	{
+	iTestCount	= 0;
+	iTestFailed	= EFalse;
+	iDoingTest	= ETrue;
+	iResetTest	= EFalse;
+	CActiveScheduler::Start();
+	}
+
+void CTestEngine::StopTesting()
+	{
+	CActiveScheduler::Stop();
+	iDoingTest = EFalse;
+	}
+
+void CTestEngine::ResetTest()
+	{
+	StopTesting();
+	iResetTest = ETrue;
+	}
+
+/*
+ *	Methods from MDriverObserver
+ */
+
+void CTestEngine::NotifyError(TInt aError)
+	{
+	if( !iTestFailed && iDoingTest )
+		{
+		iTestFailed = ETrue;
+
+		// Are we doing OOM testing?
+		if( iOOMTesting && aError == KErrNoMemory )
+			{
+			// This is not an error.
+			TBuf<KLogBufSize> buf;
+			buf.Format(_L("--> OOM Testing : alloc failure : %d"), aError);
+			Log(buf);
+
+			// Don't stop testing, but stop scheduler.
+			CActiveScheduler::Stop();
+			}
+		else if( aError == KErrInUse )
+			{
+			TBuf<KLogBufSize> buf;
+			buf.Format(_L("--> Listen port still not shutdown : %d - re-start test..."), aError);
+			Log(buf);
+
+			ResetTest();
+			}
+		else if( aError == KErrNotReady )
+			{
+			TBuf<KLogBufSize> buf;
+			buf.Format(_L("--> Comms connection has timed-out : %d - re-start it..."), aError);
+			Log(buf);
+
+			aError = iConnection.Start();
+			if( aError == KErrNone )
+				{
+				buf.Format(_L("--> Comms connection has re-started - re-start test..."));
+				Log(buf);
+				ResetTest();
+				}
+			else
+				{
+				buf.Format(_L("--> Could not start comms connection : %d - stop test"), aError);
+				Log(buf);
+				StopTesting();
+				}
+			}
+		else if( gLongHostName && aError == KErrConnectError ) 
+			{
+				//connection to invalid long host cannot be established hence error is expected
+				//so no use in testing further.
+				iTestFailed = EFalse;
+				StopTesting();
+			}
+		else if (gReaderShutdown && (aError == KErrEof || aError == KErrNone))
+			{//Making reader shutdown in the middle of Data-recieving, error is expected.
+			//so no use in testing further.
+			iTestFailed = EFalse;
+			StopTesting();
+			}
+		else if( gInvalidListenPort && aError == KErrCouldNotConnect )
+			{//Listening to invalid port, connection cannot be established hence error is expected
+			//so no use in testing further.
+			iTestFailed = EFalse;
+			StopTesting();
+			}
+		else if (gInvalidConnectPort && aError == KErrSSLAlertUnexpectedMessage)			
+			{//Trying to connect non-secure host on a Secure Port, error is expected.
+			//so no use in testing further.
+			iTestFailed = EFalse;
+			StopTesting();
+			}
+		else if (gInvalidSecureHost && gWriterShutdown && aError == KErrNone)			
+			{//Trying to connect invalid secure host and making immediate shutdown of the WriterStream, error is expected.
+			//so no use in testing further.
+			iTestFailed = EFalse;
+			StopTesting();
+			}			
+		else if (gInvalidSecureHost && !gWriterShutdown && aError == KErrSSLAlertIllegalParameter)
+			{//Trying to connect invalid secure host on a Secure Port, error is expected.
+			//so no use in testing further.
+			iTestFailed = EFalse;
+			StopTesting();
+			}
+		else if (gListenAbort && aError==KErrCancel)
+			{//Making Listen to stop abruptly, error is expected. 
+			//so no use in testing further.
+			iTestFailed = EFalse;
+			StopTesting();	
+			}				
+		else
+			{
+			// Log the failure
+			TBuf<KLogBufSize> buf;
+			buf.Format(_L("--> Test error : %d"), aError);
+			Log(buf);
+
+			// Stop the scheduler and the test.
+			StopTesting();
+			}
+		}
+	}
+
+void CTestEngine::NotifyStart()
+	{
+	++iTestCount;
+	}
+
+void CTestEngine::NotifyComplete()
+	{
+	--iTestCount;
+	if( iTestCount == 0 )
+		{
+		// Log success
+		Log(_L("Test completed"));
+
+		// All tests have completed - stop the scheduler
+		StopTesting();
+		}
+	}
+
+void CTestEngine::Log(const TDesC& aComment)
+	{
+	// Do not log this to summary file - go silent, but remember current state.
+	TBool isSilent = iTestUtils->IsSilent();
+	iTestUtils->SetSilent(ETrue);
+
+	// Log the comment...
+	iTestUtils->LogIt(aComment);
+
+	// Go back to original state.
+	iTestUtils->SetSilent(isSilent);
+	}
+
+TBool CTestEngine::SupplyCommsConnection(RConnection*& aConnectionPtr)
+	{
+	// If transport layer requests a comms connection, provide one if test is configured to reuse one
+	if(iUseConnection)
+		{
+		aConnectionPtr = &iConnection;
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+void CTestEngine::SetCommsConnectionL(RConnection* /*aConnectionPtr*/)
+	{
+	// Dont't need to do anything here
+	}
+
+void CTestEngine::GetSecurityPrefs(TBool& aDialogPrompt, MSecurityPolicy*& aSecurityPolicy)
+	{
+	if(gInvalidSecureHost && !gWriterShutdown)
+		aDialogPrompt = EFalse;
+	else
+		aDialogPrompt = ETrue;
+	
+	aSecurityPolicy = NULL;
+	}
+
+TBool CTestEngine::ImmediateSocketShutdown()
+	{
+	if (iUseConnection)
+		return ETrue;
+	else
+		return EFalse;
+	}
+
+
+TInt CTestEngine::SessionId()
+	{
+	return KErrNotSupported;
+	}
+
+TBool CTestEngine::SupplySocketServerHandle ( TInt& aSocketServerHandle )
+	{
+	if(iUseConnection)
+		{
+		aSocketServerHandle = iSocketServer.Handle();
+		return ETrue;
+		}
+	return EFalse;	
+	}
+	
+void CTestEngine::SetSocketServerHandleL ( TInt /*aSocketServerHandle*/ )	
+	{	
+	// do nothing
+	}	
+
+TInt CTestEngine::GetRecvBufferSize()
+	{
+	return KDefaultBufferSize;
+	}
+