--- a/telephonyprotocols/umtsgprsscpr/Test/te_spud/src/SpudUnitTestStepBase.cpp Thu Jul 29 12:12:57 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,496 +0,0 @@
-// 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
- iListener = CInputRequestListener::NewL(iUseTestPdpFsmInterface);
-
- // 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, ¶ms);
- 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 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;
- }
-
-
-void CSpudFsmUnitTestStepBase::FsmObjectCreate(TContextId aPdpId)
- {
- INFO_PRINTF2(_L("CSpudUnitTestStepBase::FsmObjectCreate(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 CPdpFsmFactory
- //
- iListener->iFsmInputRequestData.iPdpId = aPdpId;
-
- // complete iListener's status, causing its RunL to call Input on SPUDTEL
- TRequestStatus *status = &iListener->iStatus;
- iActiveSchedulerThread.RequestComplete(status, CInputRequestListener::EFsmObjectCreate);
- }
-
-
-void 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);
-
-
- TEST(iListener->iFsmInputResponseData.iPdpId == aPdpId);
-
- iListener->iFsmObjectCreateResponse = KRequestPending;
-
- }
-
-
-/**
- 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
-*/
-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);
- aPacketContext.GetStatus(contextStatus1);
- 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);
- }
- }
- }