120 lines
2.2 KiB
Go
120 lines
2.2 KiB
Go
package honeybeetest
|
|
|
|
import (
|
|
"bytes"
|
|
"github.com/stretchr/testify/assert"
|
|
"io"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// Constants
|
|
|
|
const (
|
|
TestTimeout = 2 * time.Second
|
|
TestTick = 10 * time.Millisecond
|
|
NegativeTestTimeout = 100 * time.Millisecond
|
|
)
|
|
|
|
// Types
|
|
|
|
type MockIncomingData struct {
|
|
MsgType int
|
|
Data []byte
|
|
Err error
|
|
}
|
|
|
|
type MockOutgoingData struct {
|
|
MsgType int
|
|
Data []byte
|
|
}
|
|
|
|
// Setup
|
|
|
|
func SetupTestSocket(t *testing.T) (
|
|
socket *MockSocket,
|
|
incoming chan MockIncomingData,
|
|
outgoing chan MockOutgoingData,
|
|
) {
|
|
t.Helper()
|
|
|
|
incoming = make(chan MockIncomingData, 10)
|
|
outgoing = make(chan MockOutgoingData, 10)
|
|
socket = NewMockSocket()
|
|
|
|
socket.CloseFunc = func() error {
|
|
socket.Once.Do(func() { close(socket.Closed) })
|
|
return nil
|
|
}
|
|
|
|
socket.ReadMessageFunc = func() (int, []byte, error) {
|
|
select {
|
|
case data, ok := <-incoming:
|
|
if !ok {
|
|
return 0, nil, io.EOF
|
|
}
|
|
return data.MsgType, data.Data, data.Err
|
|
case <-socket.Closed:
|
|
return 0, nil, io.EOF
|
|
}
|
|
}
|
|
|
|
socket.WriteMessageFunc = func(msgType int, data []byte) error {
|
|
select {
|
|
case outgoing <- MockOutgoingData{MsgType: msgType, Data: data}:
|
|
return nil
|
|
case <-socket.Closed:
|
|
return io.EOF
|
|
default:
|
|
return io.EOF
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// Helpers
|
|
|
|
func ExpectIncoming(t *testing.T, incoming <-chan []byte, expected []byte) {
|
|
t.Helper()
|
|
assert.Eventually(t, func() bool {
|
|
select {
|
|
case received := <-incoming:
|
|
return bytes.Equal(received, expected)
|
|
default:
|
|
return false
|
|
}
|
|
}, TestTimeout, TestTick)
|
|
}
|
|
|
|
func ExpectWrite(t *testing.T, outgoingData chan MockOutgoingData, msgType int, expected []byte) {
|
|
t.Helper()
|
|
|
|
var call MockOutgoingData
|
|
found := assert.Eventually(t, func() bool {
|
|
select {
|
|
case received := <-outgoingData:
|
|
call = received
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}, TestTimeout, TestTick)
|
|
|
|
if found {
|
|
|
|
assert.Equal(t, msgType, call.MsgType)
|
|
assert.Equal(t, expected, call.Data)
|
|
}
|
|
}
|
|
|
|
func Eventually(t *testing.T, condition func() bool, msg string) {
|
|
t.Helper()
|
|
assert.Eventually(t, condition, TestTimeout, TestTick, msg)
|
|
}
|
|
|
|
func Never(t *testing.T, condition func() bool, msg string) {
|
|
t.Helper()
|
|
assert.Never(t, condition, NegativeTestTimeout, TestTick, msg)
|
|
}
|