github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/encoding/bigint/fuzz_test.go (about)

     1  package bigint
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rand"
     6  	"math/big"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func FuzzFromBytes(f *testing.F) {
    13  	for _, tc := range testCases {
    14  		f.Add(tc.buf)
    15  	}
    16  	for i := 0; i < 50; i++ {
    17  		for j := 1; j < MaxBytesLen; j++ {
    18  			b := make([]byte, j)
    19  			_, err := rand.Read(b)
    20  			require.NoError(f, err)
    21  			f.Add(b)
    22  		}
    23  	}
    24  	f.Fuzz(func(t *testing.T, raw []byte) {
    25  		var bi *big.Int
    26  		require.NotPanics(t, func() { bi = FromBytes(raw) })
    27  
    28  		var actual []byte
    29  		require.NotPanics(t, func() { actual = ToBytes(bi) })
    30  		require.True(t, len(actual) <= len(raw), "actual: %x, raw: %x", actual, raw)
    31  
    32  		require.True(t, bytes.Equal(actual, raw[:len(actual)]), "actual: %x, raw: %x", actual, raw)
    33  		if len(actual) == len(raw) {
    34  			return
    35  		}
    36  
    37  		var b byte
    38  		if bi.Sign() == -1 {
    39  			b = 0xFF
    40  		}
    41  		for i := len(actual); i < len(raw); i++ {
    42  			require.Equal(t, b, raw[i], "invalid prefix")
    43  		}
    44  
    45  		newRaw := ToBytes(bi)
    46  		newBi := FromBytes(newRaw)
    47  		require.Equal(t, bi, newBi)
    48  	})
    49  }