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 }