messagingfw/suplsmshandler/test/testserver/src/Te_LbsSuplSmsTriggerIntegStep.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/suplsmshandler/test/testserver/src/Te_LbsSuplSmsTriggerIntegStep.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,456 @@
+// Copyright (c) 2007-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:
+// This is an integration unit test class for the SUPL Sms Trigger Plug-in
+// 
+//
+
+/**
+ @file
+ @internalComponent
+ @prototype
+*/
+
+#include <e32property.h>
+#include <ecom/ecom.h>
+#include <centralrepository.h>
+
+#include <wapmessage.h>
+
+#include "lbssuplpushprops.h"
+#include "lbsrootcenrepdefs.h"
+
+#include "Te_LbsSuplSmsTriggerIntegStep.h"
+#include "Te_SuplWdpWatcher.h"
+#include "Te_LbsSuplPush.h"
+#include "Te_LbsSuplSmsTriggerCommon.h"
+#include "Te_ErrorPattern.h"
+
+
+/** The port on which test SMS messages sent*/
+const TInt KSuplSmsTriggerTestPort = 7276;
+
+/**
+ * Constructor. It must	call the SetTestStepName as the controlling
+ * framework uses the test step name immediately following construction to set
+ * up the step's unique logging ID. 
+ */
+CTe_LbsSuplSmsTriggerIntegStep::CTe_LbsSuplSmsTriggerIntegStep()
+	{
+	SetTestStepName(KLbsSuplSmsTriggerIntegStep);
+	CTe_LbsSuplPush::SetTestObserver(this);
+	}
+
+/**
+ * Destructor.
+ */
+CTe_LbsSuplSmsTriggerIntegStep::~CTe_LbsSuplSmsTriggerIntegStep()
+	{
+	delete iSender;
+	delete iReceiver;
+	delete iWatcherLog;
+	}
+
+/**
+Creates the test step environment: the UDP message sender, the receiver part of the SUPL Push API,
+and the Watcher Framework logger.
+
+@return - always returns EPass.
+
+@leave If a error happens, it leaves with one of the system error codes.
+
+@see CTe_BaseStep::doTestStepPreambleL
+ */
+TVerdict CTe_LbsSuplSmsTriggerIntegStep::doTestStepPreambleL()
+	{
+	CTe_BaseStep::doTestStepPreambleL();
+	iSender = CTe_LbsSuplSmsTriggerSender::NewL(KSuplSmsTriggerTestPort , *this);
+	iReceiver = CLbsSuplPushRec::NewL(*this);
+	iWatcherLog = CTe_WatcherLog::NewL();
+	return TestStepResult();
+	}
+
+/**
+Overrides pure virtual CTe_BaseStep::ReallyDoTestStepL. The test code is run here.
+
+@leave If a error happens, it leaves with one of the system error codes or EFail.
+*/
+void CTe_LbsSuplSmsTriggerIntegStep::ReallyDoTestStepL()
+	{
+	// Get the CategoryUid from the cenrep file owned by LbsRoot.
+	TInt category;
+	CRepository* rep = CRepository::NewLC(KLbsCenRepUid);
+	User::LeaveIfError(rep->Get(KSuplPushAPIKey, category));
+	CleanupStack::PopAndDestroy(rep);
+	TUid propOwnerSecureId = TUid::Uid(category);
+	
+	//Reset the values set by previous tests
+	User::LeaveIfError(RProperty::Set(propOwnerSecureId, KLbsSuplPushSmsBusyKey, 1));
+	User::LeaveIfError(RProperty::Set(propOwnerSecureId, KLbsSuplPushSmsAckKey, 0));
+	User::LeaveIfError(RProperty::Set(propOwnerSecureId, KLbsSuplPushSmsInitKey, KNullDesC8));
+	
+	iMsgMaxCount = 1;
+
+	//Successfuly send/receive a single message
+	CLbsSuplWdpWatcher* wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+	
+	CTe_LbsSuplWdpWatcher::DisableAsserts();
+	wdpWatcher->OnTimerError(0, KErrGeneral); //Just to improve code coverage
+	CTe_LbsSuplWdpWatcher::EnableAsserts();
+	
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	SendMessage(iSendFillDigit++);
+	iSchedulerWait->Start();
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	User::LeaveIfError(iUnexpectedError);
+	CleanupStack::PopAndDestroy(wdpWatcher);
+	
+	//Successfuly send/receive several messages
+	wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	for(TInt i=0;i<10;i++)
+		{
+		SendMessage(iSendFillDigit++);
+		iSchedulerWait->Start();
+		wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+		User::LeaveIfError(iUnexpectedError);
+		}
+	CleanupStack::PopAndDestroy(wdpWatcher);
+	
+	
+	//Memory allocation failure test - creation of WdpWatcher
+	
+	User::__DbgSetAllocFail(EFalse ,RAllocator::EFailNext, 1);
+	
+	TInt* marker = new TInt(0);
+	delete marker;
+	
+	if(!marker) //We only do memory failure tests for the udeb build of the OS
+		{
+		marker = new TInt(0);
+		delete marker;
+			
+		for(TInt i=1; marker; i++)
+			{			
+			User::__DbgSetAllocFail(EFalse ,RAllocator::EFailNext, i);
+		
+			TRAPD(err, wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog); CleanupStack::Pop(wdpWatcher));
+		
+			marker = new TInt(0);
+			delete marker;
+		
+			if(!marker || (marker && err==KErrNone)) 
+				{
+				if(wdpWatcher==0)
+					{
+					User::Leave(KErrGeneral);
+					}
+				CleanupStack::PushL(wdpWatcher);
+				User::LeaveIfError(err);
+				wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EDisconnected | CLbsSuplWdpWatcher::EAwaitingDataSize);
+				CleanupStack::PopAndDestroy(wdpWatcher);
+				}
+			}
+	
+		//Memory allocation failure test - CLbsSuplWdpWatcher::RunL method
+		marker = new TInt(0);
+		delete marker;
+		for(TInt i=1; marker; i++)
+			{
+			//reset the previous errors and reset the message counter
+			iUnexpectedError = KErrNone;
+			iRecvFillDigit=iSendFillDigit;
+		
+			wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+			wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+			SendMessage(iSendFillDigit++);
+		
+			User::__DbgSetAllocFail(EFalse ,RAllocator::EFailNext, i);
+		
+			//we have to set time limitation here if leave occurs and the msg is not processed
+			iSchedulerWait->Start(15000000);	
+		
+			marker = new TInt(0);
+			delete marker;
+		
+			if(marker) //memory leak occurs in our code or in the ActiveScheduler
+				{
+				TRAPD(err, wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize));
+				if(err!=KErrNone)
+					{
+					iSchedulerWait->Start(11000000);	
+					wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+					}
+				}
+			else //memory leak does not occur in our code
+				{
+				wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+				User::LeaveIfError(iUnexpectedError);
+				}
+			CleanupStack::PopAndDestroy(wdpWatcher);
+			}
+		}
+	
+	//Error on starting listening for new messages and restoring the connection afterwards
+	wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+	//The port is occupied here
+	CLbsSuplWdpWatcher* wdpWatcher2 = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+	CleanupStack::Pop(wdpWatcher2);
+	CleanupStack::PopAndDestroy(wdpWatcher);
+	CleanupStack::PushL(wdpWatcher2);
+	wdpWatcher2->CheckStateL(CLbsSuplWdpWatcher::EDisconnected);
+	wdpWatcher2->Cancel();  //This is added to test CLbsSuplWdpWatcher::DoCancel method
+	iSchedulerWait->Start(5000000);
+	wdpWatcher2->CheckStateL(CLbsSuplWdpWatcher::EDisconnected);
+	iSchedulerWait->Start(10000000);
+	wdpWatcher2->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	SendMessage(iSendFillDigit++);
+	iSchedulerWait->Start();
+	User::LeaveIfError(iUnexpectedError);
+	wdpWatcher2->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	CleanupStack::PopAndDestroy(wdpWatcher2);
+	
+	
+	//Sync error while receiving message size
+	RTe_ErrorPattern::AppendErrorL(KModuleUid, ECWapBoundDatagramService_AwaitRecvDataSize, 
+			1, KErrGeneral, EFalse);
+	wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EDisconnected);
+	iSchedulerWait->Start(5000000);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EDisconnected);
+	iSchedulerWait->Start(10000000);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	SendMessage(iSendFillDigit++);
+	iSchedulerWait->Start();
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	User::LeaveIfError(iUnexpectedError);
+	CleanupStack::PopAndDestroy(wdpWatcher);
+	RTe_ErrorPattern::Reset();
+	
+	//Sync error while receiving message size - on the second message
+	RTe_ErrorPattern::AppendErrorL(KModuleUid, ECWapBoundDatagramService_AwaitRecvDataSize, 
+			2, KErrGeneral, EFalse);
+	wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	SendMessage(iSendFillDigit++);
+	iSchedulerWait->Start();
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EDisconnected);
+	User::LeaveIfError(iUnexpectedError);
+	iSchedulerWait->Start(5000000);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EDisconnected);
+	iSchedulerWait->Start(10000000);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	SendMessage(iSendFillDigit++);
+	iSchedulerWait->Start();
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	User::LeaveIfError(iUnexpectedError);
+	CleanupStack::PopAndDestroy(wdpWatcher);
+	RTe_ErrorPattern::Reset();
+	
+	
+	//Async error while receiving message size
+	RTe_ErrorPattern::AppendAsyncErrorL(KModuleUid, ECWapBoundDatagramService_AwaitRecvDataSize, 
+			1, KErrGeneral, EFalse);
+	wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	iSchedulerWait->Start(5000000);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EDisconnected);
+	iSchedulerWait->Start(10000000);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	SendMessage(iSendFillDigit++);
+	iSchedulerWait->Start();
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	User::LeaveIfError(iUnexpectedError);
+	CleanupStack::PopAndDestroy(wdpWatcher);
+	RTe_ErrorPattern::Reset();
+	
+	//Sync error while receiving message 
+	RTe_ErrorPattern::AppendErrorL(KModuleUid, ECWapBoundDatagramService_RecvFrom, 
+			1, KErrGeneral, EFalse);
+	wdpWatcher = CLbsSuplWdpWatcher::NewLC(iWatcherLog);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	SendMessage(iSendFillDigit++);
+	iSchedulerWait->Start(5000000);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EDisconnected);
+	iSchedulerWait->Start(10000000);
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	iRecvFillDigit=iSendFillDigit;
+	SendMessage(iSendFillDigit++);
+	iSchedulerWait->Start();
+	wdpWatcher->CheckStateL(CLbsSuplWdpWatcher::EAwaitingDataSize);
+	User::LeaveIfError(iUnexpectedError);
+	CleanupStack::PopAndDestroy(wdpWatcher);
+	RTe_ErrorPattern::Reset();
+	
+	}
+
+/**
+Overrides the pure virtual MTe_LbsSuplSmsTriggerSenderObserver::OnMessageSent. Receives the result
+of the message sending.
+	
+@param aError [In] The error code or KErrNone if successful.
+
+@see MTe_LbsSuplSmsTriggerSenderObserver::OnMessageSent
+@see CTe_LbsSuplSmsTriggerSender::SendMessage
+*/
+void CTe_LbsSuplSmsTriggerIntegStep::OnMessageSent(TInt aError)
+	{
+	if(aError!=KErrNone)
+		{
+		iUnexpectedError = aError;
+		iSchedulerWait->AsyncStop();
+		return;
+		}
+	iMsgCount++;
+	
+	if(iMsgCount<iMsgMaxCount) //continue to send messages
+		{
+		SendMessage(iMsgCount);
+		}
+	else //create the receiver and start to process messages
+		{
+		if(iMsgMaxCount>1)
+			{
+			User::After(5000000);
+			}
+		iMsgCount = 0;
+		}
+	}
+
+/**
+Overrides the pure virtual MLbsSuplPushRecObserver::OnSuplInit. Receives notifications about 
+incoming SUPL INIT messages.
+
+@param aChannel  [In] The channel the call-back is related to.
+@param aReqId    [In] An Id of the request the call-back is related to.
+@param aMsg      [In] A buffer containing a SUPL INIT message.
+
+@see MLbsSuplPushRecObserver::OnSuplInit
+@see CLbsSuplPushRec
+*/
+void CTe_LbsSuplSmsTriggerIntegStep::OnSuplInit(TLbsSuplPushChannel aChannel, 
+		TLbsSuplPushRequestId /*aReqId*/, TDesC8& aMsg)
+	{
+	if(aChannel!=ELbsSuplPushChannelSMS || !CompareMessage(iRecvFillDigit++, aMsg))
+		{
+		if(aChannel!=ELbsSuplPushChannelSMS)
+			{
+			ERR_PRINTF1(_L("CTe_LbsSuplSmsTriggerIntegStep::OnSuplInit: aChannel!=ELbsSuplPushChannelSMS"));
+			}
+		iUnexpectedError = KErrGeneral;;
+		iSchedulerWait->AsyncStop();
+		return;
+		}
+	}
+
+/**
+Overrides the pure virtual MLbsSuplPushObserver::OnSuplInitComplete. Receives message delivery 
+notifications.
+
+@param aChannel  [In] The channel the call-back is related to.
+@param aReqId    [In] An Id of the request the call-back is related to.
+@param aError    [In] KErrNone if successful, KErrTimeout if it was not possible to deliver
+	                      the request before the timeout period, KErrArgument if the structure 
+	                      or content of the SUPL INIT message was incorrect. 
+	                      Any system wide error code otherwise.
+@param aReserved [In] Reserved for future use.
+
+@see MLbsSuplPushObserver::OnSuplInitComplete
+@see CLbsSuplPush
+*/
+void CTe_LbsSuplSmsTriggerIntegStep::OnSuplInitComplete(TLbsSuplPushChannel aChannel, 
+		TLbsSuplPushRequestId /*aReqId*/, TInt /*aError*/, TInt /*aReserved*/)
+	{
+	
+	if(aChannel!=ELbsSuplPushChannelSMS)
+		{
+		ERR_PRINTF1(_L("CTe_LbsSuplSmsTriggerIntegStep::OnSuplInit: aChannel!=ELbsSuplPushChannelSMS"));
+		iUnexpectedError = KErrGeneral;;
+		iSchedulerWait->AsyncStop();
+		return;
+		}
+	
+	iMsgCount++;
+	
+	if(iMsgCount==iMsgMaxCount)
+		{
+		iSchedulerWait->AsyncStop();
+		}
+	}
+
+/**
+Generates and sends a UDP message using the CTe_LbsSuplSmsTriggerSender object.
+
+@param aNum [In] The number used to fill the message.
+
+@see CTe_LbsSuplSmsTriggerIntegStep::OnMessageSent
+@see CTe_LbsSuplSmsTriggerIntegStep::CompareMessage
+*/
+void CTe_LbsSuplSmsTriggerIntegStep::SendMessage(TUint aNum)
+	{
+	INFO_PRINTF2(_L("CTe_LbsSuplSmsTriggerIntegStep::SendMessage: msg %d"), aNum);
+	aNum = aNum%10;
+	iMessage.Zero();
+	TInt maxLength = iMessage.MaxLength();
+	for(TInt i=0;i<maxLength;i++)
+		{
+		iMessage.AppendNum(aNum);
+		}
+		
+	iMessage[0] = 0;
+	iMessage[1] = 0;
+
+	// set the encoded length field
+	iMessage[0] |= (TUint8)( maxLength >> 8 );
+	iMessage[1] |= (TUint8)( maxLength );
+		
+	iSender->SendMessage(iMessage);
+	}
+
+
+/**
+Generates a message using the pattern specified and compares it with the given message.
+
+@param aNum [In] The number used to fill the generated message.
+
+@return ETrue if the messages are identical, EFalse otherwise.
+
+@see CTe_LbsSuplSmsTriggerIntegStep::OnSuplInit
+@see CTe_LbsSuplSmsTriggerIntegStep::SendMessage
+*/
+TBool CTe_LbsSuplSmsTriggerIntegStep::CompareMessage(TUint aNum, TDesC8& aMsg)
+	{
+	aNum = aNum%10;
+	iMessage.Zero();
+	TInt maxLength = iMessage.MaxLength();
+	for(TInt i=0;i<maxLength;i++)
+		{
+		iMessage.AppendNum(aNum);
+		}
+	
+	iMessage[0] = 0;
+	iMessage[1] = 0;
+
+	// set the encoded length field
+	iMessage[0] |= (TUint8)( maxLength >> 8 );
+	iMessage[1] |= (TUint8)( maxLength );	
+	
+	if(aMsg.Compare(iMessage)==0)
+		{
+		return ETrue;
+		}
+	ERR_PRINTF1(_L("CTe_LbsSuplSmsTriggerIntegStep::CompareMessage: aMsg!=iMessage"));
+	return EFalse;
+	}
+
+