]> Sergey Matveev's repositories - btrtrc.git/blob - peer_protocol/fuzz_test.go
Implement decoding hash request, reject and hashes
[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         "io"
10         "testing"
11
12         qt "github.com/frankban/quicktest"
13 )
14
15 func FuzzDecoder(f *testing.F) {
16         f.Add([]byte("\x00\x00\x00\x00"))
17         f.Add([]byte("\x00\x00\x00\x01\x00"))
18         f.Add([]byte("\x00\x00\x00\x03\x14\x00"))
19         f.Add([]byte("\x00\x00\x00\x01\x07"))
20         f.Fuzz(func(t *testing.T, b []byte) {
21                 t.Logf("%q", b)
22                 c := qt.New(t)
23                 d := Decoder{
24                         R:         bufio.NewReader(bytes.NewReader(b)),
25                         MaxLength: 0x100,
26                 }
27                 var ms []Message
28                 for {
29                         var m Message
30                         err := d.Decode(&m)
31                         t.Log(err)
32                         if err == io.EOF {
33                                 break
34                         }
35                         if err == nil {
36                                 c.Assert(m, qt.Not(qt.Equals), Message{})
37                                 ms = append(ms, m)
38                                 continue
39                         } else {
40                                 t.Skip(err)
41                         }
42                 }
43                 t.Log(ms)
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 }