From 338edc139f2d793448a33eb89cbcda6d1812539f Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sat, 29 May 2021 19:12:34 +0200 Subject: [PATCH] speed up tests --- main_rtspsource_test.go | 215 ++++++++++++++++++---------------------- 1 file changed, 98 insertions(+), 117 deletions(-) diff --git a/main_rtspsource_test.go b/main_rtspsource_test.go index df2673bf..ab59d7fb 100644 --- a/main_rtspsource_test.go +++ b/main_rtspsource_test.go @@ -1,6 +1,7 @@ package main import ( + "crypto/tls" "os" "testing" "time" @@ -11,123 +12,16 @@ import ( "github.com/stretchr/testify/require" ) -func TestSourceRTSP(t *testing.T) { - for _, source := range []string{ - "udp", - "tcp", - "tls", - } { - t.Run(source, func(t *testing.T) { - switch source { - case "udp", "tcp": - p1, ok := testProgram("rtmpDisable: yes\n" + - "hlsDisable: yes\n" + - "rtspAddress: :8555\n" + - "rtpAddress: :8100\n" + - "rtcpAddress: :8101\n" + - "paths:\n" + - " all:\n" + - " readUser: testuser\n" + - " readPass: testpass\n") - require.Equal(t, true, ok) - defer p1.close() - - cnt1, err := newContainer("ffmpeg", "source", []string{ - "-re", - "-stream_loop", "-1", - "-i", "emptyvideo.mkv", - "-c", "copy", - "-f", "rtsp", - "-rtsp_transport", "udp", - "rtsp://" + ownDockerIP + ":8555/teststream", - }) - require.NoError(t, err) - defer cnt1.close() - - p2, ok := testProgram("rtmpDisable: yes\n" + - "hlsDisable: yes\n" + - "paths:\n" + - " proxied:\n" + - " source: rtsp://testuser:testpass@localhost:8555/teststream\n" + - " sourceProtocol: " + source[len(""):] + "\n" + - " sourceOnDemand: yes\n") - require.Equal(t, true, ok) - defer p2.close() - - case "tls": - serverCertFpath, err := writeTempFile(serverCert) - require.NoError(t, err) - defer os.Remove(serverCertFpath) - - serverKeyFpath, err := writeTempFile(serverKey) - require.NoError(t, err) - defer os.Remove(serverKeyFpath) - - p, ok := testProgram("rtmpDisable: yes\n" + - "hlsDisable: yes\n" + - "rtspAddress: :8555\n" + - "rtpAddress: :8100\n" + - "rtcpAddress: :8101\n" + - "readTimeout: 20s\n" + - "protocols: [tcp]\n" + - "encryption: yes\n" + - "serverCert: " + serverCertFpath + "\n" + - "serverKey: " + serverKeyFpath + "\n" + - "paths:\n" + - " all:\n" + - " readUser: testuser\n" + - " readPass: testpass\n") - require.Equal(t, true, ok) - defer p.close() - - cnt1, err := newContainer("ffmpeg", "source", []string{ - "-re", - "-stream_loop", "-1", - "-i", "emptyvideo.mkv", - "-c", "copy", - "-f", "rtsp", - "rtsps://" + ownDockerIP + ":8555/teststream", - }) - require.NoError(t, err) - defer cnt1.close() - - time.Sleep(1 * time.Second) - - p2, ok := testProgram("rtmpDisable: yes\n" + - "hlsDisable: yes\n" + - "paths:\n" + - " proxied:\n" + - " source: rtsps://testuser:testpass@localhost:8555/teststream\n" + - " sourceFingerprint: 33949E05FFFB5FF3E8AA16F8213A6251B4D9363804BA53233C4DA9A46D6F2739\n" + - " sourceOnDemand: yes\n") - require.Equal(t, true, ok) - defer p2.close() - } - - time.Sleep(1 * time.Second) - - cnt3, err := newContainer("ffmpeg", "dest", []string{ - "-rtsp_transport", "udp", - "-i", "rtsp://" + ownDockerIP + ":8554/proxied", - "-vframes", "1", - "-f", "image2", - "-y", "/dev/null", - }) - require.NoError(t, err) - defer cnt3.close() - require.Equal(t, 0, cnt3.wait()) - }) - } -} - -type testServerNoPassword struct { +type testServer struct { + user string + pass string authValidator *auth.Validator done chan struct{} } -func (sh *testServerNoPassword) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, []byte, error) { +func (sh *testServer) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, []byte, error) { if sh.authValidator == nil { - sh.authValidator = auth.NewValidator("testuser", "", nil) + sh.authValidator = auth.NewValidator(sh.user, sh.pass, nil) } err := sh.authValidator.ValidateHeader(ctx.Req.Header["Authorization"], @@ -148,17 +42,105 @@ func (sh *testServerNoPassword) OnDescribe(ctx *gortsplib.ServerHandlerOnDescrib }, gortsplib.Tracks{track}.Write(), nil } -// called after receiving a SETUP request. -func (sh *testServerNoPassword) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *uint32, error) { - close(sh.done) +func (sh *testServer) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *uint32, error) { + if sh.done != nil { + close(sh.done) + } + return &base.Response{ StatusCode: base.StatusOK, }, nil, nil } +func (sh *testServer) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { + go func() { + time.Sleep(1 * time.Second) + ctx.Session.WriteFrame(0, gortsplib.StreamTypeRTP, []byte{0x01, 0x02, 0x03, 0x04}) + }() + + return &base.Response{ + StatusCode: base.StatusOK, + }, nil +} + +func TestSourceRTSP(t *testing.T) { + for _, source := range []string{ + "udp", + "tcp", + "tls", + } { + t.Run(source, func(t *testing.T) { + s := gortsplib.Server{ + Handler: &testServer{user: "testuser", pass: "testpass"}, + } + + switch source { + case "udp": + s.UDPRTPAddress = "127.0.0.1:8002" + s.UDPRTCPAddress = "127.0.0.1:8003" + + case "tls": + serverCertFpath, err := writeTempFile(serverCert) + require.NoError(t, err) + defer os.Remove(serverCertFpath) + + serverKeyFpath, err := writeTempFile(serverKey) + require.NoError(t, err) + defer os.Remove(serverKeyFpath) + + cert, err := tls.LoadX509KeyPair(serverCertFpath, serverKeyFpath) + require.NoError(t, err) + + s.TLSConfig = &tls.Config{Certificates: []tls.Certificate{cert}} + } + + err := s.Start("127.0.0.1:8555") + require.NoError(t, err) + defer s.Close() + + if source == "udp" || source == "tcp" { + p, ok := testProgram("paths:\n" + + " proxied:\n" + + " source: rtsp://testuser:testpass@localhost:8555/teststream\n" + + " sourceProtocol: " + source + "\n" + + " sourceOnDemand: yes\n") + require.Equal(t, true, ok) + defer p.close() + } else { + p, ok := testProgram("paths:\n" + + " proxied:\n" + + " source: rtsps://testuser:testpass@localhost:8555/teststream\n" + + " sourceFingerprint: 33949E05FFFB5FF3E8AA16F8213A6251B4D9363804BA53233C4DA9A46D6F2739\n" + + " sourceOnDemand: yes\n") + require.Equal(t, true, ok) + defer p.close() + } + + time.Sleep(1 * time.Second) + + conn, err := gortsplib.DialRead("rtsp://127.0.0.1:8554/proxied") + require.NoError(t, err) + + readDone := make(chan struct{}) + received := make(chan struct{}) + go func() { + defer close(readDone) + conn.ReadFrames(func(trackID int, streamType gortsplib.StreamType, payload []byte) { + require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, payload) + close(received) + }) + }() + + <-received + conn.Close() + <-readDone + }) + } +} + func TestSourceRTSPNoPassword(t *testing.T) { done := make(chan struct{}) - s := gortsplib.Server{Handler: &testServerNoPassword{done: done}} + s := gortsplib.Server{Handler: &testServer{user: "testuser", done: done}} err := s.Start("127.0.0.1:8555") require.NoError(t, err) defer s.Close() @@ -173,5 +155,4 @@ func TestSourceRTSPNoPassword(t *testing.T) { defer p.close() <-done - // require.Equal(t, 0, cnt.wait()) }