diff -r 000000000000 -r 1bce908db942 natfw/natfwconnectionmultiplexer/tsrc/muxtestconsole/src/multiplexertcptests.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/natfwconnectionmultiplexer/tsrc/muxtestconsole/src/multiplexertcptests.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,480 @@ +/* +* 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 "natfwconnectivityapidefs.h" +#include +#include +#include "cncmconnectionmultiplexer.h" + +#include "testdefinitions.hrh" +#include "ncmconnectionmultiplexerlogs.h" +#include "cncmportstore.h" +#include "natfwsocketmediaconnwrapper.h" +#include "muxtestconsolestubs.h" +#include "multiplexertcptests.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 ================================================= + +// --------------------------------------------------------------------------- +// CMultiplexerTcpTestsInterface::CMultiplexerTcpTestsInterface +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CMultiplexerTcpTests::CMultiplexerTcpTests( CConsoleBase& aConsole, + CNcmConnectionMultiplexer& aMux, CMuxTestConsoleStubs& aIFStub ) : + iConsole( aConsole ), iMux( aMux ), iIfStub( aIFStub ) + { + } + +// --------------------------------------------------------------------------- +// CMultiplexerTcpTests::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CMultiplexerTcpTests::ConstructL() + { + // Dummy 'cause first uheap marking + TUint sessionId( 0 ); + TUint streamId( 0 ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5500, 10000 ); + 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 ); + } + +// --------------------------------------------------------------------------- +// CMultiplexerTcpTests::NewL +// Static constructor. +// --------------------------------------------------------------------------- +// +CMultiplexerTcpTests* CMultiplexerTcpTests::NewL( CConsoleBase& aConsole, + CNcmConnectionMultiplexer& aMux, CMuxTestConsoleStubs& aIFStub ) + { + CMultiplexerTcpTests* self + = new ( ELeave ) CMultiplexerTcpTests( aConsole, aMux, aIFStub ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CMultiplexerTcpTests::~CMultiplexerTcpTests +// Destructor. +// --------------------------------------------------------------------------- +// +CMultiplexerTcpTests::~CMultiplexerTcpTests() + { + } + + void CMultiplexerTcpTests::DoRunTcpMuxTestsL() + { + 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 ); + + // Check again with memory leak check + 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 ); + + err = KErrNone; + RDebug::Print( _L("MUX_TEST_START: TestConnectTcpConnectionsL") ); + iConsole.Printf( _L("Connect TCP connections test\n") ); + //__UHEAP_MARK; + TRAP( err, TestConnectTcpConnectionsL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestConnectTcpConnectionsL, ERR: %d"), err ); + + // Check again with memory leak check + err = KErrNone; + RDebug::Print( _L("MUX_TEST_START: TestConnectTcpConnectionsL") ); + iConsole.Printf( _L("Connect TCP connections test\n") ); + __UHEAP_MARK; + TRAP( err, TestConnectTcpConnectionsL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestConnectTcpConnectionsL, ERR: %d"), err ); + + err = KErrNone; + RDebug::Print( _L("MUX_TEST_START: TestActivateStunTcpMediaConnectionsL") ); + iConsole.Printf( _L("Activate STUN TCP MEDIA test\n") ); + __UHEAP_MARK; + TRAP( err, TestActivateStunTcpMediaConnectionsL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("MUX_TEST_STOP: TestActivateStunTcpMediaConnectionsL, ERR: %d"), err ); + } + +// --------------------------------------------------------------------------- +// CMultiplexerTcpTests::TestCreateSessionL +// --------------------------------------------------------------------------- +// +void CMultiplexerTcpTests::TestCreateSessionL() + { + TUint sessionId( 0 ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 8000 ); + CActiveScheduler::Start(); + + iMux.RemoveSessionL( sessionId ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 8000 ); + iMux.RemoveSessionL( sessionId ); + } + + +// --------------------------------------------------------------------------- +// CMultiplexerTcpTests::TestCreateSessionL +// --------------------------------------------------------------------------- +// +void CMultiplexerTcpTests::TestCreateStreamL() + { + TUint sessionId( 0 ); + TUint sessionId2( 0 ); + TUint streamId( 0 ); + TUint streamId2( 0 ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 8000 ); + CActiveScheduler::Start(); + + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + + iMux.RemoveStreamL( streamId ); + iMux.RemoveStreamL( streamId2 ); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + + iMux.RegisterIncomingConnectionObserverL( streamId, iIfStub ); + iMux.RegisterIncomingConnectionObserverL( streamId, iIfStub ); + + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + + iMux.RemoveStreamL( streamId ); + iMux.RemoveSessionL( sessionId ); + iMux.RemoveSessionL( sessionId2 ); + } + +// --------------------------------------------------------------------------- +// CMultiplexerTcpTests::TestCreateConnectionL +// --------------------------------------------------------------------------- +// +void CMultiplexerTcpTests::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, 8000 ); + CActiveScheduler::Start(); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + + 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::TestConnectTcpConnectionsL +// --------------------------------------------------------------------------- +// +void CMultiplexerTcpTests::TestConnectTcpConnectionsL() + { + TUint sessionId( 0 ); + + TUint streamId( 0 ); + TUint streamId2( 0 ); + + TUint connectionId( 0 ); + TUint connectionId2( 0 ); + TUint connectionId3( 0 ); + + + // Create 1 session, 1 stream, 1 connection + sessionId = iMux.CreateSessionL( KTestIapId, 8000, 11000 ); + CActiveScheduler::Start(); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + connectionId = iMux.CreateConnectionL( streamId, KAfInet ); + connectionId2 = iMux.CreateConnectionL( streamId2, KAfInet ); + + // Address resolving + TInetAddr connectionAddr( iMux.LocalIPAddressL( streamId, connectionId ) ); + TInetAddr connectionAddr2( iMux.LocalIPAddressL( streamId2, connectionId2 ) ); + + iMux.RegisterConnectionObserverL( streamId, iIfStub ); + iMux.RegisterConnectionObserverL( streamId2, iIfStub ); + + iMux.OpenTcpConnectionL( streamId, connectionId, ETcpSetupActive, connectionAddr2 ); + iMux.OpenTcpConnectionL( streamId2, connectionId2, ETcpSetupActive, connectionAddr ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.CloseTcpConnection( streamId, connectionId ); + iMux.CloseTcpConnection( streamId2, connectionId2 ); + + iMux.OpenTcpConnectionL( streamId, connectionId, ETcpSetupPassive, connectionAddr2 ); + iMux.OpenTcpConnectionL( streamId2, connectionId2, ETcpSetupActive, connectionAddr ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.CloseTcpConnection( streamId, connectionId ); + iMux.CloseTcpConnection( streamId2, connectionId2 ); + + iMux.OpenTcpConnectionL( streamId2, connectionId2, ETcpSetupActive, connectionAddr ); + iMux.OpenTcpConnectionL( streamId, connectionId, ETcpSetupPassive, connectionAddr2 ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.CloseTcpConnection( streamId, connectionId ); + iMux.CloseTcpConnection( streamId2, connectionId2 ); + + // Cancel the connection process + iMux.OpenTcpConnectionL( streamId, connectionId, ETcpSetupPassive, connectionAddr2 ); + iMux.CloseTcpConnection( streamId, connectionId ); + CActiveScheduler::Start(); + + iMux.OpenTcpConnectionL( streamId, connectionId, ETcpSetupPassive, connectionAddr2 ); + iMux.CloseTcpConnection( streamId, connectionId ); + CActiveScheduler::Start(); + iMux.RemoveSessionL( sessionId ); + } + + + +// --------------------------------------------------------------------------- +// CMultiplexerTcpTests::TestActivateStunTcpMediaConnectionsL +// --------------------------------------------------------------------------- +// +void CMultiplexerTcpTests::TestActivateStunTcpMediaConnectionsL() + { + TUint sessionId( 0 ); + + TUint streamId( 0 ); + TUint streamId2( 0 ); + + TUint connectionId( 0 ); + TUint connectionId2( 0 ); + TUint connectionId3( 0 ); + + sessionId = iMux.CreateSessionL( KTestIapId, 5000, 8000 ); + CActiveScheduler::Start(); + + streamId = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + streamId2 = iMux.CreateStreamL( sessionId, KDefaultQos, KProtocolInetTcp ); + + // Simulate UDP fetch candidate + iMux.RegisterIncomingConnectionObserverL( streamId, iIfStub ); + iMux.RegisterConnectionObserverL( streamId, iIfStub ); + iMux.RegisterConnectionObserverL( streamId2, iIfStub ); + connectionId = iMux.CreateConnectionL( streamId, KAfInet ); + + // Test connection + connectionId2 = iMux.CreateConnectionL( streamId2, KAfInet ); + TInetAddr connectionAddress2( iMux.LocalIPAddressL( streamId2, connectionId2 ) ); + + // Test connection, SERVER + connectionId3 = iMux.CreateConnectionL( streamId2, KAfInet ); + TInetAddr connectionAddress3( iMux.LocalIPAddressL( streamId2, connectionId3 ) ); + + /**** 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 ); + //TODO connect connection 2 to wrapper and start wrapper receiving + /**************************/ + + // Dummy address + TInetAddr stunServerAddress; + stunServerAddress.SetAddress( INET_ADDR( 10,36,7,6 ) ); + stunServerAddress.SetPort( 3478 ); + + // STUN-plugin connects connection to stun server + iMux.OpenTcpConnectionL( streamId2, connectionId3, ETcpSetupPassive, stunServerAddress ); // Server + iMux.OpenTcpConnectionL( streamId, connectionId, ETcpSetupActive, connectionAddress3 ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + iMux.SetSendingStateL( streamId, connectionId, stunServerAddress, EStreamingStateActive ); + iMux.SetReceivingStateL( streamId2, connectionId3, EStreamingStateActive ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + // Binding request + _LIT8(KUDPMessage,"UDP_Binding_Request"); + iMux.SendL( streamId, connectionId, KUDPMessage, NULL ); + + + // STUN plugin, reuse connection.. connect to peer address + iMux.CloseTcpConnection( streamId, connectionId ); // Connection to STUN server + CActiveScheduler::Start(); + + iMux.OpenTcpConnectionL( streamId2, connectionId2, ETcpSetupPassive, stunServerAddress ); // Remote end + iMux.OpenTcpConnectionL( streamId, connectionId, ETcpSetupActive, connectionAddress2 ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + // Remote end + + TInetAddr connectionAddress( iMux.LocalIPAddressL( streamId, connectionId ) ); + iMux.SetSendingStateL( streamId2, connectionId2, connectionAddress, EStreamingStateActive ); + CActiveScheduler::Start(); + + + // Setup media flow to peer + // NATFW client + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + iMux.SetReceivingStateForMediaL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + // NATFW client + iMux.SetSendingStateL( streamId, connectionId, connectionAddress2, EStreamingStateActive );; + iMux.SetSendingStateForMediaL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + + // Set sending again + iMux.SetSendingStateL( streamId, connectionId, connectionAddress2, EStreamingStateActive ); + CActiveScheduler::Start(); + iMux.SetSendingStateL( streamId, connectionId, connectionAddress2, EStreamingStateActive ); + CActiveScheduler::Start(); + + // Set receiving again + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + iMux.SetReceivingStateL( streamId, connectionId, EStreamingStateActive ); + CActiveScheduler::Start(); + + iMux.SendL( streamId2, connectionId2, KUDPMessage, &iIfStub ); + iMux.SendL( streamId2, connectionId2, KUDPMessage, connectionAddress2, &iIfStub ); + CActiveScheduler::Start(); + CActiveScheduler::Start(); + + iMux.CloseTcpConnection( streamId, connectionId ); // Connection to STUN server + iMux.RemoveSessionL( sessionId ); + }