145 lines
4.5 KiB
Go
145 lines
4.5 KiB
Go
package media
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/pion/rtp"
|
|
)
|
|
|
|
func TestPacketGuardUsesPionAndAppliesCellPolicy(t *testing.T) {
|
|
packet := &rtp.Packet{Header: rtp.Header{Version: 2, PayloadType: 8, SequenceNumber: 42, Timestamp: 160, SSRC: 99, Marker: true}, Payload: []byte{1, 2, 3, 4}}
|
|
raw, err := packet.Marshal()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
parsed, err := (PacketGuard{MaxPacketBytes: 1500, MaxPayloadBytes: 100, AllowedSSRC: 99, RequireSSRC: true, AllowedPayloadTypes: map[uint8]struct{}{8: {}}}).Parse(raw)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if parsed.PayloadType != 8 || parsed.SequenceNumber != 42 || parsed.Timestamp != 160 || parsed.SSRC != 99 || !parsed.Marker || string(parsed.Payload) != string(packet.Payload) {
|
|
t.Fatalf("unexpected parsed packet: %+v", parsed)
|
|
}
|
|
}
|
|
|
|
func TestPacketGuardPreservesPCMAPayloadByteForByte(t *testing.T) {
|
|
payload := make([]byte, 160)
|
|
for index := range payload {
|
|
payload[index] = byte((index*37 + 11) % 256)
|
|
}
|
|
packet := &rtp.Packet{Header: rtp.Header{Version: 2, PayloadType: 8, SequenceNumber: 700, Timestamp: 112000, SSRC: 0xA1B2C3D4}, Payload: payload}
|
|
raw, err := packet.Marshal()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
parsed, err := (PacketGuard{MaxPacketBytes: 1500, MaxPayloadBytes: 160, AllowedSSRC: 0xA1B2C3D4, RequireSSRC: true, AllowedPayloadTypes: map[uint8]struct{}{8: {}}}).Parse(raw)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if parsed.PayloadType != 8 || parsed.SequenceNumber != packet.SequenceNumber || parsed.Timestamp != packet.Timestamp || parsed.SSRC != packet.SSRC {
|
|
t.Fatalf("unexpected PCMA RTP header: %+v", parsed)
|
|
}
|
|
if string(parsed.Payload) != string(payload) {
|
|
t.Fatalf("PCMA payload changed: got %x want %x", parsed.Payload, payload)
|
|
}
|
|
}
|
|
|
|
func TestRTPStreamSendsAfterExplicitPeerBeforeInbound(t *testing.T) {
|
|
receiver, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer receiver.Close()
|
|
stream, err := ListenRTP("127.0.0.1:0", 118)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer stream.Close()
|
|
if err := stream.SetPeer(receiver.LocalAddr().String()); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
pcm := make([]byte, pcm16FrameSamples*2)
|
|
if err := stream.SendPCM16(context.Background(), pcm, 16000); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := receiver.SetReadDeadline(time.Now().Add(time.Second)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
buf := make([]byte, maxRTPPacketBytes)
|
|
n, _, err := receiver.ReadFromUDP(buf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var packet rtp.Packet
|
|
if err := packet.Unmarshal(buf[:n]); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if packet.PayloadType != 118 || len(packet.Payload) != len(pcm) {
|
|
t.Fatalf("unexpected packet: payload_type=%d payload_bytes=%d", packet.PayloadType, len(packet.Payload))
|
|
}
|
|
}
|
|
|
|
func TestALAWProfileNormalizesWireAudioToCanonicalPCM16(t *testing.T) {
|
|
receiver, err := ListenRTPWithFormat("127.0.0.1:0", 8, FormatALAW, 8000)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer receiver.Close()
|
|
sender, err := ListenRTPWithFormat("127.0.0.1:0", 8, FormatALAW, 8000)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer sender.Close()
|
|
if err := sender.SetPeer(receiver.LocalAddr().String()); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
pcm := make([]byte, pcm16FrameSamples*2)
|
|
if err := sender.SendPCM16(context.Background(), pcm, 16000); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
|
defer cancel()
|
|
decoded, err := receiver.ReadPayload(ctx)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(decoded) != len(pcm) {
|
|
t.Fatalf("canonical PCM16 bytes=%d want=%d", len(decoded), len(pcm))
|
|
}
|
|
}
|
|
|
|
func TestPacketGuardRejectsMalformedOrUnauthorizedMedia(t *testing.T) {
|
|
guard := PacketGuard{MaxPacketBytes: 12, MaxPayloadBytes: 2, AllowedSSRC: 99, RequireSSRC: true, AllowedPayloadTypes: map[uint8]struct{}{8: {}}}
|
|
if _, err := guard.Parse([]byte{0x80}); err == nil {
|
|
t.Fatal("expected malformed RTP rejection")
|
|
}
|
|
packet := &rtp.Packet{Header: rtp.Header{Version: 2, PayloadType: 0, SequenceNumber: 1, Timestamp: 1, SSRC: 99}, Payload: []byte{1}}
|
|
raw, err := packet.Marshal()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := guard.Parse(raw); err == nil {
|
|
t.Fatal("expected payload type rejection")
|
|
}
|
|
packet.PayloadType = 8
|
|
packet.SSRC = 100
|
|
raw, err = packet.Marshal()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := guard.Parse(raw); err == nil {
|
|
t.Fatal("expected SSRC rejection")
|
|
}
|
|
packet.SSRC = 99
|
|
packet.Payload = []byte{1, 2, 3}
|
|
raw, err = packet.Marshal()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := guard.Parse(raw); err == nil {
|
|
t.Fatal("expected payload limit rejection")
|
|
}
|
|
}
|