applayerprotocols/httptransportfw/Test/Acceptance/CHttpAcceptTestBase.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httptransportfw/Test/Acceptance/CHttpAcceptTestBase.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,263 @@
+// 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:
+//
+
+
+#include "CHttpAccepTtestBase.h"
+#include <http.h>
+
+const TInt KNothingExpected = 0;
+
+
+CHttpAcceptTestBase::CHttpAcceptTestBase()
+	{
+	iExpectedStatusCode=KNothingExpected;
+	iExpectedError=KNothingExpected;
+	
+
+	}
+
+void CHttpAcceptTestBase::DoRunL()
+	{
+	iOpenTransactionCount = 0;
+	CleanupStack::PushL ( TCleanupItem ( CHttpAcceptTestBase::Cleanup, this ) );
+	OpenTestSessionL(); // set up session and transaction here
+	
+	iTransaction.SubmitL();
+	CleanupStack::Pop (); 
+	CActiveScheduler::Start();
+	CloseTestSession(); // close any strings, transaction and session
+	if (iTestFail==1)
+		{
+		User::Leave(KErrNoMemory);
+		}
+	}
+	
+TInt CHttpAcceptTestBase::RunError(TInt aErr)
+	{
+	iEngine->Utils().LogIt(_L("\nTest failed with error code %d\n"), aErr);
+	return KErrNone;
+	}
+
+void CHttpAcceptTestBase::DoCancel()
+	{}
+
+CHttpAcceptTestBase::~CHttpAcceptTestBase()
+	{}	
+
+void CHttpAcceptTestBase::Cleanup ( TAny* aPtr )
+	{
+	CHttpAcceptTestBase& httpTestBase = *( CHttpAcceptTestBase* )aPtr;
+ 	httpTestBase.CloseTestSession ();
+	}
+
+
+/** set this object active */
+void CHttpAcceptTestBase::CompleteOwnRequest()
+	{
+	TRequestStatus* stat = &iStatus;
+	User::RequestComplete(stat,KErrNone);	
+	if (!IsActive())
+		SetActive();
+	}
+
+
+TInt CHttpAcceptTestBase::MHFRunError(TInt aError, 
+										RHTTPTransaction /*aTransaction*/,
+										const THTTPEvent& /*aEvent*/)
+	{
+	iEngine->Utils().LogIt(_L("\nTest failed with error code %d\n"), aError);
+	return KErrNone;
+	}
+
+
+// validates a response against all expected outcomes
+void CHttpAcceptTestBase::Validate(RHTTPTransaction aTransaction)
+	{
+	if (iExpectedNumberRedirects)
+		{
+		THTTPHdrVal hdr;
+		TBool hasValue;
+		RStringPool strP = aTransaction.Session().StringPool();
+		hasValue = aTransaction.PropertySet().Property(strP.StringF(HTTP::ERedirectCount,RHTTPSession::GetTable()), hdr);
+		if (hasValue && hdr.Int() != iExpectedNumberRedirects)
+			{
+			iTestFail = 1;
+			iEngine->Utils().LogIt(_L("<Number of Redirects don't match expected number>\n"));
+			}
+		}
+	}
+
+void CHttpAcceptTestBase::MHFRunL(RHTTPTransaction aTransaction,
+						 const THTTPEvent& aEvent)
+	{
+	if (aEvent.iStatus < 0)
+		{
+		if (aEvent.iStatus == iExpectedError)
+			{
+			iEngine->Utils().LogIt(_L("<The error event %d was expected>\n"), aEvent.iStatus);
+			iExpectError = ETrue;
+			}
+		else 
+			{
+			iTestFail = 1;
+			iEngine->Utils().LogIt(_L("<The error event %d was not expected>\n"), aEvent.iStatus);
+			}
+			if ( aEvent.iStatus != KErrNoMemory )			
+		return;
+		}
+
+	switch (aEvent.iStatus)
+		{
+	case THTTPEvent::EGotResponseHeaders:
+		{
+		// HTTP response headers have been received
+		iEngine->Utils().LogIt(_L("<EGotResponseHeaders (%d)\n"),aEvent.iStatus);
+		
+		TInt  statusCode = aTransaction.Response().StatusCode();
+		iEngine->Utils().LogIt(_L("Status Code: %d \n"),statusCode);
+		DumpRespHeaders(aTransaction);
+		iEngine->SetCurrentStatusCode(aTransaction.Response().StatusCode());
+		if (iExpectedStatusCode !=KNothingExpected && iExpectedStatusCode != aTransaction.Response().StatusCode() &&
+			iExpectedStatusCode < THTTPEvent::ERedirectedPermanently)
+			{
+			iTestFail= ETrue;
+			iEngine->Utils().LogIt(_L("<Unexpected status code: %d, Expected was %d>\n"), statusCode,iExpectedStatusCode);
+			}
+		else
+			{
+			iTestFail = EFalse;
+			}
+ 		// To verify ETransferEncoding header field is removed from the response header
+ 		// on receiving the value of EChunked in it
+ 		THTTPHdrVal tmpVal;
+ 		RStringPool strP = aTransaction.Session().StringPool();
+ 			
+ 		if(aTransaction.Response().GetHeaderCollection().GetField(strP.StringF(
+ 			HTTP::ETransferEncoding,RHTTPSession::GetTable()),0,tmpVal) == KErrNone)
+ 			{
+ 			if(tmpVal.StrF().Index(RHTTPSession::GetTable()) == HTTP::EChunked ) 
+				{
+ 				iEngine->Utils().LogIt(_L("EChunked Detected in Header. Hence the Test Fails"));
+				iTestFail= ETrue;
+				}
+ 			}
+ 		} break;
+	case THTTPEvent::EGotResponseBodyData:
+		{
+		// Some (more) body data has been received (in the HTTP response)
+		iEngine->Utils().LogIt(_L("<EGotResponseBodyData received (%d)>\n"),aEvent.iStatus);
+		// for each chunk of data received we have to empty the buffer before to be able to receive 
+		MHTTPDataSupplier* body = aTransaction.Response().Body();
+		body->ReleaseData();
+		} break;
+	case THTTPEvent::EResponseComplete:
+		{
+		// The transaction's response is complete
+		iEngine->Utils().LogIt(_L("<EResponseComplete received (%d)>\n"),aEvent.iStatus);
+		} break;
+	case THTTPEvent::ESucceeded:
+		{
+		if (iExpectedError < 0 && (!iExpectError))
+			{
+			iEngine->Utils().LogIt(_L("<Expected Error Code Not Recieved (%d)>\n"),iExpectedError);
+			iTestFail = ETrue;
+			}
+		else
+			{
+			iTestFail = EFalse;
+			}
+		iEngine->Utils().LogIt(_L("<ESucceeded received from the VF (%d)>\n"),aEvent.iStatus);
+		if (--iOpenTransactionCount == 0)	
+			CActiveScheduler::Stop();
+		} break;
+	case THTTPEvent::EFailed:
+		{
+		iEngine->Utils().LogIt(_L("<EFailed received from the VF (%d)>\n"),aEvent.iStatus);
+		Validate(aTransaction);
+		if (--iOpenTransactionCount == 0)
+			CActiveScheduler::Stop();
+		} break;
+	case KErrHttpRequestHasBody:
+		iEngine->Utils().LogIt(_L("<KErrHttpRequestHasBody  received from the VF (%d)>\n"),aEvent.iStatus);
+		break;
+	case KErrHttpEntityHeaderMissingContentType:
+		iEngine->Utils().LogIt(_L("<KErrHttpEntityHeaderMissingContentType  received from the VF (%d)>\n"),aEvent.iStatus);
+		break;
+	case KErrHttpRequestBodyMissing:
+		{
+		iEngine->Utils().LogIt(_L("<KErrHttpRequestBodyMissing  received from the VF(%d)>\n"),aEvent.iStatus);
+		} break;
+	case KErrTimedOut:							//-33
+		{
+		iEngine->Utils().LogIt(_L("<KErrTimedOut  received from the VF (%d)>\n"),aEvent.iStatus);
+		if ((iExpectedError != 0) && (iExpectedError != KErrTimedOut))	
+			{
+			iTestFail = 1;
+			iEngine->Utils().LogIt(_L("<The event received will cause a failure (%d)>\n"),aEvent.iStatus);
+			}
+		} break;
+	case KErrHttpRedirectExceededLimit:			
+		{
+		iEngine->Utils().LogIt(_L("<KErrHttpRedirectExceededLimit received (%d)>\n"),aEvent.iStatus);
+		if ((iExpectedError != 0) && (iExpectedError != KErrHttpRedirectExceededLimit))	
+			{
+			iTestFail = 1;
+			iEngine->Utils().LogIt(_L("<The event received will cause a failure>\n"));
+			}
+		} break;
+	case KErrHttpRedirectNoLocationField:	
+		{
+		iEngine->Utils().LogIt(_L("<KErrHttpRedirectNoLocationField received (%d)>\n"),aEvent.iStatus);
+		if ((iExpectedError != 0) && (iExpectedError != KErrHttpRedirectNoLocationField))
+			{
+			iTestFail = 1;
+			iEngine->Utils().LogIt(_L("<The event received will cause a failure>\n"));
+			}
+		} break;
+
+	// 301( Moved Permanently) or 302(Found) or 307(Temporary Redirect) status code is 
+	// obtained for a transaction with a method other than GET or HEAD and hence this event
+	// has been sent by the filter.
+	case THTTPEvent::ERedirectRequiresConfirmation:			
+ 		{
+ 		iEngine->Utils().LogIt(_L("<Redirect requires confirmation (%d)>\n"),aEvent.iStatus);
+ 		// Client has opted to Submit the transaction
+		if(iExpectedStatusCode==200)
+ 			aTransaction.SubmitL();
+ 		else
+		// client has opted to close the transaction
+ 			{
+ 			if (--iOpenTransactionCount == 0)
+ 				CActiveScheduler::Stop();
+ 			}
+ 		} break;
+	case THTTPEvent::EGotResponseTrailerHeaders:
+		{
+		iEngine->Utils().LogIt(_L("<EGotResponseTrailerHeaders received (%d)>\n"),aEvent.iStatus);
+		}
+		break;
+	default:
+		{
+		iEngine->Utils().LogIt(_L("<unrecognised event>\n %d"),aEvent.iStatus);
+		if (aEvent.iStatus < THTTPEvent::ERedirectedPermanently)
+			{
+			iTestFail=1;
+			iEngine->Utils().LogIt(_L("Test Failed: The event received was not expected and it's not just a warning\n"));
+			iEngine->PressAnyKey();
+			}
+		} 
+		break;
+		}
+	}