From 1906c9f77683036789fa7cc7e69f1790cb26fbcf Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sun, 2 May 2021 22:16:08 +0200 Subject: [PATCH] server: test invalid session --- pkg/liberrors/server.go | 8 ++++++ server_test.go | 54 +++++++++++++++++++++++++++++++++++++++++ serverconn.go | 8 +++--- 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/pkg/liberrors/server.go b/pkg/liberrors/server.go index ae240de8..4358b995 100644 --- a/pkg/liberrors/server.go +++ b/pkg/liberrors/server.go @@ -199,3 +199,11 @@ type ErrServerSessionLinkedToOtherConn struct{} func (e ErrServerSessionLinkedToOtherConn) Error() string { return "session is linked to another connection" } + +// ErrServerInvalidSession is an error that can be returned by a server. +type ErrServerInvalidSession struct{} + +// Error implements the error interface. +func (e ErrServerInvalidSession) Error() string { + return "invalid session" +} diff --git a/server_test.go b/server_test.go index c2286292..f386e379 100644 --- a/server_test.go +++ b/server_test.go @@ -659,3 +659,57 @@ func TestServerGetSetParameter(t *testing.T) { require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, []byte("param1: 123456\r\n"), res.Body) } + +func TestServerErrorInvalidSession(t *testing.T) { + for _, method := range []base.Method{ + base.Play, + base.Record, + base.Pause, + base.Teardown, + } { + t.Run(string(method), func(t *testing.T) { + s := &Server{ + Handler: &testServerHandler{ + onPlay: func(ctx *ServerHandlerOnPlayCtx) (*base.Response, error) { + return &base.Response{ + StatusCode: base.StatusOK, + }, nil + }, + onRecord: func(ctx *ServerHandlerOnRecordCtx) (*base.Response, error) { + return &base.Response{ + StatusCode: base.StatusOK, + }, nil + }, + onPause: func(ctx *ServerHandlerOnPauseCtx) (*base.Response, error) { + return &base.Response{ + StatusCode: base.StatusOK, + }, nil + }, + }, + } + + err := s.Start("127.0.0.1:8554") + require.NoError(t, err) + defer s.Close() + + conn, err := net.Dial("tcp", "localhost:8554") + require.NoError(t, err) + defer conn.Close() + bconn := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) + + err = base.Request{ + Method: method, + URL: base.MustParseURL("rtsp://localhost:8554/teststream"), + Header: base.Header{ + "CSeq": base.HeaderValue{"1"}, + }, + }.Write(bconn.Writer) + require.NoError(t, err) + + var res base.Response + err = res.Read(bconn.Reader) + require.NoError(t, err) + require.Equal(t, base.StatusBadRequest, res.StatusCode) + }) + } +} diff --git a/serverconn.go b/serverconn.go index 1fc39bba..a4cc0f0d 100644 --- a/serverconn.go +++ b/serverconn.go @@ -333,7 +333,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { if ss == nil { return &base.Response{ StatusCode: base.StatusBadRequest, - }, fmt.Errorf("terminated") + }, liberrors.ErrServerInvalidSession{} } rres := make(chan requestRes) @@ -359,7 +359,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { if ss == nil { return &base.Response{ StatusCode: base.StatusBadRequest, - }, fmt.Errorf("terminated") + }, liberrors.ErrServerInvalidSession{} } rres := make(chan requestRes) @@ -385,7 +385,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { if ss == nil { return &base.Response{ StatusCode: base.StatusBadRequest, - }, fmt.Errorf("terminated") + }, liberrors.ErrServerInvalidSession{} } rres := make(chan requestRes) @@ -408,7 +408,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { if ss == nil { return &base.Response{ StatusCode: base.StatusBadRequest, - }, fmt.Errorf("terminated") + }, liberrors.ErrServerInvalidSession{} } rres := make(chan requestRes)