--- /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 <f32file.h>
+
+// 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
+ }