mirror of
https://github.com/aler9/rtsp-simple-server
synced 2025-09-27 12:02:27 +08:00
112 lines
2.6 KiB
Go
112 lines
2.6 KiB
Go
package rtmp
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"net"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/bluenviron/mediamtx/internal/conf"
|
|
"github.com/bluenviron/mediamtx/internal/defs"
|
|
"github.com/bluenviron/mediamtx/internal/protocols/rtmp"
|
|
"github.com/bluenviron/mediamtx/internal/test"
|
|
)
|
|
|
|
func writeTempFile(byts []byte) (string, error) {
|
|
tmpf, err := os.CreateTemp(os.TempDir(), "rtsp-")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer tmpf.Close()
|
|
|
|
_, err = tmpf.Write(byts)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return tmpf.Name(), nil
|
|
}
|
|
|
|
func TestSource(t *testing.T) {
|
|
for _, ca := range []string{
|
|
"plain",
|
|
"tls",
|
|
} {
|
|
t.Run(ca, func(t *testing.T) {
|
|
ln, err := func() (net.Listener, error) {
|
|
if ca == "plain" {
|
|
return net.Listen("tcp", "127.0.0.1:1935")
|
|
}
|
|
|
|
serverCertFpath, err := writeTempFile(test.TLSCertPub)
|
|
require.NoError(t, err)
|
|
defer os.Remove(serverCertFpath)
|
|
|
|
serverKeyFpath, err := writeTempFile(test.TLSCertKey)
|
|
require.NoError(t, err)
|
|
defer os.Remove(serverKeyFpath)
|
|
|
|
var cert tls.Certificate
|
|
cert, err = tls.LoadX509KeyPair(serverCertFpath, serverKeyFpath)
|
|
require.NoError(t, err)
|
|
|
|
return tls.Listen("tcp", "127.0.0.1:1936", &tls.Config{Certificates: []tls.Certificate{cert}})
|
|
}()
|
|
require.NoError(t, err)
|
|
defer ln.Close()
|
|
|
|
go func() {
|
|
nconn, err := ln.Accept()
|
|
require.NoError(t, err)
|
|
defer nconn.Close()
|
|
|
|
conn, _, _, err := rtmp.NewServerConn(nconn)
|
|
require.NoError(t, err)
|
|
|
|
w, err := rtmp.NewWriter(conn, test.FormatH264, test.FormatMPEG4Audio)
|
|
require.NoError(t, err)
|
|
|
|
err = w.WriteH264(0, 0, true, [][]byte{{0x05, 0x02, 0x03, 0x04}})
|
|
require.NoError(t, err)
|
|
}()
|
|
|
|
var te *test.SourceTester
|
|
|
|
if ca == "plain" {
|
|
te = test.NewSourceTester(
|
|
func(p defs.StaticSourceParent) defs.StaticSource {
|
|
return &Source{
|
|
ResolvedSource: "rtmp://localhost/teststream",
|
|
ReadTimeout: conf.StringDuration(10 * time.Second),
|
|
WriteTimeout: conf.StringDuration(10 * time.Second),
|
|
Parent: p,
|
|
}
|
|
},
|
|
&conf.Path{},
|
|
)
|
|
} else {
|
|
te = test.NewSourceTester(
|
|
func(p defs.StaticSourceParent) defs.StaticSource {
|
|
return &Source{
|
|
ResolvedSource: "rtmps://localhost/teststream",
|
|
ReadTimeout: conf.StringDuration(10 * time.Second),
|
|
WriteTimeout: conf.StringDuration(10 * time.Second),
|
|
Parent: p,
|
|
}
|
|
},
|
|
&conf.Path{
|
|
SourceFingerprint: "33949E05FFFB5FF3E8AA16F8213A6251B4D9363804BA53233C4DA9A46D6F2739",
|
|
},
|
|
)
|
|
}
|
|
|
|
defer te.Close()
|
|
|
|
<-te.Unit
|
|
})
|
|
}
|
|
}
|