]> Sergey Matveev's repositories - btrtrc.git/blob - peer_protocol/fuzz_test.go
Fix incorrect EOF when decoding some peer protocol message types
[btrtrc.git] / peer_protocol / fuzz_test.go
1 //go:build go1.18
2 // +build go1.18
3
4 package peer_protocol
5
6 import (
7         "bufio"
8         "bytes"
9         "errors"
10         "io"
11         "testing"
12
13         qt "github.com/frankban/quicktest"
14 )
15
16 func FuzzDecoder(f *testing.F) {
17         f.Add([]byte("\x00\x00\x00\x00"))
18         f.Add([]byte("\x00\x00\x00\x01\x00"))
19         f.Add([]byte("\x00\x00\x00\x03\x14\x00"))
20         f.Add([]byte("\x00\x00\x00\x01\x07"))
21         f.Fuzz(func(t *testing.T, b []byte) {
22                 t.Logf("%q", b)
23                 c := qt.New(t)
24                 d := Decoder{
25                         R:         bufio.NewReader(bytes.NewReader(b)),
26                         MaxLength: 0x100,
27                 }
28                 var ms []Message
29                 for {
30                         var m Message
31                         err := d.Decode(&m)
32                         t.Log(err)
33                         if errors.Is(err, io.EOF) {
34                                 break
35                         }
36                         if err == nil {
37                                 c.Assert(m, qt.Not(qt.Equals), Message{})
38                                 ms = append(ms, m)
39                                 continue
40                         } else {
41                                 t.Skip(err)
42                         }
43                 }
44                 var buf bytes.Buffer
45                 for _, m := range ms {
46                         buf.Write(m.MustMarshalBinary())
47                 }
48                 if len(b) == 0 {
49                         c.Assert(buf.Bytes(), qt.HasLen, 0)
50                 } else {
51                         c.Assert(buf.Bytes(), qt.DeepEquals, b)
52                 }
53         })
54 }
55
56 func FuzzMessageMarshalBinary(f *testing.F) {
57         f.Fuzz(func(t *testing.T, b []byte) {
58                 var m Message
59                 if err := m.UnmarshalBinary(b); err != nil {
60                         t.Skip(err)
61                 }
62                 b0 := m.MustMarshalBinary()
63                 qt.Assert(t, b0, qt.DeepEquals, b)
64         })
65 }