mirror of
https://github.com/jackc/pgx.git
synced 2025-05-31 11:42:24 +00:00
In the original issue [1] and commit [2], support for unexpected EOF was
added to the frontend to detect when a connection was closed abruptly.
Additionally, this allows us to differentiate normal io.EOF errors with
unexpected errors in the backend.
[1] https://github.com/jackc/pgx/issues/662/
[2] 595780be0f
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package pgproto3_test
|
|
|
|
import (
|
|
"io"
|
|
"testing"
|
|
|
|
"github.com/jackc/pgproto3/v2"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestBackendReceiveInterrupted(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
server := &interruptReader{}
|
|
server.push([]byte{'Q', 0, 0, 0, 6})
|
|
|
|
backend := pgproto3.NewBackend(pgproto3.NewChunkReader(server), nil)
|
|
|
|
msg, err := backend.Receive()
|
|
if err == nil {
|
|
t.Fatal("expected err")
|
|
}
|
|
if msg != nil {
|
|
t.Fatalf("did not expect msg, but %v", msg)
|
|
}
|
|
|
|
server.push([]byte{'I', 0})
|
|
|
|
msg, err = backend.Receive()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if msg, ok := msg.(*pgproto3.Query); !ok || msg.String != "I" {
|
|
t.Fatalf("unexpected msg: %v", msg)
|
|
}
|
|
}
|
|
|
|
func TestBackendReceiveUnexpectedEOF(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
server := &interruptReader{}
|
|
server.push([]byte{'Q', 0, 0, 0, 6})
|
|
|
|
backend := pgproto3.NewBackend(pgproto3.NewChunkReader(server), nil)
|
|
|
|
// Receive regular msg
|
|
msg, err := backend.Receive()
|
|
assert.Nil(t, msg)
|
|
assert.Equal(t, io.ErrUnexpectedEOF, err)
|
|
|
|
// Receive FE msg
|
|
server.push([]byte{'F', 0, 0, 0, 6})
|
|
msg, err = backend.ReceiveStartupMessage()
|
|
assert.Nil(t, msg)
|
|
assert.Equal(t, io.ErrUnexpectedEOF, err)
|
|
}
|