From 4009cf5b3a10bc20f7b8bc7286f01d291a305592 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sun, 21 Mar 2021 18:53:07 +0100 Subject: [PATCH] client: add more tests --- clientconn_test.go | 156 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 clientconn_test.go diff --git a/clientconn_test.go b/clientconn_test.go new file mode 100644 index 00000000..f1b21f8f --- /dev/null +++ b/clientconn_test.go @@ -0,0 +1,156 @@ +package gortsplib + +import ( + "bufio" + "net" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/aler9/gortsplib/pkg/auth" + "github.com/aler9/gortsplib/pkg/base" +) + +func TestClientConnSession(t *testing.T) { + l, err := net.Listen("tcp", "localhost:8554") + require.NoError(t, err) + defer l.Close() + + serverDone := make(chan struct{}) + defer func() { <-serverDone }() + go func() { + defer close(serverDone) + + conn, err := l.Accept() + require.NoError(t, err) + bconn := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) + defer conn.Close() + + var req base.Request + err = req.Read(bconn.Reader) + require.NoError(t, err) + require.Equal(t, base.Options, req.Method) + + err = base.Response{ + StatusCode: base.StatusOK, + Header: base.Header{ + "Public": base.HeaderValue{strings.Join([]string{ + string(base.Describe), + }, ", ")}, + "Session": base.HeaderValue{"123456"}, + }, + }.Write(bconn.Writer) + require.NoError(t, err) + + err = req.Read(bconn.Reader) + require.NoError(t, err) + require.Equal(t, base.Describe, req.Method) + + require.Equal(t, base.HeaderValue{"123456"}, req.Header["Session"]) + + track, err := NewTrackH264(96, []byte("123456"), []byte("123456")) + require.NoError(t, err) + + err = base.Response{ + StatusCode: base.StatusOK, + Header: base.Header{ + "Content-Type": base.HeaderValue{"application/sdp"}, + "Session": base.HeaderValue{"123456"}, + }, + Body: Tracks{track}.Write(), + }.Write(bconn.Writer) + require.NoError(t, err) + }() + + u, err := base.ParseURL("rtsp://localhost:8554/stream") + require.NoError(t, err) + + conn, err := Dial(u.Scheme, u.Host) + require.NoError(t, err) + defer conn.Close() + + _, err = conn.Options(u) + require.NoError(t, err) + + _, _, err = conn.Describe(u) + require.NoError(t, err) +} + +func TestClientConnAuth(t *testing.T) { + l, err := net.Listen("tcp", "localhost:8554") + require.NoError(t, err) + defer l.Close() + + serverDone := make(chan struct{}) + defer func() { <-serverDone }() + go func() { + defer close(serverDone) + + conn, err := l.Accept() + require.NoError(t, err) + bconn := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) + defer conn.Close() + + var req base.Request + err = req.Read(bconn.Reader) + require.NoError(t, err) + require.Equal(t, base.Options, req.Method) + + err = base.Response{ + StatusCode: base.StatusOK, + Header: base.Header{ + "Public": base.HeaderValue{strings.Join([]string{ + string(base.Describe), + }, ", ")}, + }, + }.Write(bconn.Writer) + require.NoError(t, err) + + err = req.Read(bconn.Reader) + require.NoError(t, err) + require.Equal(t, base.Describe, req.Method) + + v := auth.NewValidator("myuser", "mypass", nil) + + err = base.Response{ + StatusCode: base.StatusUnauthorized, + Header: base.Header{ + "WWW-Authenticate": v.GenerateHeader(), + }, + }.Write(bconn.Writer) + require.NoError(t, err) + + err = req.Read(bconn.Reader) + require.NoError(t, err) + require.Equal(t, base.Describe, req.Method) + + err = v.ValidateHeader(req.Header["Authorization"], base.Describe, req.URL, nil) + require.NoError(t, err) + + track, err := NewTrackH264(96, []byte("123456"), []byte("123456")) + require.NoError(t, err) + + err = base.Response{ + StatusCode: base.StatusOK, + Header: base.Header{ + "Content-Type": base.HeaderValue{"application/sdp"}, + }, + Body: Tracks{track}.Write(), + }.Write(bconn.Writer) + require.NoError(t, err) + }() + + u, err := base.ParseURL("rtsp://myuser:mypass@localhost:8554/stream") + require.NoError(t, err) + + conn, err := Dial(u.Scheme, u.Host) + require.NoError(t, err) + defer conn.Close() + + _, err = conn.Options(u) + require.NoError(t, err) + + _, _, err = conn.Describe(u) + require.NoError(t, err) +}