--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccrtpsourcesink/tsrc/ut_rtpsourcesink/src/UT_CMccRtpSender.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,428 @@
+/*
+* Copyright (c) 2004 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:
+*
+*/
+
+
+
+
+// CLASS HEADER
+#include "UT_CMccRtpSender.h"
+
+// EXTERNAL INCLUDES
+#include <digia/eunit/EUnitMacros.h>
+#include "rtpheader.h"
+
+// CONSTANTS
+
+const TInt KMaxQueueSize = 30; // KMccMaxSendQueueSize
+const TUint32 KTestRtpSendTimeoutLongMillisecs = 600; // KMccRtpSendTimeoutLongMillisecs
+
+// INTERNAL INCLUDES
+
+
+UT_CMccRtpSender* UT_CMccRtpSender::NewL()
+ {
+ UT_CMccRtpSender* self = UT_CMccRtpSender::NewLC();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+UT_CMccRtpSender* UT_CMccRtpSender::NewLC()
+ {
+ UT_CMccRtpSender* self = new( ELeave ) UT_CMccRtpSender();
+ CleanupStack::PushL( self );
+
+ self->ConstructL();
+
+ return self;
+ }
+
+UT_CMccRtpSender::UT_CMccRtpSender()
+ {
+ }
+
+// Destructor (virtual by CBase)
+UT_CMccRtpSender::~UT_CMccRtpSender()
+ {
+ }
+
+// Second phase construct
+void UT_CMccRtpSender::ConstructL()
+ {
+ // The ConstructL from the base class CEUnitTestSuiteClass must be called.
+ // It generates the test case table.
+ CEUnitTestSuiteClass::ConstructL();
+ }
+
+// METHODS
+void UT_CMccRtpSender::SetupL( )
+ {
+ iLastError = KErrNone;
+ iRtpApi = CRtpAPI::NewL( *this );
+ iSender = CMccRtpSender::NewL( *this, *iRtpApi, 1, ETrue );
+ }
+
+void UT_CMccRtpSender::Teardown( )
+ {
+ delete iSender;
+ iSender = NULL;
+ delete iRtpApi;
+ iRtpApi = NULL;
+ }
+
+
+void UT_CMccRtpSender::ErrorNotify( TInt /*aErrCode*/ )
+ {
+ }
+
+void UT_CMccRtpSender::SendErrorOccured( TInt aError )
+ {
+ iLastError = aError;
+ }
+
+// TEST FUNCTIONs
+
+void UT_CMccRtpSender::UT_CMccRtpSender_SendRtpPacketTest()
+ {
+ _LIT8( KMccRtpSenderTestData, "testadata" );
+ TRtpId streamId( 2 );
+ TRtpSendHeader sendHeader;
+ TInt timestamp = 1000;
+ sendHeader.iTimestamp = timestamp;
+ sendHeader.iMarker = 1;
+ TUint16 seqNum( 10 );
+
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+ EUNIT_ASSERT( iSender->iSendQueue[ 0 ]->RtpStreamId() == streamId );
+ EUNIT_ASSERT( iSender->iSendQueue[ 0 ]->RtpHeader().iTimestamp == timestamp );
+ EUNIT_ASSERT( iSender->iSendQueue[ 0 ]->DataPtr() == KMccRtpSenderTestData );
+
+ // Send is active, make queue full
+
+ for ( TInt i = 1; i < KMaxQueueSize; i++ )
+ {
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), i + 1 );
+ }
+
+ // As queue is full, packet is discarded
+ TInt queueSize = iSender->iSendQueue.Count();
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), queueSize );
+
+ // Sending completes successfully
+ iSender->Cancel();
+ iSender->RunL();
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), queueSize - 1 );
+ EUNIT_ASSERT_EQUALS( iLastError, KErrNone );
+
+ // Sending of next packet fails
+ iSender->Cancel();
+ iSender->iStatus = KErrGeneral;
+ iSender->RunL();
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), queueSize - 2 );
+ EUNIT_ASSERT_EQUALS( iLastError, KErrGeneral );
+ }
+
+void UT_CMccRtpSender::UT_CMccRtpSender_SendDataLL()
+ {
+ _LIT8( KMccRtpSenderTestData, "testadata" );
+ TRtpId sessionId( 1 );
+ TBool useRtpSocket( EFalse );
+ iSender->SendDataL( sessionId, useRtpSocket, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+ EUNIT_ASSERT( iSender->iSendQueue[ 0 ]->RtpStreamId() == KNullId );
+ EUNIT_ASSERT( iSender->iSendQueue[ 0 ]->SessionId() == sessionId );
+ EUNIT_ASSERT( iSender->iSendQueue[ 0 ]->DataPtr() == KMccRtpSenderTestData );
+
+ // Send is active, make queue full
+ for ( TInt i = 1; i < KMaxQueueSize; i++ )
+ {
+ iSender->SendDataL( sessionId, useRtpSocket, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), i + 1 );
+ }
+
+ // As queue is full, packet is discarded
+ TInt queueSize = iSender->iSendQueue.Count();
+ EUNIT_ASSERT_LEAVE(
+ iSender->SendDataL( sessionId, useRtpSocket, KMccRtpSenderTestData ) );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), queueSize );
+
+ // Sending completes successfully
+ iSender->Cancel();
+ iSender->RunL();
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), queueSize - 1 );
+ EUNIT_ASSERT_EQUALS( iLastError, KErrNone );
+
+ // Sending of next packet fails
+ iSender->Cancel();
+ iSender->iStatus = KErrGeneral;
+ iSender->RunL();
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), queueSize - 2 );
+ EUNIT_ASSERT_EQUALS( iLastError, KErrGeneral );
+ }
+
+void UT_CMccRtpSender::UT_CMccRtpSender_ClearTest()
+ {
+ _LIT8( KMccRtpSenderTestData, "testadata" );
+ TRtpId streamId( 2 );
+ TRtpSendHeader sendHeader;
+ TInt timestamp = 1000;
+ sendHeader.iTimestamp = timestamp;
+ TUint16 seqNum( 10 );
+
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+
+ iSender->Clear();
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 0 );
+ }
+
+void UT_CMccRtpSender::UT_CMccRtpSender_SendingTimeoutTest()
+ {
+ _LIT8( KMccRtpSenderTestData, "testadata" );
+ TRtpId streamId( 2 );
+ TRtpSendHeader sendHeader;
+ TInt timestamp = 1000;
+ sendHeader.iTimestamp = timestamp;
+ TUint16 seqNum( 10 );
+
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+
+ iSender->TimerExpiredL( 0, NULL );
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 0 );
+ }
+
+void UT_CMccRtpSender::UT_CMccRtpSender_MarkerBasedClearingTest()
+ {
+ // Set to short timeout mode
+ iSender->iTimeoutTimeMilliseconds = KTestRtpSendTimeoutLongMillisecs;
+
+ _LIT8( KMccRtpSenderTestData, "testadata" );
+ TRtpId streamId( 2 );
+ TRtpSendHeader sendHeader;
+ TInt timestamp = 1000;
+ sendHeader.iTimestamp = timestamp;
+ TUint16 seqNum( 10 );
+ sendHeader.iMarker = 0;
+
+ // Timeout occurs when sending zero marker packet and there's already the full
+ // frame in the queue
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+
+ seqNum++;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 2 );
+
+ seqNum++;
+ sendHeader.iMarker = 1;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 3 );
+
+ iSender->TimerExpiredL( 0, NULL );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 0 );
+
+ // Timeout occurs when sending marker packet
+ seqNum++;
+ sendHeader.iMarker = 1;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+
+ seqNum++;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 2 );
+
+ iSender->TimerExpiredL( 0, NULL );
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+
+ seqNum++;
+ sendHeader.iMarker = 0;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 2 );
+
+ iSender->TimerExpiredL( 0, NULL );
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+
+ // Timeout occurs when sending zero marker packet and there's no full frame
+ // in the queue
+ seqNum++;
+ sendHeader.iMarker = 0;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 2 );
+
+ iSender->TimerExpiredL( 0, NULL );
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 0 );
+ EUNIT_ASSERT( iSender->iDiscarding == ETrue );
+
+ // Next packets are discarded because of that
+ seqNum++;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 0 );
+ EUNIT_ASSERT( iSender->iDiscarding == ETrue );
+
+ seqNum++;
+ sendHeader.iMarker = 1;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 0 );
+ EUNIT_ASSERT( iSender->iDiscarding == EFalse );
+
+ // Buffer is full and dropped frame is zero marker frame and there's some
+ // packets of same frame in the queue
+ for ( TInt i = 0; i < KMaxQueueSize; i++ )
+ {
+ seqNum++;
+ sendHeader.iMarker = 1;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), i + 1 );
+ }
+
+ iSender->iSendQueue[ KMaxQueueSize - 1 ]->iRtpHeader.iMarker = 0;
+ iSender->iSendQueue[ KMaxQueueSize - 2 ]->iRtpHeader.iMarker = 0;
+
+ seqNum++;
+ sendHeader.iMarker = 0;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), KMaxQueueSize - 2 );
+ EUNIT_ASSERT( iSender->iDiscarding == ETrue );
+ iSender->iDiscarding = EFalse;
+
+ // Buffer is full and dropped frame is zero marker frame but there's no other packets
+ // of the same frame in the queue
+ seqNum++;
+ sendHeader.iMarker = 1;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ seqNum++;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ seqNum++;
+ sendHeader.iMarker = 0;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), KMaxQueueSize );
+ EUNIT_ASSERT( iSender->iDiscarding == ETrue );
+ iSender->iDiscarding = EFalse;
+
+ // Buffer is full and dropped frame is marker frame but there's no other packets
+ // of the same frame in the queue
+ seqNum++;
+ sendHeader.iMarker = 1;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), KMaxQueueSize );
+ EUNIT_ASSERT( iSender->iDiscarding == EFalse );
+
+ // Buffer is full and dropped frame is marker frame and there's some other packets
+ // of the same frame in the queue
+ iSender->iSendQueue[ KMaxQueueSize - 1 ]->iRtpHeader.iMarker = 0;
+ seqNum++;
+ sendHeader.iMarker = 1;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), KMaxQueueSize - 1 );
+ EUNIT_ASSERT( iSender->iDiscarding == EFalse );
+ }
+
+void UT_CMccRtpSender::UT_CMccRtpSender_MarkerBasedClearingTest2()
+ {
+ // Set to long timeout mode
+ iSender->iTimeoutTimeMilliseconds = KTestRtpSendTimeoutLongMillisecs + 200;
+
+ _LIT8( KMccRtpSenderTestData, "testadata" );
+ TRtpId streamId( 2 );
+ TRtpSendHeader sendHeader;
+ TInt timestamp = 1000;
+ sendHeader.iTimestamp = timestamp;
+ TUint16 seqNum( 10 );
+ sendHeader.iMarker = 0;
+
+ // Timeout occurs when there's already several packets in queue
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 1 );
+
+ seqNum++;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 2 );
+
+ seqNum++;
+ sendHeader.iMarker = 1;
+ iSender->SendRtpPacketL( streamId, sendHeader, KMccRtpSenderTestData );
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 3 );
+
+ iSender->TimerExpiredL( 0, NULL );
+
+ EUNIT_ASSERT_EQUALS( iSender->iSendQueue.Count(), 0 );
+ }
+
+// TEST TABLE
+
+EUNIT_BEGIN_TEST_TABLE(
+ UT_CMccRtpSender,
+ "CMccRtpSender test",
+ "UNIT" )
+
+EUNIT_TEST(
+ "SendRtpPacketL - test ",
+ "CMccRtpSender",
+ "SendRtpPacketL",
+ "FUNCTIONALITY",
+ SetupL, UT_CMccRtpSender_SendRtpPacketTest, Teardown )
+
+EUNIT_TEST(
+ "SendDataL - test ",
+ "CMccRtpSender",
+ "SendDataL",
+ "FUNCTIONALITY",
+ SetupL, UT_CMccRtpSender_SendDataLL, Teardown )
+
+EUNIT_TEST(
+ "Clear - test ",
+ "CMccRtpSender",
+ "Clear",
+ "FUNCTIONALITY",
+ SetupL, UT_CMccRtpSender_ClearTest, Teardown )
+
+EUNIT_TEST(
+ "Timeout - test ",
+ "CMccRtpSender",
+ "Timeout",
+ "FUNCTIONALITY",
+ SetupL, UT_CMccRtpSender_SendingTimeoutTest, Teardown )
+
+EUNIT_TEST(
+ "MarkerBasedClearing - test ",
+ "CMccRtpSender",
+ "MarkerBasedClearing",
+ "FUNCTIONALITY",
+ SetupL, UT_CMccRtpSender_MarkerBasedClearingTest, Teardown )
+
+EUNIT_TEST(
+ "MarkerBasedClearing 2 - test ",
+ "CMccRtpSender",
+ "MarkerBasedClearing 2",
+ "FUNCTIONALITY",
+ SetupL, UT_CMccRtpSender_MarkerBasedClearingTest2, Teardown )
+
+EUNIT_END_TEST_TABLE
+
+// END OF FILE