diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/Test/Acceptance/Iter2/WspTestTransactions.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httptransportfw/Test/Acceptance/Iter2/WspTestTransactions.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,475 @@ +// Copyright (c) 2004-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: +// + +// System includes +#include + +// User includes +#include "WspTestTransactions.h" +#include "csrvaddrval.h" + +// Proxy information properties +_LIT(KItemWspProxyAddress, "proxy_address"); +_LIT(KItemWspBearer, "wsp_bearer"); +_LIT(KItemWspLocalPort, "local_port"); +_LIT(KItemWspRemotePort, "remote_port"); +_LIT(KItemWspServiceNumber, "service_number"); +_LIT(KItemWspSessionType, "session_type"); +_LIT(KItemWspSecurity, "security"); + +// Capability properties +_LIT(KItemWspClientMsgSize, "client_message_size"); +_LIT(KItemWspServerMsgSize, "server_message_size"); +_LIT(KItemWspUseAcknowledgements, "use_acknowledgements"); +_LIT(KItemWspSupportSuspendResume, "support_suspend_resume"); +_LIT(KItemWspMaxOutstandingRequests,"max_outstanding_requests"); +_LIT(KItemExpectedError, "test_validation_param_expectederror"); + +// Security policy properties +_LIT(KSecurityPolicy, "securitypolicy"); +_LIT(KSecurityPolicyFileName, "securitypolicy.ini"); + +_LIT(KValidateUntrustedServerCert, "ValidateUntrustedServerCert"); +_LIT(KWTLSCipherSuites, "WTLSCipherSuites"); +_LIT(KWTLSKeyExchangeSuites, "WTLSKeyExchangeSuites"); +_LIT(KTLSCipherSuites, "TLSCipherSuites"); +_LIT(KPolicy, "Policy"); + + +CWspTestTransactions* CWspTestTransactions::NewL(CScriptFile& aIniFile, CScriptFile* aIniSettingsFile, const TInt aSectionName) + { + CWspTestTransactions* self = new(ELeave) CWspTestTransactions(aIniSettingsFile); + CleanupStack::PushL(self); + self->ConstructL(aIniFile, aIniSettingsFile, aSectionName); + CleanupStack::Pop(self); + return self; + } + + +CWspTestTransactions::CWspTestTransactions(CScriptFile* aIniSettingsFile) : + iIniSettingsFile(aIniSettingsFile) + { + } + + +void CWspTestTransactions::ConstructL(CScriptFile& aIniFile, CScriptFile* aIniSettingsFile, const TInt aSectionName) + { + CHttpTestTransactions::ConstructL(aIniFile, aIniSettingsFile, aSectionName); + } + + +CWspTestTransactions::~CWspTestTransactions() + { + } + +void CWspTestTransactions::DoRunL() + { + OpenTestSessionL(); // set up session and transaction here + if ((iSessionEvent.iStatus) == THTTPSessionEvent::EDisconnected || (iSessionEvent.iStatus) == THTTPSessionEvent::EConnectionTimedOut) + { + DoCloseTestSession(); // close any strings, transactiona and session + + // Check if the expected status is returned + if( (iSessionEvent.iStatus == THTTPSessionEvent::EConnectionTimedOut) && (iExpectedStatusCode == 504) ) + { + // No fail... + iTestFail = 0; + } + else if( (iSessionEvent.iStatus == THTTPSessionEvent::EDisconnected) && (iExpectedError == THTTPSessionEvent::EAuthenticationFailure) && iAuthenticationFailure ) + { + // No fail... + iTestFail = 0; + } + else + { + // Fail! + iTestFail = 1; + } + + iEngine->Utils().LogIt(_L("Warning: Connection to proxy closed\n")); + } + else + { + CActiveScheduler::Start(); + CloseTestSession(); // disconnect from gateway and then close any + // strings, transactions and sessions + } + if (iTestFail==1) + { + User::Leave(-1); + } + } + + +void CWspTestTransactions::OpenTestSessionL() + { + // Iterate through the TestCases.ini file, beginning at the first element + // i.e. index 0, and write the security policy properties to the + // securitypolicy.ini file. + SetWspSecurityPolicyPropertiesL(0); + + iSession.OpenL(_L8("WSP/WSP")); + + iMyStrP = iSession.StringPool(); + + // Set the session callback + iSession.SetSessionEventCallback(this); + + SetWspSessionPropertiesL(); + + ConnectToGatewayL(); + } + + +void CWspTestTransactions::CloseTestSession() + { + LogCertificate(); + // Disconnect from the gateway first + TRAP_IGNORE( DisconnectFromGatewayL() ); + DoCloseTestSession(); + } + +void CWspTestTransactions::LogCertificate() + { + if(iLogCert) + { + TRAPD(error, LogCertL()); + if(error != KErrNone) + iEngine->Utils().LogIt(_L("Unable to log server certificate. Error code=%d\n"), error); + } + } + +void CWspTestTransactions::LogCertL() + { + TCertInfo certInfo; + User::LeaveIfError(iSession.ServerCert(certInfo)); + + LogCertificateL(certInfo); + } + +void CWspTestTransactions::DoCloseTestSession() + { + CHttpTestTransactions::CloseTestSession(); + iTransaction.Close(); + iEngine->Utils().LogIt(_L("Transaction closed\n")); + iSession.Close(); + iEngine->Utils().LogIt(_L("Session closed")); + } + + +void CWspTestTransactions::ConnectToGatewayL() + { + iSession.ConnectL(); + CActiveScheduler::Start(); + } + + +void CWspTestTransactions::DisconnectFromGatewayL() + { + iSession.DisconnectL(); + CActiveScheduler::Start(); + } + + +void CWspTestTransactions::CreateSingleTransactionL() + { + // Iterate through the TestCases.ini file, beginning at the first element + // i.e. index 0, and set up the transaction properties + iTransaction = CreateTransactionL(0); + iTransaction.SubmitL(); + } + + +void CWspTestTransactions::MHFSessionRunL(const THTTPSessionEvent& aEvent) + { + iSessionEvent = aEvent; + switch(aEvent.iStatus) + { + case THTTPSessionEvent::EConnectedOK: + { + iEngine->Utils().LogIt(_L("WSP Session connected. No reduced capabilities\n")); + CreateSingleTransactionL(); + CActiveScheduler::Stop(); + } break; + case THTTPSessionEvent::EConnectedWithReducedCapabilities: + { + iEngine->Utils().LogIt(_L("WSP Session connected with reduced capabilities\n")); + CreateSingleTransactionL(); + CActiveScheduler::Stop(); + } break; + case THTTPSessionEvent::EConnectionTimedOut: + { + // Need to create the transaction even though its timed out to read + // the ini file for the time out tests in servertestcases.ini + iTransaction = CreateTransactionL(0); + iEngine->Utils().LogIt(_L("Proxy connection timed out\n")); + CActiveScheduler::Stop(); + } break; + case THTTPSessionEvent::EDisconnected: + { + iEngine->Utils().LogIt(_L("WSP Session disconnected\n")); + CActiveScheduler::Stop(); + } break; + case THTTPSessionEvent::ERedirected: + { + iEngine->Utils().LogIt(_L("Redirected\n")); + } break; + case THTTPSessionEvent::EAuthenticatedOK: + { + iEngine->Utils().LogIt(_L("Authenticated OK\n")); + } break; + case THTTPSessionEvent::EAuthenticationFailure: + { + iEngine->Utils().LogIt(_L("Warning: Authentication Failure\n")); + iAuthenticationFailure = ETrue; + } break; + case THTTPSessionEvent::ENotConnected: + { + iEngine->Utils().LogIt(_L("Warning: Not Connected\n")); + } break; + case THTTPSessionEvent::EExceptionInfo: + { + iEngine->Utils().LogIt(_L("Warning: Exception Info\n")); + } break; + case THTTPSessionEvent::EAlreadyConnecting: + { + iEngine->Utils().LogIt(_L("Warning: Already Connecting\n")); + } break; + case THTTPSessionEvent::EAlreadyConnected: + { + iEngine->Utils().LogIt(_L("Warning: Already Connected\n")); + } break; + case THTTPSessionEvent::EAlreadyDisconnecting: + { + iEngine->Utils().LogIt(_L("Warning: Already Disconnecting\n")); + } break; + case THTTPSessionEvent::EAlreadyDisconnected: + { + iEngine->Utils().LogIt(_L("Warning: Already Disconnected\n")); + } break; + default: + CActiveScheduler::Stop(); + break; + } + } + + +TInt CWspTestTransactions::MHFSessionRunError(TInt aError, const THTTPSessionEvent& /*aEvent*/) + { + return aError; + } + + +void CWspTestTransactions::SetWspSessionPropertiesL() + { + // Iterate through the TestCases.ini file, beginning at the first element + // i.e. index 0, and set up the WSP proxy properties and the + // WSP capability properties + SetWspProxyPropertiesL(0); + SetWspCapabilityPropertiesL(0); + } + + +void CWspTestTransactions::SetWspProxyPropertiesL(TInt aStartItem) + { + RHTTPConnectionInfo connInfo = iSession.ConnectionInfo(); + TInt endItem = FindEndOfTransaction(aStartItem); + for (TInt ii = aStartItem; ii < endItem; ++ii) + { + TPtrC itemPtr(iIniFile->Section(iSectionNumber).Item(ii).Item()); + HBufC8* itemBuff8 = HBufC8::NewLC(itemPtr.Length()); + TPtr8 itemPtr8 = itemBuff8->Des(); + itemPtr8.Copy(itemPtr); + RStringF item = iMyStrP.OpenFStringL(itemPtr8); + CleanupClosePushL(item); + + + TPtrC valuePtr(iIniFile->Section(iSectionNumber).Item(ii).Value()); + + // Retrieve the actual value from the settings.ini file for + // KItemWspProxyAddress ("proxy_address"). Other values like + // uri value are retrieved in trans.cpp file. + + // Replace the host name in the URI + HBufC16* valueBuff16 = TSrvAddrVal::ReplaceHostNameL(valuePtr, iIniSettingsFile); + CleanupStack::PushL(valueBuff16); + TPtr16 valuePtr16 = valueBuff16->Des(); + + // Convert 16 bit to 8 bit. + HBufC8* valueBuff8 = HBufC8::NewLC(valuePtr16.Length()); + TPtr8 valuePtr8 = valueBuff8->Des(); + valuePtr8.Copy(valuePtr16); + + RStringF value = iMyStrP.OpenFStringL(valuePtr8); + CleanupClosePushL(value); + + if (itemPtr.CompareF(KItemWspProxyAddress)==0) + { + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspProxyAddress, RHTTPSession::GetTable()), value); + } + if (itemPtr.Compare(KItemWspBearer)==0) + { + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspBearer, RHTTPSession::GetTable()), value); + } + if (itemPtr.Compare(KItemWspLocalPort)==0) + { + TLex lex(valuePtr); + TInt localPort = 0; + lex.Val(localPort); + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspLocalPort, RHTTPSession::GetTable()), localPort); + } + if (itemPtr.Compare(KItemWspRemotePort)==0) + { + TLex lex(valuePtr); + TInt remotePort = 0; + lex.Val(remotePort); + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspRemotePort, RHTTPSession::GetTable()), remotePort); + } + if (itemPtr.Compare(KItemWspServiceNumber)==0) + { + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspServiceNumber, RHTTPSession::GetTable()), value); + } + if (itemPtr.Compare(KItemWspSessionType)==0) + { + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspSessionType, RHTTPSession::GetTable()), value); + } + if (itemPtr.Compare(KItemWspSecurity)==0) + { + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspSecurity, RHTTPSession::GetTable()), value); + } + + CleanupStack::PopAndDestroy(5, itemBuff8); // item, valueBuff8, value, valueBuff16 + } + } + +void CWspTestTransactions::SetWspCapabilityPropertiesL(TInt aStartItem) + { + RHTTPConnectionInfo connInfo = iSession.ConnectionInfo(); + TInt endItem = FindEndOfTransaction(aStartItem); + for (TInt ii = aStartItem; ii < endItem; ++ii) + { + TPtrC itemPtr(iIniFile->Section(iSectionNumber).Item(ii).Item()); + HBufC8* itemBuff8 = HBufC8::NewLC(itemPtr.Length()); + TPtr8 itemPtr8= itemBuff8->Des(); + itemPtr8.Copy(itemPtr); + RStringF item = iMyStrP.OpenFStringL(itemPtr8); + CleanupClosePushL(item); + + + TPtrC valuePtr(iIniFile->Section(iSectionNumber).Item(ii).Value()); + HBufC8* valueBuff8 = HBufC8::NewLC(valuePtr.Length()); + TPtr8 valuePtr8= valueBuff8->Des(); + valuePtr8.Copy(valuePtr); + RStringF value = iMyStrP.OpenFStringL(valuePtr8); + CleanupClosePushL(value); + + if (itemPtr.CompareF(KItemWspClientMsgSize)==0) + { + TLex lex(valuePtr); + TInt cliMsgSize = 0; + lex.Val(cliMsgSize); + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspCapClientMessageSize, RHTTPSession::GetTable()), cliMsgSize); + } + if (itemPtr.CompareF(KItemWspServerMsgSize)==0) + { + TLex lex(valuePtr); + TInt srvMsgSize = 0; + lex.Val(srvMsgSize); + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspCapServerMessageSize, RHTTPSession::GetTable()), srvMsgSize); + } + if (itemPtr.CompareF(KItemWspUseAcknowledgements)==0) + { + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspCapUseAcknowledgements, RHTTPSession::GetTable()), value); + } + if (itemPtr.CompareF(KItemWspSupportSuspendResume)==0) + { + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspCapSupportSuspendResume, RHTTPSession::GetTable()), value); + } + if (itemPtr.CompareF(KItemWspMaxOutstandingRequests)==0) + { + TLex lex(valuePtr); + TInt maxOutReqs = 0; + lex.Val(maxOutReqs); + connInfo.SetPropertyL(iMyStrP.StringF(HTTP::EWspCapMaxOutstandingRequests, RHTTPSession::GetTable()), maxOutReqs); + } + if (itemPtr.CompareF(KItemExpectedError)==0) + { + //get the 'test_validation_param_expectederror' from the ini + //file... + TPtrC expectedParamPtr = iIniFile->Section(iSectionNumber).ItemL(KItemExpectedError).Value(); + TLex paramLex(expectedParamPtr); + TInt param; + paramLex.Val(param); + // ...and put it into iExpectedError + iExpectedError = param; + } + + CleanupStack::PopAndDestroy(4, itemBuff8); // itemBuff8, item, + // valueBuff8, value + } + } + +void CWspTestTransactions::SetWspSecurityPolicyPropertiesL(TInt aStartItem) + { + // Create the security policy plugin ini file + RFs fs; + CleanupClosePushL(fs); + User::LeaveIfError(fs.Connect()); + + TParse fileName; + User::LeaveIfError(iEngine->Utils().ResolveFile(KSecurityPolicy, KSecurityPolicyFileName, fileName)); + + RFile file; + CleanupClosePushL(file); + User::LeaveIfError(file.Replace(fs, fileName.FullName(), + EFileWrite|EFileShareExclusive)); + + // Write the section name + file.Write(_L8("\r\n[Security Policy]\r\n")); + + TInt endItem = FindEndOfTransaction(aStartItem); + for (TInt ii = aStartItem; ii < endItem; ++ii) + { + TPtrC itemPtr(iIniFile->Section(iSectionNumber).Item(ii).Item()); + HBufC8* itemBuff8 = HBufC8::NewLC(itemPtr.Length()); + TPtr8 itemPtr8 = itemBuff8->Des(); + itemPtr8.Copy(itemPtr); + + TPtrC valuePtr(iIniFile->Section(iSectionNumber).Item(ii).Value()); + HBufC8* valueBuff8 = HBufC8::NewLC(valuePtr.Length()); + TPtr8 valuePtr8 = valueBuff8->Des(); + valuePtr8.Copy(valuePtr); + + if( itemPtr.CompareF(KValidateUntrustedServerCert) == 0 || + itemPtr.CompareF(KWTLSCipherSuites) == 0|| + itemPtr.CompareF(KWTLSKeyExchangeSuites) == 0 || + itemPtr.CompareF(KTLSCipherSuites) == 0|| + itemPtr.Find(KPolicy) == 0) // matches 'Policy1', 'Policy2', etc. + { + // Write out entry to the securitypolicy.ini file + file.Write(itemPtr8); + file.Write(_L8("= ")); + file.Write(valuePtr8); + file.Write(_L8("\r\n")); + } + + CleanupStack::PopAndDestroy(2, itemBuff8); // itemBuff8, valueBuff8 + } + // Write the end of script marked in security ini + file.Write(_L8("\r\nendscript\r\n")); + + // Cleanup + CleanupStack::PopAndDestroy(2, &fs); // fs, file + }