src.dualinventive.com/go/dinet/ll/stream_test.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))
}