@ -15,6 +15,8 @@
#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
@ -24,14 +26,18 @@
JitterQueue * r1 = [ JitterQueue jitterQueue ] ;
JitterQueue * r2 = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * q1 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 100 ] ;
EncodedAudioPacket * q1 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 100 * TICK
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 ] andSequenceNumber : 0 xFF00 ] ;
EncodedAudioPacket * q2 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0 xFF00 * TICK
andSequenceNumber : 0 xFF00 ] ;
test ( r2 . count == 0 ) ;
test ( [ r2 tryEnqueue : q2 ] ) ;
test ( r2 . count == 1 ) ;
@ -42,7 +48,9 @@
JitterQueue * r = [ JitterQueue jitterQueue ] ;
for ( uint16_t i = 0 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : i ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : i * TICK
andSequenceNumber : i ] ;
test ( [ r tryEnqueue : q ] ) ;
test ( r . count == i + 1 ) ;
}
@ -57,7 +65,9 @@
JitterQueue * r = [ JitterQueue jitterQueue ] ;
for ( uint16_t i = 0 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : i * 2 + 1 ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : ( i * 2 + 1 ) * TICK
andSequenceNumber : i * 2 + 1 ] ;
test ( [ r tryEnqueue : q ] ) ;
}
@ -73,7 +83,9 @@
for ( uint16_t i = 0 ; i < 20 ; i + + ) {
for ( uint16_t j = 0 ; j < 2 ; j + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : i * 2 + j ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : ( i * 2 + j ) * TICK
andSequenceNumber : i * 2 + j ] ;
test ( [ r tryEnqueue : q ] ) ;
}
@ -84,11 +96,15 @@
- ( void ) testJitterQueueRejectsDuplicateSequenceNumbers {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0
andSequenceNumber : 0 ] ;
test ( [ r tryEnqueue : p ] ) ;
for ( uint16_t i = 0 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0
andSequenceNumber : 0 ] ;
test ( ![ r tryEnqueue : q ] ) ;
}
@ -98,11 +114,15 @@
- ( void ) testJitterQueueRejectsOldSequenceNumbers {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 50 ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 50 * TICK
andSequenceNumber : 50 ] ;
test ( [ r tryEnqueue : p ] ) ;
for ( uint16_t i = 1 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 50 - i ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : ( 50 - i ) * TICK
andSequenceNumber : 50 - i ] ;
test ( ![ r tryEnqueue : q ] ) ;
}
@ -112,11 +132,15 @@
- ( void ) testJitterQueueRejectsFarOffSequenceNumbers {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0
andSequenceNumber : 0 ] ;
test ( [ r tryEnqueue : p ] ) ;
for ( uint16_t i = 0 ; i < 10 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 x7000 + i ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : ( 0 x7000 + i ) * TICK
andSequenceNumber : 0 x7000 + i ] ;
test ( ![ r tryEnqueue : q ] ) ;
}
@ -126,11 +150,15 @@
- ( void ) testJitterQueueResyncsSequenceNumber {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 1 ] ;
EncodedAudioPacket * p = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 1 * TICK
andSequenceNumber : 1 ] ;
test ( [ r tryEnqueue : p ] ) ;
test ( [ r tryDequeue ] == p ) ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : 0 ] ;
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ]
andTimeStamp : 0
andSequenceNumber : 0 ] ;
test ( ![ r tryEnqueue : q ] ) ;
/ / cause desync to be detected
@ -142,11 +170,25 @@
test ( [ r tryEnqueue : q ] ) ;
test ( [ r tryDequeue ] == q ) ;
}
- ( void ) testLoopAround {
- ( 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 {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
for ( int i = 0 ; i < 1 < < 17 ; i + + ) {
EncodedAudioPacket * q = [ EncodedAudioPacket encodedAudioPacketWithAudioData : [ NSData dataWithLength : 1 ] andSequenceNumber : ( uint16_t ) ( i & 0 xFFFF ) ] ;
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 ) ] ;
test ( [ r tryEnqueue : q ] ) ;
test ( [ r tryDequeue ] == q ) ;
}
@ -154,15 +196,21 @@
}
- ( void ) testJitterQueueAvoidsRacingAhead {
JitterQueue * r = [ JitterQueue jitterQueue ] ;
EncodedAudioPacket * p1 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 ) andSequenceNumber : 0 ] ;
EncodedAudioPacket * p2 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 ) andSequenceNumber : 1 ] ;
EncodedAudioPacket * p1 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 )
andTimeStamp : 0
andSequenceNumber : 0 ] ;
EncodedAudioPacket * p2 = [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 )
andTimeStamp : 1 * TICK
andSequenceNumber : 1 ] ;
test ( [ r tryEnqueue : p1 ] ) ;
test ( [ r tryDequeue ] == p1 ) ;
test ( [ r tryDequeue ] == nil ) ;
test ( [ r tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 ) andSequenceNumber : 10 ] ] ) ;
test ( [ r tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 1 )
andTimeStamp : 10 * TICK
andSequenceNumber : 10 ] ] ) ;
test ( [ r tryDequeue ] == nil ) ;
test ( [ r tryEnqueue : p2 ] ) ;
@ -173,11 +221,17 @@
- ( void ) testJitterQueueMeasurement {
JitterQueue * q = [ JitterQueue jitterQueue ] ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 1 ] ] ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 1 * TICK
andSequenceNumber : 1 ] ] ;
test ( [ q currentBufferDepth ] == 0 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 2 ] ] ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 2 * TICK
andSequenceNumber : 2 ] ] ;
test ( [ q currentBufferDepth ] == 1 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 4 ] ] ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 4 * TICK
andSequenceNumber : 4 ] ] ;
test ( [ q currentBufferDepth ] == 3 ) ;
[ q tryDequeue ] ;
test ( [ q currentBufferDepth ] == 2 ) ;
@ -187,14 +241,18 @@
test ( [ q currentBufferDepth ] == 0 ) ;
[ q tryDequeue ] ;
test ( [ q currentBufferDepth ] == - 1 ) ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 8 ] ] ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 8 * TICK
andSequenceNumber : 8 ] ] ;
test ( [ q currentBufferDepth ] == 3 ) ;
/ / resyncs to 0
for ( int i = 0 ; i < 500 ; i + + ) {
[ q tryDequeue ] ;
}
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 ) andSequenceNumber : 9000 ] ] ;
[ q tryEnqueue : [ EncodedAudioPacket encodedAudioPacketWithAudioData : increasingData ( 20 )
andTimeStamp : 9000 * TICK
andSequenceNumber : 9000 ] ] ;
test ( [ q currentBufferDepth ] == 0 ) ;
}
@ end