diff -r 000000000000 -r b16258d2340f applayerprotocols/httpservice/test/httpservicetest/ctestclienthttpget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httpservice/test/httpservicetest/ctestclienthttpget.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,327 @@ +// 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 "ctestclienthttpget.h" +#include +#include "mlocaltestserverobserver.h" +#include "chttpclienttestparams.h" +#include +_LIT8(KAcceptHeader, "Accept"); +_LIT8(KAcceptValue, "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); +_LIT(KTestHttpClientAPITestTitle, "HTTP client API Unit Test Harness"); +_LIT(KTransferProgress, "File size: %d kb , Downloaded so far: %d kb"); + +CTestClientHttpSimpleGet* CTestClientHttpSimpleGet::NewL(CHttpClientTestParams& aParams, MLocalTestServerObserver& aObserver, CHttpService& aClient, const TDesC8& aUri, CHTTPTestUtils* aUtils) + { + CTestClientHttpSimpleGet* self = new(ELeave) CTestClientHttpSimpleGet(aParams, aObserver, aUtils); + CleanupStack::PushL(self); + self->ConstructL(aClient, aUri); + CleanupStack::Pop(); // self + return self; + } + +CTestClientHttpSimpleGet::~CTestClientHttpSimpleGet() + { + } + +CTestClientHttpSimpleGet::CTestClientHttpSimpleGet(CHttpClientTestParams& aParams, MLocalTestServerObserver& aObserver, CHTTPTestUtils* aUtils) +: iObserver(aObserver), +iParams(aParams), +iTestUtils(*aUtils) + { + + } + +void CTestClientHttpSimpleGet::ConstructL(CHttpService& aClient, const TDesC8& aUri) + { + TPtrC8 method; + aClient.String(HTTP::EGET, method); + CHttpClientTransaction::Create(aClient, method, aUri); + } + +// From CHTTPClientTransaction +void CTestClientHttpSimpleGet::OnResponseHeaders() + { + // Check whether the status code matches + if(iParams.StatusCode() != StatusCode()) + { + iObserver.EndTest(KErrCorrupt); + } + + // IF we are receiving a file. just sink the content to the file. + // We will not check + if(iParams.IsFileSending()) + { + CHttpClientTransaction::SetContentSink(iParams.SinkFile()); + return; + } + else + { + CHttpClientTransaction::SetContentSink(*this); + } + TInt i = 0; + const RPointerArray& hdrInfos = iParams.HeaderInfos(); + + THttpHeaderIterator iter = ResponseHeaders(); + while(!iter.AtEnd()) + { + CHeaderInfo* info = iParams.FindHeaderInfo(iter.Name()); + if(info == NULL) + { + iObserver.EndTest(KErrCorrupt); + return; + } + + TInt j = 0; + THttpHeaderElementIterator elementIter = iter.Elements(); + while(!elementIter.AtEnd()) + { + CHeaderFieldInfo* fieldInfo = info->iFieldInfos[j]; + THttpHeaderValueVariant value = elementIter.Value(); + if(!iParams.CheckVariantValue(value, *fieldInfo->iFieldValue)) + { + iObserver.EndTest(KErrCorrupt); + return; + } + + // Check the params + THttpHeaderParamIterator paramIter = elementIter.Parameter(); + TInt k = 0; + while(!paramIter.AtEnd()) + { + CHeaderFieldParamInfo* paramInfo = fieldInfo->iFieldParamInfos[k]; + // Check the param name and value + if(paramInfo->iParamName->CompareF(paramIter.Name()) != 0) + { + iObserver.EndTest(KErrCorrupt); + return; + } + THttpHeaderValueVariant value = paramIter.Value(); + if(!iParams.CheckVariantValue(value, *paramInfo->iParamValue) != 0) + { + iObserver.EndTest(KErrCorrupt); + return; + } + ++k; + ++paramIter; + } + ++j; + ++elementIter; + } + TInt x = 0; + THttpHeaderParamIterator hdrParamIter = iter.Parameters(); + while(!hdrParamIter.AtEnd()) + { + CHeaderFieldParamInfo* paramInfo = info->iParamInfos[x]; + if(paramInfo->iParamName->CompareF(hdrParamIter.Name()) != 0) + { + iObserver.EndTest(KErrCorrupt); + return; + } + THttpHeaderValueVariant value = hdrParamIter.Value(); + if(!iParams.CheckVariantValue(value, *paramInfo->iParamValue) != 0) + { + iObserver.EndTest(KErrCorrupt); + return; + } + ++x; + ++hdrParamIter; + } + ++iter; + ++i; + } + } + +void CTestClientHttpSimpleGet::OnCompletion() + { + if(iParams.IsFileSending()) + { + iParams.SinkFile().Close(); // Close the file + TBool ret = ETrue; + TRAPD(err, ret = iParams.MatchFileContent()); + if(err == KErrNone && ret) + iObserver.EndTest(KErrNone); + else + iObserver.EndTest(KErrCorrupt); + } + else + { + iObserver.EndTest(KErrNone); + } + } + +void CTestClientHttpSimpleGet::OnError(TInt aError) + { + if(aError == iParams.ExpectedError()) + iObserver.EndTest(KErrNone); + else + iObserver.EndTest(aError); + } + +void CTestClientHttpSimpleGet::OnTransferProgress(TInt aTotal, TInt aTransffered) + { + if(iParams.TransferProgress()) + { + iTestUtils.LogIt(KTransferProgress(),aTotal,aTransffered); + } + } + +TBool CTestClientHttpSimpleGet::OnRedirection() + { + if(iParams.IsRedirecting()) + return ETrue; + else + return EFalse; + } + +void CTestClientHttpSimpleGet::OnData(THttpContentSinkOp& aData) + { + if(iParams.ResponseDynamicAndStatic()) + { + aData.Store(); + } + else + { + TPtrC8 ptr; + aData.GetData(ptr); + if(ptr.CompareF(iParams.ResponseBody()) != 0) + { + iObserver.EndTest(KErrCorrupt); + return; + } + aData.Release(); + } + } + + +CTestClientHttpOnlineGet* CTestClientHttpOnlineGet::NewL(CHttpClientTestParams& aParams, MLocalTestServerObserver& aObserver, CHttpService& aClient, const TDesC8& aUri, CHTTPTestUtils* aUtils) + { + CTestClientHttpOnlineGet* self = new(ELeave) CTestClientHttpOnlineGet(aParams, aObserver, aUtils); + CleanupStack::PushL(self); + self->ConstructL(aClient, aUri); + CleanupStack::Pop(); // self + return self; + } + +CTestClientHttpOnlineGet::CTestClientHttpOnlineGet(CHttpClientTestParams& aParams, MLocalTestServerObserver& aObserver, CHTTPTestUtils* aUtils) +: CTestClientHttpSimpleGet(aParams, aObserver, aUtils) + { + + } + +void CTestClientHttpOnlineGet::ConstructL(CHttpService& aClient, const TDesC8& aUri) + { + CTestClientHttpSimpleGet::ConstructL(aClient, aUri); + _LIT8(KLocalHost, "127.0.0.1"); + if(aUri.FindF(KLocalHost()) == KErrNotFound) + { + CHttpClientTransaction::AddCustomRequestHeader(KAcceptHeader(), KAcceptValue()); + THttpHeaderValueVariant variant; + variant.SetInt(300); + CHttpClientTransaction::AddRequestHeader(HTTP::EKeepAlive, variant); + _LIT8(KEnUs, "en-us"); + variant.SetStr(KEnUs); + CHttpClientTransaction::AddRequestHeader(HTTP::EAcceptLanguage, variant); + _LIT8(KEn, "en"); + _LIT8(KQVal, "0.9"); + + //The following functions SetDateTime() and DateTime() have been used to avoid the code coverage issues. + TDateTime dateTime(2009, EDecember, 0, 0, 0, 0, 0); + variant.SetDateTime(dateTime); + + TInternetDate internetDate(variant.DateTime()); + + TLex8 lex(KQVal); + TReal64 value = 0.; + lex.Val(value); + THTTPHdrVal::TQConv q(value); + TInt val2 = q; + THttpHeaderValueVariant variant2(val2); + variant.SetStr(KEn); + CHttpClientTransaction::AddRequestHeader(HTTP::EAcceptLanguage, variant, HTTP::EQ, variant2); + + //The following two temporary objects have been created to avoid the code coverage issues. + THttpContentSinkOp httpContentSinkOp; + THttpContentSourceOp httpContentSourceOp; + // Disable the pipelining + DisablePipelining(); + } + else + { + _LIT8(KAcceptAll, "*/*"); + CHttpClientTransaction::AddCustomRequestHeader(KAcceptHeader(), KAcceptAll()); + } + } + +CTestClientHttpOnlineGet::~CTestClientHttpOnlineGet() + { + + } + +void CTestClientHttpOnlineGet::OnResponseHeaders() + { + // Check whether the status code matches + if(iParams.StatusCode() != StatusCode()) + { + iObserver.EndTest(KErrCorrupt); + return; + } + _LIT8(KStatusText, "Ok"); + const TDesC8& statusText = StatusText(); + + if(statusText.CompareF(KStatusText) != 0) + { + // we do not fail here. But comparison is failed. print that. + } + + // Iterate the response headers + THttpHeaderIterator iter; + iter = ResponseHeaders(); + while(!iter.AtEnd()) + { + iter++; + } + + THttpHeaderElementIterator it; + it = ResponseHeader(HTTP::ECacheControl); + while(!it.AtEnd()) + { + it++; + } + _LIT8(KContentType, "Content-Type"); + it = ResponseHeader(KContentType()); + while(!it.AtEnd()) + { + THttpHeaderParamIterator it2; + it2 = it.Parameter(); + while(!it2.AtEnd()) + { + it2++; + } + it++; + } + CHttpClientTransaction::SetContentSink(*this); + } + +void CTestClientHttpOnlineGet::OnCompletion() + { + iObserver.EndTest(KErrNone); + } + +void CTestClientHttpOnlineGet::OnData(THttpContentSinkOp& aData) + { + // Just release the data + aData.Release(); + }