github.com/anacrolix/torrent@v1.61.0/peer_protocol/fuzz_test.go (about) 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/go-quicktest/qt" 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 d := Decoder{ 23 R: bufio.NewReader(bytes.NewReader(b)), 24 MaxLength: 0x100, 25 } 26 var ms []Message 27 for { 28 var m Message 29 err := d.Decode(&m) 30 t.Log(err) 31 if err == io.EOF { 32 break 33 } 34 if err == nil { 35 qt.Assert(t, qt.Not(qt.Equals(m, Message{}))) 36 ms = append(ms, m) 37 continue 38 } else { 39 t.Skip(err) 40 } 41 } 42 t.Log(ms) 43 var buf bytes.Buffer 44 for _, m := range ms { 45 buf.Write(m.MustMarshalBinary()) 46 } 47 if len(b) == 0 { 48 qt.Assert(t, qt.HasLen(buf.Bytes(), 0)) 49 } else { 50 qt.Assert(t, qt.DeepEquals(buf.Bytes(), b)) 51 } 52 }) 53 } 54 55 func FuzzMessageMarshalBinary(f *testing.F) { 56 f.Fuzz(func(t *testing.T, b []byte) { 57 var m Message 58 if err := m.UnmarshalBinary(b); err != nil { 59 t.Skip(err) 60 } 61 b0 := m.MustMarshalBinary() 62 qt.Assert(t, qt.DeepEquals(b0, b)) 63 }) 64 }