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)) }