diff -r 6b1d113cdff3 -r 6638e7f4bd8f telephonyserverplugins/common_tsy/test/component/src/cctsytelephonyaudiocontrolfu.cpp --- a/telephonyserverplugins/common_tsy/test/component/src/cctsytelephonyaudiocontrolfu.cpp Mon May 03 13:37:20 2010 +0300 +++ b/telephonyserverplugins/common_tsy/test/component/src/cctsytelephonyaudiocontrolfu.cpp Thu May 06 15:10:38 2010 +0100 @@ -1,3996 +1,3996 @@ -// 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: -// The TEFUnit test suite for TelephonyAudioControl in the Common TSY. -// -// - -#include "cctsytelephonyaudiocontrolfu.h" -#include -#include -#include -#include -#include -#include -#include "tmockltsydata.h" -#include -#include - -_LIT( KPhoneNumber, "101632960000" ); - -CTestSuite* CCTsyTelephonyAudioControlFU::CreateSuiteL(const TDesC& aName) - { - SUB_SUITE; - - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestSetupTelephonyAudio0001aL); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestSetupTelephonyAudio0001bL); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestSetupTelephonyAudio0004L); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestTeardownTelephonyAudio0001aL); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestTeardownTelephonyAudio0001bL); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestTeardownTelephonyAudio0004L); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestCallStateChange0001aL); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestCallStateChange0001bL); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestCallStateChange0004L); - ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestNotifyTelephonyAudioControlError0001L ); - - END_SUITE; - } - -// -// Actual test cases -// - - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCSUCR-0001a -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::SetUpCallRouting -@SYMTestPriority High -@SYMTestActions Invokes MTelephonyAudioControl::SetUpCallRouting -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestSetupTelephonyAudio0001aL() - { - DefinePropeties( ETrue, EVersion2 ); - - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 data; - CleanupClosePushL(data); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - TRequestStatus status( KErrNone ); - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId, mobileService); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - - TRequestStatus mockLtsyStatus( KErrNone ); - RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); - TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); - - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( EFalse ); - - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - - RLine line; - RMobileCall call; - - //------------------------------------------------------------------------- - // TEST C: Successful completion request of - // MTelephonyAudioControl::SetUpCallRouting when result is not cached. - //------------------------------------------------------------------------- - - // DialL - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line & call - TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that values passed to the SetupCallRouting were valid - CheckCallRoutingValues( line, call ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - - // DialNoFdnCheck - - // reset line and call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - expectData.Close(); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EMobileCallDialNoFdnCheck, expectData); - completeData.Close(); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EMobileCallDialNoFdnCheck, KErrNone, completeData); - - // make the call - call.DialNoFdnCheck( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that values passed to the SetupCallRouting were valid - CheckCallRoutingValues( line, call ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // DialISV - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line and call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - expectData.Close(); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - completeData.Close(); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - call.DialISV( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that values passed to the SetupCallRouting were valid - CheckCallRoutingValues( line, call ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // Ghost Call - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // order NotifyStatusChange event - RCall::TStatus callStatus( RCall::EStatusIdle ); - line.NotifyStatusChange( status, callStatus ); - - // prepare MockLTSY for NotifyStatusChange event - iMockLTSY.NotifyTerminated(mockLtsyStatus); - RMobileCall::TMobileCallInfoV1 mobileCallInfo; - mobileCallInfo.iCallId = callId; - mobileCallInfo.iService = mobileService; - mobileCallInfo.iStatus = RMobileCall::EStatusDialling; - mobileCallInfo.iCallName.Copy( _L8("Voice12") ); - - TMockLtsyCallData1 mockCallData1(callId, mobileService, mobileCallInfo); - mockCallData1.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallGetMobileCallInfo, KErrNone, data); - - User::WaitForRequest(mockLtsyStatus); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - User::WaitForRequest(status); - ASSERT_EQUALS(KErrNone, status.Int()); - ASSERT_EQUALS(RCall::EStatusDialling, callStatus); - - error = call.OpenExistingCall( line, mobileCallInfo.iCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - data.Close(); - completeCallStatusData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); - - call.NotifyMobileCallStatusChange( status, mobileCallStatus ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - AssertMockLtsyStatusL(); - - CheckCallStatus( mobileCallInfo.iCallName, RMobileCall::EStatusConnecting ); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL( EEtelCallHangUp, expectData, KErrNone ); - - // hangup the call by popping the call from the cleanupstack - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // DialEmergencyCall - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line and call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // set rf on - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - TRfStateInfo rfInfo = ERfsStateInfoNormal; - TMockLtsyData1 mockData1( rfInfo ); - expectData.Close(); - mockData1.SerialiseL(expectData); - iMockLTSY.CompleteL(EMmTsyBootGetRFStatusIPC, KErrNone, expectData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // the emergency number - RMobileENStore::TEmergencyNumber number(_L("911")); - TMockLtsyData1 numberLtsyData( number ); - - CallGetMobileCallInfoL(callId, mobileService, number ); - - // prepare MockLTSY for EMobileCallDialEmergencyCall - data.Close(); - numberLtsyData.SerialiseL(data); - iMockLTSY.ExpectL(EMobileCallDialEmergencyCall, data, KErrNone); - - TMockLtsyCallData1 completeCallInfoData( callId, mobileService, callInfo ); - - // send EStatusDialling, EStatusConnecting and EStatusConnected events to complete DialEmergencyCall - data.Close(); - completeCallInfoData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallGetMobileCallInfo, KErrNone, data); - - mobileCallStatus = RMobileCall::EStatusDialling; - completeCallStatusData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); - - data.Close(); - mobileCallStatus = RMobileCall::EStatusConnecting; - completeCallStatusData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); - - data.Close(); - mobileCallStatus = RMobileCall::EStatusConnected; - completeCallStatusData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); - - // On return, KErrNone if the emergency call successfully reaches the connected state. - call.DialEmergencyCall( status, number ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that values passed to the SetupCallRouting were valid - CheckCallRoutingValues( line, call ); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - // hangup the call by popping the call from the cleanupstack - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - - // cleanup - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // answer incoming call - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - TName incomingCallName; - TRequestStatus requestNotify( KErrNone ); - line.NotifyIncomingCall( status, incomingCallName); - - TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); - mockCallData.SerialiseL( completeData ); - - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - User::WaitForRequest( requestNotify ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, requestNotify.Int() ); - - mobileCallStatus = RMobileCall::EStatusRinging; - TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); - completeData.Close(); - mockCallData2.SerialiseL(completeData); - - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that values passed to the SetupCallRouting were valid - CheckCallRoutingValues( line, call ); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - // hangup the call by popping the call from the cleanupstack - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - - // cleanup - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // cleanup - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( &data ); - CleanupStack::PopAndDestroy( this ); - } - - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCSUCR-0001b -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::SetUpCallRouting by using LTSY version1 -@SYMTestPriority High -@SYMTestActions Test that call routing is not set up -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestSetupTelephonyAudio0001bL() - { - DefinePropeties( ETrue, EVersion1 ); - - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - RBuf8 data; - CleanupClosePushL(data); - - TRequestStatus status( KErrNone ); - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId, mobileService); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - - RLine line; - RMobileCall call; - - //------------------------------------------------------------------------- - // TEST C: Successful completion request of - // MTelephonyAudioControl::SetUpCallRouting when result is not cached. - //------------------------------------------------------------------------- - - // Test that CMockLtsyFactoryV1 is used instead of CMockLtsyFactoryV2 - - // DialL - - // reset line & call - TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - - // DialNoFdnCheck - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion1 ); - - // reset line and call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - expectData.Close(); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EMobileCallDialNoFdnCheck, expectData); - completeData.Close(); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EMobileCallDialNoFdnCheck, KErrNone, completeData); - - // make the call - call.DialNoFdnCheck( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // DialEmergencyCall - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion1 ); - - // reset line and call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // set rf on - TRequestStatus mockLtsyStatus(KErrNone); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - TRfStateInfo rfInfo = ERfsStateInfoNormal; - TMockLtsyData1 mockData1( rfInfo ); - expectData.Close(); - mockData1.SerialiseL(expectData); - iMockLTSY.CompleteL(EMmTsyBootGetRFStatusIPC, KErrNone, expectData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // the emergency number - RMobileENStore::TEmergencyNumber number(_L("911")); - TMockLtsyData1 numberLtsyData( number ); - - CallGetMobileCallInfoL(callId, mobileService, number ); - - // prepare MockLTSY for EMobileCallDialEmergencyCall - data.Close(); - numberLtsyData.SerialiseL(data); - iMockLTSY.ExpectL(EMobileCallDialEmergencyCall, data, KErrNone); - - TMockLtsyCallData1 completeCallInfoData( callId, mobileService, callInfo ); - - // send EStatusDialling, EStatusConnecting and EStatusConnected events to complete DialEmergencyCall - data.Close(); - completeCallInfoData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallGetMobileCallInfo, KErrNone, data); - - RMobileCall::TMobileCallStatus mobileCallStatus(RMobileCall::EStatusDialling); - TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); - completeCallStatusData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); - - data.Close(); - mobileCallStatus = RMobileCall::EStatusConnecting; - completeCallStatusData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); - - data.Close(); - mobileCallStatus = RMobileCall::EStatusConnected; - completeCallStatusData.SerialiseL(data); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); - - // On return, KErrNone if the emergency call successfully reaches the connected state. - call.DialEmergencyCall( status, number ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // prepare MockLTSY for hangup - expectData.Close(); - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( EFalse ); - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - // hangup the call by popping the call from the cleanupstack - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - - // cleanup - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // cleanup - CleanupStack::PopAndDestroy( &data ); - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( this ); - } - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCSUCR-0004 -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for multiple client requests to MTelephonyAudioControl::SetUpCallRouting -@SYMTestPriority High -@SYMTestActions Invokes multiple client requests to MTelephonyAudioControl::SetUpCallRouting -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestSetupTelephonyAudio0004L() - { - DefinePropeties( EFalse, EVersion2 ); - - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - //------------------------------------------------------------------------- - // Test A: Test multiple clients requesting MTelephonyAudioControl::SetUpCallRouting - //------------------------------------------------------------------------- - - TInt callId1( 1 ); - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - - RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId1, mobileService); - - // reset line & call - RLine line; - TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - RMobileCall call; - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId1, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call - TRequestStatus status( KErrNone ); - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // Open second client - RTelServer telServer2; - error = telServer2.Connect(); - ASSERT_EQUALS( KErrNone, error ); - CleanupClosePushL( telServer2 ); - - RMobilePhone phone2; - error = phone2.Open( iTelServer,KMmTsyPhoneName ); - ASSERT_EQUALS( KErrNone, error ); - CleanupClosePushL( phone2 ); - - RLine line2; - error = line2.Open( phone2, KMmTsyVoice1LineName ); - CleanupClosePushL( line2 ); - ASSERT_EQUALS( KErrNone, error ); - - RMobileCall call2; - error = call2.OpenNewCall( line2 ); - CleanupClosePushL( call2 ); - ASSERT_EQUALS( KErrNone, error ); - - TInt callId2( 2 ); - // prepare MockLTSY - RMobileCall::TMobileCallInfoV8 callInfo2; - callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo2.iService = mobileService; - callInfo2.iStatus = RMobileCall::EStatusUnknown; - callInfo2.iCallId =-1; - callInfo2.iExitCode =0; - callInfo2.iEmergency =0; - callInfo2.iForwarded =0; - callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData0 mockData01(callId2, mobileService); - CallGetMobileCallInfoL(callId2, mobileService, KPhoneNumber); - TMockLtsyCallData2 mockData3(0, mobileService, callParams, callInfo2); - mockData3.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData01.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call - call2.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call2.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - TInt callCount(0); - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should be 2 calls now - ASSERT_EQUALS( 2, callCount ); - - // cleanup - - // prepare MockLTSY for hangup - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( EFalse ); - TMockLtsyCallData2 mockHangUpData( callId2, mobileService, hangUpCause, autoStChangeDisable ); - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - CleanupStack::PopAndDestroy( &call2 ); - CleanupStack::PopAndDestroy( &line2 ); - CleanupStack::PopAndDestroy( &phone2 ); - CleanupStack::PopAndDestroy( &telServer2 ); - - // prepare MockLTSY for hangup - TMockLtsyCallData2 mockHangUpData2( callId1, mobileService, hangUpCause, autoStChangeDisable ); - expectData.Close(); - mockHangUpData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( this ); - } - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCTCR-0001a -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::TeardownCallRouting -@SYMTestPriority High -@SYMTestActions Invokes MTelephonyAudioControl::TeardownCallRouting -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestTeardownTelephonyAudio0001aL() - { - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - TRequestStatus status( KErrNone ); - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - - RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId, mobileService); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - - TRequestStatus mockLtsyStatus( KErrNone ); - RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); - TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); - - RLine line; - RMobileCall call; - - TInt error( KErrNone ); - - //------------------------------------------------------------------------- - // TEST C: Successful completion request of - // MTelephonyAudioControl::TeardownCallRouting when result is not cached. - //------------------------------------------------------------------------- - - // MO Call Audio Teardown - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // prepare MockLTSY for hangup - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( ETrue ); - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - completeData.Close(); - TMockLtsyCallData0 mockData3(callId, mobileService); - mockData3.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); - // hangup the call - call.HangUp( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - - TInt callCount(0); - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should not be any calls - ASSERT_EQUALS( 0, callCount ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // MT Call Audio Teardown - - // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // notify incoming call - TName incomingCallName; - line.NotifyIncomingCall( status, incomingCallName ); - - // create incoming call notification - TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); - mockCallData.SerialiseL( completeData ); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - // wait for notification - User::WaitForRequest( status ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // create call ringing notification - completeData.Close(); - mobileCallStatus = RMobileCall::EStatusRinging; - TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); - mockCallData2.SerialiseL(completeData); - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // prepare MockLTSY for answer - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusAnswering ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should not be any calls - ASSERT_EQUALS( 0, callCount ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // MT Call Audio Setup - Immediate Failure Case - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // notify incoming call - line.NotifyIncomingCall( status, incomingCallName ); - - // create incoming call notification - mockCallData.SerialiseL( completeData ); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - // wait for notification - User::WaitForRequest( status ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // create call ringing notification - completeData.Close(); - mockCallData2.SerialiseL(completeData); - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // prepare MockLTSY for answer - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // create error by changing call state back to idle - UpdateCallStatusL( call, RMobileCall::EStatusIdle ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should not be any calls - ASSERT_EQUALS( 0, callCount ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // MT Call Audio Setup - In Progress Failure Case - - // EStatusAnswering -> EStatusIdle - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // notify incoming call - line.NotifyIncomingCall( status, incomingCallName ); - - // create incoming call notification - mockCallData.SerialiseL( completeData ); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - // wait for notification - User::WaitForRequest( status ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // create call ringing notification - completeData.Close(); - mobileCallStatus = RMobileCall::EStatusRinging; - mockCallData2.SerialiseL(completeData); - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // prepare MockLTSY for answer - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call state and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusAnswering ); - - // create error by changing call state back to idle - UpdateCallStatusL( call, RMobileCall::EStatusIdle ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should not be any calls - ASSERT_EQUALS( 0, callCount ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // MT Call Audio Setup - Immediate Failure Case - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - RMobileCall::TMobileCallInfoV8 callInfo2; - callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo2.iService = mobileService; - callInfo2.iStatus = RMobileCall::EStatusUnknown; - callInfo2.iCallId =-1; - callInfo2.iExitCode =0; - callInfo2.iEmergency =0; - callInfo2.iForwarded =0; - callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData4(0, mobileService, callParams, callInfo2); - mockData4.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should not be any calls - ASSERT_EQUALS( 0, callCount ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // MO Call Audio Setup - In Progress Failure Case - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData4.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // create error by setting the call back to the idle - UpdateCallStatusL( call, RMobileCall::EStatusIdle ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should not be any calls - ASSERT_EQUALS( 0, callCount ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // cleanup - AssertMockLtsyStatusL(); - - DeletePropeties(); - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( this ); - } - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCTCR-0001b -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::TeardownCallRouting by using LTSY version1 -@SYMTestPriority High -@SYMTestActions Invokes MTelephonyAudioControl::TeardownCallRouting -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestTeardownTelephonyAudio0001bL() - { - DefinePropeties( ETrue, EVersion1 ); - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - TRequestStatus status( KErrNone ); - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - - RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId, mobileService); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - - TRequestStatus mockLtsyStatus( KErrNone ); - RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); - TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); - - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( ETrue ); - - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - - RLine line; - RMobileCall call; - - TInt error( KErrNone ); - - //------------------------------------------------------------------------- - // TEST C: Successful completion request of - // MTelephonyAudioControl::TeardownCallRouting when result is not cached. - //------------------------------------------------------------------------- - - // MO Call Audio Teardown - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that there is no call routing done - CheckNoCallRouting(); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - completeData.Close(); - TMockLtsyCallData0 mockData3(callId, mobileService); - mockData3.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); - // hangup the call - call.HangUp( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // MT Call Audio Teardown - - // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband - - DefinePropeties( ETrue, EVersion1 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // notify incoming call - TName incomingCallName; - line.NotifyIncomingCall( status, incomingCallName ); - - // create incoming call notification - TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); - mockCallData.SerialiseL( completeData ); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - // wait for notification - User::WaitForRequest( status ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // create call ringing notification - completeData.Close(); - mobileCallStatus = RMobileCall::EStatusRinging; - TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); - mockCallData2.SerialiseL(completeData); - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // prepare MockLTSY for answer - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that there is no call routing done - CheckNoCallRouting(); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // cleanup - DeletePropeties(); - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( this ); - } - - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCTCR-0004 -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for multiple client requests to MTelephonyAudioControl::TeardownCallRouting -@SYMTestPriority High -@SYMTestActions Invokes multiple client requests to MTelephonyAudioControl::TeardownCallRouting -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestTeardownTelephonyAudio0004L() - { - DefinePropeties( EFalse, EVersion2 ); - - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( ETrue ); - - TInt callId1( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - TMockLtsyCallData2 mockHangUpData( callId1, mobileService, hangUpCause, autoStChangeDisable ); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId1, mobileService); - - //------------------------------------------------------------------------- - // Test A: Test multiple clients requesting MTelephonyAudioControl::SetUpCallRouting - //------------------------------------------------------------------------- - - // reset line & call - RLine line; - TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - RMobileCall call; - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId1, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call - TRequestStatus status( KErrNone ); - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - - ASSERT_EQUALS( KErrNone, status.Int() ); - RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); - error = call.GetMobileCallInfo( callInfoPckg ); - - ASSERT_EQUALS( KErrNone, error ); - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - TInt callCount(0); - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - // there should be 1 call now - ASSERT_EQUALS( 1, callCount ); - - // Open second client - RTelServer telServer2; - error = telServer2.Connect(); - ASSERT_EQUALS( KErrNone, error ); - CleanupClosePushL( telServer2 ); - - RMobilePhone phone2; - error = phone2.Open( telServer2,KMmTsyPhoneName ); - CleanupClosePushL( phone2 ); - ASSERT_EQUALS( KErrNone, error ); - - RLine line2; - error = line2.Open( phone2, KMmTsyVoice1LineName ); - CleanupClosePushL( line2 ); - ASSERT_EQUALS( KErrNone, error ); - - RMobileCall call2; - error = call2.OpenNewCall( line2 ); - CleanupClosePushL( call2 ); - ASSERT_EQUALS( KErrNone, error ); - - TInt callId2( 2 ); - // prepare MockLTSY - TMockLtsyCallData0 mockData01(callId2, mobileService); - CallGetMobileCallInfoL(callId2, mobileService, KPhoneNumber); - RMobileCall::TMobileCallInfoV8 callInfo2; - callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo2.iService = mobileService; - callInfo2.iStatus = RMobileCall::EStatusUnknown; - callInfo2.iCallId =-1; - callInfo2.iExitCode =0; - callInfo2.iEmergency =0; - callInfo2.iForwarded =0; - callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData3(0, mobileService, callParams, callInfo2); - mockData3.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData01.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call - call2.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call2.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should be 2 calls now - ASSERT_EQUALS( 2, callCount ); - - // hangup call 1 - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should 1 call - ASSERT_EQUALS( 1, callCount ); - - // hangup call 2 - error = call2.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - UpdateCallStatusL( call2, RMobileCall::EStatusDisconnectingWithInband, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should not be any calls - ASSERT_EQUALS( 0, callCount ); - - // cleanup - CleanupStack::PopAndDestroy( &call2 ); - CleanupStack::PopAndDestroy( &line2 ); - CleanupStack::PopAndDestroy( &phone2 ); - CleanupStack::PopAndDestroy( &telServer2 ); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( this ); - } - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCCRST-0001a -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::CallStateChange -@SYMTestPriority High -@SYMTestActions Invokes MTelephonyAudioControl::CallStateChange -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestCallStateChange0001aL() - - { - - /* CallStateChange function is called when call has changed its state to the following states: - EStatusDialling - EStatusAnswering - EStatusConnecting - EStatusHold - EStatusDisconnecting - EStatusDisconnectingWithInband - EStatusConnected - */ - DefinePropeties( ETrue, EVersion2 ); - - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 data; - CleanupClosePushL(data); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - TRequestStatus status( KErrNone ); - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - - RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId, mobileService); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - - TRequestStatus mockLtsyStatus( KErrNone ); - RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); - TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); - - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( ETrue ); - - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - - RLine line; - RMobileCall call; - - //------------------------------------------------------------------------- - // TEST C: Successful completion request of - // MTelephonyAudioControl::CallStateChange when result is not cached. - //------------------------------------------------------------------------- - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting - - // reset line & call - TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - completeData.Close(); - TMockLtsyCallData0 mockData3(callId, mobileService); - mockData3.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); - // hangup the call - call.HangUp( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - RMobileCall::TMobileCallInfoV8 callInfo2; - callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo2.iService = mobileService; - callInfo2.iStatus = RMobileCall::EStatusUnknown; - callInfo2.iCallId =-1; - callInfo2.iExitCode =0; - callInfo2.iEmergency =0; - callInfo2.iForwarded =0; - callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData6(0, mobileService, callParams, callInfo2); - mockData6.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // notify incoming call - TName incomingCallName; - line.NotifyIncomingCall( status, incomingCallName ); - - // create incoming call notification - TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); - mockCallData.SerialiseL( completeData ); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - // wait for notification - User::WaitForRequest( status ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // create call ringing notification - mobileCallStatus = RMobileCall::EStatusRinging; - TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); - completeData.Close(); - mockCallData2.SerialiseL(completeData); - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // prepare MockLTSY for answer - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); - CheckCallStatus( incomingCallName, RMobileCall::EStatusAnswering ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( incomingCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( incomingCallName, RMobileCall::EStatusConnected ); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - completeData.Close(); - TMockLtsyCallData0 mockData4(callId, mobileService); - mockData4.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); - // hangup the call - call.HangUp( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); - CheckCallStatus( incomingCallName, RMobileCall::EStatusDisconnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( incomingCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband - - // reset properties - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // notify incoming call - line.NotifyIncomingCall( status, incomingCallName ); - - // create incoming call notification - mockCallData.SerialiseL( completeData ); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - // wait for notification - User::WaitForRequest( status ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // create call ringing notification - completeData.Close(); - mockCallData2.SerialiseL(completeData); - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // prepare MockLTSY for answer - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusAnswering ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusHold -> EStatusConnected -> EStatusDisconnectingWithInband -> EStatusIdle - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData6.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // prepare MockLTSY for hold - expectData.Close(); - mockData0.SerialiseL(expectData); - iMockLTSY.ExpectL( EMobileCallHold, expectData ); - iMockLTSY.CompleteL( EMobileCallHold, KErrNone, expectData ); - - call.Hold( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusHold ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusHold ); - - // prepare MockLTSY for resume - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EMobileCallResume, expectData ); - iMockLTSY.CompleteL( EMobileCallResume, KErrNone, expectData ); - - call.Resume( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusHold -> EStatusDisconnecting -> EStatusIdle - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData6.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // prepare MockLTSY for hold - expectData.Close(); - mockData0.SerialiseL(expectData); - iMockLTSY.ExpectL( EMobileCallHold, expectData ); - iMockLTSY.CompleteL( EMobileCallHold, KErrNone, expectData ); - - call.Hold( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusHold ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusHold ); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - completeData.Close(); - TMockLtsyCallData0 mockData5(callId, mobileService); - mockData5.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); - // hangup the call - call.HangUp( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusHold -> EStatusDisconnectingWithInband -> EStatusIdle - - DefinePropeties( ETrue, EVersion2 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData6.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - // prepare MockLTSY for hold - expectData.Close(); - mockData0.SerialiseL(expectData); - iMockLTSY.ExpectL( EMobileCallHold, expectData ); - iMockLTSY.CompleteL( EMobileCallHold, KErrNone, expectData ); - - call.Hold( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusHold ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusHold ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // cleanup - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( &data ); - CleanupStack::PopAndDestroy( this ); - } - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCCRST-0001b -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::CallStateChange by using LTSY version1 -@SYMTestPriority High -@SYMTestActions Invokes MTelephonyAudioControl::CallStateChange -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestCallStateChange0001bL() - - { - - /* CallStateChange function is called when call has changed its state to the following states: - EStatusDialling - EStatusAnswering - EStatusConnecting - EStatusDisconnecting - EStatusDisconnectingWithInband - EStatusConnected - */ - DefinePropeties( ETrue, EVersion1 ); - - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 data; - CleanupClosePushL(data); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - TRequestStatus status( KErrNone ); - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - - RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId, mobileService); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - - TRequestStatus mockLtsyStatus( KErrNone ); - RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); - TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); - - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( ETrue ); - - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - - RLine line; - RMobileCall call; - - //------------------------------------------------------------------------- - // TEST C: Successful completion request of - // MTelephonyAudioControl::CallStateChange when result is not cached. - //------------------------------------------------------------------------- - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting - - // reset line & call - TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - completeData.Close(); - TMockLtsyCallData0 mockData3(callId, mobileService); - mockData3.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); - // hangup the call - call.HangUp( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband - - DefinePropeties( ETrue, EVersion1 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - RMobileCall::TMobileCallInfoV8 callInfo2; - callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo2.iService = mobileService; - callInfo2.iStatus = RMobileCall::EStatusUnknown; - callInfo2.iCallId =-1; - callInfo2.iExitCode =0; - callInfo2.iEmergency =0; - callInfo2.iForwarded =0; - callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData5(0, mobileService, callParams, callInfo2); - mockData5.SerialiseL(expectData); - - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting - - DefinePropeties( ETrue, EVersion1 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // notify incoming call - TName incomingCallName; - line.NotifyIncomingCall( status, incomingCallName ); - - // create incoming call notification - TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); - mockCallData.SerialiseL( completeData ); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - // wait for notification - User::WaitForRequest( status ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // create call ringing notification - mobileCallStatus = RMobileCall::EStatusRinging; - TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); - completeData.Close(); - mockCallData2.SerialiseL(completeData); - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // prepare MockLTSY for answer - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // check that there is no call routing done - CheckNoCallRouting(); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // prepare MockLTSY for hangup - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - - completeData.Close(); - TMockLtsyCallData0 mockData4(callId, mobileService); - mockData4.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); - // hangup the call - call.HangUp( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband - - DefinePropeties( ETrue, EVersion1 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - // notify incoming call - line.NotifyIncomingCall( status, incomingCallName ); - - // create incoming call notification - mockCallData.SerialiseL( completeData ); - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - // wait for notification - User::WaitForRequest( status ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // create call ringing notification - completeData.Close(); - mockCallData2.SerialiseL(completeData); - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - // prepare MockLTSY for answer - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - DoCleanup(); - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusHold -> EStatusDisconnectingWithInband -> EStatusIdle - - DefinePropeties( ETrue, EVersion1 ); - OpenEtelServerL(EUseExtendedError); - OpenPhoneL(); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData5.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // prepare MockLTSY for hold - expectData.Close(); - mockData0.SerialiseL(expectData); - iMockLTSY.ExpectL( EMobileCallHold, expectData ); - iMockLTSY.CompleteL( EMobileCallHold, KErrNone, expectData ); - - call.Hold( status ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusHold ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // change call status - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - - // check that there is no call routing done - CheckNoCallRouting(); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // cleanup - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( &data ); - CleanupStack::PopAndDestroy( this ); - - } - -/** -@SYMTestCaseID BA-CTSY-CRC-CRCCRST-0004 -@SYMComponent telephony_ctsy -@SYMTestCaseDesc Test support in CTSY for multiple client requests to MTelephonyAudioControl::CallStateChange -@SYMTestPriority High -@SYMTestActions Invokes multiple client requests to MTelephonyAudioControl::CallStateChange -@SYMTestExpectedResults Pass -@SYMTestType CT - */ -void CCTsyTelephonyAudioControlFU::TestCallStateChange0004L() - { - DefinePropeties( EFalse, EVersion2 ); - - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 data; - CleanupClosePushL(data); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - TRequestStatus status( KErrNone ); - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId, mobileService); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - - TRequestStatus mockLtsyStatus( KErrNone ); - RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); - TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); - - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( ETrue ); - - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - - RLine line; - RMobileCall call; - - //------------------------------------------------------------------------- - // Test A: Test multiple clients requesting MTelephonyAudioControl::CallStateChange - //------------------------------------------------------------------------- - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband -> EStatusIdle - - // reset line & call - TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // dial the call - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - AssertMockLtsyStatusL(); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - AssertMockLtsyStatusL(); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - AssertMockLtsyStatusL(); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - AssertMockLtsyStatusL(); - - // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting - - // Open second client - RTelServer telServer2; - error = telServer2.Connect(); - ASSERT_EQUALS( KErrNone, error ); - CleanupClosePushL( telServer2 ); - - RMobilePhone phone2; - error = phone2.Open( telServer2,KMmTsyPhoneName ); - ASSERT_EQUALS( KErrNone, error ); - CleanupClosePushL( phone2 ); - - RLine line2; - error = line2.Open( phone2, KMmTsyVoice1LineName ); - CleanupClosePushL( line2 ); - ASSERT_EQUALS( KErrNone, error ); - - RMobileCall call2; - error = call2.OpenNewCall( line2 ); - CleanupClosePushL( call2 ); - ASSERT_EQUALS( KErrNone, error ); - - TInt callId2( 2 ); - // prepare MockLTSY for call 2 dial - TMockLtsyCallData0 mockData01(callId2, mobileService); - CallGetMobileCallInfoL(callId2, mobileService, KPhoneNumber); - RMobileCall::TMobileCallInfoV8 callInfo2; - callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo2.iService = mobileService; - callInfo2.iStatus = RMobileCall::EStatusUnknown; - callInfo2.iCallId =-1; - callInfo2.iExitCode =0; - callInfo2.iEmergency =0; - callInfo2.iForwarded =0; - callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData3(0, mobileService, callParams, callInfo2); - mockData3.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData01.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call 2 - call2.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - AssertMockLtsyStatusL(); - - error = call2.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // check that call status it is OK - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - AssertMockLtsyStatusL(); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusConnecting ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - AssertMockLtsyStatusL(); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusConnected ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - TInt callCount(0); - error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should be 2 calls now - ASSERT_EQUALS( 2, callCount ); - - // hangup call 1 - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - error = call2.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // hangup call 2 - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusDisconnectingWithInband, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); - - // change call status and check it is OK - UpdateCallStatusL( call2, RMobileCall::EStatusIdle, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - CleanupStack::PopAndDestroy( &call2 ); - CleanupStack::PopAndDestroy( &line2 ); - CleanupStack::PopAndDestroy( &phone2 ); - CleanupStack::PopAndDestroy( &telServer2 ); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( &data ); - CleanupStack::PopAndDestroy( this ); - } - -void CCTsyTelephonyAudioControlFU::UpdateCallStatusL( RMobileCall& aMobileCall, - RMobileCall::TMobileCallStatus aMobileCallStatus, - TBool aUpdateTimer, - TBool aHangUp ) - { - RMobileCall::TMobileCallInfoV1 callInfo; - RMobileCall::TMobileCallInfoV1Pckg callInfoPckg( callInfo ); - TInt error = aMobileCall.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - TMockLtsyCallData1 mockCallData(callInfo.iCallId, callInfo.iService, aMobileCallStatus ); - completeData.Close(); - mockCallData.SerialiseL(completeData); - - TRequestStatus mockLtsyStatus( KErrNone ); - - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData ); - - if ( aHangUp ) - { - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV1 callParams; - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( ETrue ); - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - expectData.Close(); - mockHangUpData.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); - } - - if ( aUpdateTimer ) - { - // when call becomes idle, remaining duration of the call is added to life time param in LTSY: - TUint32 duration = 9; // this is a dummy value, which won't be checked by mocksy engine - TMockLtsyData1 timerData( duration ); - expectData.Close(); - timerData.SerialiseL(expectData); - iMockLTSY.ExpectL(EMmTsyUpdateLifeTimeIPC, expectData); - } - - User::WaitForRequest(mockLtsyStatus); - - AssertMockLtsyStatusL(); - - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int() ); - - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( &completeData ); - - error = aMobileCall.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - } - -void CCTsyTelephonyAudioControlFU::CheckCallRoutingValues( RLine& aLine, RMobileCall& aCall ) - { - TInt callCount(0); - TInt error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - TInt count(0); - error = aLine.EnumerateCall( count ); - ASSERT_EQUALS( KErrNone, error ); - ASSERT_EQUALS( callCount, count ); - - RMobileCall::TMobileCallInfoV1 callInfo; - RMobileCall::TMobileCallInfoV1Pckg callInfoPckg( callInfo ); - error = aCall.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - TName callName; - error = RProperty::Get( KMockLtsyFactoryProperty, ECallName, callName ); - ASSERT_EQUALS( KErrNone, error ); - ASSERT_EQUALS( 0, callInfo.iCallName.Compare( callName ) ); - - TBool emergency( ETrue ); - error = RProperty::Get( KMockLtsyFactoryProperty, EEmergencyCall, emergency ); - ASSERT_EQUALS( KErrNone, error ); - ASSERT_EQUALS( emergency, callInfo.iEmergency ); - - TInt direction(0); - error = RProperty::Get( KMockLtsyFactoryProperty, ECallDirection, direction ); - RMobileCall::TMobileCallDirection calldirection = (RMobileCall::TMobileCallDirection) direction; - ASSERT_EQUALS( KErrNone, error ); - ASSERT_EQUALS( calldirection, callInfo.iRemoteParty.iDirection ); - - TInt callType( 0 ); - error = RProperty::Get( KMockLtsyFactoryProperty, ECallType, callType ); - MTelephonyAudioControl::TTelephonyAudioControlCallType callRoutingType = ( MTelephonyAudioControl::TTelephonyAudioControlCallType ) callType; - ASSERT_EQUALS( KErrNone, error ); - ASSERT_EQUALS( callRoutingType, MTelephonyAudioControl::ECallTypeVoice ); - } - - -void CCTsyTelephonyAudioControlFU::DefinePropeties( TBool aReset, TMockLtsyFactoryVersions aVersion ) - { - DeletePropeties(); - - TInt error = RProperty::Define( KMockLtsyFactoryProperty, ENumberOfCalls, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, ECallName, RProperty::EText ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, EEmergencyCall, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, ECallDirection, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, EHangUpReason, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, ECallType, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, EReturnErrorCode, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, EReset, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, ECallStatus, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReset, aReset ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, EVersionProperty, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EVersionProperty, aVersion ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Define( KMockLtsyFactoryProperty, EComplete, RProperty::EInt ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EComplete, EFalse ); - ASSERT_EQUALS( KErrNone, error ); - } - - -void CCTsyTelephonyAudioControlFU::CheckCallStatus( TName& aCallName, RMobileCall::TMobileCallStatus aMobileCallStatus ) - { - TName callName; - TInt error = RProperty::Get( KMockLtsyFactoryProperty, ECallName, callName ); - ASSERT_EQUALS( KErrNone, error ); - ASSERT_EQUALS( 0, aCallName.Compare( callName ) ); - - TInt status( 0 ); - error = RProperty::Get( KMockLtsyFactoryProperty, ECallStatus, status ); - RMobileCall::TMobileCallStatus callStatus = ( RMobileCall::TMobileCallStatus ) status; - ASSERT_EQUALS( KErrNone, error ); - ASSERT_EQUALS( callStatus, aMobileCallStatus ); - } - -void CCTsyTelephonyAudioControlFU::DeletePropeties() - { - TInt error = RProperty::Delete(KMockLtsyFactoryProperty, ENumberOfCalls ); - error = RProperty::Delete(KMockLtsyFactoryProperty, ECallName ); - error = RProperty::Delete(KMockLtsyFactoryProperty, EEmergencyCall ); - error = RProperty::Delete(KMockLtsyFactoryProperty, ECallDirection ); - error = RProperty::Delete(KMockLtsyFactoryProperty, EHangUpReason ); - error = RProperty::Delete(KMockLtsyFactoryProperty, ECallType ); - error = RProperty::Delete(KMockLtsyFactoryProperty, EReturnErrorCode ); - error = RProperty::Delete(KMockLtsyFactoryProperty, EReset ); - error = RProperty::Delete(KMockLtsyFactoryProperty, ECallStatus ); - error = RProperty::Delete(KMockLtsyFactoryProperty, EVersionProperty ); - error = RProperty::Delete(KMockLtsyFactoryProperty, EComplete ); - } - -void CCTsyTelephonyAudioControlFU::CheckNoCallRouting() - { - // check that there is no calls in call routing control - TInt callCount(0); - TInt error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); - ASSERT_EQUALS( KErrNone, error ); - - // there should not be any calls - ASSERT_EQUALS( 0, callCount ); - - // check that the call name is still undefined - TName callName; - error = RProperty::Get( KMockLtsyFactoryProperty, ECallName, callName ); - ASSERT_EQUALS( KErrNone, error ); - ASSERT_EQUALS( 0, callName.Compare( KNullDesC ) ); - } - -CCTsyTelephonyAudioControlFU::~CCTsyTelephonyAudioControlFU() - { - DeletePropeties(); - } - -void CCTsyTelephonyAudioControlFU::TestNotifyTelephonyAudioControlError0001L() - { - DefinePropeties( ETrue, EVersion2 ); - - OpenEtelServerL(EUseExtendedError); - CleanupStack::PushL(TCleanupItem(Cleanup,this)); - OpenPhoneL(); - - RBuf8 data; - CleanupClosePushL(data); - - RBuf8 expectData; - CleanupClosePushL(expectData); - - RBuf8 completeData; - CleanupClosePushL(completeData); - - TRequestStatus status( KErrNone ); - TInt callId( 1 ); - RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); - RMobileCall::TMobileCallParamsV7 callParams; - RMobileCall::TMobileCallInfoV8 callInfo; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo.iService = mobileService; - callInfo.iStatus = RMobileCall::EStatusUnknown; - callInfo.iCallId =-1; - callInfo.iExitCode =0; - callInfo.iEmergency =0; - callInfo.iForwarded =0; - callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); - TMockLtsyCallData0 mockData0(callId, mobileService); - - RCall::TCallParams callParamsX1; - TPckg pckgCallParamsX1(callParamsX1); - - TRequestStatus mockLtsyStatus( KErrNone ); - RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); - - TInt hangUpCause( KErrGsmReleaseByUser ); - TBool autoStChangeDisable ( EFalse ); - - TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); - - RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); - - RLine line; - RMobileCall call; - - //------------------------------------------------------------------------- - // TEST A: failure to dispatch request to LTSY - //------------------------------------------------------------------------- - - // DialL - - // error when call is in RMobileCall::EStatusDialling - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line & call - TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData2.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call where SetupTelephonyAudio fails - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling, EFalse, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); - ASSERT_EQUALS( KErrNone, error ); - - UpdateCallStatusL( call, RMobileCall::EStatusIdle ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - - // DialL - - // error when call is in RMobileCall::EStatusDialling - // in VoiceLine 2 - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice2LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - RMobilePhone::TMobileService mobileService2( RMobilePhone::EAuxVoiceService ); - RMobileCall::TMobileCallInfoV8 callInfo2; - callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; - callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; - callParams.iInterval = 100; - callParams.iWaitForDialTone = RCall::EDialToneWait; - callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; - callParams.iCug.iExplicitInvoke = EFalse; - callParams.iCug.iCugIndex = 0xFFFF; - callParams.iCug.iSuppressPrefCug = EFalse; - callParams.iCug.iSuppressOA = EFalse; - callParams.iAutoRedial = EFalse; - callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo2.iService = mobileService2; - callInfo2.iStatus = RMobileCall::EStatusUnknown; - callInfo2.iCallId =-1; - callInfo2.iExitCode =0; - callInfo2.iEmergency =0; - callInfo2.iForwarded =0; - callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData3(0, mobileService2, callParams, callInfo2); - TMockLtsyCallData0 mockData4(callId, mobileService2); - - RCall::TCallParams callParamsX2; - TPckg pckgCallParamsX2(callParamsX2); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService2, KPhoneNumber ); - mockData3.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData4.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call where SetupTelephonyAudio fails - call.Dial( status, pckgCallParamsX2, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling, EFalse, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); - ASSERT_EQUALS( KErrNone, error ); - - UpdateCallStatusL( call, RMobileCall::EStatusIdle ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - - // error when call is in RMobileCall::EStatusConnecting - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; - callInfo2.iService = mobileService; - callInfo2.iStatus = RMobileCall::EStatusUnknown; - callInfo2.iCallId =-1; - callInfo2.iExitCode =0; - callInfo2.iEmergency =0; - callInfo2.iForwarded =0; - callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; - callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; - callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; - callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; - callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); - TMockLtsyCallData2 mockData5(0, mobileService, callParams, callInfo2); - mockData5.SerialiseL(expectData); - - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call where SetupTelephonyAudio fails - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting, EFalse, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); - ASSERT_EQUALS( KErrNone, error ); - - UpdateCallStatusL( call, RMobileCall::EStatusIdle ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - - // error when call is in RMobileCall::EStatusConnected - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line & call - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - error = call.OpenNewCall( line ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // prepare MockLTSY - CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); - mockData5.SerialiseL(expectData); - iMockLTSY.ExpectL(EEtelCallDial, expectData); - mockData0.SerialiseL(completeData); - iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); - - // make the call where SetupTelephonyAudio fails - call.Dial( status, pckgCallParamsX1, KPhoneNumber ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusDialling ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnecting, EFalse, EFalse ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusConnected, EFalse, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); - ASSERT_EQUALS( KErrNone, error ); - - UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue, EFalse ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - // cleanup - AssertMockLtsyStatusL(); - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - - // error when call is in RMobileCall::EStatusAnswering - - // reset the properties to ensure to get valid data - DefinePropeties( ETrue, EVersion2 ); - - // reset line - error = line.Open( iPhone, KMmTsyVoice1LineName ); - CleanupClosePushL( line ); - ASSERT_EQUALS( KErrNone, error ); - - TName incomingCallName; - TRequestStatus requestNotify( KErrNone ); - line.NotifyIncomingCall( status, incomingCallName); - - TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); - mockCallData.SerialiseL( completeData ); - - iMockLTSY.NotifyTerminated( mockLtsyStatus ); - iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; - User::WaitForRequest( mockLtsyStatus ); - - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); - - User::WaitForRequest( requestNotify ); - AssertMockLtsyStatusL(); - ASSERT_EQUALS( KErrNone, requestNotify.Int() ); - - mobileCallStatus = RMobileCall::EStatusRinging; - TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); - completeData.Close(); - mockCallData2.SerialiseL(completeData); - - iMockLTSY.NotifyTerminated(mockLtsyStatus); - iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); - User::WaitForRequest(mockLtsyStatus); - AssertMockLtsyStatusL(); - ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); - - expectData.Close(); - mockData0.SerialiseL( expectData ); - iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); - iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); - - // reset the call - error = call.OpenExistingCall( line, incomingCallName ); - CleanupClosePushL( call ); - ASSERT_EQUALS( KErrNone, error ); - - // answer the call - call.AnswerIncomingCall( status, pckgCallParamsX1 ); - User::WaitForRequest( status ); - ASSERT_EQUALS( KErrNone, status.Int() ); - - error = call.GetMobileCallInfo( callInfoPckg ); - ASSERT_EQUALS( KErrNone, error ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); - ASSERT_EQUALS( KErrNone, error ); - - // change call status and check it is OK - UpdateCallStatusL( call, RMobileCall::EStatusAnswering, EFalse, ETrue ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusAnswering ); - - error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); - ASSERT_EQUALS( KErrNone, error ); - - UpdateCallStatusL( call, RMobileCall::EStatusIdle, EFalse, EFalse ); - CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); - - CleanupStack::PopAndDestroy( &call ); - CleanupStack::PopAndDestroy( &line ); - AssertMockLtsyStatusL(); - - // cleanup - CleanupStack::PopAndDestroy( &completeData ); - CleanupStack::PopAndDestroy( &expectData ); - CleanupStack::PopAndDestroy( &data ); - CleanupStack::PopAndDestroy( this ); - } - -// End of File +// 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: +// The TEFUnit test suite for TelephonyAudioControl in the Common TSY. +// +// + +#include "cctsytelephonyaudiocontrolfu.h" +#include +#include +#include +#include +#include +#include +#include "tmockltsydata.h" +#include +#include + +_LIT( KPhoneNumber, "101632960000" ); + +CTestSuite* CCTsyTelephonyAudioControlFU::CreateSuiteL(const TDesC& aName) + { + SUB_SUITE; + + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestSetupTelephonyAudio0001aL); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestSetupTelephonyAudio0001bL); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestSetupTelephonyAudio0004L); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestTeardownTelephonyAudio0001aL); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestTeardownTelephonyAudio0001bL); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestTeardownTelephonyAudio0004L); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestCallStateChange0001aL); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestCallStateChange0001bL); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestCallStateChange0004L); + ADD_TEST_STEP_ISO_CPP(CCTsyTelephonyAudioControlFU, TestNotifyTelephonyAudioControlError0001L ); + + END_SUITE; + } + +// +// Actual test cases +// + + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCSUCR-0001a +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::SetUpCallRouting +@SYMTestPriority High +@SYMTestActions Invokes MTelephonyAudioControl::SetUpCallRouting +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestSetupTelephonyAudio0001aL() + { + DefinePropeties( ETrue, EVersion2 ); + + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 data; + CleanupClosePushL(data); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + TRequestStatus status( KErrNone ); + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId, mobileService); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + + TRequestStatus mockLtsyStatus( KErrNone ); + RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); + TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); + + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( EFalse ); + + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + + RLine line; + RMobileCall call; + + //------------------------------------------------------------------------- + // TEST C: Successful completion request of + // MTelephonyAudioControl::SetUpCallRouting when result is not cached. + //------------------------------------------------------------------------- + + // DialL + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line & call + TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that values passed to the SetupCallRouting were valid + CheckCallRoutingValues( line, call ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + + // DialNoFdnCheck + + // reset line and call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + expectData.Close(); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EMobileCallDialNoFdnCheck, expectData); + completeData.Close(); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EMobileCallDialNoFdnCheck, KErrNone, completeData); + + // make the call + call.DialNoFdnCheck( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that values passed to the SetupCallRouting were valid + CheckCallRoutingValues( line, call ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // DialISV + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line and call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + expectData.Close(); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + completeData.Close(); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + call.DialISV( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that values passed to the SetupCallRouting were valid + CheckCallRoutingValues( line, call ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // Ghost Call + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // order NotifyStatusChange event + RCall::TStatus callStatus( RCall::EStatusIdle ); + line.NotifyStatusChange( status, callStatus ); + + // prepare MockLTSY for NotifyStatusChange event + iMockLTSY.NotifyTerminated(mockLtsyStatus); + RMobileCall::TMobileCallInfoV1 mobileCallInfo; + mobileCallInfo.iCallId = callId; + mobileCallInfo.iService = mobileService; + mobileCallInfo.iStatus = RMobileCall::EStatusDialling; + mobileCallInfo.iCallName.Copy( _L8("Voice12") ); + + TMockLtsyCallData1 mockCallData1(callId, mobileService, mobileCallInfo); + mockCallData1.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallGetMobileCallInfo, KErrNone, data); + + User::WaitForRequest(mockLtsyStatus); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + User::WaitForRequest(status); + ASSERT_EQUALS(KErrNone, status.Int()); + ASSERT_EQUALS(RCall::EStatusDialling, callStatus); + + error = call.OpenExistingCall( line, mobileCallInfo.iCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + data.Close(); + completeCallStatusData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); + + call.NotifyMobileCallStatusChange( status, mobileCallStatus ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + AssertMockLtsyStatusL(); + + CheckCallStatus( mobileCallInfo.iCallName, RMobileCall::EStatusConnecting ); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL( EEtelCallHangUp, expectData, KErrNone ); + + // hangup the call by popping the call from the cleanupstack + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // DialEmergencyCall + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line and call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // set rf on + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + TRfStateInfo rfInfo = ERfsStateInfoNormal; + TMockLtsyData1 mockData1( rfInfo ); + expectData.Close(); + mockData1.SerialiseL(expectData); + iMockLTSY.CompleteL(EMmTsyBootGetRFStatusIPC, KErrNone, expectData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // the emergency number + RMobileENStore::TEmergencyNumber number(_L("911")); + TMockLtsyData1 numberLtsyData( number ); + + CallGetMobileCallInfoL(callId, mobileService, number ); + + // prepare MockLTSY for EMobileCallDialEmergencyCall + data.Close(); + numberLtsyData.SerialiseL(data); + iMockLTSY.ExpectL(EMobileCallDialEmergencyCall, data, KErrNone); + + TMockLtsyCallData1 completeCallInfoData( callId, mobileService, callInfo ); + + // send EStatusDialling, EStatusConnecting and EStatusConnected events to complete DialEmergencyCall + data.Close(); + completeCallInfoData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallGetMobileCallInfo, KErrNone, data); + + mobileCallStatus = RMobileCall::EStatusDialling; + completeCallStatusData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); + + data.Close(); + mobileCallStatus = RMobileCall::EStatusConnecting; + completeCallStatusData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); + + data.Close(); + mobileCallStatus = RMobileCall::EStatusConnected; + completeCallStatusData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); + + // On return, KErrNone if the emergency call successfully reaches the connected state. + call.DialEmergencyCall( status, number ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that values passed to the SetupCallRouting were valid + CheckCallRoutingValues( line, call ); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + // hangup the call by popping the call from the cleanupstack + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + + // cleanup + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // answer incoming call + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + TName incomingCallName; + TRequestStatus requestNotify( KErrNone ); + line.NotifyIncomingCall( status, incomingCallName); + + TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); + mockCallData.SerialiseL( completeData ); + + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + User::WaitForRequest( requestNotify ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, requestNotify.Int() ); + + mobileCallStatus = RMobileCall::EStatusRinging; + TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); + completeData.Close(); + mockCallData2.SerialiseL(completeData); + + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that values passed to the SetupCallRouting were valid + CheckCallRoutingValues( line, call ); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + // hangup the call by popping the call from the cleanupstack + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + + // cleanup + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // cleanup + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( &data ); + CleanupStack::PopAndDestroy( this ); + } + + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCSUCR-0001b +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::SetUpCallRouting by using LTSY version1 +@SYMTestPriority High +@SYMTestActions Test that call routing is not set up +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestSetupTelephonyAudio0001bL() + { + DefinePropeties( ETrue, EVersion1 ); + + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + RBuf8 data; + CleanupClosePushL(data); + + TRequestStatus status( KErrNone ); + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId, mobileService); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + + RLine line; + RMobileCall call; + + //------------------------------------------------------------------------- + // TEST C: Successful completion request of + // MTelephonyAudioControl::SetUpCallRouting when result is not cached. + //------------------------------------------------------------------------- + + // Test that CMockLtsyFactoryV1 is used instead of CMockLtsyFactoryV2 + + // DialL + + // reset line & call + TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + + // DialNoFdnCheck + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion1 ); + + // reset line and call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + expectData.Close(); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EMobileCallDialNoFdnCheck, expectData); + completeData.Close(); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EMobileCallDialNoFdnCheck, KErrNone, completeData); + + // make the call + call.DialNoFdnCheck( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // DialEmergencyCall + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion1 ); + + // reset line and call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // set rf on + TRequestStatus mockLtsyStatus(KErrNone); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + TRfStateInfo rfInfo = ERfsStateInfoNormal; + TMockLtsyData1 mockData1( rfInfo ); + expectData.Close(); + mockData1.SerialiseL(expectData); + iMockLTSY.CompleteL(EMmTsyBootGetRFStatusIPC, KErrNone, expectData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // the emergency number + RMobileENStore::TEmergencyNumber number(_L("911")); + TMockLtsyData1 numberLtsyData( number ); + + CallGetMobileCallInfoL(callId, mobileService, number ); + + // prepare MockLTSY for EMobileCallDialEmergencyCall + data.Close(); + numberLtsyData.SerialiseL(data); + iMockLTSY.ExpectL(EMobileCallDialEmergencyCall, data, KErrNone); + + TMockLtsyCallData1 completeCallInfoData( callId, mobileService, callInfo ); + + // send EStatusDialling, EStatusConnecting and EStatusConnected events to complete DialEmergencyCall + data.Close(); + completeCallInfoData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallGetMobileCallInfo, KErrNone, data); + + RMobileCall::TMobileCallStatus mobileCallStatus(RMobileCall::EStatusDialling); + TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); + completeCallStatusData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); + + data.Close(); + mobileCallStatus = RMobileCall::EStatusConnecting; + completeCallStatusData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); + + data.Close(); + mobileCallStatus = RMobileCall::EStatusConnected; + completeCallStatusData.SerialiseL(data); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, data); + + // On return, KErrNone if the emergency call successfully reaches the connected state. + call.DialEmergencyCall( status, number ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // prepare MockLTSY for hangup + expectData.Close(); + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( EFalse ); + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + // hangup the call by popping the call from the cleanupstack + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + + // cleanup + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // cleanup + CleanupStack::PopAndDestroy( &data ); + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( this ); + } + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCSUCR-0004 +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for multiple client requests to MTelephonyAudioControl::SetUpCallRouting +@SYMTestPriority High +@SYMTestActions Invokes multiple client requests to MTelephonyAudioControl::SetUpCallRouting +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestSetupTelephonyAudio0004L() + { + DefinePropeties( EFalse, EVersion2 ); + + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + //------------------------------------------------------------------------- + // Test A: Test multiple clients requesting MTelephonyAudioControl::SetUpCallRouting + //------------------------------------------------------------------------- + + TInt callId1( 1 ); + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + + RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId1, mobileService); + + // reset line & call + RLine line; + TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + RMobileCall call; + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId1, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call + TRequestStatus status( KErrNone ); + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // Open second client + RTelServer telServer2; + error = telServer2.Connect(); + ASSERT_EQUALS( KErrNone, error ); + CleanupClosePushL( telServer2 ); + + RMobilePhone phone2; + error = phone2.Open( iTelServer,KMmTsyPhoneName ); + ASSERT_EQUALS( KErrNone, error ); + CleanupClosePushL( phone2 ); + + RLine line2; + error = line2.Open( phone2, KMmTsyVoice1LineName ); + CleanupClosePushL( line2 ); + ASSERT_EQUALS( KErrNone, error ); + + RMobileCall call2; + error = call2.OpenNewCall( line2 ); + CleanupClosePushL( call2 ); + ASSERT_EQUALS( KErrNone, error ); + + TInt callId2( 2 ); + // prepare MockLTSY + RMobileCall::TMobileCallInfoV8 callInfo2; + callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo2.iService = mobileService; + callInfo2.iStatus = RMobileCall::EStatusUnknown; + callInfo2.iCallId =-1; + callInfo2.iExitCode =0; + callInfo2.iEmergency =0; + callInfo2.iForwarded =0; + callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData0 mockData01(callId2, mobileService); + CallGetMobileCallInfoL(callId2, mobileService, KPhoneNumber); + TMockLtsyCallData2 mockData3(0, mobileService, callParams, callInfo2); + mockData3.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData01.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call + call2.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call2.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + TInt callCount(0); + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should be 2 calls now + ASSERT_EQUALS( 2, callCount ); + + // cleanup + + // prepare MockLTSY for hangup + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( EFalse ); + TMockLtsyCallData2 mockHangUpData( callId2, mobileService, hangUpCause, autoStChangeDisable ); + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + CleanupStack::PopAndDestroy( &call2 ); + CleanupStack::PopAndDestroy( &line2 ); + CleanupStack::PopAndDestroy( &phone2 ); + CleanupStack::PopAndDestroy( &telServer2 ); + + // prepare MockLTSY for hangup + TMockLtsyCallData2 mockHangUpData2( callId1, mobileService, hangUpCause, autoStChangeDisable ); + expectData.Close(); + mockHangUpData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( this ); + } + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCTCR-0001a +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::TeardownCallRouting +@SYMTestPriority High +@SYMTestActions Invokes MTelephonyAudioControl::TeardownCallRouting +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestTeardownTelephonyAudio0001aL() + { + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + TRequestStatus status( KErrNone ); + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + + RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId, mobileService); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + + TRequestStatus mockLtsyStatus( KErrNone ); + RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); + TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); + + RLine line; + RMobileCall call; + + TInt error( KErrNone ); + + //------------------------------------------------------------------------- + // TEST C: Successful completion request of + // MTelephonyAudioControl::TeardownCallRouting when result is not cached. + //------------------------------------------------------------------------- + + // MO Call Audio Teardown + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // prepare MockLTSY for hangup + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( ETrue ); + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + completeData.Close(); + TMockLtsyCallData0 mockData3(callId, mobileService); + mockData3.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); + // hangup the call + call.HangUp( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + + TInt callCount(0); + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should not be any calls + ASSERT_EQUALS( 0, callCount ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // MT Call Audio Teardown + + // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // notify incoming call + TName incomingCallName; + line.NotifyIncomingCall( status, incomingCallName ); + + // create incoming call notification + TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); + mockCallData.SerialiseL( completeData ); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + // wait for notification + User::WaitForRequest( status ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // create call ringing notification + completeData.Close(); + mobileCallStatus = RMobileCall::EStatusRinging; + TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); + mockCallData2.SerialiseL(completeData); + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // prepare MockLTSY for answer + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusAnswering ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should not be any calls + ASSERT_EQUALS( 0, callCount ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // MT Call Audio Setup - Immediate Failure Case + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // notify incoming call + line.NotifyIncomingCall( status, incomingCallName ); + + // create incoming call notification + mockCallData.SerialiseL( completeData ); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + // wait for notification + User::WaitForRequest( status ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // create call ringing notification + completeData.Close(); + mockCallData2.SerialiseL(completeData); + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // prepare MockLTSY for answer + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // create error by changing call state back to idle + UpdateCallStatusL( call, RMobileCall::EStatusIdle ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should not be any calls + ASSERT_EQUALS( 0, callCount ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // MT Call Audio Setup - In Progress Failure Case + + // EStatusAnswering -> EStatusIdle + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // notify incoming call + line.NotifyIncomingCall( status, incomingCallName ); + + // create incoming call notification + mockCallData.SerialiseL( completeData ); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + // wait for notification + User::WaitForRequest( status ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // create call ringing notification + completeData.Close(); + mobileCallStatus = RMobileCall::EStatusRinging; + mockCallData2.SerialiseL(completeData); + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // prepare MockLTSY for answer + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call state and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusAnswering ); + + // create error by changing call state back to idle + UpdateCallStatusL( call, RMobileCall::EStatusIdle ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should not be any calls + ASSERT_EQUALS( 0, callCount ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // MT Call Audio Setup - Immediate Failure Case + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + RMobileCall::TMobileCallInfoV8 callInfo2; + callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo2.iService = mobileService; + callInfo2.iStatus = RMobileCall::EStatusUnknown; + callInfo2.iCallId =-1; + callInfo2.iExitCode =0; + callInfo2.iEmergency =0; + callInfo2.iForwarded =0; + callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData4(0, mobileService, callParams, callInfo2); + mockData4.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should not be any calls + ASSERT_EQUALS( 0, callCount ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // MO Call Audio Setup - In Progress Failure Case + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData4.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // create error by setting the call back to the idle + UpdateCallStatusL( call, RMobileCall::EStatusIdle ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should not be any calls + ASSERT_EQUALS( 0, callCount ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // cleanup + AssertMockLtsyStatusL(); + + DeletePropeties(); + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( this ); + } + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCTCR-0001b +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::TeardownCallRouting by using LTSY version1 +@SYMTestPriority High +@SYMTestActions Invokes MTelephonyAudioControl::TeardownCallRouting +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestTeardownTelephonyAudio0001bL() + { + DefinePropeties( ETrue, EVersion1 ); + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + TRequestStatus status( KErrNone ); + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + + RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId, mobileService); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + + TRequestStatus mockLtsyStatus( KErrNone ); + RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); + TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); + + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( ETrue ); + + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + + RLine line; + RMobileCall call; + + TInt error( KErrNone ); + + //------------------------------------------------------------------------- + // TEST C: Successful completion request of + // MTelephonyAudioControl::TeardownCallRouting when result is not cached. + //------------------------------------------------------------------------- + + // MO Call Audio Teardown + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that there is no call routing done + CheckNoCallRouting(); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + completeData.Close(); + TMockLtsyCallData0 mockData3(callId, mobileService); + mockData3.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); + // hangup the call + call.HangUp( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // MT Call Audio Teardown + + // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband + + DefinePropeties( ETrue, EVersion1 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // notify incoming call + TName incomingCallName; + line.NotifyIncomingCall( status, incomingCallName ); + + // create incoming call notification + TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); + mockCallData.SerialiseL( completeData ); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + // wait for notification + User::WaitForRequest( status ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // create call ringing notification + completeData.Close(); + mobileCallStatus = RMobileCall::EStatusRinging; + TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); + mockCallData2.SerialiseL(completeData); + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // prepare MockLTSY for answer + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that there is no call routing done + CheckNoCallRouting(); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // cleanup + DeletePropeties(); + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( this ); + } + + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCTCR-0004 +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for multiple client requests to MTelephonyAudioControl::TeardownCallRouting +@SYMTestPriority High +@SYMTestActions Invokes multiple client requests to MTelephonyAudioControl::TeardownCallRouting +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestTeardownTelephonyAudio0004L() + { + DefinePropeties( EFalse, EVersion2 ); + + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( ETrue ); + + TInt callId1( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + TMockLtsyCallData2 mockHangUpData( callId1, mobileService, hangUpCause, autoStChangeDisable ); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId1, mobileService); + + //------------------------------------------------------------------------- + // Test A: Test multiple clients requesting MTelephonyAudioControl::SetUpCallRouting + //------------------------------------------------------------------------- + + // reset line & call + RLine line; + TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + RMobileCall call; + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId1, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call + TRequestStatus status( KErrNone ); + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + + ASSERT_EQUALS( KErrNone, status.Int() ); + RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); + error = call.GetMobileCallInfo( callInfoPckg ); + + ASSERT_EQUALS( KErrNone, error ); + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + TInt callCount(0); + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + // there should be 1 call now + ASSERT_EQUALS( 1, callCount ); + + // Open second client + RTelServer telServer2; + error = telServer2.Connect(); + ASSERT_EQUALS( KErrNone, error ); + CleanupClosePushL( telServer2 ); + + RMobilePhone phone2; + error = phone2.Open( telServer2,KMmTsyPhoneName ); + CleanupClosePushL( phone2 ); + ASSERT_EQUALS( KErrNone, error ); + + RLine line2; + error = line2.Open( phone2, KMmTsyVoice1LineName ); + CleanupClosePushL( line2 ); + ASSERT_EQUALS( KErrNone, error ); + + RMobileCall call2; + error = call2.OpenNewCall( line2 ); + CleanupClosePushL( call2 ); + ASSERT_EQUALS( KErrNone, error ); + + TInt callId2( 2 ); + // prepare MockLTSY + TMockLtsyCallData0 mockData01(callId2, mobileService); + CallGetMobileCallInfoL(callId2, mobileService, KPhoneNumber); + RMobileCall::TMobileCallInfoV8 callInfo2; + callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo2.iService = mobileService; + callInfo2.iStatus = RMobileCall::EStatusUnknown; + callInfo2.iCallId =-1; + callInfo2.iExitCode =0; + callInfo2.iEmergency =0; + callInfo2.iForwarded =0; + callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData3(0, mobileService, callParams, callInfo2); + mockData3.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData01.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call + call2.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call2.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should be 2 calls now + ASSERT_EQUALS( 2, callCount ); + + // hangup call 1 + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should 1 call + ASSERT_EQUALS( 1, callCount ); + + // hangup call 2 + error = call2.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + UpdateCallStatusL( call2, RMobileCall::EStatusDisconnectingWithInband, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should not be any calls + ASSERT_EQUALS( 0, callCount ); + + // cleanup + CleanupStack::PopAndDestroy( &call2 ); + CleanupStack::PopAndDestroy( &line2 ); + CleanupStack::PopAndDestroy( &phone2 ); + CleanupStack::PopAndDestroy( &telServer2 ); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( this ); + } + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCCRST-0001a +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::CallStateChange +@SYMTestPriority High +@SYMTestActions Invokes MTelephonyAudioControl::CallStateChange +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestCallStateChange0001aL() + + { + + /* CallStateChange function is called when call has changed its state to the following states: + EStatusDialling + EStatusAnswering + EStatusConnecting + EStatusHold + EStatusDisconnecting + EStatusDisconnectingWithInband + EStatusConnected + */ + DefinePropeties( ETrue, EVersion2 ); + + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 data; + CleanupClosePushL(data); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + TRequestStatus status( KErrNone ); + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + + RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId, mobileService); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + + TRequestStatus mockLtsyStatus( KErrNone ); + RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); + TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); + + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( ETrue ); + + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + + RLine line; + RMobileCall call; + + //------------------------------------------------------------------------- + // TEST C: Successful completion request of + // MTelephonyAudioControl::CallStateChange when result is not cached. + //------------------------------------------------------------------------- + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting + + // reset line & call + TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + completeData.Close(); + TMockLtsyCallData0 mockData3(callId, mobileService); + mockData3.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); + // hangup the call + call.HangUp( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + RMobileCall::TMobileCallInfoV8 callInfo2; + callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo2.iService = mobileService; + callInfo2.iStatus = RMobileCall::EStatusUnknown; + callInfo2.iCallId =-1; + callInfo2.iExitCode =0; + callInfo2.iEmergency =0; + callInfo2.iForwarded =0; + callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData6(0, mobileService, callParams, callInfo2); + mockData6.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // notify incoming call + TName incomingCallName; + line.NotifyIncomingCall( status, incomingCallName ); + + // create incoming call notification + TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); + mockCallData.SerialiseL( completeData ); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + // wait for notification + User::WaitForRequest( status ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // create call ringing notification + mobileCallStatus = RMobileCall::EStatusRinging; + TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); + completeData.Close(); + mockCallData2.SerialiseL(completeData); + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // prepare MockLTSY for answer + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); + CheckCallStatus( incomingCallName, RMobileCall::EStatusAnswering ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( incomingCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( incomingCallName, RMobileCall::EStatusConnected ); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + completeData.Close(); + TMockLtsyCallData0 mockData4(callId, mobileService); + mockData4.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); + // hangup the call + call.HangUp( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); + CheckCallStatus( incomingCallName, RMobileCall::EStatusDisconnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( incomingCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband + + // reset properties + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // notify incoming call + line.NotifyIncomingCall( status, incomingCallName ); + + // create incoming call notification + mockCallData.SerialiseL( completeData ); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + // wait for notification + User::WaitForRequest( status ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // create call ringing notification + completeData.Close(); + mockCallData2.SerialiseL(completeData); + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // prepare MockLTSY for answer + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusAnswering ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusHold -> EStatusConnected -> EStatusDisconnectingWithInband -> EStatusIdle + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData6.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // prepare MockLTSY for hold + expectData.Close(); + mockData0.SerialiseL(expectData); + iMockLTSY.ExpectL( EMobileCallHold, expectData ); + iMockLTSY.CompleteL( EMobileCallHold, KErrNone, expectData ); + + call.Hold( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusHold ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusHold ); + + // prepare MockLTSY for resume + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EMobileCallResume, expectData ); + iMockLTSY.CompleteL( EMobileCallResume, KErrNone, expectData ); + + call.Resume( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusHold -> EStatusDisconnecting -> EStatusIdle + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData6.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // prepare MockLTSY for hold + expectData.Close(); + mockData0.SerialiseL(expectData); + iMockLTSY.ExpectL( EMobileCallHold, expectData ); + iMockLTSY.CompleteL( EMobileCallHold, KErrNone, expectData ); + + call.Hold( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusHold ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusHold ); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + completeData.Close(); + TMockLtsyCallData0 mockData5(callId, mobileService); + mockData5.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); + // hangup the call + call.HangUp( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusHold -> EStatusDisconnectingWithInband -> EStatusIdle + + DefinePropeties( ETrue, EVersion2 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData6.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + // prepare MockLTSY for hold + expectData.Close(); + mockData0.SerialiseL(expectData); + iMockLTSY.ExpectL( EMobileCallHold, expectData ); + iMockLTSY.CompleteL( EMobileCallHold, KErrNone, expectData ); + + call.Hold( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusHold ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusHold ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // cleanup + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( &data ); + CleanupStack::PopAndDestroy( this ); + } + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCCRST-0001b +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for MTelephonyAudioControl::CallStateChange by using LTSY version1 +@SYMTestPriority High +@SYMTestActions Invokes MTelephonyAudioControl::CallStateChange +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestCallStateChange0001bL() + + { + + /* CallStateChange function is called when call has changed its state to the following states: + EStatusDialling + EStatusAnswering + EStatusConnecting + EStatusDisconnecting + EStatusDisconnectingWithInband + EStatusConnected + */ + DefinePropeties( ETrue, EVersion1 ); + + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 data; + CleanupClosePushL(data); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + TRequestStatus status( KErrNone ); + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + + RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId, mobileService); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + + TRequestStatus mockLtsyStatus( KErrNone ); + RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); + TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); + + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( ETrue ); + + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + + RLine line; + RMobileCall call; + + //------------------------------------------------------------------------- + // TEST C: Successful completion request of + // MTelephonyAudioControl::CallStateChange when result is not cached. + //------------------------------------------------------------------------- + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting + + // reset line & call + TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + completeData.Close(); + TMockLtsyCallData0 mockData3(callId, mobileService); + mockData3.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); + // hangup the call + call.HangUp( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband + + DefinePropeties( ETrue, EVersion1 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + RMobileCall::TMobileCallInfoV8 callInfo2; + callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo2.iService = mobileService; + callInfo2.iStatus = RMobileCall::EStatusUnknown; + callInfo2.iCallId =-1; + callInfo2.iExitCode =0; + callInfo2.iEmergency =0; + callInfo2.iForwarded =0; + callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData5(0, mobileService, callParams, callInfo2); + mockData5.SerialiseL(expectData); + + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting + + DefinePropeties( ETrue, EVersion1 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // notify incoming call + TName incomingCallName; + line.NotifyIncomingCall( status, incomingCallName ); + + // create incoming call notification + TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); + mockCallData.SerialiseL( completeData ); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + // wait for notification + User::WaitForRequest( status ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // create call ringing notification + mobileCallStatus = RMobileCall::EStatusRinging; + TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); + completeData.Close(); + mockCallData2.SerialiseL(completeData); + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // prepare MockLTSY for answer + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // check that there is no call routing done + CheckNoCallRouting(); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // prepare MockLTSY for hangup + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + + completeData.Close(); + TMockLtsyCallData0 mockData4(callId, mobileService); + mockData4.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallHangUp, KErrNone, completeData); + // hangup the call + call.HangUp( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDisconnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusAnswering -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband + + DefinePropeties( ETrue, EVersion1 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + // notify incoming call + line.NotifyIncomingCall( status, incomingCallName ); + + // create incoming call notification + mockCallData.SerialiseL( completeData ); + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + // wait for notification + User::WaitForRequest( status ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // create call ringing notification + completeData.Close(); + mockCallData2.SerialiseL(completeData); + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + // prepare MockLTSY for answer + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusAnswering ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + DoCleanup(); + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusHold -> EStatusDisconnectingWithInband -> EStatusIdle + + DefinePropeties( ETrue, EVersion1 ); + OpenEtelServerL(EUseExtendedError); + OpenPhoneL(); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData5.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // prepare MockLTSY for hold + expectData.Close(); + mockData0.SerialiseL(expectData); + iMockLTSY.ExpectL( EMobileCallHold, expectData ); + iMockLTSY.CompleteL( EMobileCallHold, KErrNone, expectData ); + + call.Hold( status ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusHold ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // change call status + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + + // check that there is no call routing done + CheckNoCallRouting(); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // cleanup + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( &data ); + CleanupStack::PopAndDestroy( this ); + + } + +/** +@SYMTestCaseID BA-CTSY-CRC-CRCCRST-0004 +@SYMComponent telephony_ctsy +@SYMTestCaseDesc Test support in CTSY for multiple client requests to MTelephonyAudioControl::CallStateChange +@SYMTestPriority High +@SYMTestActions Invokes multiple client requests to MTelephonyAudioControl::CallStateChange +@SYMTestExpectedResults Pass +@SYMTestType CT + */ +void CCTsyTelephonyAudioControlFU::TestCallStateChange0004L() + { + DefinePropeties( EFalse, EVersion2 ); + + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 data; + CleanupClosePushL(data); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + TRequestStatus status( KErrNone ); + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId, mobileService); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + + TRequestStatus mockLtsyStatus( KErrNone ); + RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); + TMockLtsyCallData1 completeCallStatusData( callId, mobileService, mobileCallStatus ); + + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( ETrue ); + + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + + RLine line; + RMobileCall call; + + //------------------------------------------------------------------------- + // Test A: Test multiple clients requesting MTelephonyAudioControl::CallStateChange + //------------------------------------------------------------------------- + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnectingWithInband -> EStatusIdle + + // reset line & call + TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // dial the call + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + AssertMockLtsyStatusL(); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + AssertMockLtsyStatusL(); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + AssertMockLtsyStatusL(); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + AssertMockLtsyStatusL(); + + // EStatusDialling -> EStatusConnecting -> EStatusConnected -> EStatusDisconnecting + + // Open second client + RTelServer telServer2; + error = telServer2.Connect(); + ASSERT_EQUALS( KErrNone, error ); + CleanupClosePushL( telServer2 ); + + RMobilePhone phone2; + error = phone2.Open( telServer2,KMmTsyPhoneName ); + ASSERT_EQUALS( KErrNone, error ); + CleanupClosePushL( phone2 ); + + RLine line2; + error = line2.Open( phone2, KMmTsyVoice1LineName ); + CleanupClosePushL( line2 ); + ASSERT_EQUALS( KErrNone, error ); + + RMobileCall call2; + error = call2.OpenNewCall( line2 ); + CleanupClosePushL( call2 ); + ASSERT_EQUALS( KErrNone, error ); + + TInt callId2( 2 ); + // prepare MockLTSY for call 2 dial + TMockLtsyCallData0 mockData01(callId2, mobileService); + CallGetMobileCallInfoL(callId2, mobileService, KPhoneNumber); + RMobileCall::TMobileCallInfoV8 callInfo2; + callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo2.iService = mobileService; + callInfo2.iStatus = RMobileCall::EStatusUnknown; + callInfo2.iCallId =-1; + callInfo2.iExitCode =0; + callInfo2.iEmergency =0; + callInfo2.iForwarded =0; + callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData3(0, mobileService, callParams, callInfo2); + mockData3.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData01.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call 2 + call2.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + AssertMockLtsyStatusL(); + + error = call2.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // check that call status it is OK + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusUnknown ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + AssertMockLtsyStatusL(); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusConnecting ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + AssertMockLtsyStatusL(); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusConnected ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + TInt callCount(0); + error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should be 2 calls now + ASSERT_EQUALS( 2, callCount ); + + // hangup call 1 + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + UpdateCallStatusL( call, RMobileCall::EStatusDisconnectingWithInband, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + error = call2.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // hangup call 2 + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusDisconnectingWithInband, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDisconnectingWithInband ); + + // change call status and check it is OK + UpdateCallStatusL( call2, RMobileCall::EStatusIdle, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + CleanupStack::PopAndDestroy( &call2 ); + CleanupStack::PopAndDestroy( &line2 ); + CleanupStack::PopAndDestroy( &phone2 ); + CleanupStack::PopAndDestroy( &telServer2 ); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( &data ); + CleanupStack::PopAndDestroy( this ); + } + +void CCTsyTelephonyAudioControlFU::UpdateCallStatusL( RMobileCall& aMobileCall, + RMobileCall::TMobileCallStatus aMobileCallStatus, + TBool aUpdateTimer, + TBool aHangUp ) + { + RMobileCall::TMobileCallInfoV1 callInfo; + RMobileCall::TMobileCallInfoV1Pckg callInfoPckg( callInfo ); + TInt error = aMobileCall.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + TMockLtsyCallData1 mockCallData(callInfo.iCallId, callInfo.iService, aMobileCallStatus ); + completeData.Close(); + mockCallData.SerialiseL(completeData); + + TRequestStatus mockLtsyStatus( KErrNone ); + + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData ); + + if ( aHangUp ) + { + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV1 callParams; + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( ETrue ); + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + expectData.Close(); + mockHangUpData.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallHangUp, expectData, KErrNone ); + } + + if ( aUpdateTimer ) + { + // when call becomes idle, remaining duration of the call is added to life time param in LTSY: + TUint32 duration = 9; // this is a dummy value, which won't be checked by mocksy engine + TMockLtsyData1 timerData( duration ); + expectData.Close(); + timerData.SerialiseL(expectData); + iMockLTSY.ExpectL(EMmTsyUpdateLifeTimeIPC, expectData); + } + + User::WaitForRequest(mockLtsyStatus); + + AssertMockLtsyStatusL(); + + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int() ); + + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( &completeData ); + + error = aMobileCall.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + } + +void CCTsyTelephonyAudioControlFU::CheckCallRoutingValues( RLine& aLine, RMobileCall& aCall ) + { + TInt callCount(0); + TInt error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + TInt count(0); + error = aLine.EnumerateCall( count ); + ASSERT_EQUALS( KErrNone, error ); + ASSERT_EQUALS( callCount, count ); + + RMobileCall::TMobileCallInfoV1 callInfo; + RMobileCall::TMobileCallInfoV1Pckg callInfoPckg( callInfo ); + error = aCall.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + TName callName; + error = RProperty::Get( KMockLtsyFactoryProperty, ECallName, callName ); + ASSERT_EQUALS( KErrNone, error ); + ASSERT_EQUALS( 0, callInfo.iCallName.Compare( callName ) ); + + TBool emergency( ETrue ); + error = RProperty::Get( KMockLtsyFactoryProperty, EEmergencyCall, emergency ); + ASSERT_EQUALS( KErrNone, error ); + ASSERT_EQUALS( emergency, callInfo.iEmergency ); + + TInt direction(0); + error = RProperty::Get( KMockLtsyFactoryProperty, ECallDirection, direction ); + RMobileCall::TMobileCallDirection calldirection = (RMobileCall::TMobileCallDirection) direction; + ASSERT_EQUALS( KErrNone, error ); + ASSERT_EQUALS( calldirection, callInfo.iRemoteParty.iDirection ); + + TInt callType( 0 ); + error = RProperty::Get( KMockLtsyFactoryProperty, ECallType, callType ); + MTelephonyAudioControl::TTelephonyAudioControlCallType callRoutingType = ( MTelephonyAudioControl::TTelephonyAudioControlCallType ) callType; + ASSERT_EQUALS( KErrNone, error ); + ASSERT_EQUALS( callRoutingType, MTelephonyAudioControl::ECallTypeVoice ); + } + + +void CCTsyTelephonyAudioControlFU::DefinePropeties( TBool aReset, TMockLtsyFactoryVersions aVersion ) + { + DeletePropeties(); + + TInt error = RProperty::Define( KMockLtsyFactoryProperty, ENumberOfCalls, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, ECallName, RProperty::EText ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, EEmergencyCall, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, ECallDirection, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, EHangUpReason, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, ECallType, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, EReturnErrorCode, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, EReset, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, ECallStatus, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReset, aReset ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, EVersionProperty, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EVersionProperty, aVersion ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Define( KMockLtsyFactoryProperty, EComplete, RProperty::EInt ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EComplete, EFalse ); + ASSERT_EQUALS( KErrNone, error ); + } + + +void CCTsyTelephonyAudioControlFU::CheckCallStatus( TName& aCallName, RMobileCall::TMobileCallStatus aMobileCallStatus ) + { + TName callName; + TInt error = RProperty::Get( KMockLtsyFactoryProperty, ECallName, callName ); + ASSERT_EQUALS( KErrNone, error ); + ASSERT_EQUALS( 0, aCallName.Compare( callName ) ); + + TInt status( 0 ); + error = RProperty::Get( KMockLtsyFactoryProperty, ECallStatus, status ); + RMobileCall::TMobileCallStatus callStatus = ( RMobileCall::TMobileCallStatus ) status; + ASSERT_EQUALS( KErrNone, error ); + ASSERT_EQUALS( callStatus, aMobileCallStatus ); + } + +void CCTsyTelephonyAudioControlFU::DeletePropeties() + { + TInt error = RProperty::Delete(KMockLtsyFactoryProperty, ENumberOfCalls ); + error = RProperty::Delete(KMockLtsyFactoryProperty, ECallName ); + error = RProperty::Delete(KMockLtsyFactoryProperty, EEmergencyCall ); + error = RProperty::Delete(KMockLtsyFactoryProperty, ECallDirection ); + error = RProperty::Delete(KMockLtsyFactoryProperty, EHangUpReason ); + error = RProperty::Delete(KMockLtsyFactoryProperty, ECallType ); + error = RProperty::Delete(KMockLtsyFactoryProperty, EReturnErrorCode ); + error = RProperty::Delete(KMockLtsyFactoryProperty, EReset ); + error = RProperty::Delete(KMockLtsyFactoryProperty, ECallStatus ); + error = RProperty::Delete(KMockLtsyFactoryProperty, EVersionProperty ); + error = RProperty::Delete(KMockLtsyFactoryProperty, EComplete ); + } + +void CCTsyTelephonyAudioControlFU::CheckNoCallRouting() + { + // check that there is no calls in call routing control + TInt callCount(0); + TInt error = RProperty::Get( KMockLtsyFactoryProperty, ENumberOfCalls, callCount ); + ASSERT_EQUALS( KErrNone, error ); + + // there should not be any calls + ASSERT_EQUALS( 0, callCount ); + + // check that the call name is still undefined + TName callName; + error = RProperty::Get( KMockLtsyFactoryProperty, ECallName, callName ); + ASSERT_EQUALS( KErrNone, error ); + ASSERT_EQUALS( 0, callName.Compare( KNullDesC ) ); + } + +CCTsyTelephonyAudioControlFU::~CCTsyTelephonyAudioControlFU() + { + DeletePropeties(); + } + +void CCTsyTelephonyAudioControlFU::TestNotifyTelephonyAudioControlError0001L() + { + DefinePropeties( ETrue, EVersion2 ); + + OpenEtelServerL(EUseExtendedError); + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + OpenPhoneL(); + + RBuf8 data; + CleanupClosePushL(data); + + RBuf8 expectData; + CleanupClosePushL(expectData); + + RBuf8 completeData; + CleanupClosePushL(completeData); + + TRequestStatus status( KErrNone ); + TInt callId( 1 ); + RMobilePhone::TMobileService mobileService( RMobilePhone::EVoiceService ); + RMobileCall::TMobileCallParamsV7 callParams; + RMobileCall::TMobileCallInfoV8 callInfo; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo.iService = mobileService; + callInfo.iStatus = RMobileCall::EStatusUnknown; + callInfo.iCallId =-1; + callInfo.iExitCode =0; + callInfo.iEmergency =0; + callInfo.iForwarded =0; + callInfo.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData2(0, mobileService, callParams, callInfo); + TMockLtsyCallData0 mockData0(callId, mobileService); + + RCall::TCallParams callParamsX1; + TPckg pckgCallParamsX1(callParamsX1); + + TRequestStatus mockLtsyStatus( KErrNone ); + RMobileCall::TMobileCallStatus mobileCallStatus( RMobileCall::EStatusConnecting ); + + TInt hangUpCause( KErrGsmReleaseByUser ); + TBool autoStChangeDisable ( EFalse ); + + TMockLtsyCallData2 mockHangUpData( callId, mobileService, hangUpCause, autoStChangeDisable ); + + RMobileCall::TMobileCallInfoV8Pckg callInfoPckg( callInfo ); + + RLine line; + RMobileCall call; + + //------------------------------------------------------------------------- + // TEST A: failure to dispatch request to LTSY + //------------------------------------------------------------------------- + + // DialL + + // error when call is in RMobileCall::EStatusDialling + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line & call + TInt error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData2.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call where SetupTelephonyAudio fails + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling, EFalse, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); + ASSERT_EQUALS( KErrNone, error ); + + UpdateCallStatusL( call, RMobileCall::EStatusIdle ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + + // DialL + + // error when call is in RMobileCall::EStatusDialling + // in VoiceLine 2 + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice2LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + RMobilePhone::TMobileService mobileService2( RMobilePhone::EAuxVoiceService ); + RMobileCall::TMobileCallInfoV8 callInfo2; + callParams.iSpeakerControl = RCall::EMonitorSpeakerControlOnUntilCarrier; + callParams.iSpeakerVolume = RCall::EMonitorSpeakerVolumeLow; + callParams.iInterval = 100; + callParams.iWaitForDialTone = RCall::EDialToneWait; + callParams.iIdRestrict = RMobileCall::EIdRestrictDefault; + callParams.iCug.iExplicitInvoke = EFalse; + callParams.iCug.iCugIndex = 0xFFFF; + callParams.iCug.iSuppressPrefCug = EFalse; + callParams.iCug.iSuppressOA = EFalse; + callParams.iAutoRedial = EFalse; + callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo2.iService = mobileService2; + callInfo2.iStatus = RMobileCall::EStatusUnknown; + callInfo2.iCallId =-1; + callInfo2.iExitCode =0; + callInfo2.iEmergency =0; + callInfo2.iForwarded =0; + callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData3(0, mobileService2, callParams, callInfo2); + TMockLtsyCallData0 mockData4(callId, mobileService2); + + RCall::TCallParams callParamsX2; + TPckg pckgCallParamsX2(callParamsX2); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService2, KPhoneNumber ); + mockData3.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData4.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call where SetupTelephonyAudio fails + call.Dial( status, pckgCallParamsX2, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling, EFalse, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); + ASSERT_EQUALS( KErrNone, error ); + + UpdateCallStatusL( call, RMobileCall::EStatusIdle ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + + // error when call is in RMobileCall::EStatusConnecting + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + callInfo2.iValid = RMobileCall::KCallDialledParty | RMobileCall::KCallAlternating; + callInfo2.iService = mobileService; + callInfo2.iStatus = RMobileCall::EStatusUnknown; + callInfo2.iCallId =-1; + callInfo2.iExitCode =0; + callInfo2.iEmergency =0; + callInfo2.iForwarded =0; + callInfo2.iPrivacy = RMobilePhone::EPrivacyUnspecified; + callInfo2.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified; + callInfo2.iDialledParty.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + callInfo2.iDialledParty.iTypeOfNumber = RMobilePhone::EUnknownNumber; + callInfo2.iDialledParty.iTelNumber.Copy( KPhoneNumber ); + TMockLtsyCallData2 mockData5(0, mobileService, callParams, callInfo2); + mockData5.SerialiseL(expectData); + + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call where SetupTelephonyAudio fails + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting, EFalse, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); + ASSERT_EQUALS( KErrNone, error ); + + UpdateCallStatusL( call, RMobileCall::EStatusIdle ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + + // error when call is in RMobileCall::EStatusConnected + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line & call + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + error = call.OpenNewCall( line ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // prepare MockLTSY + CallGetMobileCallInfoL(callId, mobileService, KPhoneNumber); + mockData5.SerialiseL(expectData); + iMockLTSY.ExpectL(EEtelCallDial, expectData); + mockData0.SerialiseL(completeData); + iMockLTSY.CompleteL(EEtelCallDial, KErrNone, completeData); + + // make the call where SetupTelephonyAudio fails + call.Dial( status, pckgCallParamsX1, KPhoneNumber ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusDialling ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusDialling ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnecting, EFalse, EFalse ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnecting ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusConnected, EFalse, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusConnected ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); + ASSERT_EQUALS( KErrNone, error ); + + UpdateCallStatusL( call, RMobileCall::EStatusIdle, ETrue, EFalse ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + // cleanup + AssertMockLtsyStatusL(); + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + + // error when call is in RMobileCall::EStatusAnswering + + // reset the properties to ensure to get valid data + DefinePropeties( ETrue, EVersion2 ); + + // reset line + error = line.Open( iPhone, KMmTsyVoice1LineName ); + CleanupClosePushL( line ); + ASSERT_EQUALS( KErrNone, error ); + + TName incomingCallName; + TRequestStatus requestNotify( KErrNone ); + line.NotifyIncomingCall( status, incomingCallName); + + TMockLtsyCallData1 mockCallData( callId, mobileService, callInfo ); + mockCallData.SerialiseL( completeData ); + + iMockLTSY.NotifyTerminated( mockLtsyStatus ); + iMockLTSY.CompleteL( EEtelLineNotifyIncomingCall, KErrNone, completeData) ; + User::WaitForRequest( mockLtsyStatus ); + + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, mockLtsyStatus.Int() ); + + User::WaitForRequest( requestNotify ); + AssertMockLtsyStatusL(); + ASSERT_EQUALS( KErrNone, requestNotify.Int() ); + + mobileCallStatus = RMobileCall::EStatusRinging; + TMockLtsyCallData1 mockCallData2(callId, mobileService, mobileCallStatus ); + completeData.Close(); + mockCallData2.SerialiseL(completeData); + + iMockLTSY.NotifyTerminated(mockLtsyStatus); + iMockLTSY.CompleteL(EMobileCallNotifyMobileCallStatusChange, KErrNone, completeData); + User::WaitForRequest(mockLtsyStatus); + AssertMockLtsyStatusL(); + ASSERT_EQUALS(KErrNone, mockLtsyStatus.Int()); + + expectData.Close(); + mockData0.SerialiseL( expectData ); + iMockLTSY.ExpectL( EEtelCallAnswer, expectData ); + iMockLTSY.CompleteL( EEtelCallAnswer, KErrNone, expectData ); + + // reset the call + error = call.OpenExistingCall( line, incomingCallName ); + CleanupClosePushL( call ); + ASSERT_EQUALS( KErrNone, error ); + + // answer the call + call.AnswerIncomingCall( status, pckgCallParamsX1 ); + User::WaitForRequest( status ); + ASSERT_EQUALS( KErrNone, status.Int() ); + + error = call.GetMobileCallInfo( callInfoPckg ); + ASSERT_EQUALS( KErrNone, error ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNotSupported ); + ASSERT_EQUALS( KErrNone, error ); + + // change call status and check it is OK + UpdateCallStatusL( call, RMobileCall::EStatusAnswering, EFalse, ETrue ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusAnswering ); + + error = RProperty::Set( KMockLtsyFactoryProperty, EReturnErrorCode, KErrNone ); + ASSERT_EQUALS( KErrNone, error ); + + UpdateCallStatusL( call, RMobileCall::EStatusIdle, EFalse, EFalse ); + CheckCallStatus( callInfo.iCallName, RMobileCall::EStatusIdle ); + + CleanupStack::PopAndDestroy( &call ); + CleanupStack::PopAndDestroy( &line ); + AssertMockLtsyStatusL(); + + // cleanup + CleanupStack::PopAndDestroy( &completeData ); + CleanupStack::PopAndDestroy( &expectData ); + CleanupStack::PopAndDestroy( &data ); + CleanupStack::PopAndDestroy( this ); + } + +// End of File