}
// io.EOF is returned if the source terminates cleanly on a message boundary.
-// TODO: Is that before or after the message?
func (d *Decoder) Decode(msg *Message) (err error) {
var length Integer
err = binary.Read(d.R, binary.BigEndian, &length)
if err != nil {
if err != io.EOF {
- err = fmt.Errorf("error reading message length: %s", err)
+ err = fmt.Errorf("error reading message length: %w", err)
}
return
}
import (
"bufio"
"bytes"
+ "errors"
+ "io"
"testing"
+
+ qt "github.com/frankban/quicktest"
)
func FuzzDecoder(f *testing.F) {
f.Add([]byte("\x00\x00\x00\x01\x00"))
f.Add([]byte("\x00\x00\x00\x03\x14\x00"))
f.Fuzz(func(t *testing.T, b []byte) {
+ c := qt.New(t)
d := Decoder{
- R: bufio.NewReader(bytes.NewReader(b)),
+ R: bufio.NewReader(bytes.NewReader(b)),
+ MaxLength: 0x100,
+ }
+ var ms []Message
+ for {
+ var m Message
+ err := d.Decode(&m)
+ t.Log(err)
+ if errors.Is(err, io.EOF) {
+ break
+ }
+ if err == nil {
+ c.Assert(m, qt.Not(qt.Equals), Message{})
+ ms = append(ms, m)
+ continue
+ } else {
+ t.Skip(err)
+ }
}
- var m Message
- err := d.Decode(&m)
- if err != nil {
- t.Skip(err)
+ var buf bytes.Buffer
+ for _, m := range ms {
+ buf.Write(m.MustMarshalBinary())
}
+ c.Assert(buf.Bytes(), qt.DeepEquals, b)
})
}