base: add tests

This commit is contained in:
aler9
2021-04-11 18:12:08 +02:00
parent 113935ab47
commit 2e5aef4c12
2 changed files with 63 additions and 7 deletions

View File

@@ -79,12 +79,12 @@ func (f *InterleavedFrame) Read(br *bufio.Reader) error {
} }
if header[0] != interleavedFrameMagicByte { if header[0] != interleavedFrameMagicByte {
return fmt.Errorf("wrong magic byte (0x%.2x)", header[0]) return fmt.Errorf("invalid magic byte (0x%.2x)", header[0])
} }
framelen := int(binary.BigEndian.Uint16(header[2:])) framelen := int(binary.BigEndian.Uint16(header[2:]))
if framelen > len(f.Payload) { if framelen > len(f.Payload) {
return fmt.Errorf("frame length greater than maximum allowed (%d vs %d)", return fmt.Errorf("payload size greater than maximum allowed (%d vs %d)",
framelen, len(f.Payload)) framelen, len(f.Payload))
} }

View File

@@ -14,7 +14,7 @@ var casesInterleavedFrame = []struct {
dec InterleavedFrame dec InterleavedFrame
}{ }{
{ {
name: "generic", name: "rtp",
enc: []byte{0x24, 0x6, 0x0, 0x4, 0x1, 0x2, 0x3, 0x4}, enc: []byte{0x24, 0x6, 0x0, 0x4, 0x1, 0x2, 0x3, 0x4},
dec: InterleavedFrame{ dec: InterleavedFrame{
TrackID: 3, TrackID: 3,
@@ -22,6 +22,15 @@ var casesInterleavedFrame = []struct {
Payload: []byte{0x01, 0x02, 0x03, 0x04}, Payload: []byte{0x01, 0x02, 0x03, 0x04},
}, },
}, },
{
name: "rtcp",
enc: []byte{0x24, 0xd, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8},
dec: InterleavedFrame{
TrackID: 6,
StreamType: StreamTypeRTCP,
Payload: []byte{0x05, 0x06, 0x07, 0x08},
},
},
} }
func TestInterleavedFrameRead(t *testing.T) { func TestInterleavedFrameRead(t *testing.T) {
@@ -55,29 +64,76 @@ func TestInterleavedFrameReadErrors(t *testing.T) {
for _, ca := range []struct { for _, ca := range []struct {
name string name string
byts []byte byts []byte
err string
}{ }{
{ {
"empty", "empty",
[]byte{}, []byte{},
"EOF",
}, },
{ {
"invalid magic byte", "invalid magic byte",
[]byte{0x55, 0x00, 0x00, 0x00}, []byte{0x55, 0x00, 0x00, 0x00},
"invalid magic byte (0x55)",
}, },
{ {
"length too big", "payload size too big",
[]byte{0x24, 0x00, 0x00, 0x08}, []byte{0x24, 0x00, 0x00, 0x08},
"payload size greater than maximum allowed (8 vs 5)",
}, },
{ {
"invalid payload", "payload invalid",
[]byte{0x24, 0x00, 0x00, 0x08, 0x01, 0x02}, []byte{0x24, 0x00, 0x00, 0x05, 0x01, 0x02},
"unexpected EOF",
}, },
} { } {
t.Run(ca.name, func(t *testing.T) { t.Run(ca.name, func(t *testing.T) {
var f InterleavedFrame var f InterleavedFrame
f.Payload = make([]byte, 5) f.Payload = make([]byte, 5)
err := f.Read(bufio.NewReader(bytes.NewBuffer(ca.byts))) err := f.Read(bufio.NewReader(bytes.NewBuffer(ca.byts)))
require.Error(t, err) require.Equal(t, ca.err, err.Error())
}) })
} }
} }
func TestReadInterleavedFrameOrRequest(t *testing.T) {
byts := []byte("DESCRIBE rtsp://example.com/media.mp4 RTSP/1.0\r\n" +
"Accept: application/sdp\r\n" +
"CSeq: 2\r\n" +
"\r\n")
byts = append(byts, []byte{0x24, 0x6, 0x0, 0x4, 0x1, 0x2, 0x3, 0x4}...)
var f InterleavedFrame
f.Payload = make([]byte, 10)
var req Request
br := bufio.NewReader(bytes.NewBuffer(byts))
out, err := ReadInterleavedFrameOrRequest(&f, &req, br)
require.NoError(t, err)
require.Equal(t, &req, out)
out, err = ReadInterleavedFrameOrRequest(&f, &req, br)
require.NoError(t, err)
require.Equal(t, &f, out)
}
func TestReadInterleavedFrameOrResponse(t *testing.T) {
byts := []byte("RTSP/1.0 200 OK\r\n" +
"CSeq: 1\r\n" +
"Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE\r\n" +
"\r\n")
byts = append(byts, []byte{0x24, 0x6, 0x0, 0x4, 0x1, 0x2, 0x3, 0x4}...)
var f InterleavedFrame
f.Payload = make([]byte, 10)
var res Response
br := bufio.NewReader(bytes.NewBuffer(byts))
out, err := ReadInterleavedFrameOrResponse(&f, &res, br)
require.NoError(t, err)
require.Equal(t, &res, out)
out, err = ReadInterleavedFrameOrResponse(&f, &res, br)
require.NoError(t, err)
require.Equal(t, &f, out)
}