Files
go-sip/internal/ai/protocol_pcma_test.go
T

52 lines
1.4 KiB
Go

package ai
import (
"context"
"testing"
"git.ipao.vip/rogee/go-sip/internal/media"
)
// Use actual local UDP/Pion RTP and G.711, not a media mock, for the opening,
// user input and AI reply in every ASR/TTS rate combination.
func protocolPCMAViaRTP(t *testing.T, ctx context.Context, pcm []byte) []byte {
t.Helper()
receiver, err := media.ListenRTP("127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := receiver.Close(); err != nil {
t.Error(err)
}
}()
sender, err := media.ListenRTP("127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := sender.Close(); err != nil {
t.Error(err)
}
}()
if err := sender.SetPeer(receiver.LocalAddr().String()); err != nil {
t.Fatal(err)
}
if err := sender.SendPCM16(ctx, pcm, 16000); err != nil {
t.Fatal(err)
}
var received []byte
for len(received) < len(pcm) {
frame, err := receiver.ReadPayload(ctx)
if err != nil {
t.Fatal(err)
}
received = append(received, frame...)
}
sentStats, receivedStats := sender.Stats(), receiver.Stats()
if len(received) != len(pcm) || sentStats.SentPackets != receivedStats.ReceivedPackets || sentStats.SentBytes != receivedStats.ReceivedBytes || sentStats.SentBytes != uint64(len(pcm)/4) {
t.Fatalf("PCMA duration/packet/byte mismatch: canonical=%d received=%d sent=%+v receivedStats=%+v", len(pcm), len(received), sentStats, receivedStats)
}
return received
}