// Copyright (c) 2008-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:
//
/**
@file base class for SAT component tests
*/
#include <ctsy/ltsy/mltsydispatchphoneinterface.h>
#include <ctsy/ltsy/mltsydispatchsecurityinterface.h>
#include <ctsy/ltsy/mltsydispatchsiminterface.h>
#include <ctsy/ltsy/mltsydispatchcallcontrolinterface.h>
#include <pcktcs.h>
#include <ctsy/mmtsy_names.h>
#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
#include <test/tmockltsydata.h>
#include <ctsy/serviceapi/gsmerror.h>
#include <ctsy/serviceapi/cmmutility.h>
#include <test/mockltsyindicatorids.h>
#include <ctsy/ltsy/mltsydispatchsatinterface.h>
#include <ctsy/ltsy/mltsydispatchphonebookinterface.h> //for KLtsyDispatchPhonebookSmsStoreWriteEntryApiId
#include <cstktsy/ttlv.h>
#include <charconv.h>
#include "ccsatcomponenttestbase.h"
_LIT(KDoubleColon, "::");
_LIT(KMmTsyWithDispatcherModuleName, "phonetsywithdispatcher");
/**
To push a CleanupItem ont the cleanupstack to close the phone
*/
void CCSatComponentTestBase::Cleanup(TAny* self)
{
static_cast<CCSatComponentTestBase*>(self)->DoCleanup();
}
/**
Close the Phone a the server connection
*/
void CCSatComponentTestBase::DoCleanup()
{
iSms.Close();
iSat.Close();
iPhone.Close();
iMockLTSY.Close();
TInt ret = iTelServer.UnloadPhoneModule(KMmTsyWithDispatcherModuleName);
if (ret != KErrNone)
{
INFO_PRINTF1(_L("Failed to unload phone module"));
}
iTelServer.Close();
}
/**
Assert MockLtsy Terminated all handlings without errors
*/
void CCSatComponentTestBase::AssertMockLtsyStatusL()
{
TBool hasWaitingExpect;
TBool hasPendingComplete;
TBool hasError;
iMockLTSY.GetStatus(hasWaitingExpect,hasPendingComplete,hasError);
if (hasWaitingExpect || hasPendingComplete)
{
ERR_PRINTF1(_L("MockLTsy still have pending/waiting events!"));
}
if (hasWaitingExpect || hasPendingComplete || hasError)
{
TBuf<255> log;
do {
iMockLTSY.GetNextLogLine(log);
INFO_PRINTF1(log);
}
while(log.Length() > 0);
User::Leave(KErrTEFUnitFail); // Fail the test
}
}
/**
Open Server session
*/
void CCSatComponentTestBase::OpenEtelServerL(TExtendedErrorClient aSetExtendedErrorClient)
{
TInt ret = iTelServer.Connect();
if (ret != KErrNone)
{
INFO_PRINTF1(_L("Failed connect phone"));
User::Leave(ret);
}
ret = iTelServer.LoadPhoneModule(KMmTsyWithDispatcherModuleName);
if (ret != KErrNone)
{
INFO_PRINTF1(_L("Failed load phone module"));
iTelServer.Close();
User::Leave(ret);
}
if(aSetExtendedErrorClient == EUseExtendedError)
{
iTelServer.SetExtendedErrorGranularity( RTelServer::EErrorExtended );
}
}
/**
Standard function to open the phone up to the end of the boot sequence
*/
void CCSatComponentTestBase::OpenPhoneL()
{
RBuf8 data;
CleanupClosePushL(data);
TInt err = iPhone.Open(iTelServer,KMmTsyPhoneName);
ASSERT_EQUALS(KErrNone, err);
//open SMS messaging session
err = iSms.Open(iPhone);
ASSERT_EQUALS(KErrNone, err);
TRequestStatus modemDetectedStatus;
RPhone::TModemDetection modemDetection;
iPhone.NotifyModemDetected(modemDetectedStatus,modemDetection);
err=iMockLTSY.Connect();
ASSERT_EQUALS(KErrNone, err);
TRequestStatus mockLtsyStatus;
iMockLTSY.NotifyTerminated(mockLtsyStatus);
TRfStateInfo rfstatus = ERfsStateInfoNormal;
TMockLtsyData1<TRfStateInfo> rfstatdata(rfstatus);
rfstatdata.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneBootNotifyModemStatusReady::KLtsyDispatchPhoneBootNotifyModemStatusReadyApiId,KErrNone, data, 1);
// EMobilePhoneGetNetworkRegistrationStatus
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetNetworkRegistrationStatus::KLtsyDispatchPhoneGetNetworkRegistrationStatusApiId);
RMobilePhone::TMobilePhoneRegistrationStatus regStatus = RMobilePhone::ERegisteredOnHomeNetwork;
TMockLtsyData1<RMobilePhone::TMobilePhoneRegistrationStatus> retNetRegStatusData(regStatus);
data.Close();
retNetRegStatusData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetNetworkRegistrationStatus::KLtsyDispatchPhoneGetNetworkRegistrationStatusApiId,KErrNone,data, 0);
// EMmTsyBootNotifySimStatusReadyIPC
iMockLTSY.ExpectL(MLtsyDispatchPhoneBootNotifySimStatusReady::KLtsyDispatchPhoneBootNotifySimStatusReadyApiId);
iMockLTSY.CompleteL(MLtsyDispatchPhoneBootNotifySimStatusReady::KLtsyDispatchPhoneBootNotifySimStatusReadyApiId,KErrNone,0);
// Prepare MockLtsy for the internal getters of the network information
DriverPrepInternalGettersMockLtsyL();
// EMobilePhoneGetHomeNetwork
data.Close();
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetHomeNetwork::KLtsyDispatchPhoneGetHomeNetworkApiId);
RMobilePhone::TMobilePhoneNetworkInfoV5 homeNetwork;
homeNetwork.iMode = RMobilePhone::ENetworkModeWcdma;
homeNetwork.iStatus = RMobilePhone::ENetworkStatusCurrent;
homeNetwork.iBandInfo = RMobilePhone::EBandUnknown;
homeNetwork.iCountryCode = _L("234");
homeNetwork.iCdmaSID = _L("");
homeNetwork.iAnalogSID = _L("");
homeNetwork.iNetworkId = _L("23499");
homeNetwork.iDisplayTag = _L("symbian");
homeNetwork.iShortName = _L("symbian");
homeNetwork.iLongName = _L("symbian mobile");
homeNetwork.iAccess = RMobilePhone::ENetworkAccessUtran;
homeNetwork.iEgprsAvailableIndicator = ETrue;
homeNetwork.iHsdpaAvailableIndicator = ETrue;
TMockLtsyData1<RMobilePhone::TMobilePhoneNetworkInfoV5> homeNetworkData(homeNetwork);
homeNetworkData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetHomeNetwork::KLtsyDispatchPhoneGetHomeNetworkApiId,KErrNone,data,0);
// EMmTsySecurityGetPin1DisableSupportedIPC
iMockLTSY.ExpectL(MLtsyDispatchSecurityGetPin1DisableSupported::KLtsyDispatchSecurityGetPin1DisableSupportedApiId);
TBool pin1DisableSupport = ETrue;
TMockLtsyData1<TBool> pin1DisableSupportData(pin1DisableSupport);
data.Close();
pin1DisableSupportData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchSecurityGetPin1DisableSupported::KLtsyDispatchSecurityGetPin1DisableSupportedApiId,KErrNone,data,0);
//EMmTsySimRefreshRegisterIPC
TUint16 refreshFileList = KCacheAdn | KCacheFdn | KCacheServiceTable | KCacheALSline;
TMockLtsyData1<TUint16> refreshFileListData(refreshFileList);
data.Close();
refreshFileListData.SerialiseL(data);
iMockLTSY.ExpectL(MLtsyDispatchPhoneSimRefreshRegister::KLtsyDispatchPhoneSimRefreshRegisterApiId,data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneSimRefreshRegister::KLtsyDispatchPhoneSimRefreshRegisterApiId,KErrNone);
//EMobilePhoneGetServiceTable
RMobilePhone::TMobilePhoneServiceTable serviceTable = RMobilePhone::ESIMServiceTable;
TMockLtsyData1<RMobilePhone::TMobilePhoneServiceTable> serviceTableData(serviceTable);
data.Close();
serviceTableData.SerialiseL(data);
iMockLTSY.ExpectL(MLtsyDispatchSimGetServiceTable::KLtsyDispatchSimGetServiceTableApiId, data);
RMobilePhone::TMobilePhoneServiceTableV1 simServiceTable;
simServiceTable.iServices1To8 = 0xFF;
simServiceTable.iServices9To16 = 0xFF;
simServiceTable.iServices17To24= 0xFF;
simServiceTable.iServices25To32= 0xFF;
simServiceTable.iServices33To40= 0xFF;
simServiceTable.iServices41To48= 0xFF;
simServiceTable.iServices49To56= 0xFF;
TMockLtsyData1<RMobilePhone::TMobilePhoneServiceTableV1> serviceTableResultData(simServiceTable);
data.Close();
serviceTableResultData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchSimGetServiceTable::KLtsyDispatchSimGetServiceTableApiId,KErrNone,data);
// EMobilePhoneGetALSLine
iMockLTSY.ExpectL(MLtsyDispatchCallControlGetActiveAlsLine::KLtsyDispatchCallControlGetActiveAlsLineApiId);
RMobilePhone::TMobilePhoneALSLine alsLine = RMobilePhone::EAlternateLinePrimary;
TMockLtsyData1<RMobilePhone::TMobilePhoneALSLine> alsLineData(alsLine);
data.Close();
alsLineData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchCallControlGetActiveAlsLine::KLtsyDispatchCallControlGetActiveAlsLineApiId,KErrNone,data,0);
// ECustomGetIccCallForwardingStatusIPC
iMockLTSY.ExpectL(MLtsyDispatchCallControlGetCallForwardingIndicator::KLtsyDispatchCallControlGetCallForwardingIndicatorApiId);
RMobilePhone::TMobilePhoneCFUIndicatorV6 indicator;
indicator.iMultipleSubscriberProfileID = RMobilePhone::KProfileIdentityTwo;
indicator.iIndicator = RMobilePhone::KCFUIndicatorVoice;
indicator.iCFNumber.iNumberPlan = RMobilePhone::ETelexNumberPlan;
indicator.iCFNumber.iTypeOfNumber = RMobilePhone::ENationalNumber;
_LIT(KTelNumber, "012345678");
indicator.iCFNumber.iTelNumber = KTelNumber;
TMockLtsyData1<RMobilePhone::TMobilePhoneCFUIndicatorV6> indicatorData(indicator);
data.Close();
indicatorData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchCallControlGetCallForwardingIndicator::KLtsyDispatchCallControlGetCallForwardingIndicatorApiId,KErrNone,data,0);
// EMobilePhoneGetIccMessageWaitingIndicators
iMockLTSY.ExpectL(MLtsyDispatchSimGetIccMessageWaitingIndicators::KLtsyDispatchSimGetIccMessageWaitingIndicatorsApiId);
RMobilePhone::TMobilePhoneMessageWaitingV1 expectedMessageIndicators;
TMockLtsyData1<RMobilePhone::TMobilePhoneMessageWaitingV1>
indicatorsData(expectedMessageIndicators);
data.Close();
indicatorsData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchSimGetIccMessageWaitingIndicators::KLtsyDispatchSimGetIccMessageWaitingIndicatorsApiId, KErrNone, data);
iMockLTSY.ExpectL(MLtsyDispatchCallControlGetAlsPpSupport::KLtsyDispatchCallControlGetAlsPpSupportApiId);
RMmCustomAPI::TAlsSupport alsSupport = RMmCustomAPI::EAlsSupportOff;
TMockLtsyData1<RMmCustomAPI::TAlsSupport> alsLtsyData1(alsSupport);
data.Close();
alsLtsyData1.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchCallControlGetAlsPpSupport::KLtsyDispatchCallControlGetAlsPpSupportApiId, KErrNone, data);
iMockLTSY.ExpectL(MLtsyDispatchSimGetCustomerServiceProfile::KLtsyDispatchSimGetCustomerServiceProfileApiId);
// Prepare data for the mockLtsy's CompleteL
RMobilePhone::TMobilePhoneCspFileV1 cspComp;
cspComp.iCallOfferingServices = 0x01;
cspComp.iCallRestrictionServices = 0x02;
cspComp.iOtherSuppServices = 0x03;
cspComp.iCallCompletionServices = 0x04;
cspComp.iTeleservices = 0x05;
cspComp.iCphsTeleservices = 0x06;
cspComp.iCphsFeatures = 0x07;
cspComp.iNumberIdentServices = 0x08;
cspComp.iPhase2PlusServices = 0x09;
cspComp.iValueAddedServices = 0x0A;
TMockLtsyData1<RMobilePhone::TMobilePhoneCspFileV1> cspCompData(cspComp);
data.Close();
cspCompData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchSimGetCustomerServiceProfile::KLtsyDispatchSimGetCustomerServiceProfileApiId, KErrNone, data);
User::WaitForRequest(mockLtsyStatus);
AssertMockLtsyStatusL();
CleanupStack::PopAndDestroy(1); // data
}
/**
Sends ExpectL and CompleteL commands to MockLtsy for getters of various network information.
These getters are internal to the CtsyDispatcher.
This method should be called immediately after the CompleteL for KLtsyDispatchPhoneBootNotifyModemStatusReadyApiId,
since these getters are triggered on the CtsyDispacther receiving a BootNotifyModemStatusReady indication.
*/
void CCSatComponentTestBase::DriverPrepInternalGettersMockLtsyL()
{
RBuf8 data;
CleanupClosePushL(data);
//
// Prepare MockLtsy for processing a getter for CurrentNetworkInfo
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetCurrentNetworkInfo::KLtsyDispatchPhoneGetCurrentNetworkInfoApiId);
// Prepare the KLtsyDispatchPhoneGetCurrentNetworkInfoApiId data for CompleteL
RMobilePhone::TMobilePhoneNetworkInfoV5 networkInfoComplete;
// V5
networkInfoComplete.iEgprsAvailableIndicator = KEgprsAvailable;
networkInfoComplete.iHsdpaAvailableIndicator = KHsdpaAvailable;
// V2
networkInfoComplete.iAccess = KAccess;
// V1
networkInfoComplete.iMode = KMode;
networkInfoComplete.iStatus = KStatus;
networkInfoComplete.iBandInfo = KBandInfo;
networkInfoComplete.iCountryCode = KCountryCode;
networkInfoComplete.iCdmaSID = KCdmaSID;
networkInfoComplete.iAnalogSID = KAnalogSID;
networkInfoComplete.iNetworkId = KNetworkId;
networkInfoComplete.iDisplayTag = KDisplayTag;
networkInfoComplete.iShortName = KShortName;
networkInfoComplete.iLongName = KLongName;
RMobilePhone::TMobilePhoneLocationAreaV1 locationAreaComplete;
locationAreaComplete.iAreaKnown = KAreaKnown;
locationAreaComplete.iLocationAreaCode = KLocationAreaCode;
locationAreaComplete.iCellId = KCellId;
TMockLtsyData2<RMobilePhone::TMobilePhoneNetworkInfoV5,
RMobilePhone::TMobilePhoneLocationAreaV1> mockCNCData2(networkInfoComplete, locationAreaComplete);
data.Close();
mockCNCData2.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetCurrentNetworkInfo::KLtsyDispatchPhoneGetCurrentNetworkInfoApiId, KErrNone, data);
//
// Prepare MockLtsy for processing a getter for NetworkModeChange
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetNetworkMode::KLtsyDispatchPhoneGetNetworkModeApiId);
// Prepare the KLtsyDispatchPhoneGetNetworkModeApiId data for CompleteL
RMobilePhone::TMobilePhoneNetworkMode networkModeComplete;
networkModeComplete = KNetworkMode;
TMockLtsyData1<RMobilePhone::TMobilePhoneNetworkMode> mockNMCData1(networkModeComplete);
data.Close();
mockNMCData1.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetNetworkMode::KLtsyDispatchPhoneGetNetworkModeApiId, KErrNone, data);
//
// Prepare MockLtsy for processing a getter for NitzInfoChange
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetNitzInfo::KLtsyDispatchPhoneGetNitzInfoApiId);
RMobilePhone::TMobilePhoneNITZ nitzComplete(2008, EMay, 12, 11, 59, 0, 0);
nitzComplete.iShortNetworkId = KShortName;
nitzComplete.iLongNetworkId = KLongName;
nitzComplete.iNitzFieldsUsed = KNitzFieldsUsed;
nitzComplete.iTimeZone = KTimeZone;
nitzComplete.iDST = KDst;
TMockLtsyData1<RMobilePhone::TMobilePhoneNITZ> mockNitzData1(nitzComplete);
data.Close();
mockNitzData1.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetNitzInfo::KLtsyDispatchPhoneGetNitzInfoApiId, KErrNone, data);
//
// Prepare MockLtsy for processing a getter for SignalStrengthChange
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetSignalStrength::KLtsyDispatchPhoneGetSignalStrengthApiId);
TInt32 signalStrengthComplete(KSignalStrength);
TInt8 barComplete(KBar);
TMockLtsyData2<TInt32, TInt8> mockSigSthData2(signalStrengthComplete, barComplete);
data.Close();
mockSigSthData2.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetSignalStrength::KLtsyDispatchPhoneGetSignalStrengthApiId, KErrNone, data);
//
// Prepare MockLtsy for processing a getter for BatteryInfoChange
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetBatteryInfo::KLtsyDispatchPhoneGetBatteryInfoApiId);
RMobilePhone::TMobilePhoneBatteryInfoV1 battInfo;
battInfo.iChargeLevel = KBatteryChargeLevel;
battInfo.iStatus = KBatteryStatus;
TMockLtsyData1<RMobilePhone::TMobilePhoneBatteryInfoV1> mockBattInfoData1(battInfo);
data.Close();
mockBattInfoData1.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetBatteryInfo::KLtsyDispatchPhoneGetBatteryInfoApiId, KErrNone, data);
data.Close();
CleanupStack::PopAndDestroy(); // data
}
/**
* Waits until the MockLTSY queued events is empty
*/
void CCSatComponentTestBase::WaitForMockLTSYTerminated()
{
TRequestStatus reqStatus;
iMockLTSY.NotifyTerminated(reqStatus);
User::WaitForRequest(reqStatus);
ASSERT_TRUE(reqStatus.Int() == KErrNone);
}
/**
Sends ExpectL and CompleteL commands to MockLtsy for getters of various network information.
These getters are internal to the CtsyDispatcher.
This method should be called immediately after the CompleteL for KLtsyDispatchPhoneBootNotifyModemStatusReadyApiId,
since these getters are triggered on the CtsyDispacther receiving a BootNotifyModemStatusReady indication.
*/
void CCSatComponentTestBase::PrepInternalGettersMockLtsy()
{
RBuf8 data;
CleanupClosePushL(data);
//
// Prepare MockLtsy for processing a getter for CurrentNetworkInfo
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetCurrentNetworkInfo::KLtsyDispatchPhoneGetCurrentNetworkInfoApiId);
// Prepare the KLtsyDispatchPhoneGetCurrentNetworkInfoApiId data for CompleteL
RMobilePhone::TMobilePhoneNetworkInfoV5 networkInfoComplete;
// V5
networkInfoComplete.iEgprsAvailableIndicator = KEgprsAvailable;
networkInfoComplete.iHsdpaAvailableIndicator = KHsdpaAvailable;
// V2
networkInfoComplete.iAccess = KAccess;
// V1
networkInfoComplete.iMode = KMode;
networkInfoComplete.iStatus = KStatus;
networkInfoComplete.iBandInfo = KBandInfo;
networkInfoComplete.iCountryCode = KCountryCode;
networkInfoComplete.iCdmaSID = KCdmaSID;
networkInfoComplete.iAnalogSID = KAnalogSID;
networkInfoComplete.iNetworkId = KNetworkId;
networkInfoComplete.iDisplayTag = KDisplayTag;
networkInfoComplete.iShortName = KShortName;
networkInfoComplete.iLongName = KLongName;
RMobilePhone::TMobilePhoneLocationAreaV1 locationAreaComplete;
locationAreaComplete.iAreaKnown = KAreaKnown;
locationAreaComplete.iLocationAreaCode = KLocationAreaCode;
locationAreaComplete.iCellId = KCellId;
TMockLtsyData2<RMobilePhone::TMobilePhoneNetworkInfoV5,
RMobilePhone::TMobilePhoneLocationAreaV1> mockCNCData2(networkInfoComplete, locationAreaComplete);
data.Close();
mockCNCData2.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetCurrentNetworkInfo::KLtsyDispatchPhoneGetCurrentNetworkInfoApiId, KErrNone, data);
//
// Prepare MockLtsy for processing a getter for NetworkModeChange
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetNetworkMode::KLtsyDispatchPhoneGetNetworkModeApiId);
// Prepare the KLtsyDispatchPhoneGetNetworkModeApiId data for CompleteL
RMobilePhone::TMobilePhoneNetworkMode networkModeComplete;
networkModeComplete = KNetworkMode;
TMockLtsyData1<RMobilePhone::TMobilePhoneNetworkMode> mockNMCData1(networkModeComplete);
data.Close();
mockNMCData1.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetNetworkMode::KLtsyDispatchPhoneGetNetworkModeApiId, KErrNone, data);
//
// Prepare MockLtsy for processing a getter for NitzInfoChange
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetNitzInfo::KLtsyDispatchPhoneGetNitzInfoApiId);
RMobilePhone::TMobilePhoneNITZ nitzComplete(2008, EMay, 12, 11, 59, 0, 0);
nitzComplete.iShortNetworkId = KShortName;
nitzComplete.iLongNetworkId = KLongName;
nitzComplete.iNitzFieldsUsed = KNitzFieldsUsed;
nitzComplete.iTimeZone = KTimeZone;
nitzComplete.iDST = KDst;
TMockLtsyData1<RMobilePhone::TMobilePhoneNITZ> mockNitzData1(nitzComplete);
data.Close();
mockNitzData1.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetNitzInfo::KLtsyDispatchPhoneGetNitzInfoApiId, KErrNone, data);
//
// Prepare MockLtsy for processing a getter for SignalStrengthChange
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetSignalStrength::KLtsyDispatchPhoneGetSignalStrengthApiId);
TInt32 signalStrengthComplete(KSignalStrength);
TInt8 barComplete(KBar);
TMockLtsyData2<TInt32, TInt8> mockSigSthData2(signalStrengthComplete, barComplete);
data.Close();
mockSigSthData2.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetSignalStrength::KLtsyDispatchPhoneGetSignalStrengthApiId, KErrNone, data);
//
// Prepare MockLtsy for processing a getter for BatteryInfoChange
//
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetBatteryInfo::KLtsyDispatchPhoneGetBatteryInfoApiId);
RMobilePhone::TMobilePhoneBatteryInfoV1 battInfo;
battInfo.iChargeLevel = KBatteryChargeLevel;
battInfo.iStatus = KBatteryStatus;
TMockLtsyData1<RMobilePhone::TMobilePhoneBatteryInfoV1> mockBattInfoData1(battInfo);
data.Close();
mockBattInfoData1.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetBatteryInfo::KLtsyDispatchPhoneGetBatteryInfoApiId, KErrNone, data);
data.Close();
CleanupStack::PopAndDestroy(); // data
}
/**
Dial a call
@param aCall the call to use to dial
@param aService type of call (must match the line the call what created on)
@param aCallId Call ID the TSY allocates for this call
*/
void CCSatComponentTestBase::DialL(RMobileCall& aCall, TInt aCallId, RMobilePhone::TMobileService aService)
{
RBuf8 data;
CleanupClosePushL(data);
// EEtelCallDial
RMobileCall::TMobileCallParamsV1 callParams;
RMobileCall::TMobileCallParamsV1Pckg callParamsPckg(callParams);
callParams.iInterval = 0;
callParams.iCug.iCugIndex = 0xFFFF;
RMobileCall::TMobileCallInfoV1 callInfo;
RMobileCall::TMobileCallInfoV1Pckg callInfoPckg(callInfo);
callInfo.iDialledParty.iTelNumber.Copy(_L("02071541111"));
callInfo.iService = aService;
callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating;
TMockLtsyCallData2<RMobileCall::TMobileCallParamsV1, RMobileCall::TMobileCallInfoV1>
dialData(0, aService, callParams, callInfo);
dialData.SerialiseL(data);
iMockLTSY.ExpectL(EEtelCallDial,data);
// EMobileCallGetMobileCallInfo
callInfo.iService = aService;
callInfo.iEmergency = EFalse;
callInfo.iRemoteParty.iCallingName = _L("");
callInfo.iRemoteParty.iRemoteIdStatus = RMobileCall::ERemoteIdentityUnknown;
callInfo.iRemoteParty.iRemoteNumber.iTelNumber = _L("");
callInfo.iRemoteParty.iRemoteNumber.iNumberPlan = RMobilePhone::EUnknownNumberingPlan;
callInfo.iRemoteParty.iRemoteNumber.iTypeOfNumber = RMobilePhone::EUnknownNumber;
callInfo.iForwarded = EFalse;
callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallRemoteParty;
TMockLtsyCallData1<RMobileCall::TMobileCallInfoV1> callInfoData(aCallId, aService, callInfo);
data.Close();
callInfoData.SerialiseL(data);
iMockLTSY.CompleteL(EMobileCallGetMobileCallInfo,KErrNone,data,0);
// complete Dial
TMockLtsyCallData0 dialCompleteData(aCallId,aService);
data.Close();
dialCompleteData.SerialiseL(data);
iMockLTSY.CompleteL(EEtelCallDial,KErrNone,data,0);
TRequestStatus requestStatus ;
aCall.Dial(requestStatus,callInfo.iDialledParty.iTelNumber);
User::WaitForRequest(requestStatus);
AssertMockLtsyStatusL();
ASSERT_EQUALS(KErrNone, requestStatus.Int());
CleanupStack::PopAndDestroy(1);
}
/**
Open packet service session.
@param aStartAttachStatus Starting attach status.
@param aStartAttachMode Starting atach mode. The CTSY does not even cache this value so it does not really matter what it gets set to.
*/
void CCSatComponentTestBase::OpenPacketServiceL(RPacketService& aRPacketService, RPacketService::TStatus aStartAttachStatus, RPacketService::TAttachMode aStartAttachMode)
{
RBuf8 data;
CleanupClosePushL(data);
TRequestStatus mockLtsyStatus;
iMockLTSY.NotifyTerminated(mockLtsyStatus);
iMockLTSY.ExpectL(EPacketNotifyStatusChange);
TBool resumed = EFalse;
TMockLtsyData2<RPacketService::TStatus , TBool> comNotifyStatus(aStartAttachStatus, resumed);
comNotifyStatus.SerialiseL(data);
iMockLTSY.CompleteL(EPacketNotifyStatusChange,KErrNone, data);
TBool expInitState = ETrue;
TMockLtsyData1<TBool> expGetAttachMode(expInitState);
data.Close();
expGetAttachMode.SerialiseL(data);
iMockLTSY.ExpectL(EPacketGetAttachMode, data);
TMockLtsyData1<RPacketService::TAttachMode> comGetAttachMode(aStartAttachMode);
data.Close();
comGetAttachMode.SerialiseL(data);
iMockLTSY.CompleteL(EPacketGetAttachMode,KErrNone, data);
//this is actually a sync call to LTSY where return represents a context id offset rather than error code.
iMockLTSY.ExpectL(EPacketInitProxiesIPC, 3);
//this actually completes before all messages between CSAT<->LTSY have finished.
TInt err = aRPacketService.Open(iPhone);
// Wait for the end of initialisation
User::WaitForRequest(mockLtsyStatus);
AssertMockLtsyStatusL();
CleanupStack::PopAndDestroy(); // data
}
/**
Context initiation
@param aPacketContext context object
@param aContextName context name
*/
TInt CCSatComponentTestBase::InitContextL(RPacketContext& aPacketContext, TInfoName& aContextName, TInfoName aHostCidName)
{
RBuf8 data;
CleanupClosePushL(data);
// data for initialisation of the context
TRequestStatus initStatus;
RPacketContext::TDataChannelV2 dataCh;
TPckg<RPacketContext::TDataChannelV2> pckgInit(dataCh);
TMockLtsyData2< TInfoName, TInfoName > ltsyInit(aContextName, aHostCidName);
ltsyInit.SerialiseL(data);
iMockLTSY.ExpectL(EPacketContextInitialiseContext, data);
TMockLtsyData1< TInfoName > ltsyData(aContextName);
data.Close();
ltsyData.SerialiseL(data);
iMockLTSY.CompleteL(EPacketContextInitialiseContext, KErrNone, data);
//initialisation of the context
aPacketContext.InitialiseContext(initStatus, pckgInit);
User::WaitForRequest(initStatus);
CleanupStack::PopAndDestroy(1); // data
return initStatus.Int();
}
/**
Context activation
@param aContextName context name
*/
TInt CCSatComponentTestBase::SetContextActiveL(TInfoName& aContextName)
{
RBuf8 data;
CleanupClosePushL(data);
//data for CompleteL
TContextMisc completeMisc;
completeMisc.iStatus = RPacketContext::EStatusActive;
TMockLtsyData2 <TInfoName, TContextMisc>
ltsyData1(aContextName, completeMisc);
ltsyData1.SerialiseL(data);
TRequestStatus mockLtsyStatus;
iMockLTSY.NotifyTerminated(mockLtsyStatus);
//send completion
iMockLTSY.CompleteL(EPacketContextNotifyStatusChange, KErrNone, data);
// wait for completion
User::WaitForRequest(mockLtsyStatus);
CleanupStack::PopAndDestroy(1); // data
return mockLtsyStatus.Int();
}
/**
Set context to new status
@param aContextName context name
@param aStatus status to set
*/
TInt CCSatComponentTestBase::SetContextStatusL(TInfoName& aContextName, RPacketContext::TContextStatus aStatus)
{
RBuf8 data;
CleanupClosePushL(data);
//data for CompleteL
TContextMisc completeMisc;
completeMisc.iStatus = aStatus;
TMockLtsyData2 <TInfoName, TContextMisc>
ltsyData1(aContextName, completeMisc);
ltsyData1.SerialiseL(data);
TRequestStatus mockLtsyStatus;
iMockLTSY.NotifyTerminated(mockLtsyStatus);
//send completion
iMockLTSY.CompleteL(EPacketContextNotifyStatusChange, KErrNone, data);
// wait for completion
User::WaitForRequest(mockLtsyStatus);
CleanupStack::PopAndDestroy(1); // data
return mockLtsyStatus.Int();
}
/**
Create QoS and set profile params
@param aPacketQoS packet qos object
@param aPacketContext context object
@param aRequested profile
*/
TInt CCSatComponentTestBase::CreateQoSAndSetProfileParamLC(RPacketQoS& aPacketQoS,
RPacketContext& aPacketContext,
TInfoName& aContextName,
TPacketDataConfigBase& aRequested,
TInfoName aPrimaryContextName)
{
// ------ create New QoS -------------------------------------------------
TName qosName;
aPacketQoS.OpenNewQoS(aPacketContext, qosName);
CleanupClosePushL(aPacketQoS);
RBuf8 expectDataSPP;
CleanupClosePushL(expectDataSPP);
TInt ret(KErrArgument);
// Get Context current status
// test 1: context not inited
RPacketContext::TContextStatus contextStatus;
TBool statusChanged = EFalse;
aPacketContext.GetStatus(contextStatus);
//check Context current status
if ( RPacketContext::EStatusActivating != contextStatus &&
RPacketContext::EStatusActive != contextStatus)
{
// and change it to RPacketContext::EStatusActive
SetContextActiveL(aContextName);
statusChanged = ETrue;
}
// ------ SetProfileParameters --------------------------------------------
TRequestStatus requestStatus;
if (TPacketDataConfigBase::KConfigGPRS == aRequested.ExtensionId())
{
RPacketQoS::TQoSGPRSRequested* req;
req = reinterpret_cast< RPacketQoS::TQoSGPRSRequested* > ( &aRequested );
TPckg<RPacketQoS::TQoSGPRSRequested> pckg(*req);
// prepare data for expectDataSPP ...
// ... context status
RPacketContext::TContextStatus contextStatus;
aPacketContext.GetStatus(contextStatus);
AssertMockLtsyStatusL();
// ... get contextConfig
RPacketContext::TContextConfigGPRS contextConfig;
TPckg< RPacketContext::TContextConfigGPRS > pckgContextConfig =
( TPckg< RPacketContext::TContextConfigGPRS > ) contextConfig;
aPacketContext.GetConfig(requestStatus, pckgContextConfig);
User::WaitForRequest(requestStatus);
AssertMockLtsyStatusL();
// data for SetProfileParameters's ExpectL
TContextParams contextParams;
contextParams.iContextName = aContextName;
contextParams.iContextType = contextConfig.iNWIContext;
contextParams.iPdpType = contextConfig.iPdpType;
contextParams.iPrimaryContextName = aPrimaryContextName;
contextParams.iContextStatus = contextStatus;
TMockLtsyData2<TContextParams, RPacketQoS::TQoSGPRSRequested>
expExpect(contextParams, *req);
expExpect.SerialiseL(expectDataSPP);
iMockLTSY.ExpectL(EPacketQoSSetProfileParams, expectDataSPP);
aPacketQoS.SetProfileParameters(requestStatus, pckg);
User::WaitForRequest(requestStatus);
AssertMockLtsyStatusL();
ret = KErrNone;
}
if (TPacketDataConfigBase::KConfigRel99Rel4 == aRequested.ExtensionId())
{
RPacketQoS::TQoSR99_R4Requested* req;
req = reinterpret_cast< RPacketQoS::TQoSR99_R4Requested* > ( &aRequested );
TPckg<RPacketQoS::TQoSR99_R4Requested> pckg(*req);
// prepare data for expectDataSPP ...
// ... context status
RPacketContext::TContextStatus contextStatus;
aPacketContext.GetStatus(contextStatus);
// ... get contextConfig
RPacketContext::TContextConfigR99_R4 contextConfig;
TPckg< RPacketContext::TContextConfigR99_R4 > pckgContextConfig =
( TPckg< RPacketContext::TContextConfigR99_R4 > ) contextConfig;
aPacketContext.GetConfig(requestStatus, pckgContextConfig);
User::WaitForRequest(requestStatus);
// data for SetProfileParameters's ExpectL
TInfoName primaryContextName;
TContextParams contextParams;
contextParams.iContextName = aContextName;
contextParams.iContextType = contextConfig.iNWIContext;
contextParams.iPdpType = contextConfig.iPdpType;
contextParams.iPrimaryContextName = primaryContextName;
contextParams.iContextStatus = contextStatus;
TMockLtsyData2<TContextParams, RPacketQoS::TQoSR99_R4Requested>
expExpect(contextParams, *req);
expectDataSPP.Close();
expExpect.SerialiseL(expectDataSPP);
iMockLTSY.ExpectL(EPacketQoSSetProfileParams, expectDataSPP);
aPacketQoS.SetProfileParameters(requestStatus, pckg);
User::WaitForRequest(requestStatus);
AssertMockLtsyStatusL();
ret = KErrNone;
}
if (TPacketDataConfigBase::KConfigRel5 == aRequested.ExtensionId())
{
RPacketQoS::TQoSR5Requested* req;
req = reinterpret_cast< RPacketQoS::TQoSR5Requested* > ( &aRequested );
TPckg<RPacketQoS::TQoSR5Requested> pckg(*req);
// prepare data for expectDataSPP ...
// ... context status
RPacketContext::TContextStatus contextStatus;
aPacketContext.GetStatus(contextStatus);
// ... get contextConfig
RPacketContext::TContextConfig_R5 contextConfig;
TPckg< RPacketContext::TContextConfig_R5 > pckgContextConfig =
( TPckg< RPacketContext::TContextConfig_R5 > ) contextConfig;
aPacketContext.GetConfig(requestStatus, pckgContextConfig);
User::WaitForRequest(requestStatus);
// data for SetProfileParameters's ExpectL
TInfoName primaryContextName;
TContextParams contextParams;
contextParams.iContextName = aContextName;
contextParams.iContextType = contextConfig.iNWIContext;
contextParams.iPdpType = contextConfig.iPdpType;
contextParams.iPrimaryContextName = primaryContextName;
contextParams.iContextStatus = contextStatus;
TMockLtsyData2<TContextParams, RPacketQoS::TQoSR5Requested>
expExpect(contextParams, *req);
expectDataSPP.Close();
expExpect.SerialiseL(expectDataSPP);
iMockLTSY.ExpectL(EPacketQoSSetProfileParams, expectDataSPP);
aPacketQoS.SetProfileParameters(requestStatus, pckg);
User::WaitForRequest(requestStatus);
AssertMockLtsyStatusL();
ret = KErrNone;
}
// if context status was changed
if (statusChanged)
{
// return to previous status
SetContextStatusL(aContextName, contextStatus);
}
CleanupStack::PopAndDestroy(1);// expectDataSPP
// aPacketQoS is still in CleanupStack !!!
return ret;
}
/**
Set status to RPacketService
@param aStatus status to set
@param aIsResumed -- is resumed
*/
TInt CCSatComponentTestBase::SetPacketServiceStatusL(RPacketService::TStatus& aStatus, TBool aIsResumed)
{
RBuf8 data;
CleanupClosePushL(data);
// Data for CompleteL
TMockLtsyData2 <RPacketService::TStatus, TBool > ltsyData(aStatus, aIsResumed);
ltsyData.SerialiseL(data);
TRequestStatus mockLtsyStatus;
iMockLTSY.NotifyTerminated(mockLtsyStatus);
// Issue the Complete...
iMockLTSY.CompleteL(EPacketNotifyStatusChange, KErrNone, data);
User::WaitForRequest(mockLtsyStatus);
CleanupStack::PopAndDestroy(1); // data
return mockLtsyStatus.Int();
}
/**
Add filter to RContext
@param aContext RPacketContext use to add filter
@param aPacketFilterInfo -- Reference to a TPacketFilterV2 class packaged inside a TPckg<> class.
*/
TInt CCSatComponentTestBase::AddContextPacketFilterL(RPacketContext& aContext,
TInfoName& aContextName,
RPacketContext::TPacketFilterV2& aFilter,
TBool aIsFailInCSAT)
{
RBuf8 data;
CleanupClosePushL(data);
TRequestStatus requestStatus;
RPacketContext::TPacketFilterV2Pckg filterPckg (aFilter);
// if request reaches LTSY
if (!aIsFailInCSAT)
{
//data for ExpectL
RPacketContext::TContextConfigGPRS configGPRS;
CArrayFixFlat< RPacketContext::TPacketFilterV2 >* filterArray = new ( ELeave ) CArrayFixFlat
<RPacketContext::TPacketFilterV2>( 1 );
CleanupStack::PushL(filterArray);
filterArray->AppendL( aFilter );
TMockLtsyContextData2< TInfoName, CArrayFixFlat< RPacketContext::TPacketFilterV2 >* >
packetFilterData( configGPRS, 0, aContextName, filterArray );
packetFilterData.SerialiseL(data);
iMockLTSY.ExpectL(EPacketContextAddPacketFilter, data);
//data for CompleteL
TMockLtsyData1<TInfoName > contexName(aContextName);
data.Close();
contexName.SerialiseL(data);
iMockLTSY.CompleteL(EPacketContextSetConfig, KErrNone, data);
CleanupStack::PopAndDestroy(1); // filterArray
}
aContext.AddPacketFilter(requestStatus, filterPckg);
User::WaitForRequest(requestStatus);
CleanupStack::PopAndDestroy(1); // data
return requestStatus.Int();
}
TInt CCSatComponentTestBase::OpenNewCall(RLine& aLine, RCall& aCall, const TDesC& aLineName)
{
TName name;
name = KMmTsyPhoneName;
name.Append(KDoubleColon);
name.Append(aLineName);
name.Append(KDoubleColon);
return aCall.OpenNewCall(aLine, name);
}
TInt CCSatComponentTestBase::OpenNewCall(RLine& aLine, RCall& aCall, const TDesC& aLineName, TName& aNewName)
{
aNewName = KMmTsyPhoneName;
aNewName.Append(KDoubleColon);
aNewName.Append(aLineName);
aNewName.Append(KDoubleColon);
return aCall.OpenNewCall(aLine, aNewName);
}
TInt CCSatComponentTestBase::CreateIncomingCall(RLine& aLine,
const TInt aCallId,
const TDesC& aLineName,
TName& aIncomingCallName,
RMobilePhone::TMobileService aMobileService)
{
TInt errorCode = KErrNone;
_LIT(KDoubleColon, "::");
TName name;
name = KMmTsyPhoneName;
name.Append(KDoubleColon);
name.Append(aLineName);
name.Append(KDoubleColon);
RCall call;
RBuf8 completeData;
CleanupClosePushL(completeData);
TRequestStatus requestNotify;
TRequestStatus mockLtsyStatus;
errorCode = call.OpenNewCall(aLine, name);
CleanupClosePushL(call);
if (errorCode != KErrNone)
return errorCode;
aLine.NotifyIncomingCall(requestNotify, aIncomingCallName);
// Complete NotifyIncomingCall
RMobileCall::TMobileCallInfoV1 mobileCallInfo;
mobileCallInfo.iService = aMobileService;
TMockLtsyCallData1<RMobileCall::TMobileCallInfoV1> mockCallData1(aCallId, aMobileService, mobileCallInfo);
mockCallData1.SerialiseL(completeData);
iMockLTSY.NotifyTerminated(mockLtsyStatus);
iMockLTSY.CompleteL(KMockLtsyDispatchCallControlNotifyIncomingCallIndId, KErrNone, completeData);
User::WaitForRequest(mockLtsyStatus);
AssertMockLtsyStatusL();
ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int());
User::WaitForRequest(requestNotify);
AssertMockLtsyStatusL();
ASSERT_EQUALS(KErrNone, requestNotify.Int());
// Complete NotifyCallStatusChange with ringing status
RMobileCall::TMobileCallStatus callStatus = RMobileCall::EStatusRinging;
TMockLtsyCallData1<RMobileCall::TMobileCallStatus> mockCallData2(aCallId, aMobileService, callStatus);
completeData.Close();
mockCallData2.SerialiseL(completeData);
iMockLTSY.NotifyTerminated(mockLtsyStatus);
iMockLTSY.CompleteL(KMockLtsyDispatchCallControlNotifyCallStatusChangeIndId , KErrNone, completeData);
User::WaitForRequest(mockLtsyStatus);
AssertMockLtsyStatusL();
ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int());
call.Close();
AssertMockLtsyStatusL();
CleanupStack::PopAndDestroy(2); // data, completeData
return errorCode;
}
void CCSatComponentTestBase::CloseIncomingCall(RCall& aCall, const TInt aCallId,
RMobilePhone::TMobileService aMobileService)
{
RBuf8 expectData;
CleanupClosePushL(expectData);
TInt hangUpCause = KErrGsmReleaseByUser;
TBool autoStChangeDisable = EFalse;
TMockLtsyCallData2<TInt, TBool> mockData2(aCallId, aMobileService,
hangUpCause,
autoStChangeDisable);
mockData2.SerialiseL(expectData);
iMockLTSY.ExpectL(EEtelCallHangUp, expectData);
aCall.Close();
AssertMockLtsyStatusL();
CleanupStack::PopAndDestroy(1); // expectData
}
void CCSatComponentTestBase::CloseLineL(RLine& aLine, TInt aCallId, RMobilePhone::TMobileService aMobileService)
{
RBuf8 expectData;
CleanupClosePushL(expectData);
// Get Call Status
RCall::TStatus callStatus;
aLine.GetStatus(callStatus);
// Hang up call if call is still connecting
// so in this case we have to prepare expectData
if ( !( RMobileCall::EStatusIdle == callStatus ||
RMobileCall::EStatusDisconnecting == callStatus ||
RMobileCall::EStatusDisconnectingWithInband == callStatus )
&& aCallId !=0 && aMobileService != RMobilePhone::EServiceUnspecified)
{
// prepare data for close line
TInt symbianHangUpCause( KErrGsmReleaseByUser );
TBool autoStChangeDisable = EFalse;
TMockLtsyCallData2<TInt, TBool> expData(aCallId, aMobileService, symbianHangUpCause, autoStChangeDisable);
expData.SerialiseL(expectData);
iMockLTSY.ExpectL(EEtelCallHangUp, expectData);
}
// close line
aLine.Close();
CleanupStack::PopAndDestroy(1); // expectData
}
// ExpectL and CopmleteL must precede this function.
void CCSatComponentTestBase::CallGetMobileCallInfoL(TInt aCallId,
RMobilePhone::TMobileService aService,
const TDesC &aTelNumber)
{
_LIT(KNullDesC , "");
RBuf8 data;
CleanupClosePushL(data);
RMobileCall::TMobileCallInfoV1 callInfo;
callInfo.iDialledParty.iTelNumber.Copy(aTelNumber);
callInfo.iService = aService;
callInfo.iEmergency = EFalse;
callInfo.iRemoteParty.iCallingName = KNullDesC;
callInfo.iRemoteParty.iRemoteIdStatus = RMobileCall::ERemoteIdentityUnknown;
callInfo.iRemoteParty.iRemoteNumber.iTelNumber = KNullDesC;
callInfo.iRemoteParty.iRemoteNumber.iNumberPlan = RMobilePhone::EUnknownNumberingPlan;
callInfo.iRemoteParty.iRemoteNumber.iTypeOfNumber = RMobilePhone::EUnknownNumber;
callInfo.iForwarded = EFalse;
callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallRemoteParty;
TMockLtsyCallData1<RMobileCall::TMobileCallInfoV1> callInfoData(aCallId, aService, callInfo);
callInfoData.SerialiseL(data);
iMockLTSY.CompleteL(EMobileCallGetMobileCallInfo, KErrNone, data);
CleanupStack::PopAndDestroy(1);
}
CActiveScheduler* CCSatComponentTestBase::InstallSchedulerLC()
{
CActiveScheduler* scheduler=new (ELeave) CActiveScheduler;
CActiveScheduler::Install(scheduler);
return scheduler;
}
/**
* Utility function which handles all the Expects/Completes generated by Opening an RSat object.
*/
void CCSatComponentTestBase::OpenSatL(TUint8 aEnabled)
{
RBuf8 data;
CleanupClosePushL(data);
TRequestStatus reqStatus;
iMockLTSY.ExpectL(MLtsyDispatchSatGetSmsControlActivated::KLtsyDispatchSatGetSmsControlActivatedApiId);
TBool smsMoControlActivated = aEnabled & KSmsMoControlEnabled;
TMockLtsyData1<TBool> comLtsyData(smsMoControlActivated);
comLtsyData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchSatGetSmsControlActivated::KLtsyDispatchSatGetSmsControlActivatedApiId, KErrNone, data, KDefaultDelay);
TUint8 pcmdCode = KPollInterval;
TMockLtsyData1<TUint8> expLtsyData(pcmdCode);
data.Close();
expLtsyData.SerialiseL(data);
iMockLTSY.ExpectL(MLtsyDispatchSatPCmdNotification::KLtsyDispatchSatPCmdNotificationApiId, data );
pcmdCode = KPollingOff;
data.Close();
expLtsyData.SerialiseL(data);
iMockLTSY.ExpectL(MLtsyDispatchSatPCmdNotification::KLtsyDispatchSatPCmdNotificationApiId, data );
pcmdCode = KMoreTime;
data.Close();
expLtsyData.SerialiseL(data);
iMockLTSY.ExpectL(MLtsyDispatchSatPCmdNotification::KLtsyDispatchSatPCmdNotificationApiId, data );
pcmdCode = KTimerManagement;
data.Close();
expLtsyData.SerialiseL(data);
iMockLTSY.ExpectL(MLtsyDispatchSatPCmdNotification::KLtsyDispatchSatPCmdNotificationApiId, data );
iMockLTSY.ExpectL(MLtsyDispatchPhoneGetPhoneId::KLtsyDispatchPhoneGetPhoneIdApiId);
_LIT(KSerialNumber, "12345678");
RMobilePhone::TMobilePhoneIdentityV1 phoneId;
phoneId.iSerialNumber = KSerialNumber;
TMockLtsyData1<RMobilePhone::TMobilePhoneIdentityV1> phoneIdData(phoneId);
data.Close();
phoneIdData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchPhoneGetPhoneId::KLtsyDispatchPhoneGetPhoneIdApiId, KErrNone, data,KDefaultDelay);
iMockLTSY.ExpectL(MLtsyDispatchSatGetDefaultBearerCapability::KLtsyDispatchSatGetDefaultBearerCapabilityApiId);
TBuf8<KMaxLengthDefaultBearerData> bearerCapabilities(_L8("TEST BEARER!"));
TDesC8* bearerCapabilitiesPtr = &bearerCapabilities;
TMockLtsyData1<TDesC8*> bearerCapabilitiesData(bearerCapabilitiesPtr);
data.Close();
bearerCapabilitiesData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchSatGetDefaultBearerCapability::KLtsyDispatchSatGetDefaultBearerCapabilityApiId, KErrNone, data, KDefaultDelay);
iMockLTSY.ExpectL(MLtsyDispatchSatGetUssdControlSupported::KLtsyDispatchSatGetUssdControlSupportedApiId);
TBool ussdSupported = aEnabled & KUssdEnabled;
TMockLtsyData1<TBool> ussdSupportedData(ussdSupported);
data.Close();
ussdSupportedData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchSatGetUssdControlSupported::KLtsyDispatchSatGetUssdControlSupportedApiId, KErrNone, data, KDefaultDelay);
iMockLTSY.CompleteL(KMockLtsyDispatchSatUssdControlSupportedChangeIndId, KErrNone, data, KDefaultDelay); //do a future indicator completion as well as this could happen at some point
iMockLTSY.ExpectL(MLtsyDispatchSatReady::KLtsyDispatchSatReadyApiId);
iMockLTSY.CompleteL(MLtsyDispatchSatReady::KLtsyDispatchSatReadyApiId,KErrNone, KDefaultDelay);
iMockLTSY.ExpectL(MLtsyDispatchSatGetSmsPpDownloadSupported::KLtsyDispatchSatGetSmsPpDownloadSupportedApiId);
TBool smsPpDdlSupported = aEnabled & KSmsPpDownloadEnabled;
TMockLtsyData1<TBool> smsPpData(smsPpDdlSupported);
data.Close();
smsPpData.SerialiseL(data);
iMockLTSY.CompleteL(MLtsyDispatchSatGetSmsPpDownloadSupported::KLtsyDispatchSatGetSmsPpDownloadSupportedApiId, KErrNone, data, KDefaultDelay);
User::LeaveIfError(iSat.Open(iPhone));
WaitForMockLTSYTerminated();
AssertMockLtsyStatusL();
CleanupStack::PopAndDestroy(&data);
}
/**
Prepares MockLtsy with expected IPC data for proactive command notification
@param aPCmdNumber proactive command number
*/
void CCSatComponentTestBase::PrepareMockWithExpDataForPCmdNotifyL( TUint8 aPCmdNumber )
{
TPckg<TUint8> pcmdCodePckg(aPCmdNumber);
iMockLTSY.ExpectL(MLtsyDispatchSatPCmdNotification::KLtsyDispatchSatPCmdNotificationApiId, pcmdCodePckg);
}
/**
Prepares MockLtsy with data for completion of proactive command notification
@param aCompleteTlv proactive command Tlv
@param aError proactive command notification result code
*/
void CCSatComponentTestBase::PrepareMockWithCompleteDataForPCmdNotifyL( TPtrC8 aCompleteTlv, TInt aError, TInt aDelay )
{
RBuf8 data;
CleanupClosePushL(data);
TDesC8* tlvPtr = &aCompleteTlv;
TMockLtsyData1<TDesC8*> dspTxtDscPack(tlvPtr);
dspTxtDscPack.SerialiseL(data);
iMockLTSY.CompleteL(KMockLtsyDispatchSatPcmdIndId, aError, data, aDelay);
CleanupStack::PopAndDestroy(&data);
}
/**
Fills in a proactive command Tlv with command details and device identities
@param aTlv Tlv to fill in
@param aPCmdNumber proactive command number
@param aTypeOfCommand type of proactive command
@param aCommandQualifier proactive command qualifier
@param aDestDeviceId command destination device Id
*/
void ProactiveCmdTlvBegin(
TTlv& aTlv,
TUint8 aPCmdNumber,
TUint8 aTypeOfCommand,
TUint8 aCommandQualifier,
TUint8 aDestDeviceId)
{
aTlv.Begin(KBerTlvProactiveSimCommandTag);
aTlv.AddTag(KTlvCommandDetailsTag);
aTlv.AddByte(aPCmdNumber);//ETLV_CommandNumber
aTlv.AddByte(aTypeOfCommand); //ETLV_TypeOfCommand
aTlv.AddByte(aCommandQualifier); //ETLV_CommandQualifier
if ( KDeviceIdNotSet != aDestDeviceId )
{
aTlv.AddTag(KTlvDeviceIdentityTag);
aTlv.AddByte(KSim); //ETLV_SourceDeviceIdentity
aTlv.AddByte(aDestDeviceId); //ETLV_DestinationDeviceIdentity
}
}
/**
Generates a terminal response Tlv
@param aBuf A buffer to fill in Tlv
@param aPCmdNumber proactive command number
@param aTypeOfCommand type of proactive command
@param aCommandQualifier proactive command qualifier
@param aGeneralResult result code of proactive command processing
@param aGeneralResultAddInfo additional command result information
@param aAdditionalInfoTlv additional tlv data
*/
void CCSatComponentTestBase::GenerateTermRspTlv(
RBuf8& aBuf,
TUint8 aPCmdNumber,
TUint8 aTypeOfCommand,
TUint8 aCommandQualifier,
RSat::TPCmdResult aGeneralResult,
const TDesC& aGeneralResultAddInfo,
const TDesC8& aAdditionalInfoTlv)
{
TTlv tlv;
tlv.AddTag(KTlvCommandDetailsTag);
tlv.AddByte(aPCmdNumber);//ETLV_CommandNumber
tlv.AddByte(aTypeOfCommand); //ETLV_TypeOfCommand
tlv.AddByte(aCommandQualifier); //ETLV_CommandQualifier
tlv.AddTag(KTlvDeviceIdentityTag);
tlv.AddByte(KMe);
tlv.AddByte(KSim);
tlv.AddTag(KTlvResultTag);
tlv.AddByte(aGeneralResult);
TUint genResAddInfoLength = aGeneralResultAddInfo.Length();
for (TUint i = 0; i < genResAddInfoLength; i++)
{
tlv.AddByte( static_cast< TUint8 >(aGeneralResultAddInfo[i]) );
}
aBuf.Zero();
aBuf.Append(tlv.GetDataWithoutTopLevelTag());
aBuf.Append(aAdditionalInfoTlv);
}
/**
Prepares MockLtsy with expected IPC data for terminal response
@param aPCmdNumber proactive command number
@param aTypeOfCommand type of proactive command
@param aCommandQualifier proactive command qualifier
@param aGeneralResult result code of proactive command processing
@param aGeneralResultAddInfo additional command result information
@param aAdditionalInfoTlv additional tlv data
@param aResultForExpect result value for ExpectL()
*/
void CCSatComponentTestBase::PrepareTerminalResponseMockDataL(
TUint8 aPCmdNumber,
TUint8 aTypeOfCommand,
TUint8 aCommandQualifier,
const TDesC& aGeneralResultAddInfo,
RSat::TPCmdResult aGeneralResult,
const TDesC8& aAdditionalInfoTlv,
const TInt aResultForExpect)
{
RBuf8 data;
CleanupClosePushL(data);
RBuf8 terminalRsp;
CleanupClosePushL(terminalRsp);
terminalRsp.CreateL(KTlvMaxSize);
GenerateTermRspTlv(
terminalRsp,
aPCmdNumber,
aTypeOfCommand,
aCommandQualifier,
aGeneralResult,
aGeneralResultAddInfo,
aAdditionalInfoTlv);
TDesC8* terminalRspPtr = &terminalRsp;
TMockLtsyData1<TDesC8*> termRespData(terminalRspPtr);
termRespData.SerialiseL(data);
iMockLTSY.ExpectL(MLtsyDispatchSatTerminalRsp::KLtsyDispatchSatTerminalRspApiId, data, aResultForExpect);
CleanupStack::PopAndDestroy(&terminalRsp);
CleanupStack::PopAndDestroy(&data);
}
/**
Sends a terminal response.
@param aRSatTypeOfCommand proactive command number
@param aRspPckg packaged data for terminal response
@param aExpResult expected result of TerminalRsp() execution
*/
void CCSatComponentTestBase::TerminalResponseL(
RSat::TPCmd aRSatTypeOfCommand,
const TDesC8& aRspPckg,
const TInt aExpResult)
{
TRequestStatus reqStatus;
iSat.TerminalRsp(reqStatus, aRSatTypeOfCommand, aRspPckg);
User::WaitForRequest(reqStatus);
ASSERT_EQUALS(aExpResult, reqStatus.Int());
}
/**
Handles sending a terminal response
@param aPCmdNumber proactive command number
@param aTypeOfCommand type of proactive command
@param aCommandQualifier proactive command qualifier
@param aRSatTypeOfCommand proactive command number
@param aRspPckg packaged data for terminal response
@param aGeneralResultAddInfo additional command result information
@param aGeneralResult result code of proactive command processing
@param aAdditionalInfoTlv additional tlv data
@param aExpResult expected result of TerminalRsp() execution
*/
void CCSatComponentTestBase::GenerateTerminalResponseL(
TUint8 aPCmdNumber,
TUint8 aTypeOfCommand,
TUint8 aCommandQualifier,
RSat::TPCmd aRSatTypeOfCommand,
const TDesC8& aRspPckg,
const TDesC& aGeneralResultAddInfo,
RSat::TPCmdResult aGeneralResult,
const TDesC8& aAdditionalInfoTlv,
const TInt aExpResult)
{
PrepareTerminalResponseMockDataL(
aPCmdNumber,
aTypeOfCommand,
aCommandQualifier,
aGeneralResultAddInfo,
aGeneralResult,
aAdditionalInfoTlv,
aExpResult);
TerminalResponseL( aRSatTypeOfCommand, aRspPckg, aExpResult);
}
/**
End Proactive Sim Session
*/
void CCSatComponentTestBase::EndPSimSessionL()
{
//this is as a result of the NotifyProactiveSimSessionEnd call down to the LTSY,
//this tells the LTSY we are interested in a Sim Session End event
//CSAT -> LTSY
PrepareMockWithExpDataForPCmdNotifyL(KEndOfTheProactiveSession);
//the client side call to be notifed when the Proactive Sim Session has ended.
TRequestStatus reqStatus;
iSat.NotifyProactiveSimSessionEnd(reqStatus);
TUint8 statusWord1 = 0x90;
TUint8 statusWord2 = 0x00;
TMockLtsyData2<TUint8,TUint8> notifyDataPack(statusWord1,statusWord2);
RBuf8 data;
CleanupClosePushL(data);
notifyDataPack.SerialiseL(data);
iMockLTSY.CompleteL(KMockLtsyDispatchSatNotifyProactiveSimSessionEndIndId, KErrNone, data);
//wait for the client side to be notified
User::WaitForRequest(reqStatus);
ASSERT_EQUALS(KErrNone, reqStatus.Int());
AssertMockLtsyStatusL();
CleanupStack::PopAndDestroy(&data);
}
/**
Test if a proactive command was performed successfully
*/
TBool CCSatComponentTestBase::CommandPerformedSuccessfully
(
TUint8 aGeneralResult
)
{
TBool ret( EFalse );
switch ( aGeneralResult )
{
case RSat::KSuccess:
case RSat::KPartialComprehension:
case RSat::KMissingInformation:
case RSat::KRefreshAdditionEFRead:
case RSat::KSuccessRequestedIconNotDisplayed:
case RSat::KModifiedByCallControl:
case RSat::KSuccessLimitedService:
case RSat::KPerformedWithModifications:
case RSat::KRefreshUSIMNotActive:
{
ret = ETrue;
break;
}
default:
{
ret = EFalse;
break;
}
}
return ret;
}
/**
Compares 16bit descriptor with 8bit descriptor
@param aStringToCompareWith string to compare with
@param aStringToCompare string to compare
@return
Positive, if this descriptor is greater than the specified descriptor.
Negative, if this descriptor is less than the specified descriptor.
Zero, if both descriptors have the same length and the their contents are the same.
*/
TInt Compare16bitDesWith8bitDesL(const TDesC8& aStringToCompareWith, const TDesC16& aStringToCompare)
{
RBuf8 buf;
buf.CreateL(aStringToCompare.Length());
buf.Copy(aStringToCompare);
TInt res = aStringToCompareWith.Compare(buf);
buf.Close();
return res;
}
/**
Converts Unicode to packed 7 bit
@param aInput Input string
@param aOutput Output string
@return KErrNone or the luck space of output descriptor
*/
TInt CCSatComponentTestBase::UnicodeToPacked7L(const TDesC16& aInput, TDes8& aOutput)
{
TInt length( aInput.Length() );
RBuf8 string;
string.CleanupClosePushL();
string.CreateL( length );
// convert unicode to 7 bit SMS default alphabet
CCnvCharacterSetConverter* converter = CCnvCharacterSetConverter::NewLC();
RFs fileServSes;
ASSERT_EQUALS(CCnvCharacterSetConverter::EAvailable,
converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierSms7Bit, fileServSes));
ASSERT_EQUALS(KErrNone, converter->ConvertFromUnicode(string, aInput));
CleanupStack::PopAndDestroy(converter);
// pack 7 bit data
TUint8 shift( 0 );
TInt packedDataSize( 0 );
for ( TInt i = 0; i < length; i++ )
{
// Get first character
TUint8 char1 = static_cast<TUint8>( string[i] >> shift );
TUint8 char2( 0 );
if ( length > ( i + 1 ) ) // if not last symbol
{
// Get next character
char2 = static_cast<TUint8>( string[i + 1] << ( 7 - shift ) );
}
// update packed character
string[ packedDataSize++ ] = static_cast<TUint8>( char1 | char2 );
// character is 7bit coded, so the shift can not be more then 6
if ( 6 == shift )
{
shift = 0;
// the next symbol is allready packed (8 bytes packed in 7 bytes)
// so let increase the counter
i++;
}
else
{
shift++;
}
}
string.SetLength( packedDataSize );
if ( 0 == shift )
{
// 7 last bytes packed in 7 bytes, so there are 7 spare zero bits at
// the end of the message. To avoid the situation where the receiving
// entity confuses 7 binary zero pad bits as the @ character,
// the carriage return (i.e. <CR>) character shall be used for padding
// in this situation, as defined in TS 23.038 [5]. <CR> = 0x0D
string[ packedDataSize - 1 ] =
static_cast<TUint8>( string[ packedDataSize - 1 ] | (0x0D)<<1 );
}
TInt copySize = Min( packedDataSize, aOutput.MaxLength() );
aOutput.Copy( string.Left( copySize ) );
CleanupStack::PopAndDestroy(&string);
return (packedDataSize == copySize)?KErrNone:(packedDataSize - copySize);
}