104 lines
2.2 KiB
Go
104 lines
2.2 KiB
Go
package udp
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"src.dualinventive.com/go/lib/dilog"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestNewListener_withNilLogger_returnsErr(t *testing.T) {
|
|
rec := newRecorder()
|
|
|
|
l, err := NewListener(nil, ":8080", DefaultUDPBufferSize, 2, rec.handle)
|
|
assert.Nil(t, l)
|
|
assert.NotNil(t, err)
|
|
assert.EqualError(t, err, "logger must not be nil")
|
|
}
|
|
|
|
func TestNewListener_withNilHandler_returnsErr(t *testing.T) {
|
|
log := dilog.NewNilLogger()
|
|
|
|
l, err := NewListener(log, ":8080", DefaultUDPBufferSize, 2, nil)
|
|
assert.Nil(t, l)
|
|
assert.NotNil(t, err)
|
|
assert.EqualError(t, err, "handler must not be nil")
|
|
}
|
|
|
|
func TestNewListener_withEmptyAddr_startOnRandomPort(t *testing.T) {
|
|
log := dilog.NewTestLogger(t)
|
|
rec := newRecorder()
|
|
|
|
l, err := NewListener(log, "", DefaultUDPBufferSize, 2, rec.handle)
|
|
|
|
assert.NotNil(t, l)
|
|
assert.Nil(t, err)
|
|
assert.NotNil(t, l.pc)
|
|
}
|
|
|
|
func TestNewListener_withZeroBufferSize_setsDefaultBufferSize(t *testing.T) {
|
|
log := dilog.NewTestLogger(t)
|
|
rec := newRecorder()
|
|
|
|
l, err := NewListener(log, ":8080", 0, 2, rec.handle)
|
|
|
|
assert.NotNil(t, l)
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, len(l.buffer), DefaultUDPBufferSize)
|
|
assert.NotNil(t, l.pc)
|
|
}
|
|
|
|
func TestListenAndServe_routesPacketsToHandler(t *testing.T) {
|
|
log := dilog.NewTestLogger(t)
|
|
rec := newRecorder()
|
|
|
|
l, err := NewListener(log, "", 1064, 2, rec.handle)
|
|
assert.Nil(t, err)
|
|
|
|
go func() {
|
|
err = l.ListenAndServe()
|
|
}()
|
|
|
|
done := make(chan bool, 1)
|
|
go func() {
|
|
select {
|
|
case <-rec.recvChan:
|
|
assert.NotEmpty(t, rec.recv)
|
|
assert.Len(t, rec.recv, 1)
|
|
assert.Equal(t, []byte("test"), rec.recv[0])
|
|
done <- true
|
|
case <-time.Tick(time.Second * 5):
|
|
assert.Fail(t, "timeout")
|
|
done <- true
|
|
}
|
|
}()
|
|
|
|
writeUDP(t, l.LocalAddr(), "test")
|
|
<-done
|
|
}
|
|
|
|
type recorder struct {
|
|
recv [][]byte
|
|
recvChan chan bool
|
|
}
|
|
|
|
func (r *recorder) handle(b []byte) {
|
|
r.recv = append(r.recv, b)
|
|
r.recvChan <- true
|
|
}
|
|
|
|
func newRecorder() *recorder {
|
|
recvChan := make(chan bool, 1)
|
|
return &recorder{recv: [][]byte{}, recvChan: recvChan}
|
|
}
|
|
|
|
func writeUDP(t *testing.T, addr string, payload string) {
|
|
conn, err := net.Dial("udp", addr)
|
|
assert.Nil(t, err)
|
|
_, err = conn.Write([]byte(payload))
|
|
assert.Nil(t, err)
|
|
}
|