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 }