94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package ll
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestDecoderNoDataPayload(t *testing.T) {
|
|
buf := bytes.NewBuffer([]byte{0x44, 0x4a, 0x52, 0x40, 0x00, 0x06})
|
|
var msg Msg
|
|
|
|
dec := NewDecoder(buf)
|
|
require.Nil(t, dec.Decode(&msg))
|
|
|
|
require.Equal(t, msg.Type, MsgTypeTime)
|
|
}
|
|
|
|
func TestDecoderLeadingTrailingSpuriousBytes(t *testing.T) {
|
|
buf := bytes.NewBuffer([]byte{0x00, 0x00, 0x12, 0x13, 0x33, 0x44, 0x4a, 0x52, 0x40, 0x00, 0x06})
|
|
var msg Msg
|
|
|
|
dec := NewDecoder(buf)
|
|
require.Nil(t, dec.Decode(&msg))
|
|
require.Equal(t, msg.Type, MsgTypeTime)
|
|
}
|
|
|
|
func TestDecoderChunkedTransfer(t *testing.T) {
|
|
r, w, err := os.Pipe()
|
|
require.Nil(t, err)
|
|
defer func(t *testing.T) {
|
|
require.Nil(t, r.Close())
|
|
}(t)
|
|
defer func(t *testing.T) {
|
|
require.Nil(t, w.Close())
|
|
}(t)
|
|
|
|
dec := NewDecoder(r)
|
|
var wg sync.WaitGroup
|
|
|
|
errChan := make(chan error, 4)
|
|
wg.Add(1)
|
|
go func() {
|
|
_, werr := w.Write([]byte{0x00, 0x12, 0x34, 0x44})
|
|
errChan <- werr
|
|
time.Sleep(time.Millisecond * 5)
|
|
_, werr = w.Write([]byte{0x4a, 0x52, 0x10})
|
|
errChan <- werr
|
|
time.Sleep(time.Millisecond * 5)
|
|
_, werr = w.Write([]byte{0x00, 0x0A, 0xde})
|
|
errChan <- werr
|
|
time.Sleep(time.Millisecond * 5)
|
|
_, werr = w.Write([]byte{0xad, 0xbe, 0xef})
|
|
errChan <- werr
|
|
close(errChan)
|
|
wg.Done()
|
|
}()
|
|
|
|
var msg Msg
|
|
require.Nil(t, dec.Decode(&msg))
|
|
require.Equal(t, msg.Type, MsgTypePlain)
|
|
require.Equal(t, []byte{0xde, 0xad, 0xbe, 0xef}, msg.Data)
|
|
wg.Wait()
|
|
for err := range errChan {
|
|
require.Nil(t, err)
|
|
}
|
|
}
|
|
|
|
func TestDecoderDataPayload(t *testing.T) {
|
|
expectData := []byte{0xde, 0xad, 0xbe, 0xef}
|
|
|
|
buf := bytes.NewBuffer([]byte{0x44, 0x4a, 0x52, 0x10, 0x00, 0x0a, 0xde, 0xad, 0xbe, 0xef})
|
|
var msg Msg
|
|
|
|
dec := NewDecoder(buf)
|
|
require.Nil(t, dec.Decode(&msg))
|
|
require.Equal(t, msg.Type, MsgTypePlain)
|
|
require.Equal(t, expectData, msg.Data)
|
|
}
|
|
|
|
func TestDecoderDataExceedDecodeChunk(t *testing.T) {
|
|
var msg Msg
|
|
data := make([]byte, 4096)
|
|
buf := bytes.NewBuffer(data)
|
|
|
|
dec := NewDecoder(buf)
|
|
require.Equal(t, io.EOF, dec.Decode(&msg))
|
|
}
|