diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/Test/T_HttpPipeliningTest/cpipeliningtestclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httptransportfw/Test/T_HttpPipeliningTest/cpipeliningtestclient.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,289 @@ +// Copyright (c) 2003-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 "cpipeliningtestclient.h" +#include "httptestutils.h" +#include "MPipeliningTestCase.h" +#include "MPipeliningTestObserver.h" + +CPipeliningTestClient* CPipeliningTestClient::NewL(CHTTPTestUtils& aTestUtils, MPipeliningTestObserver& aObserver) + { + CPipeliningTestClient* self = new (ELeave) CPipeliningTestClient(aTestUtils, aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CPipeliningTestClient::CPipeliningTestClient(CHTTPTestUtils& aTestUtils, MPipeliningTestObserver& aObserver) +: iTestUtils(aTestUtils), iObserver(aObserver) + { + } + +void CPipeliningTestClient::ConstructL() + { + iSession.OpenL(); + iHttpTimer = new(ELeave) CHttpTimer1(*this); + iASW = new(ELeave) CActiveSchedulerWait(); + } + +CPipeliningTestClient::~CPipeliningTestClient() + { + iTransArray.Reset(); + iTransArray.Close(); + iSession.Close(); + delete iHttpTimer; + delete iASW; + } + +RHTTPSession& CPipeliningTestClient::GetSession() + { + return iSession; + } + +// From MHTTPTransactionCallback +void CPipeliningTestClient::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent) + { + TInt expectedError = iTestCase->ExpectedError(aTransaction); + TInt tranID = aTransaction.Id(); + switch (aEvent.iStatus) + { + case THTTPEvent::EGotResponseHeaders: + { + iTestCase->ProcessHeadersL(aTransaction); + } break; + case THTTPEvent::EGotResponseBodyData: + { + // Done with that bit of body data + aTransaction.Response().Body()->ReleaseData(); + } break; + case THTTPEvent::EResponseComplete: + { + } break; + case KErrHttpOptimiserFailsTrans: + { + _LIT(KTxtMessage, "Cancelling/Failing Transaction\n"); + iTestUtils.LogIt(KTxtMessage); + aTransaction.Fail(THTTPFilterHandle::EProtocolHandler); + } break; + case THTTPEvent::ESucceeded: + { + ++iCurrentTrans; + aTransaction.Close(); + _LIT(KTxtSuccessful, "Client - Transaction %d, completed successfully."); + iTestUtils.LogIt(KTxtSuccessful, tranID); + if ((iTestCase->TestCaseName().Match(_L("Test Case 5")) == 0)||(iTestCase->TestCaseName().Match(_L("Test Case 6")) == 0)||(iTestCase->TestCaseName().Match(_L("Test Case 25")) == 0)) + { + TTimeIntervalMicroSeconds32 time(1000000); + iHttpTimer->After(time); + iASW->Start(); + } + if( expectedError != KErrNone ) + { + _LIT(KTxtErrorExpected, "Client - Expected error code %d"); + iTestUtils.LogIt(KTxtErrorExpected, expectedError); + + EndTestL(KErrNotFound); + } + + if( iTestCase->TotalTransactionCount() == iCurrentTrans ) + EndTestL(KErrNone); + } break; + case THTTPEvent::EFailed: + { + ++iCurrentTrans; + aTransaction.Close(); + if( expectedError == iLastError ) + { + _LIT(KTxtExpectedError, "Client - Transaction %d Failed, Expected: %d, Actual: %d"); + iTestUtils.LogIt(KTxtExpectedError(), tranID, expectedError, iLastError); + if( iTestCase->TotalTransactionCount() == iCurrentTrans ) + EndTestL(KErrNone); + } + else + { + _LIT(KTxtErrorUnexpected, "Client - Error code mismatch."); + iTestUtils.LogIt(KTxtErrorUnexpected()); + EndTestL(KErrNotFound); + } + } break; + case THTTPEvent::ERedirectedPermanently: + { + } break; + case THTTPEvent::ERedirectedTemporarily: + { + } break; + case THTTPEvent::ERedirectRequiresConfirmation: + { + aTransaction.SubmitL(); + } break; + case THTTPEvent::EReceiveTimeOut: + { + iTestUtils.Test().Printf(_L("Receive TimeOut\n")); + _LIT(KTxtErrRecvTimeout, "Client - Receive Timeout."); + iTestUtils.LogIt(KTxtErrRecvTimeout()); + }break; + case THTTPEvent::ESendTimeOut: + { + iTestUtils.Test().Printf(_L("Send TimeOut\n")); + _LIT(KTxtErrSendTimeout, "Client - Send Timeout."); + iTestUtils.LogIt(KTxtErrSendTimeout()); + }break; + default: + { + if (aEvent.iStatus < 0) + { + iLastError = aEvent.iStatus; + + _LIT(KTxtClientError, "Client - Transaction %d, received error code %d"); + iTestUtils.LogIt(KTxtClientError, tranID, iLastError); + } + } break; + } + } + + +void CPipeliningTestClient::EndTestL(TInt aErrorCode) + { + #if defined (_DEBUG) + _LIT(KTxtClientError, "Error - Code %d"); + iTestUtils.LogIt(KTxtClientError, aErrorCode); + if (aErrorCode == KErrNone) + { + TInt expectedConnections = iTestCase->RealExpectedConnectionCount(); + RStringPool stringPool = iSession.StringPool(); + _LIT8(KNumberConnectionManagers, "__NumConnectionManagers"); + RStringF numberConnectionsString = stringPool.OpenFStringL(KNumberConnectionManagers); + CleanupClosePushL(numberConnectionsString); + RHTTPConnectionInfo connInfo = iSession.ConnectionInfo(); + TInt numberConnections =0; + _LIT(KTxtTitle, "Test Case Pipeline Fallback"); + THTTPHdrVal numberConnectionsVal; + if (connInfo.Property(numberConnectionsString, numberConnectionsVal)) + { + numberConnections = numberConnectionsVal.Int(); + connInfo.RemoveProperty(numberConnectionsString); + + if ((numberConnections > expectedConnections) && iTestCase->TestCaseName().Match(KTxtTitle) != 0) + { + + _LIT(KTxtClientError, "Client - Connections %d, Expected: %d"); + iTestUtils.LogIt(KTxtClientError, numberConnections, expectedConnections); + aErrorCode = KErrNotFound; + } + + } + + CleanupStack::PopAndDestroy(&numberConnectionsString); + } + #endif + + iObserver.EndTest(aErrorCode); + } + + +TInt CPipeliningTestClient::MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& /*aEvent*/) + { + _LIT(KTxtRunError, "Client - MHFRunError - Transaction %d with error code %d."); + iTestUtils.LogIt(KTxtRunError(), aTransaction.Id(), aError); + + return KErrNone; + } + +void CPipeliningTestClient::AddTransactionL(RHTTPTransaction aTransaction) + { + User::LeaveIfError(iTransArray.Append(aTransaction)); + } + +void CPipeliningTestClient::StartClientL() + { + __ASSERT_DEBUG(iTestCase!=NULL, User::Invariant()); + + if( iTestCase->EnableBatching() ) + { + // @todo we need to add the session property for enabling batching + RHTTPConnectionInfo connInfo = GetSession().ConnectionInfo(); + THTTPHdrVal batchingSupport(iSession.StringPool().StringF(HTTP::EEnableBatching,RHTTPSession::GetTable())); + connInfo.SetPropertyL(iSession.StringPool().StringF(HTTP::EHttpBatching,RHTTPSession::GetTable()), batchingSupport); + } + + if( iTestCase->TransportHandlerPriority() ) + { + RHTTPConnectionInfo connInfo = iSession.ConnectionInfo(); + THTTPHdrVal enableTranspHndlrPriority(iSession.StringPool().StringF(HTTP::EEnableTranspHndlrPriority, RHTTPSession::GetTable())); + connInfo.SetPropertyL(iSession.StringPool().StringF(HTTP::ETranspHndlrPriority, RHTTPSession::GetTable()), enableTranspHndlrPriority); + } + + TBool batchTrans = iTestCase->BatchTransactions(); + + // Create transactions + for( TInt ii=0; ii < iTestCase->TotalTransactionCount(); ++ii ) + { + RHTTPTransaction trans = iTestCase->GetTransactionL(ii, GetSession(), *this); + CleanupClosePushL(trans); + AddTransactionL(trans); + if(!batchTrans) + trans.SubmitL(); + CleanupStack::Pop(&trans); + } + + if(batchTrans) + { + for( TInt jj=0; jj < iTransArray.Count(); ++jj ) + { + iTransArray[jj].SubmitL(); + } + } + } + +void CPipeliningTestClient::SetTestCase(MPipeliningTestCase* aTestCase) + { + iTestCase = aTestCase; + } + +void CPipeliningTestClient::TimeOut() + { + iASW->AsyncStop(); + } + +CHttpTimer1::CHttpTimer1(MTimerClient1& aClient) +:CActive(EPriorityStandard), iClient(aClient) + { + CActiveScheduler::Add(this); + iTimer.CreateLocal(); + } + +CHttpTimer1::~CHttpTimer1() + { + Cancel(); + iTimer.Close(); + } + +void CHttpTimer1::After(TTimeIntervalMicroSeconds32 anInterval) + { + iTimer.After(iStatus, anInterval); + SetActive(); + } + +void CHttpTimer1::DoCancel() + { + + } + +void CHttpTimer1::RunL() + { + iClient.TimeOut(); + } +