Files
gortsplib/internal/rtpreorderer/reorderer_test.go

261 lines
4.1 KiB
Go

package rtpreorderer
import (
"testing"
"github.com/pion/rtp"
"github.com/stretchr/testify/require"
)
func TestReorder(t *testing.T) {
sequence := []struct {
in *rtp.Packet
out []*rtp.Packet
}{
{
// first packet
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65530,
},
},
[]*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: 65530,
},
}},
},
{
// packet sent before first packet
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65529,
},
},
[]*rtp.Packet(nil),
},
{
// ok
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65531,
},
},
[]*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: 65531,
},
}},
},
{
// duplicated
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65531,
},
},
[]*rtp.Packet(nil),
},
{
// gap
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65535,
},
},
[]*rtp.Packet(nil),
},
{
// unordered
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65533,
PayloadType: 96,
},
},
[]*rtp.Packet(nil),
},
{
// unordered + duplicated
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65533,
PayloadType: 97,
},
},
[]*rtp.Packet(nil),
},
{
// unordered
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65532,
},
},
[]*rtp.Packet{
{
Header: rtp.Header{
SequenceNumber: 65532,
},
},
{
Header: rtp.Header{
SequenceNumber: 65533,
PayloadType: 96,
},
},
},
},
{
// unordered
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65534,
},
},
[]*rtp.Packet{
{
Header: rtp.Header{
SequenceNumber: 65534,
},
},
{
Header: rtp.Header{
SequenceNumber: 65535,
},
},
},
},
{
// overflow + gap
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 1,
},
},
[]*rtp.Packet(nil),
},
{
// unordered
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 0,
},
},
[]*rtp.Packet{
{
Header: rtp.Header{
SequenceNumber: 0,
},
},
{
Header: rtp.Header{
SequenceNumber: 1,
},
},
},
},
}
r := &Reorderer{}
r.Initialize()
r.absPos = 40
for _, entry := range sequence {
out, missing := r.Process(entry.in)
require.Equal(t, entry.out, out)
require.Equal(t, uint(0), missing)
}
}
func TestBufferIsFull(t *testing.T) {
r := &Reorderer{}
r.Initialize()
r.absPos = 25
sn := uint16(1564)
toMiss := uint(34)
out, missing := r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn,
},
})
require.Equal(t, []*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: sn,
},
}}, out)
require.Equal(t, uint(0), missing)
sn++
var expected []*rtp.Packet
for i := uint(0); i < 64-toMiss; i++ {
out, missing = r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn + uint16(toMiss),
},
})
require.Equal(t, []*rtp.Packet(nil), out)
require.Equal(t, uint(0), missing)
expected = append(expected, &rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn + uint16(toMiss),
},
})
sn++
}
out, missing = r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn + uint16(toMiss),
},
})
require.Equal(t, toMiss, missing)
expected = append(expected, &rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn + uint16(toMiss),
},
})
require.Equal(t, expected, out)
}
func TestReset(t *testing.T) {
r := &Reorderer{}
r.Initialize()
sn := uint16(1234)
r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn,
},
})
sn = 0xF234
for i := 0; i < 64; i++ {
out, missing := r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn,
},
})
require.Equal(t, []*rtp.Packet(nil), out)
require.Equal(t, uint(0), missing)
sn++
}
out, missing := r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn,
},
})
require.Equal(t, []*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: sn,
},
}}, out)
require.Equal(t, uint(0), missing)
}