88 lines
2.2 KiB
Go
88 lines
2.2 KiB
Go
package transport
|
|
|
|
import (
|
|
"fmt"
|
|
"git.wisehodl.dev/jay/go-honeybee/honeybeetest"
|
|
"github.com/gorilla/websocket"
|
|
"github.com/stretchr/testify/assert"
|
|
"testing"
|
|
)
|
|
|
|
func TestStartReader(t *testing.T) {
|
|
t.Run("text messages route to incoming channel", func(t *testing.T) {
|
|
conn, _, incomingData, _ := setupTestConnection(t, nil)
|
|
defer conn.Close()
|
|
|
|
testData := []byte("hello")
|
|
incomingData <- honeybeetest.MockIncomingData{
|
|
MsgType: websocket.TextMessage,
|
|
Data: testData,
|
|
Err: nil,
|
|
}
|
|
|
|
honeybeetest.ExpectIncoming(t, conn.Incoming(), testData)
|
|
})
|
|
|
|
t.Run("binary messages route to incoming channel", func(t *testing.T) {
|
|
conn, _, incomingData, _ := setupTestConnection(t, nil)
|
|
defer conn.Close()
|
|
|
|
testData := []byte{0x00, 0x01, 0x02}
|
|
incomingData <- honeybeetest.MockIncomingData{
|
|
MsgType: websocket.BinaryMessage,
|
|
Data: testData,
|
|
Err: nil,
|
|
}
|
|
|
|
honeybeetest.ExpectIncoming(t, conn.Incoming(), testData)
|
|
})
|
|
|
|
t.Run("multiple messages processed sequentially", func(t *testing.T) {
|
|
conn, _, incomingData, _ := setupTestConnection(t, nil)
|
|
defer conn.Close()
|
|
|
|
messages := [][]byte{[]byte("first"), []byte("second"), []byte("third")}
|
|
for _, msg := range messages {
|
|
incomingData <- honeybeetest.MockIncomingData{
|
|
MsgType: websocket.TextMessage, Data: msg, Err: nil}
|
|
}
|
|
|
|
for _, expected := range messages {
|
|
honeybeetest.ExpectIncoming(t, conn.Incoming(), expected)
|
|
}
|
|
})
|
|
|
|
t.Run("reader exits on socket read error", func(t *testing.T) {
|
|
mockSocket := honeybeetest.NewMockSocket()
|
|
|
|
mockSocket.CloseFunc = func() error {
|
|
mockSocket.Once.Do(func() {
|
|
close(mockSocket.Closed)
|
|
})
|
|
return nil
|
|
}
|
|
|
|
readErr := fmt.Errorf("read failed")
|
|
mockSocket.ReadMessageFunc = func() (int, []byte, error) {
|
|
return 0, nil, readErr
|
|
}
|
|
|
|
conn, err := NewConnectionFromSocket(mockSocket, nil, nil)
|
|
assert.NoError(t, err)
|
|
defer conn.Close()
|
|
|
|
assert.Eventually(t, func() bool {
|
|
select {
|
|
case err := <-conn.Errors():
|
|
return err == readErr
|
|
default:
|
|
return false
|
|
}
|
|
}, honeybeetest.TestTimeout, honeybeetest.TestTick)
|
|
|
|
assert.Eventually(t, func() bool {
|
|
return conn.State() == StateClosed
|
|
}, honeybeetest.TestTimeout, honeybeetest.TestTick)
|
|
})
|
|
}
|