github.com/MetalBlockchain/subnet-evm@v0.6.3/predicate/predicate_bytes_test.go (about)

     1  // (c) 2023, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package predicate
     5  
     6  import (
     7  	"bytes"
     8  	"testing"
     9  
    10  	"github.com/MetalBlockchain/metalgo/utils"
    11  	"github.com/MetalBlockchain/subnet-evm/params"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func testPackPredicate(t testing.TB, b []byte) {
    16  	packedPredicate := PackPredicate(b)
    17  	unpackedPredicated, err := UnpackPredicate(packedPredicate)
    18  	require.NoError(t, err)
    19  	require.Equal(t, b, unpackedPredicated)
    20  }
    21  
    22  func FuzzPackPredicate(f *testing.F) {
    23  	for i := 0; i < 100; i++ {
    24  		f.Add(utils.RandomBytes(i))
    25  	}
    26  
    27  	f.Fuzz(func(t *testing.T, b []byte) {
    28  		testPackPredicate(t, b)
    29  	})
    30  }
    31  
    32  func TestUnpackInvalidPredicate(t *testing.T) {
    33  	require := require.New(t)
    34  	// Predicate encoding requires a 0xff delimiter byte followed by padding of all zeroes, so any other
    35  	// excess padding should invalidate the predicate.
    36  	paddingCases := make([][]byte, 0, 200)
    37  	for i := 1; i < 100; i++ {
    38  		paddingCases = append(paddingCases, bytes.Repeat([]byte{0xee}, i))
    39  		paddingCases = append(paddingCases, make([]byte, i))
    40  	}
    41  
    42  	for _, l := range []int{0, 1, 31, 32, 33, 63, 64, 65} {
    43  		validPredicate := PackPredicate(utils.RandomBytes(l))
    44  
    45  		for _, padding := range paddingCases {
    46  			invalidPredicate := append(validPredicate, padding...)
    47  			_, err := UnpackPredicate(invalidPredicate)
    48  			require.Error(err, "Predicate length %d, Padding length %d (0x%x)", len(validPredicate), len(padding), invalidPredicate)
    49  		}
    50  	}
    51  }
    52  
    53  func TestPredicateResultsBytes(t *testing.T) {
    54  	require := require.New(t)
    55  	dataTooShort := utils.RandomBytes(params.DynamicFeeExtraDataSize - 1)
    56  	_, ok := GetPredicateResultBytes(dataTooShort)
    57  	require.False(ok)
    58  
    59  	preDurangoData := utils.RandomBytes(params.DynamicFeeExtraDataSize)
    60  	_, ok = GetPredicateResultBytes(preDurangoData)
    61  	require.False(ok)
    62  	postDurangoData := utils.RandomBytes(params.DynamicFeeExtraDataSize + 2)
    63  	resultBytes, ok := GetPredicateResultBytes(postDurangoData)
    64  	require.True(ok)
    65  	require.Equal(resultBytes, postDurangoData[params.DynamicFeeExtraDataSize:])
    66  }