diff -r 000000000000 -r f0cf47e981f9 mmsharing/mmshengine/tsrc/ut_engine/src/ut_musengmcesession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/mmshengine/tsrc/ut_engine/src/ut_musengmcesession.cpp Thu Dec 17 08:44:37 2009 +0200 @@ -0,0 +1,2011 @@ +/* +* Copyright (c) 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: +* +*/ + + +// INTERNAL INCLUDES +#include "ut_musengmcesession.h" +#include "musengstubs.h" +#include "musengtestdefs.h" + +#include "mussettings.h" +#include "musenglivesession.h" +#include "musengclipsession.h" +#include "musengreceivesession.h" +#include "musengsessiondurationtimer.h" +#include "musengtelephoneutils.h" +#include "musengmceutils.h" + +// SYSTEM INCLUDES + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +UT_CMusEngMceSession* UT_CMusEngMceSession::NewL() + { + UT_CMusEngMceSession* self = UT_CMusEngMceSession::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +UT_CMusEngMceSession* UT_CMusEngMceSession::NewLC() + { + UT_CMusEngMceSession* self = new( ELeave ) UT_CMusEngMceSession(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +UT_CMusEngMceSession::~UT_CMusEngMceSession() + { + // NOP + } + + +// ----------------------------------------------------------------------------- +// Default constructor +// ----------------------------------------------------------------------------- +// +UT_CMusEngMceSession::UT_CMusEngMceSession() + { + // NOP + } + + +// ----------------------------------------------------------------------------- +// Second phase construct +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::ConstructL() + { + // The ConstructL from the base class CEUnitTestSuiteClass must be called. + // It generates the test case table. + CEUnitTestSuiteClass::ConstructL(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::SetupL( ) + { + iObserver = new( ELeave ) CMusEngObserverStub; + iLiveSession = CMusEngLiveSession::NewL( KNullDesC, + TRect(0,0, 100,100), + *iObserver, + *iObserver, + *iObserver ); + + iSomeOtherSession = CMusEngLiveSession::NewL( KNullDesC, + TRect(0,0, 100,100), + *iObserver, + *iObserver, + *iObserver ); + ESTABLISH_OUT_SESSION( iSomeOtherSession ); + + iClipSession = CMusEngClipSession::NewL( TRect(0,0, 100,100), + *iObserver, + *iObserver, + *iObserver ); + iClipSession->SetClipL( KTestVideoFileName() ); + + TBuf<50> videoCodec; + videoCodec.Copy( KMceSDPNameH264() ); + iClipSession->SetSupportedVideoCodecListL(videoCodec); + + // Construct and establish an incoming session + iReceiveSession = CMusEngReceiveSession::NewL( TRect(0,0, 100,100), + *iObserver, + *iObserver ); + CMceInSession* inSession = CMceInSession::NewL( *iReceiveSession->iManager, + KTestOriginator() ); + + CMceVideoStream* videoStream = CMceVideoStream::NewLC(); + + videoStream->SetSourceL( CMceRtpSource::NewLC() ); + CleanupStack::Pop(); + + inSession->AddStreamL( videoStream ); + CleanupStack::Pop( videoStream ); + + iReceiveSession->iManager->iInSessionObserver->IncomingSession( + inSession, + &iContainer ); + iReceiveSession->iSession->iState = CMceSession::EProceeding; + iReceiveSession->AcceptInvitationL( ETrue ); + + iObserver->Reset(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::Teardown( ) + { + delete iLiveSession; + delete iClipSession; + delete iReceiveSession; + delete iObserver; + delete iSomeOtherSession; + + } + + + +// TEST CASES + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_TerminateLL() + { + TRAPD( error, iLiveSession->TerminateL() ); + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrNotReady ); + + ESTABLISH_OUT_SESSION( iLiveSession ); + + EUNIT_ASSERT( iLiveSession->iSession->iState == CMceSession::EEstablished ); + + iLiveSession->TerminateL(); + + EUNIT_ASSERT( iLiveSession->iSession->iState == CMceSession::ETerminating ); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_GetSessionTimeL() + { + EUNIT_ASSERT( iLiveSession->GetSessionTime() < TTimeIntervalSeconds( 0 ) ); + + // Invite + iLiveSession->InviteL( KTestRecipientSipUri ); + + EUNIT_ASSERT( iLiveSession->GetSessionTime() < TTimeIntervalSeconds( 0 ) ); + + // Simulate establishment + iLiveSession->iSession->iState = CMceSession::EEstablished; + iLiveSession->iStartTime.HomeTime(); + + TTimeIntervalSeconds sessionTime = iLiveSession->GetSessionTime(); + EUNIT_ASSERT( sessionTime >= TTimeIntervalSeconds( 0 ) ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_ConnectionActiveL() + { + EUNIT_ASSERT( !iLiveSession->ConnectionActive() ); + + ESTABLISH_OUT_SESSION( iLiveSession ); + + EUNIT_ASSERT( iLiveSession->ConnectionActive() ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_ContainsAudioLL() + { + // Try without session, fails + EUNIT_ASSERT_SPECIFIC_LEAVE( iLiveSession->ContainsAudioL(), KErrNotReady ) + + // Establish session without audio + ESTABLISH_OUT_SESSION( iLiveSession ) + + EUNIT_ASSERT( !iLiveSession->ContainsAudioL() ) + + // Establish session with audio + ESTABLISH_OUT_SESSION( iClipSession ) + + EUNIT_ASSERT( iClipSession->ContainsAudioL() ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_IsMutedLL() + { + // Try without session, fails + EUNIT_ASSERT_SPECIFIC_LEAVE( iLiveSession->IsMutedL(), KErrNotReady ) + + // Establish session without audio + ESTABLISH_OUT_SESSION( iLiveSession ) + + EUNIT_ASSERT( iLiveSession->IsMutedL() ) + + // Establish session with audio + ESTABLISH_OUT_SESSION( iClipSession ) + + EUNIT_ASSERT( !iClipSession->IsMutedL() ) // Not muted although disabled + + iClipSession->EnableDisplayL( ETrue ); // Enabled also speaker + + EUNIT_ASSERT( !iClipSession->IsMutedL() ) // Enabled and not muted + + iClipSession->MuteL(); + + EUNIT_ASSERT( iClipSession->IsMutedL() ) // Explicitly muted + + iClipSession->UnmuteL(); + + EUNIT_ASSERT( !iClipSession->IsMutedL() ) // Explicitly unmuted + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_OrientationLL() + { + // Try without session, fails + EUNIT_ASSERT_SPECIFIC_LEAVE( iLiveSession->OrientationL(), KErrNotReady ) + + // Establish a session and try all the MCE rotation values + ESTABLISH_OUT_SESSION( iLiveSession ) + + CMceDisplaySink* display = + MusEngMceUtils::GetDisplayL( *iLiveSession->iSession ); + + display->iRotation = CMceDisplaySink::ENone; + EUNIT_ASSERT_EQUALS( iLiveSession->OrientationL(), + CMusEngMceSession::EPortrait ) + + display->iRotation = CMceDisplaySink::EClockwise90Degree; + EUNIT_ASSERT_EQUALS( iLiveSession->OrientationL(), + CMusEngMceSession::ELandscape ) + + display->iRotation = CMceDisplaySink::EClockwise180Degree; + EUNIT_ASSERT_EQUALS( iLiveSession->OrientationL(), + CMusEngMceSession::ELandscape ) + + display->iRotation = CMceDisplaySink::EClockwise270Degree; + EUNIT_ASSERT_EQUALS( iLiveSession->OrientationL(), + CMusEngMceSession::ELandscape ) + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_SetOrientationLL() + { + // Try without session, fails + EUNIT_ASSERT_SPECIFIC_LEAVE( iLiveSession->SetOrientationL( + CMusEngMceSession::EPortrait ), + KErrNotReady ) + + // Establish a session + ESTABLISH_OUT_SESSION( iLiveSession ) + + CMceDisplaySink* display = + MusEngMceUtils::GetDisplayL( *iLiveSession->iSession ); + + // Check the initial state + display->iRotation = CMceDisplaySink::ENone; + EUNIT_ASSERT_EQUALS( iLiveSession->OrientationL(), + CMusEngMceSession::EPortrait ) + + // Successfully change orientation + + iLiveSession->SetOrientationL( CMusEngMceSession::ELandscape ); + EUNIT_ASSERT_EQUALS( iLiveSession->OrientationL(), + CMusEngMceSession::ELandscape ) + + iLiveSession->SetOrientationL( CMusEngMceSession::EPortrait ); + EUNIT_ASSERT_EQUALS( iLiveSession->OrientationL(), + CMusEngMceSession::EPortrait ) + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_VolumeUpLL() + { + // Try without session, fails + TRAPD( error, iLiveSession->VolumeUpL() ); + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrNotReady ); + + // Test only usage of CMceSpeaker, phone part is tested in base class + + // Check that nothing crashes without any speakers + iReceiveSession->VolumeUpL(); + + // Establish session + ESTABLISH_OUT_SESSION( iClipSession ) + + TInt initialVolume = iClipSession->VolumeL(); + + iClipSession->VolumeUpL(); + + // Check that all speaker volumes are adjusted and store one speaker pointer + + CMceSpeakerSink* speaker = NULL; + + CMceSession* session = iClipSession->iSession; + + for ( TInt i = 0; i < session->Streams().Count(); ++i ) + { + for ( TInt j = 0; j < session->Streams()[i]->Sinks().Count(); ++j ) + { + if ( session->Streams()[i]->Sinks()[j]->Type() == KMceSpeakerSink ) + { + speaker = static_cast( + session->Streams()[i]->Sinks()[j] ); + EUNIT_ASSERT( speaker->VolumeL() == initialVolume + 1 ); + } + } + } + + while ( iClipSession->VolumeL() < speaker->MaxVolumeL() ) + { + iClipSession->VolumeUpL(); + } + + iClipSession->VolumeUpL(); // Does not do anything to volume + + EUNIT_ASSERT( iClipSession->VolumeL() == speaker->MaxVolumeL() ); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_VolumeDownLL() + { + // Try without session, fails + TRAPD( error, iLiveSession->VolumeDownL() ); + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrNotReady ); + + // Test only usage of CMceSpeaker, phone part is tested in base class + + // Check that nothing crashes without any speakers + iReceiveSession->VolumeUpL(); + + // Establish session + ESTABLISH_OUT_SESSION( iClipSession ) + + TInt initialVolume = iClipSession->VolumeL(); + + iClipSession->VolumeDownL(); + + // Check that all speaker volumes are adjusted and store one speaker pointer + + CMceSpeakerSink* speaker = NULL; + + CMceSession* session = iClipSession->iSession; + + for ( TInt i = 0; i < session->Streams().Count(); ++i ) + { + for ( TInt j = 0; j < session->Streams()[i]->Sinks().Count(); ++j ) + { + if ( session->Streams()[i]->Sinks()[j]->Type() == KMceSpeakerSink ) + { + speaker = static_cast( + session->Streams()[i]->Sinks()[j] ); + EUNIT_ASSERT( speaker->VolumeL() == initialVolume - 1 ); + } + } + } + + while ( iClipSession->VolumeL() > 0 ) + { + iClipSession->VolumeDownL(); + } + + iClipSession->VolumeDownL(); // Does not do anything to volume + + EUNIT_ASSERT_EQUALS( iClipSession->VolumeL(), 0 ); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_SetVolumeLL() + { + // Try without session, fails + TInt newVolume = KTelephonyVolumeDefaultValue + 1; + + TRAPD( error, iLiveSession->SetVolumeL( newVolume ) ); + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrNotReady ); + + // Test only usage of CMceSpeaker, phone part is tested in base class + + // Check that nothing crashes without any speakers + iReceiveSession->SetVolumeL( newVolume ); + + // Establish session + ESTABLISH_OUT_SESSION( iClipSession ) + + TInt initialVolume = iClipSession->VolumeL(); + + iClipSession->SetVolumeL( newVolume ); + + // Check that all speaker volumes are adjusted and store one speaker pointer + + CMceSpeakerSink* speaker = NULL; + + CMceSession* session = iClipSession->iSession; + + for ( TInt i = 0; i < session->Streams().Count(); ++i ) + { + for ( TInt j = 0; j < session->Streams()[i]->Sinks().Count(); ++j ) + { + if ( session->Streams()[i]->Sinks()[j]->Type() == KMceSpeakerSink ) + { + speaker = static_cast( + session->Streams()[i]->Sinks()[j] ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume ); + } + } + } + + newVolume = speaker->MaxVolumeL() + 1; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == speaker->MaxVolumeL() ); + + newVolume = -1; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == 0 ); + + // Test situation where MCE max volume is bigger than MUS max vol + SetMaxVolForSpeakersL(*session, KMusEngMaxVolume * 10); + newVolume = 5; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume * 10 ); + newVolume = 1; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume * 10 ); + newVolume = KMusEngMaxVolume; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume * 10 ); + + SetMaxVolForSpeakersL(*session, KMusEngMaxVolume * 1000); + newVolume = 7; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume * 1000 ); + newVolume = 1; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume * 1000 ); + newVolume = KMusEngMaxVolume; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume * 1000 ); + + + // Test situation where MCE max volume is smaller than MUS max vol + SetMaxVolForSpeakersL(*session, KMusEngMaxVolume / 2); + newVolume = 3; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume / 2 ); + newVolume = 1; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == 1 ); + newVolume = KMusEngMaxVolume; + iClipSession->SetVolumeL( newVolume ); + EUNIT_ASSERT( iClipSession->VolumeL() == newVolume ); + EUNIT_ASSERT( speaker->VolumeL() == newVolume / 2 ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_EnableDisplayL() + { + TRAPD( error, iLiveSession->EnableDisplayL( ETrue ) ); + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrNotReady ); + + ESTABLISH_OUT_SESSION( iLiveSession ); + + CMceDisplaySink* display = + MusEngMceUtils::GetDisplayL( *(iLiveSession->iSession) ); + + // Disable + iLiveSession->EnableDisplayL( EFalse ); + + EUNIT_ASSERT( !display->iIsEnabled ); + + // Try to disable again, request should be ignored + + iLiveSession->EnableDisplayL( EFalse ); + + EUNIT_ASSERT( !display->iIsEnabled ); + + // Enable + + iLiveSession->EnableDisplayL( ETrue ); + + EUNIT_ASSERT( display->iIsEnabled ); + + // Try to enable again, request should be ignored + + iLiveSession->EnableDisplayL( ETrue ); + + EUNIT_ASSERT( display->iIsEnabled ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_MuteLL() + { + TRAPD( error, iClipSession->MuteL() ); + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrNotReady ); + + ESTABLISH_OUT_SESSION_AND_START_STREAMING( iClipSession ); + + const RPointerArray streams = + iClipSession->iSession->Streams(); + + iClipSession->MuteL(); + + // Check that all audio speaker sinks are disabled and only those + for ( TInt i = 0; i < streams.Count(); ++i ) + { + for ( TInt j = 0; j < streams[i]->Sinks().Count(); ++j ) + { + CMceMediaSink* sink = streams[i]->Sinks()[j]; + if ( sink->Type() == KMceSpeakerSink && + streams[i]->Type() == KMceAudio ) + { + EUNIT_ASSERT( sink->IsEnabled() == EFalse ) + } + else + { + EUNIT_ASSERT( sink->IsEnabled() == ETrue ) + } + } + } + + EUNIT_ASSERT( iClipSession->iExplicitlyMuted ) + + // Try to mute again, request should be ignored without actions or leaving + + iClipSession->MuteL(); + + } + + +// ----------------------------------------------------------------------------- +// Relies on previous test +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_UnmuteLL() + { + TRAPD( error, iClipSession->UnmuteL() ); + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrNotReady ); + + ESTABLISH_OUT_SESSION( iClipSession ); + + const RPointerArray streams = + iClipSession->iSession->Streams(); + + iClipSession->MuteL(); + + iClipSession->UnmuteL(); + + // Check that all audio speaker sinks are enabled + + for ( TInt i = 0; i < streams.Count(); ++i ) + { + for ( TInt j = 0; j < streams[i]->Sinks().Count(); ++j ) + { + if ( streams[i]->Sinks()[j]->Type() == KMceSpeakerSink ) + { + EUNIT_ASSERT( streams[i]->Sinks()[j]->IsEnabled() == ETrue ) + } + } + } + + EUNIT_ASSERT( !iClipSession->iExplicitlyMuted ) + + // Try to unmute again, request should be ignored without actions or leaving + + iClipSession->UnmuteL(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_HandleTerminationL() + { + // Try different values + iLiveSession->CMusEngMceSession::HandleTermination( KSipStatusCodeNoCodeSet, + KNullDesC8() ); + EUNIT_ASSERT( iObserver->iSessionTerminatedCalled ); + iObserver->Reset(); + + iLiveSession->CMusEngMceSession::HandleTermination( KSipStatusCode200OK, + KNullDesC8() ); + EUNIT_ASSERT( iObserver->iSessionTerminatedCalled ); + iObserver->Reset(); + + iLiveSession->CMusEngMceSession::HandleTermination( KSipStatusCodeUnknown, + KNullDesC8() ); + EUNIT_ASSERT( iObserver->iSessionFailedCalled ); + iObserver->Reset(); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_AdjustVideoCodecLL() + { + // CMusEngMceSession::AdjustVideoCodecL does nothing, so NULL test is enough + CMceVideoCodec* codec = + iLiveSession->iManager->SupportedVideoCodecs()[0]->CloneL(); + CleanupStack::PushL( codec ); + iLiveSession->CMusEngMceSession::AdjustVideoCodecL( *codec ); + CleanupStack::PopAndDestroy( codec ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_AdjustAudioCodecLL() + { + CMceAudioCodec* codec = + iLiveSession->iManager->SupportedAudioCodecs()[0]->CloneL(); + CleanupStack::PushL( codec ); + iLiveSession->CMusEngMceSession::AdjustAudioCodecL( *codec ); + + EUNIT_ASSERT( codec->iMMFPriority == KAudioPrioritySwisPlayback ) + EUNIT_ASSERT( codec->iMMFPriorityPreference == KAudioPrefSwisPlayback ) + + CleanupStack::PopAndDestroy( codec ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_RectChangedLL() + { + + // Does nothing before session establishment + + iLiveSession->RectChangedL(); + + ESTABLISH_OUT_SESSION( iLiveSession ); + + // Next leads to a call to RectChangedL() + iLiveSession->SetRectL( TRect( 100, 200, 300, 400 ) ); + + // Display size has been updated + + CMceDisplaySink* display = + MusEngMceUtils::GetDisplayL( *( iLiveSession->iSession ) ); + + EUNIT_ASSERT( display->DisplayRectL() == iLiveSession->Rect() ); + + // Terminate session and try again, rect must not be changed + + iLiveSession->iSession->iState = CMceSession::ETerminated; + + TRect newRect( 200, 300, 400, 500 ); + + iLiveSession->SetRectL( newRect ); + + EUNIT_ASSERT( display->DisplayRectL() != newRect ) + + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_SetSessionSdpLinesLL() + { + // set operator variant off + MultimediaSharingSettings::SetOperatorVariantSettingL( + MusSettingsKeys::EStandard ); + + // There is no sdp lines in session, right one is added + + CMceInSession* inSession = CMceInSession::NewL( *iReceiveSession->iManager, + KTestOriginator ); + CleanupStack::PushL( inSession ); + + iReceiveSession->SetSessionSdpLinesL( *inSession ); + + MDesC8Array* sdpLines = inSession->SessionSDPLinesL(); + CleanupDeletePushL( sdpLines ); + + EUNIT_ASSERT( sdpLines ); + EUNIT_ASSERT( sdpLines->MdcaCount() == 1 ); + EUNIT_ASSERT( sdpLines->MdcaPoint( 0 ) == KMusEngSessionSdpLineXApplication() ); + + CleanupStack::PopAndDestroy(); // sdplines + + // There is one line ready, replace it with right one + CDesC8Array* newSdpLines = new ( ELeave ) CDesC8ArrayFlat( 3 ); + CleanupStack::PushL( newSdpLines ); + newSdpLines->AppendL( KTestRecipientRandomText8() ); + inSession->SetSessionSDPLinesL( newSdpLines ); + CleanupStack::Pop( newSdpLines ); + + iReceiveSession->SetSessionSdpLinesL( *inSession ); + + sdpLines = inSession->SessionSDPLinesL(); + CleanupDeletePushL( sdpLines ); + + EUNIT_ASSERT( sdpLines ); + EUNIT_ASSERT( sdpLines->MdcaCount() == 1 ); + EUNIT_ASSERT( sdpLines->MdcaPoint( 0 ) == KMusEngSessionSdpLineXApplication() ); + + CleanupStack::PopAndDestroy(); // sdplines + + + CleanupStack::PopAndDestroy( inSession ); + + // for operator variant testing + // set operator variant + iReceiveSession->iOperatorVariant = ETrue; + + // There is no sdp lines in session, right ones are added to session and media level + inSession = CMceInSession::NewL( *iReceiveSession->iManager, + KTestOriginator ); + CleanupStack::PushL( inSession ); + + iReceiveSession->SetSessionSdpLinesL( *inSession ); + + sdpLines = inSession->SessionSDPLinesL(); + CleanupDeletePushL( sdpLines ); + + EUNIT_ASSERT( sdpLines ); + EUNIT_ASSERT( sdpLines->MdcaCount() == 2 ); + EUNIT_ASSERT( sdpLines->MdcaPoint( 0 ) == KMusEngSessionSdpLineApplication() ); + EUNIT_ASSERT( sdpLines->MdcaPoint( 1 ) == KMusEngSessionSdpLineType() ); + + CleanupStack::PopAndDestroy(); // sdplines + + MDesC8Array* mediaSdpLines = + iReceiveSession->iSession->Streams()[ 0 ]->MediaAttributeLinesL(); + CleanupDeletePushL( mediaSdpLines ); + TBool bandwidthFoundFromMediaLevel = EFalse; + for ( TInt i = 0; mediaSdpLines && i < mediaSdpLines->MdcaCount(); i++ ) + { + if ( mediaSdpLines->MdcaPoint( i ).Compare( + KMusEngSessionSdpLineBandwidthField() ) == 0 ) + { + bandwidthFoundFromMediaLevel = ETrue; + } + } + EUNIT_ASSERT( bandwidthFoundFromMediaLevel ); + CleanupStack::PopAndDestroy( mediaSdpLines ); + + // There is one line ready, replace it with right ones + newSdpLines = new ( ELeave ) CDesC8ArrayFlat( 3 ); + CleanupStack::PushL( newSdpLines ); + newSdpLines->AppendL( KTestRecipientRandomText8() ); + inSession->SetSessionSDPLinesL( newSdpLines ); + CleanupStack::Pop( newSdpLines ); + + iReceiveSession->SetSessionSdpLinesL( *inSession ); + + sdpLines = inSession->SessionSDPLinesL(); + CleanupDeletePushL( sdpLines ); + + EUNIT_ASSERT( sdpLines ); + EUNIT_ASSERT( sdpLines->MdcaCount() == 2 ); + EUNIT_ASSERT( sdpLines->MdcaPoint( 0 ) == KMusEngSessionSdpLineApplication() ); + EUNIT_ASSERT( sdpLines->MdcaPoint( 1 ) == KMusEngSessionSdpLineType() ); + + CleanupStack::PopAndDestroy(); // sdplines + + + CleanupStack::PopAndDestroy( inSession ); + + + // set operator variant off + MultimediaSharingSettings::SetOperatorVariantSettingL( + MusSettingsKeys::EStandard ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_AdjustStreamsAndCodecsLL() + { + // Check that function cannot be called before creating the session + TRAPD( error, iClipSession->AdjustStreamsAndCodecsL() ); + MUS_TEST_FORWARD_ALLOC_FAILURE( error ); + EUNIT_ASSERT( error == KErrNotReady ); + + // Establishing a clip session leads to call to AdjustStreamsAndCodecsL + ESTABLISH_OUT_SESSION( iClipSession ) + + const RPointerArray& streams = + iClipSession->iSession->Streams(); + + TBool videoCodecFound = EFalse; + TBool audioCodecFound = EFalse; + + // Test that AdjustVideoCodecL and AdjustAudioCodecL have been called + CMceVideoStream* videoStream = NULL; + for ( TInt i = 0; i < streams.Count(); ++i ) + { + if ( streams[i]->Type() == KMceAudio ) + { + CMceAudioStream* audioStream = + static_cast( streams[i] ); + + const RPointerArray& codecs = audioStream->Codecs(); + + for ( TInt i = 0; i < codecs.Count(); ++i ) + { + audioCodecFound = ETrue; + + EUNIT_ASSERT( codecs[i]->MMFPriority() == + KAudioPrioritySwisPlayback ) + EUNIT_ASSERT( codecs[i]->MMFPriorityPreference() == + KAudioPrefSwisPlayback ) + } + } + else + { + videoStream = static_cast( streams[i] ); + + const RPointerArray& codecs = videoStream->Codecs(); + + for ( TInt i = 0; i < codecs.Count(); ++i ) + { + videoCodecFound = ETrue; + + EUNIT_ASSERT( codecs[i]->iPayloadType == 96 || + codecs[i]->iPayloadType == 98 ) + } + } + + } + + EUNIT_ASSERT( audioCodecFound ) // At least one audiocodec found + EUNIT_ASSERT( videoCodecFound ) // At least one videocodec found + + // Test removing of H.263 multiples (mode 2000 preferred) + EUNIT_ASSERT( videoStream != NULL ) + for ( TInt i = videoStream->Codecs().Count() - 1; i >= 0; i-- ) + { + videoStream->RemoveCodecL( + *const_cast( videoStream->Codecs()[ i ] ) ); + } + CMceH263Codec* codecH2632000 = CMceH263Codec::NewLC( KMceSDPNameH2632000() ); + videoStream->AddCodecL( codecH2632000 ); + CleanupStack::Pop( codecH2632000 ); + + CMceH263Codec* codecH2631998 = CMceH263Codec::NewLC( KMceSDPNameH2631998() ); + videoStream->AddCodecL( codecH2631998 ); + CleanupStack::Pop( codecH2631998 ); + + iClipSession->AdjustStreamsAndCodecsL(); + + // 1998 version should have been removed + for ( TInt i = 0; i < videoStream->Codecs().Count(); i++ ) + { + EUNIT_ASSERT( + !videoStream->Codecs()[ i ]->SdpName().CompareF( KMceSDPNameH2632000() ) ); + } + + // Test removing of multiples with different bitrates + for ( TInt i = videoStream->Codecs().Count() - 1; i >= 0; i-- ) + { + videoStream->RemoveCodecL( + *const_cast( videoStream->Codecs()[ i ] ) ); + } + codecH2632000 = CMceH263Codec::NewLC( KMceSDPNameH2632000() ); + codecH2632000->SetMaxBitrateL( 64000 ); + videoStream->AddCodecL( codecH2632000 ); + CleanupStack::Pop( codecH2632000 ); + + codecH2632000 = CMceH263Codec::NewLC( KMceSDPNameH2632000() ); + codecH2632000->SetMaxBitrateL( 128000 ); + videoStream->AddCodecL( codecH2632000 ); + CleanupStack::Pop( codecH2632000 ); + + iClipSession->AdjustStreamsAndCodecsL(); + + // Lower bitrate version should have been removed + for ( TInt i = 0; i < videoStream->Codecs().Count(); i++ ) + { + EUNIT_ASSERT( + videoStream->Codecs()[ i ]->MaxBitRate() == 128000 ); + } + + // Test for Configuration based codec removal. Magic uid not set. + CMceVideoCodec* codecAvc = CMceAvcCodec::NewLC( KMceSDPNameH264() ); + videoStream->AddCodecL( codecAvc ); + CleanupStack::Pop( codecAvc ); + iClipSession->AdjustStreamsAndCodecsL(); + TBool avcCodecFound(EFalse); + for ( TInt i = 0; i < videoStream->Codecs().Count(); i++ ) + { + if( !videoStream->Codecs()[ i ]->SdpName().CompareF( KMceSDPNameH264 ) ) + { + avcCodecFound = ETrue; + } + } + // AVC should present + EUNIT_ASSERT(avcCodecFound); + + // Test for Configuration based codec removal. Magic uid set. + // Store the real value and revert back later , so that other tests will not be affected. + TUid uid = MultimediaSharingSettings::EncodingDeviceL(); + TInt32 KMusDisableAVC = 0x0fffffff; + MultimediaSharingSettings::SetPropertyValueL( MusSettingsKeys::KEncodingDevice,KMusDisableAVC); + codecAvc = CMceAvcCodec::NewLC( KMceSDPNameH264() ); + videoStream->AddCodecL( codecAvc ); + CleanupStack::Pop( codecAvc ); + codecH2632000 = CMceH263Codec::NewLC( KMceSDPNameH2632000() ); + videoStream->AddCodecL( codecH2632000 ); + CleanupStack::Pop( codecH2632000 ); + iClipSession->AdjustStreamsAndCodecsL(); + for ( TInt i = 0; i < videoStream->Codecs().Count(); i++ ) + { + // H264 ( AVC ) codec should be removed + EUNIT_ASSERT( + videoStream->Codecs()[ i ]->SdpName().CompareF( KMceSDPNameH264 ) ); + } + + + MultimediaSharingSettings::SetPropertyValueL( MusSettingsKeys::KEncodingDevice,uid.iUid); + + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_IncomingSessionL() + { + // New session should get rejected and deleted in any case, first failure + CMceInSession* inSession = CMceInSession::NewL( + *iLiveSession->iManager, KNullDesC8 ); + CleanupStack::PushL( inSession ); + iLiveSession->IncomingSession( inSession, NULL ); + CleanupStack::Pop( inSession ); + + // And then succesfull case, this would leak memory if session was not + // deleted + inSession = CMceInSession::NewL( *iLiveSession->iManager, KNullDesC8 ); + CleanupStack::PushL( inSession ); + iLiveSession->IncomingSession( inSession, NULL ); + CleanupStack::Pop( inSession ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_IncomingUpdateL() + { + CMceInSession* inSession = CMceInSession::NewL( + *iLiveSession->iManager, KNullDesC8 ); + + // Try to update before having a session, session gets rejected and deleted + CleanupStack::PushL( inSession ); + iLiveSession->IncomingUpdate( *inSession, inSession, NULL ); + CleanupStack::Pop( inSession ); + + + // Try to update with unknown session, session gets rejected and deleted + ESTABLISH_OUT_SESSION( iLiveSession ) + + inSession = CMceInSession::NewL( + *iLiveSession->iManager, KNullDesC8 ); + CleanupStack::PushL( inSession ); + iLiveSession->IncomingUpdate( *inSession, inSession, NULL ); + CleanupStack::Pop( inSession ); + + // Normal case, old session gets deleted. New session gets rejected. + + inSession = CMceInSession::NewL( + *iLiveSession->iManager, KNullDesC8 ); + CleanupStack::PushL( inSession ); + iLiveSession->IncomingUpdate( *iLiveSession->iSession, inSession, NULL ); + CleanupStack::Pop( inSession ); + + EUNIT_ASSERT( iLiveSession->iSession == inSession ) + EUNIT_ASSERT( iLiveSession->iSession->iState == CMceSession::ETerminated ) + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_StreamStateChangedL() + { + // Try without a session, nothing happens + CMceAudioStream* audioStream = CMceAudioStream::NewLC(); + iLiveSession->CMusEngMceSession::StreamStateChanged( *audioStream ); + CleanupStack::PopAndDestroy( audioStream ); + + // Simulate sending invite + iLiveSession->InviteL( KTestRecipientSipUri() ); + + // No observer set, so expect nothing to be done, cannot be asserted + CMceMediaStream* changedStream = iLiveSession->iSession->Streams()[0]; + + // Try all the stream states + + // EUninitialized, stream is created, unexpected change, nothing happens + changedStream->iState = CMceMediaStream::EUninitialized; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EInitialized, stream is initialized + changedStream->iState = CMceMediaStream::EInitialized; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EBuffering, stream is buffering + changedStream->iState = CMceMediaStream::EBuffering; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EIdle, stream is not receiving RTP + changedStream->iState = CMceMediaStream::EIdle; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EStreaming, stream is streaming + changedStream->iState = CMceMediaStream::EStreaming; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->iStreamStreamingCalled ); + iObserver->Reset(); + + // EStreaming, stream is streaming, other than video out- or instream + changedStream->iState = CMceMediaStream::EStreaming; + iLiveSession->CMusEngMceSession::StreamStateChanged( + *iLiveSession->iSession->Streams()[1] ); + EUNIT_ASSERT( iObserver->IsReseted() ); + iObserver->Reset(); + + // EDisabled, stream is explicitly disabled + changedStream->iState = CMceMediaStream::EDisabled; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ENoResources, stream has no needed resources to stream + changedStream->iState = CMceMediaStream::ENoResources; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ETranscodingRequired, stream requires non-realtime transcoding + changedStream->iState = CMceMediaStream::ETranscodingRequired; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ETranscoding, stream is transcoding in non-realtime + changedStream->iState = CMceMediaStream::ETranscoding; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + } + + +// ----------------------------------------------------------------------------- +// All the possibilities are tested in order to make sure unit tests are changed +// when function is changed +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_StreamStateChangedWithSourceL() + { + // Try without a session, nothing happens + iLiveSession->CMusEngMceSession::StreamStateChanged( + *CMceAudioStream::NewLC(), + *CMceRtpSource::NewLC() ); + + CleanupStack::PopAndDestroy(); // rtp + CleanupStack::PopAndDestroy(); // audiostream + + // Simulate sending invite + iLiveSession->InviteL( KTestRecipientSipUri() ); + + // Try all the stream states + CMceMediaStream* changedStream = iLiveSession->iSession->Streams()[0]; + + // EUninitialized, stream is created, unexpected change, nothing happens + changedStream->iState = CMceMediaStream::EUninitialized; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EInitialized, stream is initialized + changedStream->iState = CMceMediaStream::EInitialized; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EBuffering, stream is buffering + changedStream->iState = CMceMediaStream::EBuffering; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EIdle, stream is not receiving RTP + changedStream->iState = CMceMediaStream::EIdle; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EStreaming, stream is streaming + changedStream->iState = CMceMediaStream::EStreaming; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->iStreamStreamingCalled ); + iObserver->Reset(); + + // EDisabled, stream is explicitly disabled + changedStream->iState = CMceMediaStream::EDisabled; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ENoResources, stream has no needed resources to stream + changedStream->iState = CMceMediaStream::ENoResources; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ETranscodingRequired, stream requires non-realtime transcoding + changedStream->iState = CMceMediaStream::ETranscodingRequired; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ETranscoding, stream is transcoding in non-realtime + changedStream->iState = CMceMediaStream::ETranscoding; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + } + + +// ----------------------------------------------------------------------------- +// All the possibilities are tested in order to make sure unit tests are changed +// when function is changed +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_StreamStateChangedWithSinkL() + { + // Try without a session, nothing happens + CMceAudioStream* audioStream = CMceAudioStream::NewLC(); + iLiveSession->CMusEngMceSession::StreamStateChanged( *audioStream ); + CleanupStack::PopAndDestroy( audioStream ); + + // Simulate sending invite + iLiveSession->InviteL( KTestRecipientSipUri() ); + + // Try all the stream states + CMceMediaStream* changedStream = iLiveSession->iSession->Streams()[0]; + + // EUninitialized, stream is created, unexpected change, nothing happens + changedStream->iState = CMceMediaStream::EUninitialized; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EInitialized, stream is initialized + changedStream->iState = CMceMediaStream::EInitialized; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EBuffering, stream is buffering + changedStream->iState = CMceMediaStream::EBuffering; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EIdle, stream is not receiving RTP + changedStream->iState = CMceMediaStream::EIdle; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EStreaming, stream is streaming + changedStream->iState = CMceMediaStream::EStreaming; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->iStreamStreamingCalled ); + iObserver->Reset(); + + // EDisabled, stream is explicitly disabled + changedStream->iState = CMceMediaStream::EDisabled; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ENoResources, stream has no needed resources to stream + changedStream->iState = CMceMediaStream::ENoResources; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ETranscodingRequired, stream requires non-realtime transcoding + changedStream->iState = CMceMediaStream::ETranscodingRequired; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ETranscoding, stream is transcoding in non-realtime + changedStream->iState = CMceMediaStream::ETranscoding; + iLiveSession->CMusEngMceSession::StreamStateChanged( *changedStream ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_SessionStateChangedL() + { + // Simulate sending invite + iLiveSession->InviteL( KTestRecipientSipUri() ); + + // No container, so expect to be handled as internal error + iLiveSession->SessionStateChanged( *iLiveSession->iSession, NULL ); + EUNIT_ASSERT( iObserver->iSessionFailedCalled ); + iObserver->Reset(); + + // Try to tell session about some other session's state transition + + TMceTransactionDataContainer container; + + iLiveSession->SessionStateChanged( *iSomeOtherSession->iSession, &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // Try all the normal cases: + + // EIdle + iLiveSession->iSession->iState = CMceSession::EIdle; + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + // Set up any text to simulate reasonphrase + HBufC8* anyReasonPhrase = KTestOriginator().AllocL(); + container.SetReasonPhrase( anyReasonPhrase ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->iSessionFailedCalled ); + iObserver->Reset(); + container.Clear(); + + // EOffering + iLiveSession->iSession->iState = CMceSession::EOffering; + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EIncoming + iLiveSession->iSession->iState = CMceSession::EIncoming; + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->iSessionFailedCalled ); + iObserver->Reset(); + + // EReserving + iLiveSession->iSession->iState = CMceSession::EReserving; + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EAnswering + iLiveSession->iSession->iState = CMceSession::EAnswering; + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EProceeding + iLiveSession->iSession->iState = CMceSession::EProceeding; + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // EEstablished + iLiveSession->iSession->iState = CMceSession::EEstablished; + container.SetStatusCode( KSipStatusCode200OK ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->iSessionEstablishedCalled ); + iObserver->Reset(); + + // EEstablished again (meaning expiration of session timer + // and refresment of session ) + iLiveSession->iSession->iState = CMceSession::EEstablished; + container.SetStatusCode( KSipStatusCode200OK ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + // ECancelling + iLiveSession->iSession->iState = CMceSession::ECancelling; + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + iObserver->Reset(); + + // ETerminating + iLiveSession->iSession->iState = CMceSession::ETerminating; + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + iObserver->Reset(); + + // ETerminated + iLiveSession->iSession->iState = CMceSession::ETerminated; + container.SetStatusCode( KSipStatusCode200OK ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, + &container ); + EUNIT_ASSERT( iObserver->iSessionTerminatedCalled ); + iObserver->Reset(); + + // Default case + iLiveSession->iSession->iState = static_cast( 10 ); + container.SetStatusCode( KSipStatusCodeNoCodeSet ); + iLiveSession->SessionStateChanged( *iLiveSession->iSession, &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_SessionConnectionStateChangedL() + { + + // Try to tell session about another session's connection state change + + iLiveSession->SessionConnectionStateChanged( *iSomeOtherSession->iSession, + ETrue ); + EUNIT_ASSERT( iObserver->IsReseted() ); // No session yet, nothing happened + + // Simulate sending invite + iLiveSession->InviteL( KTestRecipientSipUri() ); + + // Now try again to notify session about session connection state change + // of an another session + iLiveSession->SessionConnectionStateChanged( *iSomeOtherSession->iSession, + ETrue ); + EUNIT_ASSERT( iObserver->IsReseted() ); // Wrong session, nothing happened + + // Try tell session connection state is active + iLiveSession->SessionConnectionStateChanged( *iLiveSession->iSession, + ETrue ); + EUNIT_ASSERT( iObserver->IsReseted() ); // Session active, nothing happened + + // Try tell session connection state is inactive + iLiveSession->SessionConnectionStateChanged( *iLiveSession->iSession, + EFalse ); + EUNIT_ASSERT( iObserver->iSessionConnectionLostCalled ); + iObserver->Reset(); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_FailedL() + { + // Try to tell session about failure of another session + + iLiveSession->Failed( *iSomeOtherSession->iSession, 0 ); + EUNIT_ASSERT( iObserver->IsReseted() ); // No session yet, nothing happened + + // Simulate sending invite + iLiveSession->InviteL( KTestRecipientSipUri() ); + + // Now try again to notify session about failure of an another session + iLiveSession->Failed( *iSomeOtherSession->iSession, 0 ); + EUNIT_ASSERT( iObserver->IsReseted() ); // Wrong session, nothing happened + + // Tell session that it has failed + iLiveSession->Failed( *iLiveSession->iSession, 0 ); + EUNIT_ASSERT( iObserver->iSessionFailedCalled ); + iObserver->Reset(); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_UpdateFailedL() + { + // Try to tell session about update failure of another session + iLiveSession->UpdateFailed( *iSomeOtherSession->iSession, NULL ); + EUNIT_ASSERT( iObserver->iSessionFailedCalled ); // No container, internal error + iObserver->Reset(); + + // Try again with container + TMceTransactionDataContainer container; + iLiveSession->UpdateFailed( *iSomeOtherSession->iSession, &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); // No session yet, nothing happened + + // Invite and try again. + iLiveSession->InviteL( KTestRecipientSipUri() ); + iLiveSession->UpdateFailed( *iSomeOtherSession->iSession, &container ); + EUNIT_ASSERT( iObserver->IsReseted() ); // Wrong session, nothing happened¨ + + // Try with right session + iLiveSession->UpdateFailed( *iLiveSession->iSession, &container ); + EUNIT_ASSERT( iObserver->iSessionFailedCalled ); + iObserver->Reset(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_SRReceivedL() + { + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 0 ); + + // No session yet, nothing happens + iLiveSession->SRReceived( *iSomeOtherSession->iSession, + *(iSomeOtherSession->iSession->Streams()[0]) ); + + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 0 ); + + ESTABLISH_OUT_SESSION( iLiveSession ); + + // Simulate bigger value + iLiveSession->iSecondsFromLastRtcpReport = 10; + + // We have session, but informing concearn wrong session, timer is + // not nullified + iLiveSession->SRReceived( *iSomeOtherSession->iSession, + *(iSomeOtherSession->iSession->Streams()[0]) ); + + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 10 ); + + // Right session but wrong stream, timer should not be nullified + iLiveSession->SRReceived( *iLiveSession->iSession, + *(iSomeOtherSession->iSession->Streams()[0]) ); + + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 10 ); + + // Right stream and established session, timer should be nullified + + + iLiveSession->SRReceived( *iLiveSession->iSession, + *(iLiveSession->iSession->Streams()[0]) ); + + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 0 ); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_RRReceivedL() + { + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 0 ); + + // No session yet, nothing happens + iLiveSession->RRReceived( *iSomeOtherSession->iSession, + *(iSomeOtherSession->iSession->Streams()[0]) ); + + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 0 ); + + ESTABLISH_OUT_SESSION( iLiveSession ); + + // Simulate bigger value + iLiveSession->iSecondsFromLastRtcpReport = 10; + + // We have session, but informing concearn wrong session, timer is + // not nullified + iLiveSession->RRReceived( *iSomeOtherSession->iSession, + *(iSomeOtherSession->iSession->Streams()[0]) ); + + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 10 ); + + // Right session but wrong stream, timer should not be nullified + iLiveSession->RRReceived( *iLiveSession->iSession, + *(iSomeOtherSession->iSession->Streams()[0]) ); + + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 10 ); + + // Right stream and established session, timer should be nullified + + + iLiveSession->RRReceived( *iLiveSession->iSession, + *(iLiveSession->iSession->Streams()[0]) ); + + EUNIT_ASSERT( iLiveSession->iSecondsFromLastRtcpReport == 0 ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_InactivityTimeoutL() + { + // Construct an audio stream for this test + + CMceAudioStream* audioStream = CMceAudioStream::NewLC(); + + CMceRtpSource* rtpSource = CMceRtpSource::NewLC(); + audioStream->SetSourceL( rtpSource ); + CleanupStack::Pop( rtpSource ); + + iReceiveSession->InactivityTimeout( *audioStream, *rtpSource ); + + EUNIT_ASSERT( iObserver->IsReseted() ) + + CleanupStack::PopAndDestroy( audioStream ); + + // And now real inactivity timeout + + iReceiveSession->InactivityTimeout( + *iReceiveSession->iSession->Streams()[0], + *static_cast + (iReceiveSession->iSession->Streams()[0]->Source()) ); + + EUNIT_ASSERT( iObserver->iStreamIdleCalled ) + + iObserver->Reset(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_SsrcAddedL() + { + // As CMusEngMceSession::SsrcAdded is expected to do nothing, just call + // it to make sure it does not weaken the test coverage + + CMceRtpSource* rtpSource = static_cast( + iReceiveSession->iSession->Streams()[0]->Source() ); + iReceiveSession->SsrcAdded( + *iReceiveSession->iSession->Streams()[0], + *rtpSource, + 0 ); + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_SsrcRemovedL() + { + // As CMusEngMceSession::SsrcRemoved is expected to do nothing, just call + // it to make sure it does not weaken the test coverage + + CMceRtpSource* rtpSource = static_cast( + iReceiveSession->iSession->Streams()[0]->Source() ); + + iReceiveSession->SsrcRemoved( + *iReceiveSession->iSession->Streams()[0], + *rtpSource, + 0 ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_UpdateTimerEventL() + { + iLiveSession->UpdateTimerEvent(); + EUNIT_ASSERT( iObserver->iSessionTimeChangedCalled ) + EUNIT_ASSERT( iLiveSession->iUpdateTimer->IsActive() ) + iLiveSession->iUpdateTimer->Cancel(); + iObserver->Reset(); + + iLiveSession->iSecondsFromLastRtcpReport = 25; // >KMusEngRtcpInactivityThreshold + iLiveSession->UpdateTimerEvent(); + EUNIT_ASSERT( iObserver->iSessionTimeChangedCalled ) + EUNIT_ASSERT( iObserver->iInactivityTimeoutCalled ); + EUNIT_ASSERT( iLiveSession->iUpdateTimer->IsActive() ) + iLiveSession->iUpdateTimer->Cancel(); + iObserver->Reset(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::UT_CMusEngMceSession_IsRoamingBetweenAPsAllowedL() + { + // No session + EUNIT_ASSERT( iLiveSession->IsRoamingBetweenAPsAllowed() ) + + // Session idle + _LIT( KRecipientSipUri, "sip:user@some.where" ); + iLiveSession->InviteL( KRecipientSipUri ); + iLiveSession->iSession->iState = CMceSession::EIdle; + EUNIT_ASSERT( iLiveSession->IsRoamingBetweenAPsAllowed() ) + + // Session established + iLiveSession->iSession->iState = CMceSession::EEstablished; + EUNIT_ASSERT( !iLiveSession->IsRoamingBetweenAPsAllowed() ) + + // Session terminated + iLiveSession->iSession->iState = CMceSession::ETerminated; + EUNIT_ASSERT( iLiveSession->IsRoamingBetweenAPsAllowed() ) + } + +// HELPERS + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_CMusEngMceSession::SetMaxVolForSpeakersL(CMceSession& aSession, TInt aMaxVol) + { + for ( TInt i = 0; i < aSession.Streams().Count(); ++i ) + { + for ( TInt j = 0; j < aSession.Streams()[i]->Sinks().Count(); ++j ) + { + if ( aSession.Streams()[i]->Sinks()[j]->Type() == KMceSpeakerSink ) + { + CMceSpeakerSink* speaker = static_cast( + aSession.Streams()[i]->Sinks()[j] ); + speaker->iMaxVolume = aMaxVol; + } + } + } + } + +// TEST TABLE + +EUNIT_BEGIN_TEST_TABLE( + UT_CMusEngMceSession, + "UT_CMusEngMceSesssion", + "UNIT" ) + +EUNIT_TEST( + "TerminateL - test ", + "CMusEngMceSession", + "TerminateL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_TerminateLL, Teardown) + +EUNIT_TEST( + "GetSessionTime - test ", + "CMusEngMceSession", + "GetSessionTime", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_GetSessionTimeL, Teardown) + +EUNIT_TEST( + "ConnectionActive - test ", + "CMusEngMceSession", + "ConnectionActive", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_ConnectionActiveL, Teardown) + +EUNIT_TEST( + "ContainsAudioL - test ", + "CMusEngMceSession", + "ContainsAudioL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_ContainsAudioLL, Teardown) + +EUNIT_TEST( + "IsMutedL - test ", + "CMusEngMceSession", + "IsMutedL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_IsMutedLL, Teardown) + +EUNIT_TEST( + "OrientationL - test ", + "CMusEngMceSession", + "OrientationL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_OrientationLL, Teardown) + +EUNIT_TEST( + "SetOrientationL - test ", + "CMusEngMceSession", + "SetOrientationL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_SetOrientationLL, Teardown) + +EUNIT_TEST( + "VolumeUpL - test ", + "CMusEngMceSession", + "VolumeUpL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_VolumeUpLL, Teardown) + +EUNIT_TEST( + "VolumeDownL - test ", + "CMusEngMceSession", + "VolumeDownL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_VolumeDownLL, Teardown) + +EUNIT_TEST( + "SetVolumeL - test ", + "CMusEngMceSession", + "SetVolumeL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_SetVolumeLL, Teardown) + +EUNIT_TEST( + "EnableDisplay - test ", + "CMusEngMceSession", + "EnableDisplay", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_EnableDisplayL, Teardown) + +EUNIT_TEST( + "MuteL - test ", + "CMusEngMceSession", + "MuteL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_MuteLL, Teardown) + +EUNIT_TEST( + "UnmuteL - test ", + "CMusEngMceSession", + "UnmuteL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_UnmuteLL, Teardown) + +EUNIT_TEST( + "HandleTermination - test ", + "CMusEngMceSession", + "HandleTermination", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_HandleTerminationL, Teardown) + +EUNIT_TEST( + "AdjustVideoCodecL - test ", + "CMusEngMceSession", + "AdjustVideoCodecL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_AdjustVideoCodecLL, Teardown) + +EUNIT_TEST( + "AdjustAudioCodecL - test ", + "CMusEngMceSession", + "AdjustAudioCodecL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_AdjustAudioCodecLL, Teardown) + +EUNIT_TEST( + "RectChangedL - test ", + "CMusEngMceSession", + "RectChangedL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_RectChangedLL, Teardown) + +EUNIT_TEST( + "SetSessionSdpLinesL - test ", + "CMusEngMceSession", + "SetSessionSdpLinesL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_SetSessionSdpLinesLL, Teardown) + +EUNIT_TEST( + "AdjustStreamsAndCodecsL - test ", + "CMusEngMceSession", + "AdjustStreamsAndCodecsL", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_AdjustStreamsAndCodecsLL, Teardown) + +EUNIT_TEST( + "IncomingSession - test ", + "CMusEngMceSession", + "IncomingSession", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_IncomingSessionL, Teardown) + +EUNIT_TEST( + "IncomingUpdate - test ", + "CMusEngMceSession", + "IncomingUpdate", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_IncomingUpdateL, Teardown) + +EUNIT_TEST( + "StreamStateChangedL( source ) - test ", + "CMusEngMceSession", + "StreamStateChangedL( source )", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_StreamStateChangedWithSourceL, Teardown) + +EUNIT_TEST( + "SessionStateChanged - test ", + "CMusEngMceSession", + "SessionStateChanged", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_SessionStateChangedL, Teardown) + +EUNIT_TEST( + "SessionConnectionStateChanged - test ", + "CMusEngMceSession", + "SessionConnectionStateChanged", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_SessionConnectionStateChangedL, Teardown) + +EUNIT_TEST( + "Failed - test ", + "CMusEngMceSession", + "Failed", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_FailedL, Teardown) + +EUNIT_TEST( + "UpdateFailed - test ", + "CMusEngMceSession", + "UpdateFailed", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_UpdateFailedL, Teardown) + +EUNIT_TEST( + "StreamStateChanged - test ", + "CMusEngMceSession", + "StreamStateChanged", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_StreamStateChangedL, Teardown) + +EUNIT_TEST( + "StreamStateChangedL (sink ) - test ", + "CMusEngMceSession", + "StreamStateChangedL( sink )", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_StreamStateChangedWithSinkL, Teardown) + +EUNIT_TEST( + "SRReceived - test ", + "CMusEngMceSession", + "SRReceived", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_SRReceivedL, Teardown) + +EUNIT_TEST( + "RRReceived - test ", + "CMusEngMceSession", + "RRReceived", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_RRReceivedL, Teardown) + +EUNIT_TEST( + "InactivityTimeout - test ", + "CMusEngMceSession", + "InactivityTimeout", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_InactivityTimeoutL, Teardown) + +EUNIT_TEST( + "SsrcAdded - test ", + "CMusEngMceSession", + "SsrcAdded", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_SsrcAddedL, Teardown) + +EUNIT_TEST( + "SsrcRemoved - test ", + "CMusEngMceSession", + "SsrcRemoved", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_SsrcRemovedL, Teardown) + +EUNIT_TEST( + "UpdateTimerEvent - test ", + "CMusEngMceSession", + "UpdateTimerEvent", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_UpdateTimerEventL, Teardown) + +EUNIT_TEST( + "IsRoamingBetweenAPsAllowed - test ", + "CMusEngMceSession", + "IsRoamingBetweenAPsAllowed", + "FUNCTIONALITY", + SetupL, UT_CMusEngMceSession_IsRoamingBetweenAPsAllowedL, Teardown) + +EUNIT_END_TEST_TABLE + +// END OF FILE