natfw/natfwconnectionmultiplexer/tsrc/muxtestconsole/src/multiplexerudptests.cpp
changeset 0 1bce908db942
--- /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 <e32debug.h>
+#include <in_sock.h>
+#include "cncmconnectionmultiplexer.h"
+#include <mmccinterface.h>
+#include <mmcccodecinformation.h>
+
+#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<CMccCodecInformation> codecArray;
+    CleanupResetAndDestroy< RPointerArray<CMccCodecInformation> >::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 );
+    }