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  }