github.com/MetalBlockchain/metalgo@v1.11.9/snow/engine/avalanche/vertex/stateless_vertex_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package vertex
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/MetalBlockchain/metalgo/ids"
    12  )
    13  
    14  func TestVertexVerify(t *testing.T) {
    15  	tooManyParents := make([]ids.ID, maxNumParents+1)
    16  	for i := range tooManyParents {
    17  		tooManyParents[i][0] = byte(i)
    18  	}
    19  	tooManyTxs := make([][]byte, maxTxsPerVtx+1)
    20  	for i := range tooManyTxs {
    21  		tooManyTxs[i] = []byte{byte(i)}
    22  	}
    23  	tooManyRestrictions := make([]ids.ID, maxTxsPerVtx+1)
    24  	for i := range tooManyRestrictions {
    25  		tooManyRestrictions[i][0] = byte(i)
    26  	}
    27  
    28  	tests := []struct {
    29  		name        string
    30  		vertex      StatelessVertex
    31  		expectedErr error
    32  	}{
    33  		{
    34  			name:        "zero vertex",
    35  			vertex:      statelessVertex{innerStatelessVertex: innerStatelessVertex{}},
    36  			expectedErr: errNoOperations,
    37  		},
    38  		{
    39  			name: "valid vertex",
    40  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
    41  				Version:   0,
    42  				ChainID:   ids.Empty,
    43  				Height:    0,
    44  				Epoch:     0,
    45  				ParentIDs: []ids.ID{},
    46  				Txs:       [][]byte{{}},
    47  			}},
    48  			expectedErr: nil,
    49  		},
    50  		{
    51  			name: "invalid vertex epoch",
    52  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
    53  				Version:   0,
    54  				ChainID:   ids.Empty,
    55  				Height:    0,
    56  				Epoch:     1,
    57  				ParentIDs: []ids.ID{},
    58  				Txs:       [][]byte{{}},
    59  			}},
    60  			expectedErr: errBadEpoch,
    61  		},
    62  		{
    63  			name: "too many vertex parents",
    64  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
    65  				Version:   0,
    66  				ChainID:   ids.Empty,
    67  				Height:    0,
    68  				Epoch:     0,
    69  				ParentIDs: tooManyParents,
    70  				Txs:       [][]byte{{}},
    71  			}},
    72  			expectedErr: errTooManyParentIDs,
    73  		},
    74  		{
    75  			name: "no vertex txs",
    76  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
    77  				Version:   0,
    78  				ChainID:   ids.Empty,
    79  				Height:    0,
    80  				Epoch:     0,
    81  				ParentIDs: []ids.ID{},
    82  				Txs:       [][]byte{},
    83  			}},
    84  			expectedErr: errNoOperations,
    85  		},
    86  		{
    87  			name: "too many vertex txs",
    88  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
    89  				Version:   0,
    90  				ChainID:   ids.Empty,
    91  				Height:    0,
    92  				Epoch:     0,
    93  				ParentIDs: []ids.ID{},
    94  				Txs:       tooManyTxs,
    95  			}},
    96  			expectedErr: errTooManyTxs,
    97  		},
    98  		{
    99  			name: "unsorted vertex parents",
   100  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
   101  				Version:   0,
   102  				ChainID:   ids.Empty,
   103  				Height:    0,
   104  				Epoch:     0,
   105  				ParentIDs: []ids.ID{{1}, {0}},
   106  				Txs:       [][]byte{{}},
   107  			}},
   108  			expectedErr: errInvalidParents,
   109  		},
   110  		{
   111  			name: "unsorted vertex txs",
   112  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
   113  				Version:   0,
   114  				ChainID:   ids.Empty,
   115  				Height:    0,
   116  				Epoch:     0,
   117  				ParentIDs: []ids.ID{},
   118  				Txs:       [][]byte{{0}, {1}}, // note that txs are sorted by their hashes
   119  			}},
   120  			expectedErr: errInvalidTxs,
   121  		},
   122  		{
   123  			name: "duplicate vertex parents",
   124  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
   125  				Version:   0,
   126  				ChainID:   ids.Empty,
   127  				Height:    0,
   128  				Epoch:     0,
   129  				ParentIDs: []ids.ID{{0}, {0}},
   130  				Txs:       [][]byte{{}},
   131  			}},
   132  			expectedErr: errInvalidParents,
   133  		},
   134  		{
   135  			name: "duplicate vertex txs",
   136  			vertex: statelessVertex{innerStatelessVertex: innerStatelessVertex{
   137  				Version:   0,
   138  				ChainID:   ids.Empty,
   139  				Height:    0,
   140  				Epoch:     0,
   141  				ParentIDs: []ids.ID{},
   142  				Txs:       [][]byte{{0}, {0}}, // note that txs are sorted by their hashes
   143  			}},
   144  			expectedErr: errInvalidTxs,
   145  		},
   146  	}
   147  	for _, test := range tests {
   148  		t.Run(test.name, func(t *testing.T) {
   149  			err := test.vertex.Verify()
   150  			require.ErrorIs(t, err, test.expectedErr)
   151  		})
   152  	}
   153  }