Remove read deadlines from the connection.
Prevents the connection from closing from a lack of incoming messages.
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user