Remove read deadlines from the connection.

Prevents the connection from closing from a lack of incoming messages.
This commit is contained in:
Jay
2026-04-15 17:43:26 -04:00
parent 031df8c98d
commit 9fb00c3a78
6 changed files with 20 additions and 226 deletions

View File

@@ -54,127 +54,6 @@ func TestStartReader(t *testing.T) {
}
})
t.Run("read timeout disabled when zero", func(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode")
}
config := &Config{ReadTimeout: 0}
mockSocket := NewMockSocket()
mockSocket.CloseFunc = func() error {
mockSocket.once.Do(func() {
close(mockSocket.closed)
})
return nil
}
deadlineCalled := make(chan struct{}, 1)
mockSocket.SetReadDeadlineFunc = func(t time.Time) error {
deadlineCalled <- struct{}{}
return nil
}
conn, err := NewConnectionFromSocket(mockSocket, config, nil)
assert.NoError(t, err)
defer conn.Close()
assert.Never(t, func() bool {
select {
case <-deadlineCalled:
return true
default:
return false
}
}, negativeTestTimeout, testTick,
"SetReadDeadline should not be called when timeout is zero")
})
t.Run("read timeout sets deadline when positive", func(t *testing.T) {
config := &Config{ReadTimeout: 30}
incomingData := make(chan mockIncomingData, 10)
mockSocket := NewMockSocket()
mockSocket.CloseFunc = func() error {
mockSocket.once.Do(func() {
close(mockSocket.closed)
})
return nil
}
deadlineCalled := make(chan struct{}, 1)
mockSocket.SetReadDeadlineFunc = func(t time.Time) error {
deadlineCalled <- struct{}{}
return nil
}
mockSocket.ReadMessageFunc = func() (int, []byte, error) {
select {
case data := <-incomingData:
return data.msgType, data.data, data.err
case <-mockSocket.closed:
return 0, nil, io.EOF
}
}
conn, err := NewConnectionFromSocket(mockSocket, config, nil)
assert.NoError(t, err)
defer conn.Close()
incomingData <- mockIncomingData{msgType: websocket.TextMessage, data: []byte("test"), err: nil}
select {
case <-conn.Incoming():
}
assert.Eventually(t, func() bool {
select {
case <-deadlineCalled:
return true
default:
return false
}
}, testTimeout, testTick,
"SetWriteDeadline should be called when timeout is positive")
})
t.Run("reader exits on deadline error", func(t *testing.T) {
config := &Config{ReadTimeout: 1 * time.Millisecond}
mockSocket := NewMockSocket()
mockSocket.CloseFunc = func() error {
mockSocket.once.Do(func() {
close(mockSocket.closed)
})
return nil
}
mockSocket.SetReadDeadlineFunc = func(t time.Time) error {
return fmt.Errorf("test error")
}
conn, err := NewConnectionFromSocket(mockSocket, config, nil)
assert.NoError(t, err)
defer conn.Close()
assert.Eventually(t, func() bool {
select {
case err := <-conn.Errors():
return err != nil &&
strings.Contains(err.Error(), "failed to set read deadline")
default:
return false
}
}, testTimeout, testTick)
assert.Eventually(t, func() bool {
return conn.State() == StateClosed
}, testTimeout, testTick)
})
t.Run("reader exits on socket read error", func(t *testing.T) {
mockSocket := NewMockSocket()