telephonyprotocols/pdplayer/umts/test/te_spud/src/SpudUnitTestStepBase.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 20 244d7c5f118e
--- a/telephonyprotocols/pdplayer/umts/test/te_spud/src/SpudUnitTestStepBase.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyprotocols/pdplayer/umts/test/te_spud/src/SpudUnitTestStepBase.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,588 +1,588 @@
-// 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:
-// Test framework for SPUD TEL and SPUD FSM unit tests
-// 
-//
-
-/**
- @file
- @internalComponent
-*/
-
-#include <e32property.h>
-#include <c32comm.h>
-#include <e32def.h>
-#include <e32std.h>
-
-#include <in_iface.h>
-#include <simtsy.h>
-
-#include "SpudUnitTestStep.h"
-#include "InputRequestListener.h"
-
-using namespace EtelDriver;
-
-CSpudUnitTestStepBase::CSpudUnitTestStepBase(TInt aTestNumber, TBool aUseTestPdpFsmInterface) : iTestNumber(aTestNumber), iUseTestPdpFsmInterface(aUseTestPdpFsmInterface)
-	{}
-
-/**
-Sets the section for the simtsy to use in its c:\config.txt file.
-The section that will be used is testX, where X is the parameter
-aTestNumber.
-
-@param aTestNumber Simtsy configuration section number, which will be
-                   set to ensure simtsy loads the correct parameters on
-                   when it is loaded.
-@leave The function leaves if the Sim.TSY test number property is not
-       defined; e.g. make sure StartC32 has been called.
-*/
-void CSpudUnitTestStepBase::SetSimTsyTestNumberL(TInt aTestNumber)
-  	{
-	User::LeaveIfError(RProperty::Set(KUidPSSimTsyCategory, KPSSimTsyTestNumber, aTestNumber));
-  	}
-
-/**
- Initializes the test framework, including creating the thread that will run the active 
- scheduler containing the components under test (SPUD or SPUDTEL)
- */
-TVerdict CSpudUnitTestStepBase::doTestStepPreambleL()
-	{
-	SetSimTsyTestNumberL(iTestNumber);
-
-	// create CTestRequestListener, to be used to contain parameters to be passed
-	// between the two threads
-	switch (iTestNumber)
-		{
-		case KSimTsyTestNumberR5OrR99R4:
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-			iListener = CInputRequestListener::NewL(iUseTestPdpFsmInterface, TPacketDataConfigBase::KConfigRel5);
-#else
-            iListener = CInputRequestListener::NewL(iUseTestPdpFsmInterface, TPacketDataConfigBase::KConfigRel99Rel4);
-#endif
-			break;
-		default:
-			iListener = CInputRequestListener::NewL(iUseTestPdpFsmInterface, TPacketDataConfigBase::KConfigGPRS);
-			break;
-		}
-
-	// creating and start the thread that will run the active scheduler containing SPUD or SPUDTEL
-	TActiveSchedulerThreadParams params;
-	params.iListener = iListener;
-	params.iThreadId = RThread().Id();
- 	_LIT(activeSchedulerThreadName, "ActiveSchedulerThread_");
- 	TBuf<255> buf(activeSchedulerThreadName);
- 	buf.AppendNum(iTestNumber);
- 	TInt ret = iActiveSchedulerThread.Create(buf, ActiveSchedulerThread, KDefaultStackSize, NULL, &params);
- 	TESTEL(ret == KErrNone, ret);
-	iActiveSchedulerThread.Resume();
-	
-	// wait for the thread to initialize before sending it any requests
-	User::WaitForRequest(iListener->iThreadInitialized);
-
-	return TestStepResult();
-	}
-	
-/**
- Cleans up anything allocated in the preamble
- */
-TVerdict CSpudUnitTestStepBase::doTestStepPostambleL()
-	{
-	// if we complete the listener's status with an error, the RunL will stop the 
-	// active scheduler and the thread will clean up any resources and exit
-	TRequestStatus *status = &iListener->iStatus;
-	iActiveSchedulerThread.RequestComplete(status, KErrCancel);
-
-	// wait until the thread has cleaned up then kill it
-	// if the iThreadDestructed is never completed, this is probably the result of the UHEAP_MARKEND macro failing
-	User::WaitForRequest(iListener->iThreadDestructed);
-	iActiveSchedulerThread.Kill(KErrNone);
-	iActiveSchedulerThread.Close();
-	
-	delete iListener;
-	iListener = NULL;
-
-	return EPass;
-	}
-	
-/**
- Initializes the packet service to query current parameters
-*/
-void CSpudUnitTestStepBase::InitPhoneAndPacketServiceL()
-	{
-	TESTL(iTelServer.Connect() == KErrNone);
-	TESTL(iTelServer.LoadPhoneModule( _L("SIM") ) == KErrNone);
-	TESTL(iPhone.Open ( iTelServer, _L("SimulatorPhone") ) == KErrNone);
-	TESTL(iPacketService.Open(iPhone) == KErrNone);
-	}
-	
-void CSpudUnitTestStepBase::DestroyPhoneAndPacketService()
-	{
-	iPacketService.Close();
-	iPhone.Close();
-	iTelServer.Close();
-	}
-
-// Set up to not use Test PdpFsmInterface (and use the spud fsm's RPdpFsmInterface)
-CSpudFsmUnitTestStepBase::CSpudFsmUnitTestStepBase(TInt aTestNumber) : CSpudUnitTestStepBase(aTestNumber, EFalse)
-	{}
-	
-// Set up to use Test PdpFsmInterface
-CSpudTelUnitTestStepBase::CSpudTelUnitTestStepBase(TInt aTestNumber) : CSpudUnitTestStepBase(aTestNumber, ETrue)
-	{}
-
-/**
- Must be called after simtsy has been initialized.
- Instructs the simtsy to complete a given request/notification. The supported commands are given in TEtelRequestType.
- The parameter supplied in aNewValue instructs the simtsy what data from the config.txt to use in the completion of the request.
- The aNewValue is the index to the entry to be used to complete the request for the current test step section, ie if aNewValue
- is 0, iTestNumber is 3, and aEtelCommand is ENetworkQoSChange, the entry will complete any NotifyNetworkQoSChange calls
- with data from the first QosProfileReqR99 entry of section [test3] in the config.txt file
-*/
-void CSpudUnitTestStepBase::EtelRequest(TEtelRequestType aEtelCommand, TInt aNewValue)
-	{
-	INFO_PRINTF3(_L("CSpudUnitTestStepBase::EtelRequest: aEtelCommand = %d, aNewValue = %d"), aEtelCommand, aNewValue);
-
-	TUint key(0);
-	
-	switch (aEtelCommand)
-		{
-	case ENetworkQoSChange:
-		key = KPSSimTsyNetworkQoSChange;
-		break;
-	case ENetworkChangeRegStatus:
-		key = KPSSimtsyPacketServiceNtwkRegStatusChange;
-		break;
-	case EContextStatusChange:
-		key = KPSSimtsyPacketContextStatusChange;
-		break;
-	default:
-		// log error
-		return;
-		}
-
-  	// simtsy will listen for any changes to the property, and complete the corresponding request
-	TInt ret = RProperty::Set(KUidPSSimTsyCategory, key, aNewValue);
-	TEST(ret == KErrNone);
-	}
-
-/**
- Calling this will instruct the CTestRequestListener to call REtelDriverInput::CancelPdpNotifications on SPUDTEL
-*/
-void CSpudTelUnitTestStepBase::CancelPdpRequest(TContextId aPdpId)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::EtelDriverCancelPdpRequest: aPdpId = %d"), aPdpId);
-	// wait until iListener to finish with the iControlData member so that 2 requests
-	// immediately after one another will still work
-	User::WaitForRequest(iListener->iReadyForInputRequest);
-	iListener->iReadyForInputRequest = KRequestPending;
-
-	// set the parameters to pass to REtelDriverInput::Input
-	iListener->iEtelDriverCancelRequestPdpId = aPdpId;
-
-	// complete iListener's status, causing its RunL to call CancelPdp on SPUDTEL
-	TRequestStatus *status = &iListener->iStatus;
-	iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EEtelDriverCancelPdpRequest);
-	}
-
-/**
- Calling this will instruct the CTestRequestListener to call REtelDriverInput::Input on SPUDTEL
-*/
-void CSpudTelUnitTestStepBase::EtelDriverInputRequest(TContextId aPdpId, TEtelInput aOperation)
-	{
-	INFO_PRINTF3(_L("CSpudUnitTestStepBase::EtelDriverInputRequest: aPdpId = %d, aOperation = %d"), aPdpId, aOperation);
-	// wait until iListener to finish with the iControlData member so that 2 requests
-	// immediately after one another will still work
-	User::WaitForRequest(iListener->iReadyForInputRequest);
-	iListener->iReadyForInputRequest = KRequestPending;
-
-	// set the parameters to pass to REtelDriverInput::Input
-	iListener->iEtelDriverInputRequestData.iPdpId = aPdpId;
-	iListener->iEtelDriverInputRequestData.iOperation = aOperation;
-
-	// complete iListener's status, causing its RunL to call Input on SPUDTEL
-	TRequestStatus *status = &iListener->iStatus;
-	iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EEtelDriverInputRequest);
-	}
-
-/**
- Wait for RPdpFsmInterface::Input to be called with a non-notification event
-*/
-void CSpudTelUnitTestStepBase::WaitForEtelDriverInputResponse(TContextId aPdpId, PdpFsm::TEtelSignal aSignal, TInt aError)
-	{
-	INFO_PRINTF3(_L("CSpudUnitTestStepBase::WaitForEtelDriverInputResponse: aPdpId = %d, aSignal = %d"), aPdpId, aSignal);
-	
-	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverInputResponseStatus request
-	User::WaitForRequest(iListener->iEtelDriverInputResponseStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iEtelDriverInputResponseStatus == aError);
-	TEST(iListener->iEtelDriverInputResponseData.iPdpId == aPdpId);
-	TEST(iListener->iEtelDriverInputResponseData.iSignal == aSignal);
-	
-	iListener->iEtelDriverInputResponseStatus = KRequestPending;
-	}
-	
-/**
- Wait for RPdpFsmInterface::Input to be called with aOperation EConfigGPRSChangeNetwork
-*/
-void CSpudTelUnitTestStepBase::WaitForNextContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfigGPRS& aContextConfigGPRS)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverConfigGPRSNotificationStatus request
-	User::WaitForRequest(iListener->iEtelDriverConfigGPRSNotificationStatus);
-	
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: iListener->iNotifyContextConfigData.iPdpId = %d"), iListener->iNotifyContextConfigData.iPdpId);
-	// make sure the parameters are as expected
-	TEST(iListener->iEtelDriverConfigGPRSNotificationStatus == KErrNone);
-	TEST(iListener->iNotifyContextConfigData.iPdpId == aPdpId);
-	TEST(CompareContextConfigGPRS(iListener->iNotifyContextConfigData.iContextConfigGPRS, aContextConfigGPRS));
-	
-	iListener->iEtelDriverConfigGPRSNotificationStatus = KRequestPending;
-	}
-
-/**
- Wait for RPdpFsmInterface::Input to be called with aOperation EConfigGPRSChangeNetwork
- RPacketContext::TContextConfig_R5 overload
-*/
-void CSpudTelUnitTestStepBase::WaitForNextContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfig_R5& aContextConfigR5)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverConfigGPRSNotificationStatus request
-	User::WaitForRequest(iListener->iEtelDriverConfigGPRSNotificationStatus);
-	
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: iListener->iNotifyContextConfigData.iPdpId = %d"), iListener->iNotifyContextConfigData.iPdpId);
-	// make sure the parameters are as expected
-	TEST(iListener->iEtelDriverConfigGPRSNotificationStatus == KErrNone);
-	TEST(iListener->iNotifyContextConfigData.iPdpId == aPdpId);
-	TEST(CompareContextConfigR5(iListener->iNotifyContextConfigData.iContextConfig_R5, aContextConfigR5));
-	
-	iListener->iEtelDriverConfigGPRSNotificationStatus = KRequestPending;
-	}
-
-/**
- Wait for RPdpFsmInterface::Input to be called with aOperation EConfigGPRSChangeNetwork
- RPacketContext::TContextConfigR99_R4 overload
-*/
-void CSpudTelUnitTestStepBase::WaitForNextContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfigR99_R4& aContextConfigR99R4)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverConfigGPRSNotificationStatus request
-	User::WaitForRequest(iListener->iEtelDriverConfigGPRSNotificationStatus);
-	
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: iListener->iNotifyContextConfigData.iPdpId = %d"), iListener->iNotifyContextConfigData.iPdpId);
-	// make sure the parameters are as expected
-	TEST(iListener->iEtelDriverConfigGPRSNotificationStatus == KErrNone);
-	TEST(iListener->iNotifyContextConfigData.iPdpId == aPdpId);
-	TEST(CompareContextConfigR99R4(iListener->iNotifyContextConfigData.iContextConfigR99_R4, aContextConfigR99R4));
-	
-	iListener->iEtelDriverConfigGPRSNotificationStatus = KRequestPending;
-	}
-
-
-/**
- Wait for RPdpFsmInterface::Input to be called with aOperation EContextStatusChangeNetwork
-*/
-void CSpudTelUnitTestStepBase::WaitForGivenEtelContextStatusNotification(TContextId aPdpId, RPacketContext::TContextStatus aContextStatus)
-	{
-	INFO_PRINTF3(_L("CSpudUnitTestStepBase::WaitForGivenContextStatusNotification: aPdpId = %d, aContextStatus = %d"), aPdpId, aContextStatus);
-	
-	do
-		{
-	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverContextStatusNotificationStatus request
-		User::WaitForRequest(iListener->iEtelDriverContextStatusNotificationStatus);
-		
-		INFO_PRINTF3(_L("CSpudUnitTestStepBase::WaitForGivenContextStatusNotification: iPdpId = %d, iContextStatus = %d"), iListener->iNotifyContextConfigData.iPdpId, iListener->iNotifyContextStatusData.iContextStatus);
-		} while (iListener->iNotifyContextStatusData.iPdpId != aPdpId || iListener->iNotifyContextStatusData.iContextStatus != aContextStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iEtelDriverContextStatusNotificationStatus == KErrNone);
-	TEST(iListener->iNotifyContextStatusData.iPdpId == aPdpId);
-	TEST(iListener->iNotifyContextStatusData.iContextStatus == aContextStatus);
-	
-	iListener->iEtelDriverContextStatusNotificationStatus = KRequestPending;
-	}
-
-/**
- Wait for RPdpFsmInterface::Input to be called with aOperation EQoSProfileChangeNetwork
-*/
-void CSpudTelUnitTestStepBase::WaitForNextQosNotification(TContextId aPdpId, const RPacketQoS::TQoSR99_R4Negotiated& aQoSR99_R4Negotiated)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextQosNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverQosNotificationStatus request
-	User::WaitForRequest(iListener->iEtelDriverQosNotificationStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iEtelDriverQosNotificationStatus == KErrNone);
-	TEST(iListener->iNotifyQosNegotiatedData.iPdpId == aPdpId);
-	TEST(CompareUMTSQoSNeg(iListener->iNotifyQosNegotiatedData.iNegotiated.NegotiatedQoSR99_R4(), aQoSR99_R4Negotiated));
-	iListener->iEtelDriverQosNotificationStatus = KRequestPending;
-	}
-
-
-/**
- Wait for RPdpFsmInterface::Input to be called with aOperation EServiceStatusChangeNetwork
-*/
-void CSpudTelUnitTestStepBase::WaitForNextServiceNotificationStatus(RPacketService::TStatus aServiceStatus)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextServiceNotificationStatus: aServiceStatus = %d"), aServiceStatus);
-	
-	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverServiceNotificationStatus request
-	User::WaitForRequest(iListener->iEtelDriverServiceNotificationStatus);
-	
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextServiceNotificationStatus: aServiceStatus = %d"), aServiceStatus);
-	// make sure the parameters are as expected
-	TEST(iListener->iEtelDriverServiceNotificationStatus == KErrNone);
-	TEST(iListener->iPacketServiceStatus == aServiceStatus);
-	
-	iListener->iEtelDriverServiceNotificationStatus = KRequestPending;
-	}
-
-/**
- Calling this will instruct the CTestRequestListener to call REtelDriverInput::Input on SPUDTEL
-*/
-void CSpudFsmUnitTestStepBase::FsmInputRequest(TContextId aPdpId, TInt aOperation, TInt aParam)
-	{
-	INFO_PRINTF4(_L("CSpudUnitTestStepBase::FsmInputRequest: aPdpId = %d, aOperation = %d, aParam = %d"), aPdpId, aOperation, aParam);
-
-	// wait until iListener to finish with the iControlData member so that 2 requests
-	// immediately after one another will still work
-	User::WaitForRequest(iListener->iReadyForInputRequest);
-	iListener->iReadyForInputRequest = KRequestPending;
-
-	// set the parameters to pass to REtelDriverInput::Input
-	iListener->iFsmInputRequestData.iPdpId = aPdpId;
-	iListener->iFsmInputRequestData.iOperation = aOperation;
-	iListener->iFsmInputRequestData.iParam = aParam;
-
-	// complete iListener's status, causing its RunL to call Input on SPUDTEL
-	TRequestStatus *status = &iListener->iStatus;
-	iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EFsmInputRequest);
-	}
-
-/**
- Wait for MSpudManInterface::Input to be called with a non-notification event
-*/
-void CSpudFsmUnitTestStepBase::WaitForFsmInputResponse(TInt aPdpId, TInt aEvent, TInt aParam)
-	{
-	INFO_PRINTF4(_L("CSpudUnitTestStepBase::WaitForFsmInputResponse: aPdpId = %d, aOperation = %d, aParam = %d"), aPdpId, aEvent, aParam);
-	
-	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmInputResponseStatus request
-	User::WaitForRequest(iListener->iFsmInputResponseStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iFsmInputResponseStatus == KErrNone);
-	TEST(iListener->iFsmInputResponseData.iPdpId == aPdpId);
-	TEST(iListener->iFsmInputResponseData.iEvent == aEvent);
-	TEST(iListener->iFsmInputResponseData.iParam == aParam);
-	
-	iListener->iFsmInputResponseStatus = KRequestPending;
-	}
-
-
-TContextId CSpudFsmUnitTestStepBase::FsmObjectCreate()
-    {
-	INFO_PRINTF1(_L("CSpudUnitTestStepBase::FsmObjectCreate()"));
-
-	// wait until iListener to finish with the iControlData member so that 2 requests
-	// immediately after one another will still work
-	//
-	User::WaitForRequest(iListener->iReadyForInputRequest);
-	iListener->iReadyForInputRequest = KRequestPending;
-
-	// Set the parameters to pass to CPdpFsmFactory
-	//
-	iListener->iFsmInputRequestData.iPdpId = 0;
-
-	// complete iListener's status, causing its RunL to call Input on SPUDTEL
-	TRequestStatus *status = &iListener->iStatus;
-	iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EFsmObjectCreate);
-
-	return iListener->iFsmInputRequestData.iPdpId;
-    }
-    
-    
-TInt CSpudFsmUnitTestStepBase::WaitForFsmObjectCreateResponse(TInt aPdpId)
-    {
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForEFsmObjectCreateRespons(aPdpId = %d)"), aPdpId);
-	
-	// The Test listener will complete the iFsmObjectCreateResponse request.
-	//
-	User::WaitForRequest(iListener->iFsmObjectCreateResponse);
-	
-
-	// Make sure the parameters are as expected
-	
-	TEST(iListener->iFsmObjectCreateResponse == KErrNone);
-
-
-	iListener->iFsmObjectCreateResponse = KRequestPending;
-    return iListener->iFsmInputResponseData.iPdpId;	
-    }
-
-
-/**
- Wait for MSpudManInterface::Input to be called with aOperation KContextBlockedEvent
-*/
-void CSpudFsmUnitTestStepBase::WaitForFsmSuspendedNotification(TContextId aPdpId)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmSuspendedNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextSuspendedStatus request
-	User::WaitForRequest(iListener->iFsmContextSuspendedStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iFsmContextSuspendedStatus == KErrNone);
-	TEST(iListener->iContextBlockedEventPdpId == aPdpId);
-	
-	iListener->iFsmContextSuspendedStatus = KRequestPending;
-	}
-
-/**
- Wait for MSpudManInterface::Input to be called with aOperation KContextUnblockedEvent
-*/
-void CSpudFsmUnitTestStepBase::WaitForFsmResumedNotification(TContextId aPdpId)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForEtelDriverInputResponse: aPdpId = %d"), aPdpId);
-	
-	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextResumedStatus request
-	User::WaitForRequest(iListener->iFsmContextResumedStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iFsmContextResumedStatus == KErrNone);
-	TEST(iListener->iContextUnblockedEventPdpId == aPdpId);
-	
-	iListener->iFsmContextResumedStatus = KRequestPending;
-	}
-	
-/**
- Wait for MSpudManInterface::Input to be called with aOperation KNetworkStatusEvent
-*/
-void CSpudFsmUnitTestStepBase::WaitForFsmServiceNotificationStatus()
-	{
-	INFO_PRINTF1(_L("CSpudUnitTestStepBase::WaitForGivenFsmServiceNotificationStatus"));
-	
-	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmNetworkStatusStatus request
-	User::WaitForRequest(iListener->iFsmNetworkStatusStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iFsmNetworkStatusStatus == KErrNone);
-	// already checked iPdpId and iStatus from exiting condition of do while loop
-	
-	iListener->iFsmNetworkStatusStatus = KRequestPending;
-	}
-
-/**
- Wait for MSpudManInterface::Input to be called with aOperation KContextParametersChangeEvent
-*/
-void CSpudFsmUnitTestStepBase::WaitForFsmContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfigGPRS& aContextConfig)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmContextConfigNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextParameterChangeStatus request
-	User::WaitForRequest(iListener->iFsmContextParameterChangeStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iFsmContextParameterChangeStatus == KErrNone);
-	TEST(iListener->iContextParametersEventData.iPdpId == aPdpId);
-	TEST(CompareContextConfigGPRS(aContextConfig, iListener->iContextParametersEventData.iContextConfig));
-	
-	iListener->iFsmContextParameterChangeStatus = KRequestPending;
-	}
-
-/**
-Wait for MSpudManInterface::Input to be called with aOperation KContextParametersChangeEvent
-RPacketContext::TContextConfig_R5 overload
-*/
-void CSpudFsmUnitTestStepBase::WaitForFsmContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfig_R5& aContextConfig)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmContextConfigNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextParameterChangeStatus request
-	User::WaitForRequest(iListener->iFsmContextParameterChangeStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iFsmContextParameterChangeStatus == KErrNone);
-	TEST(iListener->iContextParametersEventData.iPdpId == aPdpId);
-	TEST(CompareContextConfigR5(aContextConfig, iListener->iContextParametersEventData.iContextConfig_R5));
-	
-	iListener->iFsmContextParameterChangeStatus = KRequestPending;
-	}
-
-/**
-Wait for MSpudManInterface::Input to be called with aOperation KContextParametersChangeEvent
-RPacketContext::TContextConfigR99_R4 overload
-*/
-void CSpudFsmUnitTestStepBase::WaitForFsmContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfigR99_R4& aContextConfig)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmContextConfigNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextParameterChangeStatus request
-	User::WaitForRequest(iListener->iFsmContextParameterChangeStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iFsmContextParameterChangeStatus == KErrNone);
-	TEST(iListener->iContextParametersEventData.iPdpId == aPdpId);
-	TEST(CompareContextConfigR99R4(aContextConfig, iListener->iContextParametersEventData.iContextConfigR99_R4));
-	
-	iListener->iFsmContextParameterChangeStatus = KRequestPending;
-	}
-
-
-/**
- Wait for MSpudManInterface::Input to be called with aOperation KContextParametersChangeEvent
-*/
-void CSpudFsmUnitTestStepBase::WaitForFsmQosChangeNotification(TContextId aPdpId, const RPacketQoS::TQoSR99_R4Negotiated& aQosParams)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmQosChangeNotification: aPdpId = %d"), aPdpId);
-	
-	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextParameterChangeStatus request
-	User::WaitForRequest(iListener->iFsmContextParameterChangeStatus);
-	
-	// make sure the parameters are as expected
-	TEST(iListener->iFsmContextParameterChangeStatus == KErrNone);
-	TEST(iListener->iContextParametersEventData.iPdpId == aPdpId);
-	TEST(CompareUMTSQoSNeg(aQosParams, iListener->iContextParametersEventData.iNegotiated.NegotiatedQoSR99_R4()));
-	
-	iListener->iFsmContextParameterChangeStatus = KRequestPending;
-	}
-
-
-/**
- Wait for context aPacketContext to have the given status
-*/
-void CSpudFsmUnitTestStepBase::WaitForGivenContextStatus(RPacketContext& aPacketContext, RPacketContext::TContextStatus aStatus)
-	{
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForGivenContextStatus: aStatus = %d"), aStatus);
-	
- 	TRequestStatus status;
-	RPacketContext::TContextStatus contextStatus = RPacketContext::EStatusUnknown;
-	RPacketContext::TContextStatus contextStatus1 = RPacketContext::EStatusUnknown;
-
-	aPacketContext.NotifyStatusChange(status, contextStatus);
-	TEST(aPacketContext.GetStatus(contextStatus1) == KErrNone);
-	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForGivenContextStatus: contextStatus1 = %d"), contextStatus1);
-	if (contextStatus1 != RPacketContext::EStatusDeleted)
-		{
-		while (contextStatus != aStatus)
-			{
-			User::WaitForRequest(status);
-			INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForGivenContextStatus: contextStatus = %d"), contextStatus);
-			TEST(status == KErrNone);
-			}
-		}
-	}
+// 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:
+// Test framework for SPUD TEL and SPUD FSM unit tests
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <e32property.h>
+#include <c32comm.h>
+#include <e32def.h>
+#include <e32std.h>
+
+#include <in_iface.h>
+#include <simtsy.h>
+
+#include "SpudUnitTestStep.h"
+#include "InputRequestListener.h"
+
+using namespace EtelDriver;
+
+CSpudUnitTestStepBase::CSpudUnitTestStepBase(TInt aTestNumber, TBool aUseTestPdpFsmInterface) : iTestNumber(aTestNumber), iUseTestPdpFsmInterface(aUseTestPdpFsmInterface)
+	{}
+
+/**
+Sets the section for the simtsy to use in its c:\config.txt file.
+The section that will be used is testX, where X is the parameter
+aTestNumber.
+
+@param aTestNumber Simtsy configuration section number, which will be
+                   set to ensure simtsy loads the correct parameters on
+                   when it is loaded.
+@leave The function leaves if the Sim.TSY test number property is not
+       defined; e.g. make sure StartC32 has been called.
+*/
+void CSpudUnitTestStepBase::SetSimTsyTestNumberL(TInt aTestNumber)
+  	{
+	User::LeaveIfError(RProperty::Set(KUidPSSimTsyCategory, KPSSimTsyTestNumber, aTestNumber));
+  	}
+
+/**
+ Initializes the test framework, including creating the thread that will run the active 
+ scheduler containing the components under test (SPUD or SPUDTEL)
+ */
+TVerdict CSpudUnitTestStepBase::doTestStepPreambleL()
+	{
+	SetSimTsyTestNumberL(iTestNumber);
+
+	// create CTestRequestListener, to be used to contain parameters to be passed
+	// between the two threads
+	switch (iTestNumber)
+		{
+		case KSimTsyTestNumberR5OrR99R4:
+#ifdef SYMBIAN_NETWORKING_UMTSR5
+			iListener = CInputRequestListener::NewL(iUseTestPdpFsmInterface, TPacketDataConfigBase::KConfigRel5);
+#else
+            iListener = CInputRequestListener::NewL(iUseTestPdpFsmInterface, TPacketDataConfigBase::KConfigRel99Rel4);
+#endif
+			break;
+		default:
+			iListener = CInputRequestListener::NewL(iUseTestPdpFsmInterface, TPacketDataConfigBase::KConfigGPRS);
+			break;
+		}
+
+	// creating and start the thread that will run the active scheduler containing SPUD or SPUDTEL
+	TActiveSchedulerThreadParams params;
+	params.iListener = iListener;
+	params.iThreadId = RThread().Id();
+ 	_LIT(activeSchedulerThreadName, "ActiveSchedulerThread_");
+ 	TBuf<255> buf(activeSchedulerThreadName);
+ 	buf.AppendNum(iTestNumber);
+ 	TInt ret = iActiveSchedulerThread.Create(buf, ActiveSchedulerThread, KDefaultStackSize, NULL, &params);
+ 	TESTEL(ret == KErrNone, ret);
+	iActiveSchedulerThread.Resume();
+	
+	// wait for the thread to initialize before sending it any requests
+	User::WaitForRequest(iListener->iThreadInitialized);
+
+	return TestStepResult();
+	}
+	
+/**
+ Cleans up anything allocated in the preamble
+ */
+TVerdict CSpudUnitTestStepBase::doTestStepPostambleL()
+	{
+	// if we complete the listener's status with an error, the RunL will stop the 
+	// active scheduler and the thread will clean up any resources and exit
+	TRequestStatus *status = &iListener->iStatus;
+	iActiveSchedulerThread.RequestComplete(status, KErrCancel);
+
+	// wait until the thread has cleaned up then kill it
+	// if the iThreadDestructed is never completed, this is probably the result of the UHEAP_MARKEND macro failing
+	User::WaitForRequest(iListener->iThreadDestructed);
+	iActiveSchedulerThread.Kill(KErrNone);
+	iActiveSchedulerThread.Close();
+	
+	delete iListener;
+	iListener = NULL;
+
+	return EPass;
+	}
+	
+/**
+ Initializes the packet service to query current parameters
+*/
+void CSpudUnitTestStepBase::InitPhoneAndPacketServiceL()
+	{
+	TESTL(iTelServer.Connect() == KErrNone);
+	TESTL(iTelServer.LoadPhoneModule( _L("SIM") ) == KErrNone);
+	TESTL(iPhone.Open ( iTelServer, _L("SimulatorPhone") ) == KErrNone);
+	TESTL(iPacketService.Open(iPhone) == KErrNone);
+	}
+	
+void CSpudUnitTestStepBase::DestroyPhoneAndPacketService()
+	{
+	iPacketService.Close();
+	iPhone.Close();
+	iTelServer.Close();
+	}
+
+// Set up to not use Test PdpFsmInterface (and use the spud fsm's RPdpFsmInterface)
+CSpudFsmUnitTestStepBase::CSpudFsmUnitTestStepBase(TInt aTestNumber) : CSpudUnitTestStepBase(aTestNumber, EFalse)
+	{}
+	
+// Set up to use Test PdpFsmInterface
+CSpudTelUnitTestStepBase::CSpudTelUnitTestStepBase(TInt aTestNumber) : CSpudUnitTestStepBase(aTestNumber, ETrue)
+	{}
+
+/**
+ Must be called after simtsy has been initialized.
+ Instructs the simtsy to complete a given request/notification. The supported commands are given in TEtelRequestType.
+ The parameter supplied in aNewValue instructs the simtsy what data from the config.txt to use in the completion of the request.
+ The aNewValue is the index to the entry to be used to complete the request for the current test step section, ie if aNewValue
+ is 0, iTestNumber is 3, and aEtelCommand is ENetworkQoSChange, the entry will complete any NotifyNetworkQoSChange calls
+ with data from the first QosProfileReqR99 entry of section [test3] in the config.txt file
+*/
+void CSpudUnitTestStepBase::EtelRequest(TEtelRequestType aEtelCommand, TInt aNewValue)
+	{
+	INFO_PRINTF3(_L("CSpudUnitTestStepBase::EtelRequest: aEtelCommand = %d, aNewValue = %d"), aEtelCommand, aNewValue);
+
+	TUint key(0);
+	
+	switch (aEtelCommand)
+		{
+	case ENetworkQoSChange:
+		key = KPSSimTsyNetworkQoSChange;
+		break;
+	case ENetworkChangeRegStatus:
+		key = KPSSimtsyPacketServiceNtwkRegStatusChange;
+		break;
+	case EContextStatusChange:
+		key = KPSSimtsyPacketContextStatusChange;
+		break;
+	default:
+		// log error
+		return;
+		}
+
+  	// simtsy will listen for any changes to the property, and complete the corresponding request
+	TInt ret = RProperty::Set(KUidPSSimTsyCategory, key, aNewValue);
+	TEST(ret == KErrNone);
+	}
+
+/**
+ Calling this will instruct the CTestRequestListener to call REtelDriverInput::CancelPdpNotifications on SPUDTEL
+*/
+void CSpudTelUnitTestStepBase::CancelPdpRequest(TContextId aPdpId)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::EtelDriverCancelPdpRequest: aPdpId = %d"), aPdpId);
+	// wait until iListener to finish with the iControlData member so that 2 requests
+	// immediately after one another will still work
+	User::WaitForRequest(iListener->iReadyForInputRequest);
+	iListener->iReadyForInputRequest = KRequestPending;
+
+	// set the parameters to pass to REtelDriverInput::Input
+	iListener->iEtelDriverCancelRequestPdpId = aPdpId;
+
+	// complete iListener's status, causing its RunL to call CancelPdp on SPUDTEL
+	TRequestStatus *status = &iListener->iStatus;
+	iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EEtelDriverCancelPdpRequest);
+	}
+
+/**
+ Calling this will instruct the CTestRequestListener to call REtelDriverInput::Input on SPUDTEL
+*/
+void CSpudTelUnitTestStepBase::EtelDriverInputRequest(TContextId aPdpId, TEtelInput aOperation)
+	{
+	INFO_PRINTF3(_L("CSpudUnitTestStepBase::EtelDriverInputRequest: aPdpId = %d, aOperation = %d"), aPdpId, aOperation);
+	// wait until iListener to finish with the iControlData member so that 2 requests
+	// immediately after one another will still work
+	User::WaitForRequest(iListener->iReadyForInputRequest);
+	iListener->iReadyForInputRequest = KRequestPending;
+
+	// set the parameters to pass to REtelDriverInput::Input
+	iListener->iEtelDriverInputRequestData.iPdpId = aPdpId;
+	iListener->iEtelDriverInputRequestData.iOperation = aOperation;
+
+	// complete iListener's status, causing its RunL to call Input on SPUDTEL
+	TRequestStatus *status = &iListener->iStatus;
+	iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EEtelDriverInputRequest);
+	}
+
+/**
+ Wait for RPdpFsmInterface::Input to be called with a non-notification event
+*/
+void CSpudTelUnitTestStepBase::WaitForEtelDriverInputResponse(TContextId aPdpId, PdpFsm::TEtelSignal aSignal, TInt aError)
+	{
+	INFO_PRINTF3(_L("CSpudUnitTestStepBase::WaitForEtelDriverInputResponse: aPdpId = %d, aSignal = %d"), aPdpId, aSignal);
+	
+	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverInputResponseStatus request
+	User::WaitForRequest(iListener->iEtelDriverInputResponseStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iEtelDriverInputResponseStatus == aError);
+	TEST(iListener->iEtelDriverInputResponseData.iPdpId == aPdpId);
+	TEST(iListener->iEtelDriverInputResponseData.iSignal == aSignal);
+	
+	iListener->iEtelDriverInputResponseStatus = KRequestPending;
+	}
+	
+/**
+ Wait for RPdpFsmInterface::Input to be called with aOperation EConfigGPRSChangeNetwork
+*/
+void CSpudTelUnitTestStepBase::WaitForNextContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfigGPRS& aContextConfigGPRS)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverConfigGPRSNotificationStatus request
+	User::WaitForRequest(iListener->iEtelDriverConfigGPRSNotificationStatus);
+	
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: iListener->iNotifyContextConfigData.iPdpId = %d"), iListener->iNotifyContextConfigData.iPdpId);
+	// make sure the parameters are as expected
+	TEST(iListener->iEtelDriverConfigGPRSNotificationStatus == KErrNone);
+	TEST(iListener->iNotifyContextConfigData.iPdpId == aPdpId);
+	TEST(CompareContextConfigGPRS(iListener->iNotifyContextConfigData.iContextConfigGPRS, aContextConfigGPRS));
+	
+	iListener->iEtelDriverConfigGPRSNotificationStatus = KRequestPending;
+	}
+
+/**
+ Wait for RPdpFsmInterface::Input to be called with aOperation EConfigGPRSChangeNetwork
+ RPacketContext::TContextConfig_R5 overload
+*/
+void CSpudTelUnitTestStepBase::WaitForNextContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfig_R5& aContextConfigR5)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverConfigGPRSNotificationStatus request
+	User::WaitForRequest(iListener->iEtelDriverConfigGPRSNotificationStatus);
+	
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: iListener->iNotifyContextConfigData.iPdpId = %d"), iListener->iNotifyContextConfigData.iPdpId);
+	// make sure the parameters are as expected
+	TEST(iListener->iEtelDriverConfigGPRSNotificationStatus == KErrNone);
+	TEST(iListener->iNotifyContextConfigData.iPdpId == aPdpId);
+	TEST(CompareContextConfigR5(iListener->iNotifyContextConfigData.iContextConfig_R5, aContextConfigR5));
+	
+	iListener->iEtelDriverConfigGPRSNotificationStatus = KRequestPending;
+	}
+
+/**
+ Wait for RPdpFsmInterface::Input to be called with aOperation EConfigGPRSChangeNetwork
+ RPacketContext::TContextConfigR99_R4 overload
+*/
+void CSpudTelUnitTestStepBase::WaitForNextContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfigR99_R4& aContextConfigR99R4)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverConfigGPRSNotificationStatus request
+	User::WaitForRequest(iListener->iEtelDriverConfigGPRSNotificationStatus);
+	
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextContextConfigNotification: iListener->iNotifyContextConfigData.iPdpId = %d"), iListener->iNotifyContextConfigData.iPdpId);
+	// make sure the parameters are as expected
+	TEST(iListener->iEtelDriverConfigGPRSNotificationStatus == KErrNone);
+	TEST(iListener->iNotifyContextConfigData.iPdpId == aPdpId);
+	TEST(CompareContextConfigR99R4(iListener->iNotifyContextConfigData.iContextConfigR99_R4, aContextConfigR99R4));
+	
+	iListener->iEtelDriverConfigGPRSNotificationStatus = KRequestPending;
+	}
+
+
+/**
+ Wait for RPdpFsmInterface::Input to be called with aOperation EContextStatusChangeNetwork
+*/
+void CSpudTelUnitTestStepBase::WaitForGivenEtelContextStatusNotification(TContextId aPdpId, RPacketContext::TContextStatus aContextStatus)
+	{
+	INFO_PRINTF3(_L("CSpudUnitTestStepBase::WaitForGivenContextStatusNotification: aPdpId = %d, aContextStatus = %d"), aPdpId, aContextStatus);
+	
+	do
+		{
+	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverContextStatusNotificationStatus request
+		User::WaitForRequest(iListener->iEtelDriverContextStatusNotificationStatus);
+		
+		INFO_PRINTF3(_L("CSpudUnitTestStepBase::WaitForGivenContextStatusNotification: iPdpId = %d, iContextStatus = %d"), iListener->iNotifyContextConfigData.iPdpId, iListener->iNotifyContextStatusData.iContextStatus);
+		} while (iListener->iNotifyContextStatusData.iPdpId != aPdpId || iListener->iNotifyContextStatusData.iContextStatus != aContextStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iEtelDriverContextStatusNotificationStatus == KErrNone);
+	TEST(iListener->iNotifyContextStatusData.iPdpId == aPdpId);
+	TEST(iListener->iNotifyContextStatusData.iContextStatus == aContextStatus);
+	
+	iListener->iEtelDriverContextStatusNotificationStatus = KRequestPending;
+	}
+
+/**
+ Wait for RPdpFsmInterface::Input to be called with aOperation EQoSProfileChangeNetwork
+*/
+void CSpudTelUnitTestStepBase::WaitForNextQosNotification(TContextId aPdpId, const RPacketQoS::TQoSR99_R4Negotiated& aQoSR99_R4Negotiated)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextQosNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverQosNotificationStatus request
+	User::WaitForRequest(iListener->iEtelDriverQosNotificationStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iEtelDriverQosNotificationStatus == KErrNone);
+	TEST(iListener->iNotifyQosNegotiatedData.iPdpId == aPdpId);
+	TEST(CompareUMTSQoSNeg(iListener->iNotifyQosNegotiatedData.iNegotiated.NegotiatedQoSR99_R4(), aQoSR99_R4Negotiated));
+	iListener->iEtelDriverQosNotificationStatus = KRequestPending;
+	}
+
+
+/**
+ Wait for RPdpFsmInterface::Input to be called with aOperation EServiceStatusChangeNetwork
+*/
+void CSpudTelUnitTestStepBase::WaitForNextServiceNotificationStatus(RPacketService::TStatus aServiceStatus)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextServiceNotificationStatus: aServiceStatus = %d"), aServiceStatus);
+	
+	// the implementation of RPdpFsmInterface::Input that is called by the Etel driver will complete the iEtelDriverServiceNotificationStatus request
+	User::WaitForRequest(iListener->iEtelDriverServiceNotificationStatus);
+	
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForNextServiceNotificationStatus: aServiceStatus = %d"), aServiceStatus);
+	// make sure the parameters are as expected
+	TEST(iListener->iEtelDriverServiceNotificationStatus == KErrNone);
+	TEST(iListener->iPacketServiceStatus == aServiceStatus);
+	
+	iListener->iEtelDriverServiceNotificationStatus = KRequestPending;
+	}
+
+/**
+ Calling this will instruct the CTestRequestListener to call REtelDriverInput::Input on SPUDTEL
+*/
+void CSpudFsmUnitTestStepBase::FsmInputRequest(TContextId aPdpId, TInt aOperation, TInt aParam)
+	{
+	INFO_PRINTF4(_L("CSpudUnitTestStepBase::FsmInputRequest: aPdpId = %d, aOperation = %d, aParam = %d"), aPdpId, aOperation, aParam);
+
+	// wait until iListener to finish with the iControlData member so that 2 requests
+	// immediately after one another will still work
+	User::WaitForRequest(iListener->iReadyForInputRequest);
+	iListener->iReadyForInputRequest = KRequestPending;
+
+	// set the parameters to pass to REtelDriverInput::Input
+	iListener->iFsmInputRequestData.iPdpId = aPdpId;
+	iListener->iFsmInputRequestData.iOperation = aOperation;
+	iListener->iFsmInputRequestData.iParam = aParam;
+
+	// complete iListener's status, causing its RunL to call Input on SPUDTEL
+	TRequestStatus *status = &iListener->iStatus;
+	iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EFsmInputRequest);
+	}
+
+/**
+ Wait for MSpudManInterface::Input to be called with a non-notification event
+*/
+void CSpudFsmUnitTestStepBase::WaitForFsmInputResponse(TInt aPdpId, TInt aEvent, TInt aParam)
+	{
+	INFO_PRINTF4(_L("CSpudUnitTestStepBase::WaitForFsmInputResponse: aPdpId = %d, aOperation = %d, aParam = %d"), aPdpId, aEvent, aParam);
+	
+	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmInputResponseStatus request
+	User::WaitForRequest(iListener->iFsmInputResponseStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iFsmInputResponseStatus == KErrNone);
+	TEST(iListener->iFsmInputResponseData.iPdpId == aPdpId);
+	TEST(iListener->iFsmInputResponseData.iEvent == aEvent);
+	TEST(iListener->iFsmInputResponseData.iParam == aParam);
+	
+	iListener->iFsmInputResponseStatus = KRequestPending;
+	}
+
+
+TContextId CSpudFsmUnitTestStepBase::FsmObjectCreate()
+    {
+	INFO_PRINTF1(_L("CSpudUnitTestStepBase::FsmObjectCreate()"));
+
+	// wait until iListener to finish with the iControlData member so that 2 requests
+	// immediately after one another will still work
+	//
+	User::WaitForRequest(iListener->iReadyForInputRequest);
+	iListener->iReadyForInputRequest = KRequestPending;
+
+	// Set the parameters to pass to CPdpFsmFactory
+	//
+	iListener->iFsmInputRequestData.iPdpId = 0;
+
+	// complete iListener's status, causing its RunL to call Input on SPUDTEL
+	TRequestStatus *status = &iListener->iStatus;
+	iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EFsmObjectCreate);
+
+	return iListener->iFsmInputRequestData.iPdpId;
+    }
+    
+    
+TInt CSpudFsmUnitTestStepBase::WaitForFsmObjectCreateResponse(TInt aPdpId)
+    {
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForEFsmObjectCreateRespons(aPdpId = %d)"), aPdpId);
+	
+	// The Test listener will complete the iFsmObjectCreateResponse request.
+	//
+	User::WaitForRequest(iListener->iFsmObjectCreateResponse);
+	
+
+	// Make sure the parameters are as expected
+	
+	TEST(iListener->iFsmObjectCreateResponse == KErrNone);
+
+
+	iListener->iFsmObjectCreateResponse = KRequestPending;
+    return iListener->iFsmInputResponseData.iPdpId;	
+    }
+
+
+/**
+ Wait for MSpudManInterface::Input to be called with aOperation KContextBlockedEvent
+*/
+void CSpudFsmUnitTestStepBase::WaitForFsmSuspendedNotification(TContextId aPdpId)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmSuspendedNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextSuspendedStatus request
+	User::WaitForRequest(iListener->iFsmContextSuspendedStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iFsmContextSuspendedStatus == KErrNone);
+	TEST(iListener->iContextBlockedEventPdpId == aPdpId);
+	
+	iListener->iFsmContextSuspendedStatus = KRequestPending;
+	}
+
+/**
+ Wait for MSpudManInterface::Input to be called with aOperation KContextUnblockedEvent
+*/
+void CSpudFsmUnitTestStepBase::WaitForFsmResumedNotification(TContextId aPdpId)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForEtelDriverInputResponse: aPdpId = %d"), aPdpId);
+	
+	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextResumedStatus request
+	User::WaitForRequest(iListener->iFsmContextResumedStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iFsmContextResumedStatus == KErrNone);
+	TEST(iListener->iContextUnblockedEventPdpId == aPdpId);
+	
+	iListener->iFsmContextResumedStatus = KRequestPending;
+	}
+	
+/**
+ Wait for MSpudManInterface::Input to be called with aOperation KNetworkStatusEvent
+*/
+void CSpudFsmUnitTestStepBase::WaitForFsmServiceNotificationStatus()
+	{
+	INFO_PRINTF1(_L("CSpudUnitTestStepBase::WaitForGivenFsmServiceNotificationStatus"));
+	
+	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmNetworkStatusStatus request
+	User::WaitForRequest(iListener->iFsmNetworkStatusStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iFsmNetworkStatusStatus == KErrNone);
+	// already checked iPdpId and iStatus from exiting condition of do while loop
+	
+	iListener->iFsmNetworkStatusStatus = KRequestPending;
+	}
+
+/**
+ Wait for MSpudManInterface::Input to be called with aOperation KContextParametersChangeEvent
+*/
+void CSpudFsmUnitTestStepBase::WaitForFsmContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfigGPRS& aContextConfig)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmContextConfigNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextParameterChangeStatus request
+	User::WaitForRequest(iListener->iFsmContextParameterChangeStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iFsmContextParameterChangeStatus == KErrNone);
+	TEST(iListener->iContextParametersEventData.iPdpId == aPdpId);
+	TEST(CompareContextConfigGPRS(aContextConfig, iListener->iContextParametersEventData.iContextConfig));
+	
+	iListener->iFsmContextParameterChangeStatus = KRequestPending;
+	}
+
+/**
+Wait for MSpudManInterface::Input to be called with aOperation KContextParametersChangeEvent
+RPacketContext::TContextConfig_R5 overload
+*/
+void CSpudFsmUnitTestStepBase::WaitForFsmContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfig_R5& aContextConfig)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmContextConfigNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextParameterChangeStatus request
+	User::WaitForRequest(iListener->iFsmContextParameterChangeStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iFsmContextParameterChangeStatus == KErrNone);
+	TEST(iListener->iContextParametersEventData.iPdpId == aPdpId);
+	TEST(CompareContextConfigR5(aContextConfig, iListener->iContextParametersEventData.iContextConfig_R5));
+	
+	iListener->iFsmContextParameterChangeStatus = KRequestPending;
+	}
+
+/**
+Wait for MSpudManInterface::Input to be called with aOperation KContextParametersChangeEvent
+RPacketContext::TContextConfigR99_R4 overload
+*/
+void CSpudFsmUnitTestStepBase::WaitForFsmContextConfigNotification(TContextId aPdpId, const RPacketContext::TContextConfigR99_R4& aContextConfig)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmContextConfigNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextParameterChangeStatus request
+	User::WaitForRequest(iListener->iFsmContextParameterChangeStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iFsmContextParameterChangeStatus == KErrNone);
+	TEST(iListener->iContextParametersEventData.iPdpId == aPdpId);
+	TEST(CompareContextConfigR99R4(aContextConfig, iListener->iContextParametersEventData.iContextConfigR99_R4));
+	
+	iListener->iFsmContextParameterChangeStatus = KRequestPending;
+	}
+
+
+/**
+ Wait for MSpudManInterface::Input to be called with aOperation KContextParametersChangeEvent
+*/
+void CSpudFsmUnitTestStepBase::WaitForFsmQosChangeNotification(TContextId aPdpId, const RPacketQoS::TQoSR99_R4Negotiated& aQosParams)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForFsmQosChangeNotification: aPdpId = %d"), aPdpId);
+	
+	// the implementation of MSpudManInterface::Input that is called by the Etel driver will complete the iFsmContextParameterChangeStatus request
+	User::WaitForRequest(iListener->iFsmContextParameterChangeStatus);
+	
+	// make sure the parameters are as expected
+	TEST(iListener->iFsmContextParameterChangeStatus == KErrNone);
+	TEST(iListener->iContextParametersEventData.iPdpId == aPdpId);
+	TEST(CompareUMTSQoSNeg(aQosParams, iListener->iContextParametersEventData.iNegotiated.NegotiatedQoSR99_R4()));
+	
+	iListener->iFsmContextParameterChangeStatus = KRequestPending;
+	}
+
+
+/**
+ Wait for context aPacketContext to have the given status
+*/
+void CSpudFsmUnitTestStepBase::WaitForGivenContextStatus(RPacketContext& aPacketContext, RPacketContext::TContextStatus aStatus)
+	{
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForGivenContextStatus: aStatus = %d"), aStatus);
+	
+ 	TRequestStatus status;
+	RPacketContext::TContextStatus contextStatus = RPacketContext::EStatusUnknown;
+	RPacketContext::TContextStatus contextStatus1 = RPacketContext::EStatusUnknown;
+
+	aPacketContext.NotifyStatusChange(status, contextStatus);
+	TEST(aPacketContext.GetStatus(contextStatus1) == KErrNone);
+	INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForGivenContextStatus: contextStatus1 = %d"), contextStatus1);
+	if (contextStatus1 != RPacketContext::EStatusDeleted)
+		{
+		while (contextStatus != aStatus)
+			{
+			User::WaitForRequest(status);
+			INFO_PRINTF2(_L("CSpudUnitTestStepBase::WaitForGivenContextStatus: contextStatus = %d"), contextStatus);
+			TEST(status == KErrNone);
+			}
+		}
+	}