Files
rtsp-simple-server/internal/staticsources/srt/source_test.go
Alessandro Ros 61382e496b fix memory leak when reloading the configuration (#4855)
When a path has a MPEG-TS, RTP or WebRTC source and the path
configuration is reloaded, a routine was left open because the reload
channel was not handled. This fixes the issue.
2025-08-11 17:50:40 +02:00

83 lines
1.8 KiB
Go

package srt
import (
"context"
"testing"
"time"
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts"
srt "github.com/datarhei/gosrt"
"github.com/stretchr/testify/require"
"github.com/bluenviron/mediamtx/internal/conf"
"github.com/bluenviron/mediamtx/internal/defs"
"github.com/bluenviron/mediamtx/internal/test"
)
func TestSource(t *testing.T) {
ln, err := srt.Listen("srt", "127.0.0.1:9002", srt.DefaultConfig())
require.NoError(t, err)
defer ln.Close()
p := &test.StaticSourceParent{}
p.Initialize()
so := &Source{
ReadTimeout: conf.Duration(10 * time.Second),
Parent: p,
}
done := make(chan struct{})
defer func() { <-done }()
ctx, ctxCancel := context.WithCancel(context.Background())
defer ctxCancel()
reloadConf := make(chan *conf.Path)
go func() {
so.Run(defs.StaticSourceRunParams{ //nolint:errcheck
Context: ctx,
ResolvedSource: "srt://127.0.0.1:9002?streamid=sidname&passphrase=ttest1234567",
Conf: &conf.Path{},
ReloadConf: reloadConf,
})
close(done)
}()
req, err2 := ln.Accept2()
require.NoError(t, err2)
require.Equal(t, "sidname", req.StreamId())
err2 = req.SetPassphrase("ttest1234567")
require.NoError(t, err2)
conn, err2 := req.Accept()
require.NoError(t, err2)
defer conn.Close()
track := &mpegts.Track{Codec: &mpegts.CodecH264{}}
w := &mpegts.Writer{W: conn, Tracks: []*mpegts.Track{track}}
err2 = w.Initialize()
require.NoError(t, err2)
err2 = w.WriteH264(track, 0, 0, [][]byte{{ // IDR
5, 1,
}})
require.NoError(t, err2)
err = w.WriteH264(track, 0, 0, [][]byte{{ // non-IDR
5, 2,
}})
require.NoError(t, err)
<-p.Unit
// the source must be listening on ReloadConf
reloadConf <- nil
// stop test reader before 2nd H264 packet is received to avoid a crash
p.Close()
}