diff -r 000000000000 -r 1bce908db942 natfw/natfwconnectionmultiplexer/tsrc/muxtestconsole/src/multiplexerudptests.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/natfwconnectionmultiplexer/tsrc/muxtestconsole/src/multiplexerudptests.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,644 @@ +/* +* Copyright (c) 2007 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: +* +*/ + + + + +// INCLUDES +#include +#include +#include "cncmconnectionmultiplexer.h" +#include +#include + +#include "multiplexerudptests.h" +#include "muxtestconsolestubs.h" +#include "testdefinitions.hrh" +#include "ncmconnectionmultiplexerlogs.h" +#include "cncmportstore.h" +#include "natfwsocketmediaconnwrapper.h" + +#ifndef __WINSCW__ +const TInt KTestIapId = 1; +#else +const TInt KTestIapId = 6; +#endif + +const TInt KAudioPrefVoipAudioUplink = 0x05220001; +const TInt KAudioPrefVoipAudioUplinkNonSignal = 0x05230001; +const TInt KAudioPrefVoipAudioDownlink = 0x05210001; +const TInt KAudioDTMFString = 0x00150001; +const TInt KAudioPriorityDTMFString = 45; + +const TInt KDefaultQos = 46; +_LIT8(KUDPMessage,"UDP_Message"); + +const TUint KMediaConnection = 1; + +// ======== MEMBER FUNCTIONS ================================================= + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTestsInterface::CMultiplexerUdpTestsInterface +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CMultiplexerUdpTests::CMultiplexerUdpTests( CConsoleBase& aConsole, + CNcmConnectionMultiplexer& aMux, CMuxTestConsoleStubs& aIFStub ) : + iConsole( aConsole ), iMux( aMux ), iIfStub( aIFStub ) + { + } + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CMultiplexerUdpTests::ConstructL() + { + RDebug::Print( _L("CMultiplexerUdpTests::ConstructL IAP: %d"), KTestIapId ); + + // Dummy 'cause first uheap marking + TUint sessionId( 0 ); + TUint streamId( 0 ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5090, 5500 ); + CActiveScheduler::Start(); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + + iMux.RegisterIncomingConnectionObserverL( streamId, iIfStub ); + TUint sub = iMux.CreateConnectionL( streamId, KAfInet ); + iMux.UnregisterIncomingConnectionObserverL( streamId, iIfStub ); + iMux.RemoveSessionL( sessionId ); + } + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::NewL +// Static constructor. +// --------------------------------------------------------------------------- +// +CMultiplexerUdpTests* CMultiplexerUdpTests::NewL( CConsoleBase& aConsole, + CNcmConnectionMultiplexer& aMux, CMuxTestConsoleStubs& aIFStub ) + { + CMultiplexerUdpTests* self + = new ( ELeave ) CMultiplexerUdpTests( aConsole, aMux, aIFStub ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::~CMultiplexerUdpTests +// Destructor. +// --------------------------------------------------------------------------- +// +CMultiplexerUdpTests::~CMultiplexerUdpTests() + { + delete iMccInterface; + TRAP_IGNORE( iMux.RemoveSessionL( iSessionId ) ); + } + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::DoRunUdpMuxtTests +// +// --------------------------------------------------------------------------- +// +void CMultiplexerUdpTests::DoRunUdpMuxtTests() + { + iConsole.ClearScreen(); + iConsole.Printf( _L("\n*** MUX TESTS ***\n") ); + + TInt err( KErrNone ); + + iConsole.Printf( _L("Create session test\n") ); + RDebug::Print( _L("MUX_TEST_START: TestCreateSessionL") ); + //__UHEAP_MARK; + TRAP( err, TestCreateSessionL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestCreateSessionL, ERR: %d"), err ); + + iConsole.Printf( _L("Create session test\n") ); + RDebug::Print( _L("MUX_TEST_START: TestCreateSessionL") ); + __UHEAP_MARK; + TRAP( err, TestCreateSessionL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestCreateSessionL, ERR: %d"), err ); + + err = KErrNone; + RDebug::Print( _L("MUX_TEST_START: TestCreateStreamL") ); + iConsole.Printf( _L("Create stream test\n") ); + __UHEAP_MARK; + TRAP( err, TestCreateStreamL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestCreateStreamL, ERR: %d"), err ); + + err = KErrNone; + RDebug::Print( _L("MUX_TEST_START: TestCreateConnectionL") ); + iConsole.Printf( _L("Create connection test\n") ); + __UHEAP_MARK; + TRAP( err, TestCreateConnectionL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestCreateConnectionL, ERR: %d"), err ); + + // After this test again with memory leak check + err = KErrNone; + RDebug::Print( _L("MUX_TEST_START: TestActivateUdpConnectionsL") ); + iConsole.Printf( _L("(De)Activate UDP connections test\n") ); + //__UHEAP_MARK; + TRAP( err, TestActivateUdpConnectionsL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestActivateUdpConnectionsL, ERR: %d"), err ); + + // DO same as before... Now check memory leak + err = KErrNone; + RDebug::Print( _L("MUX_TEST_START: TestActivateUdpConnectionsL") ); + iConsole.Printf( _L("(De)Activate UDP connections test\n") ); + __UHEAP_MARK; + TRAP( err, TestActivateUdpConnectionsL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestActivateUdpConnectionsL, ERR: %d"), err ); + + err = KErrNone; + RDebug::Print( _L("MUX_TEST_START: TestActivateStunUdpMediaConnectionsL") ); + iConsole.Printf( _L("(De)Activate STUN UDP media connections test\n") ); + __UHEAP_MARK; + TRAP( err, TestActivateStunUdpMediaConnectionsL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestActivateStunUdpMediaConnectionsL, ERR: %d"), err ); + } + + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::TestCreateSessionL +// --------------------------------------------------------------------------- +// +void CMultiplexerUdpTests::TestCreateSessionL() + { + TUint sessionId( 0 ); + TUint sessionId2( 0 ); + + sessionId = iMux.CreateSessionL( 0,5000, 5100 ); + CActiveScheduler::Start(); + + iMux.RemoveSessionL( sessionId ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 5100 ); + iMux.RemoveSessionL( sessionId ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 5100 ); + iMux.RemoveSessionL( sessionId ); + + sessionId = iMux.CreateSessionL( 0,5000, 5100 ); + sessionId2 = iMux.CreateSessionL( 0,5000, 5100 ); + CActiveScheduler::Start(); + + iMux.RemoveSessionL( sessionId ); + iMux.RemoveSessionL( sessionId2 ); + + + } + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::TestCreateStreamL +// --------------------------------------------------------------------------- +// +void CMultiplexerUdpTests::TestCreateStreamL() + { + TUint sessionId( 0 ); + TUint sessionId2( 0 ); + TUint streamId( 0 ); + TUint streamId2( 0 ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 5100 ); + CActiveScheduler::Start(); + + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + + iMux.RemoveStreamL( streamId ); + iMux.RemoveStreamL( streamId2 ); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + + iMux.RegisterIncomingConnectionObserverL( streamId, iIfStub ); + iMux.RegisterIncomingConnectionObserverL( streamId, iIfStub ); + + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + + iMux.RemoveStreamL( streamId ); + iMux.RemoveSessionL( sessionId ); + iMux.RemoveSessionL( sessionId2 ); + } + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::TestCreateConnectionL +// --------------------------------------------------------------------------- +// +void CMultiplexerUdpTests::TestCreateConnectionL() + { + TUint sessionId( 0 ); + + TUint streamId( 0 ); + TUint streamId2( 0 ); + + TUint connectionId( 0 ); + TUint connectionId2( 0 ); + TUint connectionId3( 0 ); + TUint connectionId4( 0 ); + TUint connectionId5( 0 ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 5100 ); + CActiveScheduler::Start(); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + + iMux.RegisterIncomingConnectionObserverL(streamId, iIfStub ); + + connectionId = iMux.CreateConnectionL( streamId, KAfInet ); + connectionId2 = iMux.CreateConnectionL( streamId, KAfInet ); + connectionId3 = iMux.CreateConnectionL( streamId2, KAfInet ); + + // New connection, Reuse local address + TInetAddr connectionAddr = iMux.LocalIPAddressL( streamId, connectionId2 ); + connectionId4 = iMux.CreateConnectionL( streamId2, connectionAddr ); + // Check success of address reuse + TInetAddr connectionAddr2 = iMux.LocalIPAddressL( streamId, connectionId4 ); + ASSERT( connectionAddr.CmpAddr( connectionAddr2 ) ); + + + // New connection, Reuse local address + TInetAddr connectionAddr3 = iMux.LocalIPAddressL( streamId, connectionId3 ); + connectionId5 = iMux.CreateConnectionL( streamId2, connectionAddr3 ); + // Check success of address reuse + TInetAddr connectionAddr5 = iMux.LocalIPAddressL( streamId2, connectionId5 ); + ASSERT( connectionAddr3.CmpAddr( connectionAddr5 ) ); + + // New connection, Reuse local address + connectionAddr3 = iMux.LocalIPAddressL( streamId, connectionId3 ); + connectionId5 = iMux.CreateConnectionL( streamId2, connectionAddr3 ); + // Check success of address reuse + connectionAddr5 = iMux.LocalIPAddressL( streamId2, connectionId5 ); + ASSERT( connectionAddr3.CmpAddr( connectionAddr5 ) ); + + iMux.RemoveConnectionL( streamId2, connectionId5 ); + iMux.RemoveConnectionL( streamId, connectionId3 ); + iMux.RemoveStreamL( streamId ); + iMux.RemoveSessionL( sessionId ); + } + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::TestActivateUdpConnectionsL +// --------------------------------------------------------------------------- +// +void CMultiplexerUdpTests::TestActivateUdpConnectionsL() + { + TUint sessionId( 0 ); + + TUint streamId( 0 ); + TUint streamId2( 0 ); + + TUint connectionId( 0 ); + TUint connectionId2( 0 ); + TUint connectionId3( 0 ); + + TInetAddr connectionAddr; + TInetAddr connectionAddr2; + + // Create 1 session, 1 stream, 1 connection + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 5100 ); + CActiveScheduler::Start(); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + connectionId = iMux.CreateConnectionL( streamId, KAfInet ); + connectionAddr = iMux.LocalIPAddressL( streamId, connectionId ); + + // Test connection + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + connectionId2 = iMux.CreateConnectionL( streamId2, KAfInet ); + connectionAddr2 = iMux.LocalIPAddressL( streamId2, connectionId2 ); + + iMux.RegisterIncomingConnectionObserverL( streamId, iIfStub ); + iMux.RegisterOutgoingConnectionObserverL( streamId, iIfStub ); + iMux.RegisterConnectionObserverL( streamId, iIfStub ); + iMux.RegisterMessageObserverL( streamId, iIfStub ); + + // Activate receiving -> passivate receiving + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStatePassive ); + CActiveScheduler::Start(); + + // Activate sending -> passivate sending + iMux.SetSendingStateL( streamId, connectionId, connectionAddr2, EStreamingStateActive ); + CActiveScheduler::Start(); + iMux.SetSendingStateL( streamId, connectionId, connectionAddr2, EStreamingStatePassive ); + CActiveScheduler::Start(); + + // Activate receiving/sending -> passivate receiving/sending + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + iMux.SetSendingStateL( streamId, connectionId, connectionAddr2, EStreamingStateActive ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.SetSendingStateL( streamId, connectionId, connectionAddr2, EStreamingStatePassive ); + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStatePassive );; + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + // Activate receiving/sending -> activate sending again with different destination address + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + iMux.SetSendingStateL( streamId, connectionId, connectionAddr, EStreamingStateActive ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + // Set sending again + iMux.SetSendingStateL( streamId, connectionId, connectionAddr2, EStreamingStateActive ); + CActiveScheduler::Start(); + iMux.SetSendingStateL( streamId, connectionId, connectionAddr2, EStreamingStateActive ); + CActiveScheduler::Start(); + + // Set receiving again + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + + iMux.SetSendingStateL( streamId, connectionId, connectionAddr2, EStreamingStatePassive ); + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStatePassive ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.RemoveSessionL( sessionId ); + + } + + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::TestActivateStunUdpMediaConnectionsL +// --------------------------------------------------------------------------- +// +void CMultiplexerUdpTests::TestActivateStunUdpMediaConnectionsL() + { + TUint sessionId( 0 ); + + TUint streamId( 0 ); + TUint streamId2( 0 ); + + TUint connectionId( 0 ); + TUint connectionId2( 0 ); + TUint connectionId3( 0 ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 5100 ); + CActiveScheduler::Start(); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + + // Simulate UDP fetch candidate + iMux.RegisterIncomingConnectionObserverL( streamId, iIfStub ); + iMux.RegisterConnectionObserverL( streamId, iIfStub ); + + connectionId = iMux.CreateConnectionL( streamId, KAfInet ); + + // Test connection + connectionId2 = iMux.CreateConnectionL( streamId, KAfInet ); + TInetAddr connectionAddress2( iMux.LocalIPAddressL( streamId, connectionId2 ) ); + + /**** setup wrapper *****/ + CNATFWSocketMediaConnWrapper* mediaWrapper = CNATFWSocketMediaConnWrapper::NewL( + iMux.PortStoreL( sessionId ).Port(), KProtocolInetUdp, streamId ); + + iMux.RegisterMediaWrapperL( mediaWrapper ); + + TInetAddr destinationAddress; + mediaWrapper->OutgoingAddr( destinationAddress ); + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- Wrapper LOCAL ADDRESS: ", destinationAddress ) + + + mediaWrapper->SetIncomingAddrL( destinationAddress ); + + TInetAddr stunServerAddress; + stunServerAddress.SetAddress( INET_ADDR( 10,36,7,6 ) ); + stunServerAddress.SetPort( 3478 ); + + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + iMux.SetSendingStateL( streamId, connectionId, stunServerAddress, EStreamingStateActive ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + // Binding request + _LIT8(KUDPMessage,"UDP_Binding_Request"); + iMux.SendL( streamId, connectionId, KUDPMessage, NULL ); + + // Setup media flow to peer + // NATFW client + iMux.SetReceivingStateForMediaL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + + // STUN plugin, reuse connection.. connect to peer address + iMux.SetSendingStateL( streamId, connectionId, connectionAddress2, EStreamingStateActive ); + + // NATFW client + iMux.SetSendingStateForMediaL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.SendL( streamId, connectionId, KUDPMessage, &iIfStub ); + iMux.SendL( streamId, connectionId, KUDPMessage, connectionAddress2, &iIfStub ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.RemoveSessionL( sessionId ); + } + + + +// --------------------------------------------------------------------------- +// CMultiplexerUdpTests::TestUdpAudioL +// --------------------------------------------------------------------------- +// +void CMultiplexerUdpTests::TestUdpAudioStreamingL() + { + TUint sessionId( 0 ); + TUint streamId( 0 ); + TUint streamId2( 0 ); + // UDP SESSIO + RDebug::Print( _L("CMultiplexerUdpTests::TestUdpAudioL - start") ); + + iSessionId = iMux.CreateSessionL( KTestIapId, 5000, 5100 ); + sessionId = iSessionId; + CActiveScheduler::Start(); + + + // STREAM + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + TUint connectionId2 = iMux.CreateConnectionL( streamId, KAfInet ); + + // STREAM 2 + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetUdp ); + TUint connectionId = iMux.CreateConnectionL( streamId2, KAfInet ); + + // Get local IP that receives media + TInetAddr receiveMediaAddress; + receiveMediaAddress = iMux.LocalIPAddressL( streamId, connectionId2 ); + + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- LOCAL ADDRESS: ", receiveMediaAddress ) + + // WRAPPER + CNATFWSocketMediaConnWrapper* mediaWrapper = CNATFWSocketMediaConnWrapper::NewL( + iMux.PortStoreL( sessionId ).Port(), KProtocolInetUdp, streamId ); + + iMux.RegisterMediaWrapperL( mediaWrapper ); + + TInetAddr destinationAddress; + //destinationAddress = receiveMediaAddress; + //destinationAddress.SetPort( port); + mediaWrapper->OutgoingAddr( destinationAddress ); + + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- Wrapper LOCAL ADDRESS: ", destinationAddress ) + + + + // NET settings value + iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() ); + iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() ); + iNetsettings.iRemoteRtcpPort = KDefaultRtcpPort; + + iNetsettings.iLocalAddress.SetAddress( KInetAddrAny ); + iNetsettings.iLocalAddress.SetPort( KDefaultRtpPort ); + + iNetsettings.iLocalPublicAddress.SetAddress( KInetAddrAny ); + iNetsettings.iLocalRtcpPort = KDefaultRtcpPort; + iNetsettings.iLocalPublicRtcpPort = KDefaultRtcpPort; + iNetsettings.iMediaQosValue = KDefaultMediaQos; + iNetsettings.iIapId = KTestIapId; + + TUint32 sessionId1; + iMccInterface = CMccInterface::NewL( iIfStub ); + User::LeaveIfError( iMccInterface->CreateSession( sessionId1 ) ); + + + // Create MCC LINK + TUint32 linkId; + User::LeaveIfError( iMccInterface->CreateLink( sessionId1, KMccLinkGeneral, linkId, iNetsettings ) ); + + CActiveScheduler::Start(); + + + iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() ); + iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() ); + + + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- iNetsettings.iRemoteAddress: ", iIfStub.NetSettings().iRemoteAddress ) + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress ) + + User::LeaveIfError( iMccInterface->SetRemoteAddress( sessionId1, linkId, iNetsettings.iRemoteAddress ) ); + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress) + + + RPointerArray codecArray; + CleanupResetAndDestroy< RPointerArray >::PushL( codecArray ); + User::LeaveIfError( iMccInterface->GetCapabilities( codecArray ) ); + + + + // Create upstream + TUint32 upStream; + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( iMccInterface->AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( iMccInterface->AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioUplink ); + User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, upStream, + KMccAudioUplinkStream, *codecArray[0] ) ); + + // Create downstream + TUint32 downStream; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( iMccInterface->AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( iMccInterface->AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) ); + codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioDownlink ); + User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, downStream, + KMccAudioDownlinkStream, *codecArray[0] ) ); + + + // Set destination address to wrapper + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress ) + mediaWrapper->SetIncomingAddrL( iIfStub.NetSettings().iLocalAddress); + + mediaWrapper->SetReceivingStateL( EStreamingStateActive ); + mediaWrapper->SetSendingStateL( EStreamingStateActive ); + + // Address resolving + TInetAddr streamAddr; + TInetAddr streamAddr2; + + streamAddr = iMux.LocalIPAddressL( streamId, 1 ); + streamAddr2 = iMux.LocalIPAddressL( streamId2, 1 ); + + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL - receiver - streamAddr: ", streamAddr ) + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- sender - streamAddr2: ", streamAddr2 ) + __CONNECTIONMULTIPLEXER_ADDRLOG( "CMultiplexerUdpTests::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress ) + + // Connect internal two streams + //iMux.SetReceivingStateL( streamId2, connectionId, EStreamingStateActive ); + //iMux.SetSendingStateL( streamId2, connectionId, streamAddr, EStreamingStateActive ); + + iMux.SetReceivingStateL( streamId, KMediaConnection, EStreamingStateActive ); + iMux.SetSendingStateL( streamId, KMediaConnection, streamAddr/*2*/, EStreamingStateActive ); + + + iMux.RegisterIncomingConnectionObserverL( streamId/*2*/, iIfStub ); + iMux.RegisterOutgoingConnectionObserverL( streamId/*2*/, iIfStub ); + + + RDebug::Print( _L("CMultiplexerUdpTests::TestUdpAudioL - after prepare stream1") ); + + User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, upStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + RDebug::Print( _L("CMultiplexerUdpTests::TestUdpAudioL - before prepare stream2") ); + // Prepare and start up and downstream + User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, downStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + RDebug::Print( _L("CMultiplexerUdpTests::TestUdpAudioL - after start stream1") ); + + User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, upStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + + + RDebug::Print( _L("CMultiplexerUdpTests::TestUdpAudioL - after prepare stream2") ); + + User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, downStream ) ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + RDebug::Print( _L("CMultiplexerUdpTests::TestUdpAudioL - end") ); + CleanupStack::PopAndDestroy( &codecArray ); + //iMux.RemoveStreamL( streamId ); + }