@ -15,8 +15,6 @@
#define testLoggedDiscard ( q , sequenceNumber , oldReadHeadSequenceNumber , newReadHeadSequenceNumber ) testLogged ( q , ( [ NSString stringWithFormat : @ "discard %d,%d,%d", sequenceNumber, oldReadHeadSequenceNumber, newReadHeadSequenceNumber]))
#define testLoggedResync ( q , oldReadHeadSequenceNumber , newReadHeadSequenceNumber ) testLogged ( q , ( [ NSString stringWithFormat : @ "resync %d to %d", oldReadHeadSequenceNumber,newReadHeadSequenceNumber]))
#define TICK 320
@ interface JitterQueueTest : XCTestCase
@ end
@ -26,18 +24,14 @@
JitterQueue * r1 = [ JitterQueue jitterQueue ] ;
JitterQueue * r2 = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * q1 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 100 * TICK
andSequenceNumber : 100 ] ;
EncodedAudioPacket * q1 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 100 ] ;
test ( r1 . count == 0 ) ;
test ( [ r1 tryEnqueue : q1 ] ) ;
test ( r1 . count == 1 ) ;
test ( [ r1 tryDequeue ] == q1 ) ;
test ( r1 . count == 0 ) ;
EncodedAudioPacket * q2 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0 xFF00 * TICK
andSequenceNumber : 0 xFF00 ] ;
EncodedAudioPacket * q2 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 xFF00 ] ;
test ( r2 . count == 0 ) ;
test ( [ r2 tryEnqueue : q2 ] ) ;
test ( r2 . count == 1 ) ;
@ -48,9 +42,7 @@
JitterQueue * r = [ JitterQueue jitterQueue ] ;
for ( uint16_t i = 0 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : i * TICK
andSequenceNumber : i ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : i ] ;
test ( [ r tryEnqueue : q ] ) ;
test ( r . count == i + 1 ) ;
}
@ -65,9 +57,7 @@
JitterQueue * r = [ JitterQueue jitterQueue ] ;
for ( uint16_t i = 0 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : ( i * 2 + 1 ) * TICK
andSequenceNumber : i * 2 + 1 ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : i * 2 + 1 ] ;
test ( [ r tryEnqueue : q ] ) ;
}
@ -83,9 +73,7 @@
for ( uint16_t i = 0 ; i < 20 ; i + + ) {
for ( uint16_t j = 0 ; j < 2 ; j + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : ( i * 2 + j ) * TICK
andSequenceNumber : i * 2 + j ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : i * 2 + j ] ;
test ( [ r tryEnqueue : q ] ) ;
}
@ -96,15 +84,11 @@
- ( void ) testJitterQueueRejectsDuplicateSequenceNumbers {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0
andSequenceNumber : 0 ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 ] ;
test ( [ r tryEnqueue : p ] ) ;
for ( uint16_t i = 0 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0
andSequenceNumber : 0 ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 ] ;
test ( ![ r tryEnqueue : q ] ) ;
}
@ -114,15 +98,11 @@
- ( void ) testJitterQueueRejectsOldSequenceNumbers {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 50 * TICK
andSequenceNumber : 50 ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 50 ] ;
test ( [ r tryEnqueue : p ] ) ;
for ( uint16_t i = 1 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : ( 50 - i ) * TICK
andSequenceNumber : 50 - i ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 50 - i ] ;
test ( ![ r tryEnqueue : q ] ) ;
}
@ -132,15 +112,11 @@
- ( void ) testJitterQueueRejectsFarOffSequenceNumbers {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0
andSequenceNumber : 0 ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 ] ;
test ( [ r tryEnqueue : p ] ) ;
for ( uint16_t i = 0 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : ( 0 x7000 + i ) * TICK
andSequenceNumber : 0 x7000 + i ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 x7000 + i ] ;
test ( ![ r tryEnqueue : q ] ) ;
}
@ -150,15 +126,11 @@
- ( void ) testJitterQueueResyncsSequenceNumber {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 1 * TICK
andSequenceNumber : 1 ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 1 ] ;
test ( [ r tryEnqueue : p ] ) ;
test ( [ r tryDequeue ] == p ) ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0
andSequenceNumber : 0 ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 ] ;
test ( ![ r tryEnqueue : q ] ) ;
/ / cause desync to be detected
@ -170,25 +142,11 @@
test ( [ r tryEnqueue : q ] ) ;
test ( [ r tryDequeue ] == q ) ;
}
- ( void ) testLoopAround_sequenceNumber {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
for ( uint32_t i = 0 ; i < 1 < < 17 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : i * TICK
andSequenceNumber : ( uint16_t ) ( i & 0 xFFFF ) ] ;
test ( [ r tryEnqueue : q ] ) ;
test ( [ r tryDequeue ] == q ) ;
}
test ( [ r tryDequeue ] == nil ) ;
}
- ( void ) testLoopAround_timeStamp {
- ( void ) testLoopAround {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
for ( uint32_t i = 0 ; i < 1 < < 17 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : i * TICK + 0 xFFFF0000
andSequenceNumber : ( uint16_t ) ( i & 0 xFFFF ) ] ;
for ( int i = 0 ; i < 1 < < 17 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : ( uint16_t ) ( i & 0 xFFFF ) ] ;
test ( [ r tryEnqueue : q ] ) ;
test ( [ r tryDequeue ] == q ) ;
}
@ -196,21 +154,15 @@
}
- ( void ) testJitterQueueAvoidsRacingAhead {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p1 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 )
andTimeStamp : 0
andSequenceNumber : 0 ] ;
EncodedAudioPacket * p2 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 )
andTimeStamp : 1 * TICK
andSequenceNumber : 1 ] ;
EncodedAudioPacket * p1 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 ) andSequenceNumber : 0 ] ;
EncodedAudioPacket * p2 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 ) andSequenceNumber : 1 ] ;
test ( [ r tryEnqueue : p1 ] ) ;
test ( [ r tryDequeue ] == p1 ) ;
test ( [ r tryDequeue ] == nil ) ;
test ( [ r tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 )
andTimeStamp : 10 * TICK
andSequenceNumber : 10 ] ] ) ;
test ( [ r tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 ) andSequenceNumber : 10 ] ] ) ;
test ( [ r tryDequeue ] == nil ) ;
test ( [ r tryEnqueue : p2 ] ) ;
@ -221,38 +173,28 @@
- ( void ) testJitterQueueMeasurement {
JitterQueue * q = [ JitterQueue jitterQueue ] ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 1 * TICK
andSequenceNumber : 1 ] ] ;
test ( q . currentBufferDepth == 0 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 2 * TICK
andSequenceNumber : 2 ] ] ;
test ( q . currentBufferDepth == 1 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 4 * TICK
andSequenceNumber : 4 ] ] ;
test ( q . currentBufferDepth == 3 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 1 ] ] ;
test ( [ q currentBufferDepth ] == 0 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 2 ] ] ;
test ( [ q currentBufferDepth ] == 1 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 4 ] ] ;
test ( [ q currentBufferDepth ] == 3 ) ;
[ q tryDequeue ] ;
test ( q . currentBufferDepth == 2 ) ;
test ( [ q currentBufferDepth ] == 2 ) ;
[ q tryDequeue ] ;
test ( q . currentBufferDepth == 1 ) ;
test ( [ q currentBufferDepth ] == 1 ) ;
[ q tryDequeue ] ;
test ( q . currentBufferDepth == 0 ) ;
test ( [ q currentBufferDepth ] == 0 ) ;
[ q tryDequeue ] ;
test ( q . currentBufferDepth == - 1 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 8 * TICK
andSequenceNumber : 8 ] ] ;
test ( q . currentBufferDepth == 3 ) ;
test ( [ q currentBufferDepth ] == - 1 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 8 ] ] ;
test ( [ q currentBufferDepth ] == 3 ) ;
/ / resyncs to 0
for ( int i = 0 ; i < 500 ; i + + ) {
[ q tryDequeue ] ;
[ q tryDequeue ] ;
}
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 9000 * TICK
andSequenceNumber : 9000 ] ] ;
test ( q . currentBufferDepth == 0 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 9000 ] ] ;
test ( [ q currentBufferDepth ] == 0 ) ;
}
@ end