Files

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")
}
}